pax_global_header00006660000000000000000000000064150554343430014520gustar00rootroot0000000000000052 comment=b497b32592809a64d7ed741882a12ef83b1c42a7 leocad-25.09/000077500000000000000000000000001505543434300127665ustar00rootroot00000000000000leocad-25.09/.gitattributes000066400000000000000000000004771505543434300156710ustar00rootroot00000000000000# Set the default behavior, in case people don't have core.autocrlf set. * text=auto # Explicitly declare text files you want to always be normalized and converted # to native line endings on checkout. *.cpp text *.h text # Denote all files that are truly binary and should not be modified. *.png binary *.jpg binary leocad-25.09/.github/000077500000000000000000000000001505543434300143265ustar00rootroot00000000000000leocad-25.09/.github/ISSUE_TEMPLATE/000077500000000000000000000000001505543434300165115ustar00rootroot00000000000000leocad-25.09/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000016421505543434300212060ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: bug assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Version (please complete the following information):** - OS: [e.g. Windows 10, Ubuntu, macOS] - LeoCAD Version [e.g. 19.07 or continuous] **Crash information:** Some versions of LeoCAD will show a message that they saved a minidump file when they crash, if you see this message please attach the file. **Additional context** Add any other context about the problem here. If you're seeing a graphical issue, adding a screenshot of the About Dialog may help. leocad-25.09/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011231505543434300222330ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. leocad-25.09/.github/workflows/000077500000000000000000000000001505543434300163635ustar00rootroot00000000000000leocad-25.09/.github/workflows/continuous.yml000066400000000000000000000037761505543434300213310ustar00rootroot00000000000000name: LeoCAD CI on: push: branches: [ "master" ] jobs: build-ubuntu: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Qt uses: jurplel/install-qt-action@v4 with: cache: 'true' - name: Get number of CPU cores uses: SimenB/github-actions-cpu-cores@v1 id: cpu-cores - name: Generate Makefile run: qmake PREFIX=/usr - name: Build run: make -j ${{ steps.cpu-cores.outputs.count }} build-macos: runs-on: macos-latest steps: - uses: actions/checkout@v3 - name: Install Qt uses: jurplel/install-qt-action@v3 with: cache: 'true' - name: Cache Library uses: actions/cache@v3 id: cache-library with: path: library.bin key: library-25.08 - name: Download Library if: steps.cache-library.outputs.cache-hit != 'true' run: | wget https://github.com/leozide/leocad/releases/download/v23.03/Library-25.08.zip -O library.zip unzip library.zip - name: Cache POV-Ray uses: actions/cache@v3 id: cache-povray with: path: povray key: povray-20.03 - name: Download POV-Ray if: steps.cache-povray.outputs.cache-hit != 'true' run: | wget https://github.com/leozide/povray/releases/download/continuous/povray chmod +x povray curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/repos/leozide/leocad/commits/master -o repo.txt echo < repo.txt echo export REMOTE=$(grep -Po '(?<=: \")(([a-z0-9])\w+)(?=\")' -m 1 repo.txt) export REMOTE=$(grep -Po '(?<=: \")(([a-z0-9])\w+)(?=\")' -m 1 repo.txt) echo $REMOTE - name: Get number of CPU cores uses: SimenB/github-actions-cpu-cores@v1 id: cpu-cores - name: Generate Makefile run: qmake -early QMAKE_DEFAULT_LIBDIRS=$(xcrun -show-sdk-path)/usr/lib PREFIX=/usr - name: Build run: make -j ${{ steps.cpu-cores.outputs.count }} leocad-25.09/.gitignore000066400000000000000000000005611505543434300147600ustar00rootroot00000000000000*.suo *.sln *.vcxproj *.filters *.user *.pdb *.db *.psess *.opendb *.opensdf *.sdf *.suo *.vspx *.xcodeproj *.qm *.ldr *.dat *.mpd !/resources/*.ldr *.dae *.3ds *.obj .vs build debug release ipch Debug* .DS_Store .qmake.stash Makefile library.bin leocad_plugin_import.cpp leocad_resource.* povray uic_wrapper.bat /tools/setup/*.exe appdir LeoCAD-Windows*.exe *.snap leocad-25.09/PKGBUILD000066400000000000000000000036761505543434300141260ustar00rootroot00000000000000# Maintainer: Peter Bartfai pkgname=leocad pkgver=18.02 pkgrel=1 pkgdesc="LeoCAD is a CAD program for creating virtual LEGO models." url="http://leocad.org" arch=('x86_64' 'i686') license=('GPL') #Qt4.x depends=('qt4' 'libpng' 'libjpeg-turbo' 'mesa-libgl') #Qt5.x #depends=('qt5-base' 'qt5-tools' 'qt5-gamepad' 'libpng' 'libjpeg-turbo' 'mesa-libgl') makedepends=('glu' 'ca-certificates') conflicts=() replaces=() backup=() source=("leocad-git.tar.gz") md5sums=(SKIP) build() { cd ${srcdir}/leocad-git if test "$CARCH" == x86_64; then PLATFORM=linux-g++-64 else PLATFORM=linux-g++-32 fi if [ -x /usr/bin/qmake ] ; then qmake -spec $PLATFORM DISABLE_UPDATE_CHECK=1 LDRAW_LIBRARY_PATH=/usr/share/ldraw ; lrelease leocad.pro ; elif [ -x /usr/bin/qmake-qt4 ] ; then qmake-qt4 -spec $PLATFORM DISABLE_UPDATE_CHECK=1 LDRAW_LIBRARY_PATH=/usr/share/ldraw ; lrelease-qt4 leocad.pro ; elif [ -x /usr/bin/qmake-qt5 ] ; then qmake-qt5 -spec $PLATFORM DISABLE_UPDATE_CHECK=1 LDRAW_LIBRARY_PATH=/usr/share/ldraw ; lrelease-qt5 leocad.pro ; fi make } package() { cd "${srcdir}/leocad-git" mkdir -p ${pkgdir}/usr/bin mkdir -p ${pkgdir}/usr/share/leocad install -m 755 build/release/leocad ${pkgdir}/usr/bin install -m 644 docs/README.md ${pkgdir}/usr/share/leocad/README.md install -m 644 docs/CREDITS.txt ${pkgdir}/usr/share/leocad/CREDITS.txt install -m 644 docs/COPYING.txt ${pkgdir}/usr/share/leocad/COPYING.txt mkdir -p ${pkgdir}/usr/share/mime/packages/ mkdir -p ${pkgdir}/usr/share/applications/ mkdir -p ${pkgdir}/usr/share/icons/hicolor/scalable/mimetypes install -m 644 qt/leocad.xml \ ${pkgdir}/usr/share/mime/packages/leocad.xml install -m 644 qt/leocad.desktop \ ${pkgdir}/usr/share/applications/leocad.desktop install -m 644 resources/application-vnd.leocad.svg \ ${pkgdir}/usr/share/icons/hicolor/scalable/mimetypes/application-vnd.leocad.svg make INSTALL_ROOT="${pkgdir}" install } leocad-25.09/appveyor.yml000066400000000000000000000126111505543434300153570ustar00rootroot00000000000000version: '{branch}.{build}' skip_tags: false image: - Ubuntu1604 - macOS - Visual Studio 2019 configuration: Release platform: x64 environment: GITHUB_TOKEN: secure: IUcfrYUBF2T/YGkdu5TdluHOwPCZyNOuhAS8vlFmbGIWbJ1jLfZY1dFNZXNAfagl matrix: fast_finish: true for: - matrix: only: - image: Visual Studio 2019 before_build: - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" - set PATH=C:\Qt\5.15\msvc2019_64\bin;%PATH% - git rev-parse --short HEAD > version.txt - set /p VERSION= < version.txt - qmake -v - qmake -tp vc build: project: leocad.vcxproj verbosity: minimal after_build: - 7z a symbols.zip build/release/leocad.exe build/release/leocad.pdb - mkdir appdir - copy build\release\leocad.exe appdir - copy docs\readme.md appdir\readme.txt - appveyor DownloadFile https://github.com/leozide/leocad/releases/download/v23.03/Library-25.08.zip -FileName library.zip - 7z e library.zip - copy library.bin appdir\\library.bin - appveyor DownloadFile https://github.com/leozide/povray/releases/download/continuous/povconsole32-sse2.exe -FileName appdir\povconsole32-sse2.exe - windeployqt appdir\leocad.exe - copy tools\setup\leocad.nsi . - copy tools\setup\setup.ico . - 'copy "%VCToolsRedistDir%\vcredist_x64.exe" appdir' - '"C:\Program Files (x86)\NSIS\makensis.exe" /V4 /DX64 "/XOutFile LeoCAD-Windows-%VERSION%.exe" leocad.nsi' - set TRAVIS_TAG=%APPVEYOR_REPO_TAG_NAME% - set TRAVIS_REPO_SLUG=%APPVEYOR_REPO_NAME% - set TRAVIS_COMMIT=%APPVEYOR_REPO_COMMIT% - set UPLOADTOOL_ISPRERELEASE=1 - appveyor DownloadFile https://github.com/probonopd/uploadtool/raw/master/upload.sh - if not defined APPVEYOR_PULL_REQUEST_NUMBER (bash upload.sh LeoCAD*.exe) artifacts: - path: symbols.zip name: symbols - path: LeoCAD-Windows-$(VERSION).exe name: leocad - matrix: only: - image: Ubuntu1604 install: - sudo apt-get -y install libqt5opengl5-dev libxcb-xinerama0 before_build: - export PATH=$HOME/Qt/5.15/gcc_64/bin:$PATH - export TRAVIS_TAG=$APPVEYOR_REPO_TAG_NAME - export TRAVIS_REPO_SLUG=$APPVEYOR_REPO_NAME - export TRAVIS_COMMIT=$APPVEYOR_REPO_COMMIT build_script: - qmake PREFIX=/usr - make after_build: - make install INSTALL_ROOT=AppDir - appveyor DownloadFile https://github.com/leozide/leocad/releases/download/v23.03/Library-25.08.zip -FileName library.zip - unzip library.zip - mkdir -p AppDir/usr/share/leocad - mv library.bin AppDir/usr/share/leocad/library.bin - cp qt/leocad.desktop AppDir/leocad.desktop - cp tools/icon/256x256/apps/leocad.png AppDir/leocad.png - cp tools/setup/AppRun AppDir - chmod a+x AppDir/AppRun - appveyor DownloadFile https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage - chmod a+x linuxdeployqt*.AppImage - unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH - export VERSION=$(git rev-parse --short HEAD) - ./linuxdeployqt*.AppImage ./AppDir/usr/share/applications/*.desktop -bundle-non-qt-libs - ./linuxdeployqt*.AppImage --appimage-extract - export PATH=$(readlink -f ./squashfs-root/usr/bin/):$PATH - ./squashfs-root/usr/bin/appimagetool AppDir/ - mv ./LeoCAD-$VERSION-x86_64.AppImage ./LeoCAD-Linux-$VERSION-x86_64.AppImage - 'curl -s -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/repos/leozide/leocad/commits/master -o repo.txt' - 'export REMOTE=$(grep -Po ''(?<=: \")(([a-z0-9])\w+)(?=\")'' -m 1 repo.txt)' - export LOCAL=$(git rev-parse HEAD) - export UPLOADTOOL_ISPRERELEASE=1 - if [[ "$REMOTE" != "$LOCAL" ]]; then echo "Build no longer current. $REMOTE vs $LOCAL - aborting upload."; exit 0; fi; - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh - bash upload.sh LeoCAD*.AppImage* - matrix: only: - image: macos install: - brew install grep before_build: - export PATH=$HOME/Qt/5.15/clang_64/bin:$PATH - export TRAVIS_TAG=$APPVEYOR_REPO_TAG_NAME - export TRAVIS_REPO_SLUG=$APPVEYOR_REPO_NAME - export TRAVIS_COMMIT=$APPVEYOR_REPO_COMMIT - appveyor DownloadFile https://github.com/leozide/povray/releases/download/continuous/povray - chmod +x povray - appveyor DownloadFile https://github.com/leozide/leocad/releases/download/v23.03/Library-25.08.zip -FileName library.zip - unzip library.zip build_script: - qmake PREFIX=/usr - make after_build: - cd build/release - macdeployqt LeoCAD.app -dmg - mv LeoCAD.dmg LeoCAD-macOS-$(git rev-parse --short HEAD).dmg - 'curl -s -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/repos/leozide/leocad/commits/master -o repo.txt' - 'export REMOTE=$(ggrep -Po ''(?<=: \")(([a-z0-9])\w+)(?=\")'' -m 1 repo.txt)' - export LOCAL=$(git rev-parse HEAD) - export UPLOADTOOL_ISPRERELEASE=1 - if [[ "$REMOTE" != "$LOCAL" ]]; then echo "Build no longer current. $REMOTE vs $LOCAL - aborting upload."; exit 0; fi; - appveyor DownloadFile https://github.com/probonopd/uploadtool/raw/master/upload.sh - bash upload.sh LeoCAD*.dmg* leocad-25.09/common/000077500000000000000000000000001505543434300142565ustar00rootroot00000000000000leocad-25.09/common/camera.cpp000066400000000000000000001161711505543434300162210ustar00rootroot00000000000000#include "lc_global.h" #include "lc_math.h" #include "lc_colors.h" #include #include #include #include #include "lc_file.h" #include "camera.h" #include "lc_application.h" #include "lc_context.h" #define LC_CAMERA_POSITION_EDGE 7.5f #define LC_CAMERA_TARGET_EDGE 7.5f #define LC_CAMERA_SAVE_VERSION 7 // LeoCAD 0.80 lcCamera::lcCamera(bool Simple) : lcObject(lcObjectType::Camera) { Initialize(); if (Simple) mState |= LC_CAMERA_SIMPLE; else { mPosition.SetValue(lcVector3(-250.0f, -250.0f, 75.0f)); mTargetPosition.SetValue(lcVector3(0.0f, 0.0f, 0.0f)); mUpVector.SetValue(lcVector3(-0.2357f, -0.2357f, 0.94281f)); UpdatePosition(1); } } lcCamera::lcCamera(float ex, float ey, float ez, float tx, float ty, float tz) : lcObject(lcObjectType::Camera) { // Fix the up vector lcVector3 UpVector(0, 0, 1), FrontVector(ex - tx, ey - ty, ez - tz), SideVector; FrontVector.Normalize(); if (FrontVector == UpVector) SideVector = lcVector3(1, 0, 0); else SideVector = lcCross(FrontVector, UpVector); UpVector = lcCross(SideVector, FrontVector); UpVector.Normalize(); Initialize(); mPosition.SetValue(lcVector3(ex, ey, ez)); mTargetPosition.SetValue(lcVector3(tx, ty, tz)); mUpVector.SetValue(UpVector); UpdatePosition(1); } lcCamera::~lcCamera() { } QString lcCamera::GetCameraTypeString(lcCameraType CameraType) { switch (CameraType) { case lcCameraType::Perspective: return QT_TRANSLATE_NOOP("Camera Type", "Perspective"); case lcCameraType::Orthographic: return QT_TRANSLATE_NOOP("Camera Type", "Orthographic"); case lcCameraType::Count: break; } return QString(); } QStringList lcCamera::GetCameraTypeStrings() { QStringList CameraType; for (int CameraTypeIndex = 0; CameraTypeIndex < static_cast(lcCameraType::Count); CameraTypeIndex++) CameraType.push_back(GetCameraTypeString(static_cast(CameraTypeIndex))); return CameraType; } lcViewpoint lcCamera::GetViewpoint(const QString& ViewpointName) { const QLatin1String ViewpointNames[] = { QLatin1String("front"), QLatin1String("back"), QLatin1String("top"), QLatin1String("bottom"), QLatin1String("left"), QLatin1String("right"), QLatin1String("home") }; LC_ARRAY_SIZE_CHECK(ViewpointNames, lcViewpoint::Count); for (int ViewpointIndex = 0; ViewpointIndex < static_cast(lcViewpoint::Count); ViewpointIndex++) if (ViewpointNames[ViewpointIndex] == ViewpointName) return static_cast(ViewpointIndex); return lcViewpoint::Count; } void lcCamera::Initialize() { m_fovy = 30.0f; m_zNear = 25.0f; m_zFar = 50000.0f; mState = 0; } bool lcCamera::SetName(const QString& Name) { if (mName == Name) return false; mName = Name; return true; } void lcCamera::CreateName(const std::vector>& Cameras) { if (!mName.isEmpty()) { bool Found = false; for (const std::unique_ptr& Camera : Cameras) { if (Camera->GetName() == mName) { Found = true; break; } } if (!Found) return; } int MaxCameraNumber = 0; const QLatin1String Prefix("Camera "); for (const std::unique_ptr& Camera : Cameras) { QString CameraName = Camera->GetName(); if (CameraName.startsWith(Prefix)) { bool Ok = false; int CameraNumber = CameraName.mid(Prefix.size()).toInt(&Ok); if (Ok && CameraNumber > MaxCameraNumber) MaxCameraNumber = CameraNumber; } } mName = Prefix + QString::number(MaxCameraNumber + 1); } bool lcCamera::SetCameraType(lcCameraType CameraType) { if (static_cast(CameraType) < 0 || CameraType >= lcCameraType::Count) return false; if (GetCameraType() == CameraType) return false; SetOrtho(CameraType == lcCameraType::Orthographic); return true; } void lcCamera::SaveLDraw(QTextStream& Stream) const { const QLatin1String LineEnding("\r\n"); Stream << QLatin1String("0 !LEOCAD CAMERA FOV ") << m_fovy << QLatin1String(" ZNEAR ") << m_zNear << QLatin1String(" ZFAR ") << m_zFar << LineEnding; mPosition.Save(Stream, "CAMERA", "POSITION", true); mTargetPosition.Save(Stream, "CAMERA", "TARGET_POSITION", true); mUpVector.Save(Stream, "CAMERA", "UP_VECTOR", true); Stream << QLatin1String("0 !LEOCAD CAMERA "); if (IsHidden()) Stream << QLatin1String("HIDDEN"); if (IsOrtho()) Stream << QLatin1String("ORTHOGRAPHIC "); Stream << QLatin1String("NAME ") << mName << LineEnding; } bool lcCamera::ParseLDrawLine(QTextStream& Stream) { while (!Stream.atEnd()) { QString Token; Stream >> Token; if (Token == QLatin1String("HIDDEN")) SetHidden(true); else if (Token == QLatin1String("ORTHOGRAPHIC")) SetOrtho(true); else if (Token == QLatin1String("FOV")) Stream >> m_fovy; else if (Token == QLatin1String("ZNEAR")) Stream >> m_zNear; else if (Token == QLatin1String("ZFAR")) Stream >> m_zFar; else if (mPosition.Load(Stream, Token, "POSITION")) continue; else if (mTargetPosition.Load(Stream, Token, "TARGET_POSITION")) continue; else if (mUpVector.Load(Stream, Token, "UP_VECTOR")) continue; else if (Token == QLatin1String("NAME")) { mName = Stream.readAll().trimmed(); return true; } } return false; } ///////////////////////////////////////////////////////////////////////////// // Camera save/load bool lcCamera::FileLoad(lcFile& file) { quint8 version, ch; version = file.ReadU8(); if (version > LC_CAMERA_SAVE_VERSION) return false; if (version > 5) { if (file.ReadU8() != 1) return false; quint16 time; float param[4]; quint8 type; quint32 n; file.ReadU32(&n, 1); while (n--) { file.ReadU16(&time, 1); file.ReadFloats(param, 4); file.ReadU8(&type, 1); } file.ReadU32(&n, 1); while (n--) { file.ReadU16(&time, 1); file.ReadFloats(param, 4); file.ReadU8(&type, 1); } } if (version == 4) { char Name[81]; file.ReadBuffer(Name, 80); } else { ch = file.ReadU8(); if (ch == 0xFF) return false; char Name[81]; file.ReadBuffer(Name, ch); } if (version < 3) { double d[3]; file.ReadDoubles(d, 3); file.ReadDoubles(d, 3); file.ReadDoubles(d, 3); } if (version == 3) { ch = file.ReadU8(); while (ch--) { quint8 step; double eye[3], target[3], up[3]; file.ReadDoubles(eye, 3); file.ReadDoubles(target, 3); file.ReadDoubles(up, 3); file.ReadU8(&step, 1); file.ReadS32(); // snapshot file.ReadS32(); // cam } } if (version < 4) { file.ReadDouble(); // m_fovy file.ReadDouble(); // m_zFar file.ReadDouble(); // m_zNear } else { qint32 n; if (version < 6) { quint16 time; float param[4]; quint8 type; n = file.ReadS32(); while (n--) { file.ReadU16(&time, 1); file.ReadFloats(param, 3); file.ReadU8(&type, 1); } n = file.ReadS32(); while (n--) { file.ReadU16(&time, 1); file.ReadFloats(param, 3); file.ReadU8(&type, 1); } } float f; file.ReadFloats(&f, 1); // m_fovy file.ReadFloats(&f, 1); // m_zFar file.ReadFloats(&f, 1); // m_zNear if (version < 5) { n = file.ReadS32(); } else { ch = file.ReadU8(); file.ReadU8(); } } if ((version > 1) && (version < 4)) { quint32 show; qint32 user; file.ReadU32(&show, 1); // if (version > 2) file.ReadS32(&user, 1); } return true; } void lcCamera::CompareBoundingBox(lcVector3& Min, lcVector3& Max) { const lcVector3 Points[2] = { mPosition, mTargetPosition }; for (int i = 0; i < 2; i++) { const lcVector3& Point = Points[i]; // TODO: this should check the entire mesh Min = lcMin(Point, Min); Max = lcMax(Point, Max); } } void lcCamera::MoveSelected(lcStep Step, bool AddKey, const lcVector3& Distance) { if (IsSimple()) AddKey = false; const quint32 FocusSection = GetFocusSection(); if (FocusSection == LC_CAMERA_SECTION_POSITION || FocusSection == LC_CAMERA_SECTION_INVALID) { mPosition.ChangeKey(mPosition + Distance, Step, AddKey); } if (FocusSection == LC_CAMERA_SECTION_TARGET || FocusSection == LC_CAMERA_SECTION_INVALID) { mTargetPosition.ChangeKey(mTargetPosition + Distance, Step, AddKey); } if (FocusSection == LC_CAMERA_SECTION_UPVECTOR) { mUpVector.ChangeKey(lcNormalize(mUpVector + Distance), Step, AddKey); } } void lcCamera::MoveRelative(const lcVector3& Distance, lcStep Step, bool AddKey) { if (IsSimple()) AddKey = false; const lcVector3 Relative = lcMul30(Distance, lcMatrix44Transpose(mWorldView)) * 5.0f; mPosition.ChangeKey(mPosition + Relative, Step, AddKey); mTargetPosition.ChangeKey(mTargetPosition + Relative, Step, AddKey); UpdatePosition(Step); } void lcCamera::Rotate(lcStep Step, bool AddKey, const lcMatrix33& RotationMatrix, const lcVector3& Center, const lcMatrix33& RotationFrame) { if (GetFocusSection() != LC_CAMERA_SECTION_POSITION && GetFocusSection() != LC_CAMERA_SECTION_INVALID) return; const lcMatrix33 LocalToWorldMatrix = lcMatrix33(mWorldView); const lcMatrix33 LocalToFocusMatrix = lcMul(LocalToWorldMatrix, RotationFrame); lcMatrix33 NewLocalToWorldMatrix = lcMul(LocalToFocusMatrix, RotationMatrix); const lcMatrix33 WorldToLocalMatrix = lcMatrix33AffineInverse(LocalToWorldMatrix); lcVector3 Distance = mPosition - Center; Distance = lcMul(Distance, WorldToLocalMatrix); Distance = lcMul(Distance, NewLocalToWorldMatrix); SetPosition(Center + Distance, Step, AddKey); Distance = mTargetPosition - Center; Distance = lcMul(Distance, WorldToLocalMatrix); Distance = lcMul(Distance, NewLocalToWorldMatrix); SetTargetPosition(Center + Distance, Step, AddKey); lcVector3 UpVector = mUpVector; UpVector = lcMul(UpVector, WorldToLocalMatrix); UpVector = lcMul(UpVector, NewLocalToWorldMatrix); SetUpVector(UpVector, Step, AddKey); } void lcCamera::UpdatePosition(lcStep Step) { mPosition.Update(Step); mTargetPosition.Update(Step); mUpVector.Update(Step); const lcVector3 FrontVector(mPosition - mTargetPosition); const lcVector3 SideVector = lcCross(FrontVector, mUpVector); const lcVector3 UpVector = lcNormalize(lcCross(SideVector, FrontVector)); mWorldView = lcMatrix44LookAt(mPosition, mTargetPosition, UpVector); } void lcCamera::CopyPosition(const lcCamera* Camera) { m_fovy = Camera->m_fovy; m_zNear = Camera->m_zNear; m_zFar = Camera->m_zFar; mWorldView = Camera->mWorldView; mPosition = Camera->mPosition; mTargetPosition = Camera->mTargetPosition; mUpVector = Camera->mUpVector; mState |= (Camera->mState & LC_CAMERA_ORTHO); } void lcCamera::CopySettings(const lcCamera* camera) { m_fovy = camera->m_fovy; m_zNear = camera->m_zNear; m_zFar = camera->m_zFar; mState |= (camera->mState & LC_CAMERA_ORTHO); } void lcCamera::DrawInterface(lcContext* Context, const lcScene& Scene) const { Q_UNUSED(Scene); Context->SetMaterial(lcMaterialType::UnlitColor); lcMatrix44 ViewWorldMatrix = lcMatrix44AffineInverse(mWorldView); ViewWorldMatrix.SetTranslation(lcVector3(0, 0, 0)); const lcMatrix44 CameraViewMatrix = lcMul(ViewWorldMatrix, lcMatrix44Translation(mPosition)); Context->SetWorldMatrix(CameraViewMatrix); float Verts[(12 + 8 + 8 + 3 + 4) * 3]; float* CurVert = Verts; float Length = lcLength(mPosition - mTargetPosition); *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE * 2; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE * 2; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE * 2; *CurVert++ = LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE; *CurVert++ = -LC_CAMERA_POSITION_EDGE * 2; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE - Length; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE - Length; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE - Length; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE - Length; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE - Length; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE - Length; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE - Length; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE - Length; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE + 25.0f; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE + 25.0f; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE + 25.0f; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE + 25.0f; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE + 25.0f; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE + 25.0f; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE + 25.0f; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = LC_CAMERA_TARGET_EDGE; *CurVert++ = -LC_CAMERA_TARGET_EDGE + 25.0f; *CurVert++ = -LC_CAMERA_TARGET_EDGE; *CurVert++ = 0.0f; *CurVert++ = 0.0f; *CurVert++ = 0.0f; *CurVert++ = 0.0f; *CurVert++ = 0.0f; *CurVert++ = -Length; *CurVert++ = 0.0f; *CurVert++ = 25.0f; *CurVert++ = 0.0f; const GLushort Indices[40 + 24 + 24 + 4 + 16] = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7, 8, 9, 9, 10, 10, 11, 11, 8, 8, 28, 9, 28, 10, 28, 11, 28, 12, 13, 13, 14, 14, 15, 15, 12, 16, 17, 17, 18, 18, 19, 19, 16, 12, 16, 13, 17, 14, 18, 15, 19, 20, 21, 21, 22, 22, 23, 23, 20, 24, 25, 25, 26, 26, 27, 27, 24, 20, 24, 21, 25, 22, 26, 23, 27, 28, 29, 28, 30, 31, 32, 32, 33, 33, 34, 34, 31, 28, 31, 28, 32, 28, 33, 28, 34 }; Context->SetVertexBufferPointer(Verts); Context->SetVertexFormatPosition(3); Context->SetIndexBufferPointer(Indices); const lcPreferences& Preferences = lcGetPreferences(); const float LineWidth = Preferences.mLineWidth; const lcVector4 SelectedColor = lcVector4FromColor(Preferences.mObjectSelectedColor); const lcVector4 FocusedColor = lcVector4FromColor(Preferences.mObjectFocusedColor); const lcVector4 CameraColor = lcVector4FromColor(Preferences.mCameraColor); if (!IsSelected()) { Context->SetLineWidth(LineWidth); Context->SetColor(CameraColor); Context->DrawIndexedPrimitives(GL_LINES, 40 + 24 + 24 + 4, GL_UNSIGNED_SHORT, 0); } else { if (IsSelected(LC_CAMERA_SECTION_POSITION)) { Context->SetLineWidth(2.0f * LineWidth); if (IsFocused(LC_CAMERA_SECTION_POSITION)) Context->SetColor(FocusedColor); else Context->SetColor(SelectedColor); } else { Context->SetLineWidth(LineWidth); Context->SetColor(CameraColor); } Context->DrawIndexedPrimitives(GL_LINES, 40, GL_UNSIGNED_SHORT, 0); if (IsSelected(LC_CAMERA_SECTION_TARGET)) { Context->SetLineWidth(2.0f * LineWidth); if (IsFocused(LC_CAMERA_SECTION_TARGET)) Context->SetColor(FocusedColor); else Context->SetColor(SelectedColor); } else { Context->SetLineWidth(LineWidth); Context->SetColor(CameraColor); } Context->DrawIndexedPrimitives(GL_LINES, 24, GL_UNSIGNED_SHORT, 40 * 2); if (IsSelected(LC_CAMERA_SECTION_UPVECTOR)) { Context->SetLineWidth(2.0f * LineWidth); if (IsFocused(LC_CAMERA_SECTION_UPVECTOR)) Context->SetColor(FocusedColor); else Context->SetColor(SelectedColor); } else { Context->SetLineWidth(LineWidth); Context->SetColor(CameraColor); } Context->DrawIndexedPrimitives(GL_LINES, 24, GL_UNSIGNED_SHORT, (40 + 24) * 2); Context->SetColor(CameraColor); Context->SetLineWidth(LineWidth); float SizeY = tanf(LC_DTOR * m_fovy / 2) * Length; float SizeX = SizeY * 1.333f; *CurVert++ = SizeX; *CurVert++ = SizeY; *CurVert++ = -Length; *CurVert++ = -SizeX; *CurVert++ = SizeY; *CurVert++ = -Length; *CurVert++ = -SizeX; *CurVert++ = -SizeY; *CurVert++ = -Length; *CurVert++ = SizeX; *CurVert++ = -SizeY; *CurVert++ = -Length; Context->DrawIndexedPrimitives(GL_LINES, 4 + 16, GL_UNSIGNED_SHORT, (40 + 24 + 24) * 2); } } QVariant lcCamera::GetPropertyValue(lcObjectPropertyId PropertyId) const { switch (PropertyId) { case lcObjectPropertyId::PieceId: case lcObjectPropertyId::PieceColor: case lcObjectPropertyId::PieceStepShow: case lcObjectPropertyId::PieceStepHide: break; case lcObjectPropertyId::CameraName: return GetName(); case lcObjectPropertyId::CameraType: return static_cast(GetCameraType()); case lcObjectPropertyId::CameraFOV: case lcObjectPropertyId::CameraNear: case lcObjectPropertyId::CameraFar: case lcObjectPropertyId::CameraPositionX: case lcObjectPropertyId::CameraPositionY: case lcObjectPropertyId::CameraPositionZ: case lcObjectPropertyId::CameraTargetX: case lcObjectPropertyId::CameraTargetY: case lcObjectPropertyId::CameraTargetZ: case lcObjectPropertyId::CameraUpX: case lcObjectPropertyId::CameraUpY: case lcObjectPropertyId::CameraUpZ: case lcObjectPropertyId::LightName: case lcObjectPropertyId::LightType: case lcObjectPropertyId::LightColor: case lcObjectPropertyId::LightBlenderPower: case lcObjectPropertyId::LightPOVRayPower: case lcObjectPropertyId::LightCastShadow: case lcObjectPropertyId::LightPOVRayFadeDistance: case lcObjectPropertyId::LightPOVRayFadePower: case lcObjectPropertyId::LightBlenderRadius: case lcObjectPropertyId::LightBlenderAngle: case lcObjectPropertyId::LightAreaSizeX: case lcObjectPropertyId::LightAreaSizeY: case lcObjectPropertyId::LightSpotConeAngle: case lcObjectPropertyId::LightSpotPenumbraAngle: case lcObjectPropertyId::LightPOVRaySpotTightness: case lcObjectPropertyId::LightAreaShape: case lcObjectPropertyId::LightPOVRayAreaGridX: case lcObjectPropertyId::LightPOVRayAreaGridY: case lcObjectPropertyId::ObjectPositionX: case lcObjectPropertyId::ObjectPositionY: case lcObjectPropertyId::ObjectPositionZ: case lcObjectPropertyId::ObjectRotationX: case lcObjectPropertyId::ObjectRotationY: case lcObjectPropertyId::ObjectRotationZ: case lcObjectPropertyId::Count: break; } return QVariant(); } bool lcCamera::SetPropertyValue(lcObjectPropertyId PropertyId, lcStep Step, bool AddKey, QVariant Value) { Q_UNUSED(Step); Q_UNUSED(AddKey); switch (PropertyId) { case lcObjectPropertyId::PieceId: case lcObjectPropertyId::PieceColor: case lcObjectPropertyId::PieceStepShow: case lcObjectPropertyId::PieceStepHide: break; case lcObjectPropertyId::CameraName: return SetName(Value.toString()); case lcObjectPropertyId::CameraType: return SetCameraType(static_cast(Value.toInt())); case lcObjectPropertyId::CameraFOV: case lcObjectPropertyId::CameraNear: case lcObjectPropertyId::CameraFar: case lcObjectPropertyId::CameraPositionX: case lcObjectPropertyId::CameraPositionY: case lcObjectPropertyId::CameraPositionZ: case lcObjectPropertyId::CameraTargetX: case lcObjectPropertyId::CameraTargetY: case lcObjectPropertyId::CameraTargetZ: case lcObjectPropertyId::CameraUpX: case lcObjectPropertyId::CameraUpY: case lcObjectPropertyId::CameraUpZ: case lcObjectPropertyId::LightName: case lcObjectPropertyId::LightType: case lcObjectPropertyId::LightColor: case lcObjectPropertyId::LightBlenderPower: case lcObjectPropertyId::LightPOVRayPower: case lcObjectPropertyId::LightCastShadow: case lcObjectPropertyId::LightPOVRayFadeDistance: case lcObjectPropertyId::LightPOVRayFadePower: case lcObjectPropertyId::LightBlenderRadius: case lcObjectPropertyId::LightBlenderAngle: case lcObjectPropertyId::LightAreaSizeX: case lcObjectPropertyId::LightAreaSizeY: case lcObjectPropertyId::LightSpotConeAngle: case lcObjectPropertyId::LightSpotPenumbraAngle: case lcObjectPropertyId::LightPOVRaySpotTightness: case lcObjectPropertyId::LightAreaShape: case lcObjectPropertyId::LightPOVRayAreaGridX: case lcObjectPropertyId::LightPOVRayAreaGridY: case lcObjectPropertyId::ObjectPositionX: case lcObjectPropertyId::ObjectPositionY: case lcObjectPropertyId::ObjectPositionZ: case lcObjectPropertyId::ObjectRotationX: case lcObjectPropertyId::ObjectRotationY: case lcObjectPropertyId::ObjectRotationZ: case lcObjectPropertyId::Count: break; } return false; } bool lcCamera::HasKeyFrame(lcObjectPropertyId PropertyId, lcStep Time) const { switch (PropertyId) { case lcObjectPropertyId::PieceId: case lcObjectPropertyId::PieceColor: case lcObjectPropertyId::PieceStepShow: case lcObjectPropertyId::PieceStepHide: case lcObjectPropertyId::CameraName: case lcObjectPropertyId::CameraType: case lcObjectPropertyId::CameraFOV: case lcObjectPropertyId::CameraNear: case lcObjectPropertyId::CameraFar: return false; case lcObjectPropertyId::CameraPositionX: case lcObjectPropertyId::CameraPositionY: case lcObjectPropertyId::CameraPositionZ: return mPosition.HasKeyFrame(Time); case lcObjectPropertyId::CameraTargetX: case lcObjectPropertyId::CameraTargetY: case lcObjectPropertyId::CameraTargetZ: return mTargetPosition.HasKeyFrame(Time); case lcObjectPropertyId::CameraUpX: case lcObjectPropertyId::CameraUpY: case lcObjectPropertyId::CameraUpZ: return mUpVector.HasKeyFrame(Time); case lcObjectPropertyId::LightName: case lcObjectPropertyId::LightType: case lcObjectPropertyId::LightColor: case lcObjectPropertyId::LightBlenderPower: case lcObjectPropertyId::LightPOVRayPower: case lcObjectPropertyId::LightCastShadow: case lcObjectPropertyId::LightPOVRayFadeDistance: case lcObjectPropertyId::LightPOVRayFadePower: case lcObjectPropertyId::LightBlenderRadius: case lcObjectPropertyId::LightBlenderAngle: case lcObjectPropertyId::LightAreaSizeX: case lcObjectPropertyId::LightAreaSizeY: case lcObjectPropertyId::LightSpotConeAngle: case lcObjectPropertyId::LightSpotPenumbraAngle: case lcObjectPropertyId::LightPOVRaySpotTightness: case lcObjectPropertyId::LightAreaShape: case lcObjectPropertyId::LightPOVRayAreaGridX: case lcObjectPropertyId::LightPOVRayAreaGridY: case lcObjectPropertyId::ObjectPositionX: case lcObjectPropertyId::ObjectPositionY: case lcObjectPropertyId::ObjectPositionZ: case lcObjectPropertyId::ObjectRotationX: case lcObjectPropertyId::ObjectRotationY: case lcObjectPropertyId::ObjectRotationZ: case lcObjectPropertyId::Count: return false; } return false; } bool lcCamera::SetKeyFrame(lcObjectPropertyId PropertyId, lcStep Time, bool KeyFrame) { switch (PropertyId) { case lcObjectPropertyId::PieceId: case lcObjectPropertyId::PieceColor: case lcObjectPropertyId::PieceStepShow: case lcObjectPropertyId::PieceStepHide: case lcObjectPropertyId::CameraName: case lcObjectPropertyId::CameraType: case lcObjectPropertyId::CameraFOV: case lcObjectPropertyId::CameraNear: case lcObjectPropertyId::CameraFar: return false; case lcObjectPropertyId::CameraPositionX: case lcObjectPropertyId::CameraPositionY: case lcObjectPropertyId::CameraPositionZ: return mPosition.SetKeyFrame(Time, KeyFrame); case lcObjectPropertyId::CameraTargetX: case lcObjectPropertyId::CameraTargetY: case lcObjectPropertyId::CameraTargetZ: return mTargetPosition.SetKeyFrame(Time, KeyFrame); case lcObjectPropertyId::CameraUpX: case lcObjectPropertyId::CameraUpY: case lcObjectPropertyId::CameraUpZ: return mUpVector.SetKeyFrame(Time, KeyFrame); case lcObjectPropertyId::LightName: case lcObjectPropertyId::LightType: case lcObjectPropertyId::LightColor: case lcObjectPropertyId::LightBlenderPower: case lcObjectPropertyId::LightPOVRayPower: case lcObjectPropertyId::LightCastShadow: case lcObjectPropertyId::LightPOVRayFadeDistance: case lcObjectPropertyId::LightPOVRayFadePower: case lcObjectPropertyId::LightBlenderRadius: case lcObjectPropertyId::LightBlenderAngle: case lcObjectPropertyId::LightAreaSizeX: case lcObjectPropertyId::LightAreaSizeY: case lcObjectPropertyId::LightSpotConeAngle: case lcObjectPropertyId::LightSpotPenumbraAngle: case lcObjectPropertyId::LightPOVRaySpotTightness: case lcObjectPropertyId::LightAreaShape: case lcObjectPropertyId::LightPOVRayAreaGridX: case lcObjectPropertyId::LightPOVRayAreaGridY: case lcObjectPropertyId::ObjectPositionX: case lcObjectPropertyId::ObjectPositionY: case lcObjectPropertyId::ObjectPositionZ: case lcObjectPropertyId::ObjectRotationX: case lcObjectPropertyId::ObjectRotationY: case lcObjectPropertyId::ObjectRotationZ: case lcObjectPropertyId::Count: return false; } return false; } void lcCamera::RemoveKeyFrames() { mPosition.RemoveAllKeys(); mTargetPosition.RemoveAllKeys(); mUpVector.RemoveAllKeys(); } void lcCamera::RayTest(lcObjectRayTest& ObjectRayTest) const { lcVector3 Min = lcVector3(-LC_CAMERA_POSITION_EDGE, -LC_CAMERA_POSITION_EDGE, -LC_CAMERA_POSITION_EDGE); lcVector3 Max = lcVector3(LC_CAMERA_POSITION_EDGE, LC_CAMERA_POSITION_EDGE, LC_CAMERA_POSITION_EDGE); lcVector3 Start = lcMul31(ObjectRayTest.Start, mWorldView); lcVector3 End = lcMul31(ObjectRayTest.End, mWorldView); float Distance; lcVector3 Plane; if (lcBoundingBoxRayIntersectDistance(Min, Max, Start, End, &Distance, nullptr, &Plane) && (Distance < ObjectRayTest.Distance)) { ObjectRayTest.ObjectSection.Object = const_cast(this); ObjectRayTest.ObjectSection.Section = LC_CAMERA_SECTION_POSITION; ObjectRayTest.Distance = Distance; ObjectRayTest.PieceInfoRayTest.Plane = Plane; } Min = lcVector3(-LC_CAMERA_TARGET_EDGE, -LC_CAMERA_TARGET_EDGE, -LC_CAMERA_TARGET_EDGE); Max = lcVector3(LC_CAMERA_TARGET_EDGE, LC_CAMERA_TARGET_EDGE, LC_CAMERA_TARGET_EDGE); lcMatrix44 WorldView = mWorldView; WorldView.SetTranslation(lcMul30(-mTargetPosition, WorldView)); Start = lcMul31(ObjectRayTest.Start, WorldView); End = lcMul31(ObjectRayTest.End, WorldView); if (lcBoundingBoxRayIntersectDistance(Min, Max, Start, End, &Distance, nullptr, &Plane) && (Distance < ObjectRayTest.Distance)) { ObjectRayTest.ObjectSection.Object = const_cast(this); ObjectRayTest.ObjectSection.Section = LC_CAMERA_SECTION_TARGET; ObjectRayTest.Distance = Distance; ObjectRayTest.PieceInfoRayTest.Plane = Plane; } const lcMatrix44 ViewWorld = lcMatrix44AffineInverse(mWorldView); const lcVector3 UpVectorPosition = lcMul31(lcVector3(0, 25, 0), ViewWorld); WorldView = mWorldView; WorldView.SetTranslation(lcMul30(-UpVectorPosition, WorldView)); Start = lcMul31(ObjectRayTest.Start, WorldView); End = lcMul31(ObjectRayTest.End, WorldView); if (lcBoundingBoxRayIntersectDistance(Min, Max, Start, End, &Distance, nullptr, &Plane) && (Distance < ObjectRayTest.Distance)) { ObjectRayTest.ObjectSection.Object = const_cast(this); ObjectRayTest.ObjectSection.Section = LC_CAMERA_SECTION_UPVECTOR; ObjectRayTest.Distance = Distance; ObjectRayTest.PieceInfoRayTest.Plane = Plane; } } void lcCamera::BoxTest(lcObjectBoxTest& ObjectBoxTest) const { lcVector3 Min(-LC_CAMERA_POSITION_EDGE, -LC_CAMERA_POSITION_EDGE, -LC_CAMERA_POSITION_EDGE); lcVector3 Max(LC_CAMERA_POSITION_EDGE, LC_CAMERA_POSITION_EDGE, LC_CAMERA_POSITION_EDGE); lcVector4 LocalPlanes[6]; for (int PlaneIdx = 0; PlaneIdx < 6; PlaneIdx++) { const lcVector3 Normal = lcMul30(ObjectBoxTest.Planes[PlaneIdx], mWorldView); LocalPlanes[PlaneIdx] = lcVector4(Normal, ObjectBoxTest.Planes[PlaneIdx][3] - lcDot3(mWorldView[3], Normal)); } if (lcBoundingBoxIntersectsVolume(Min, Max, LocalPlanes)) { ObjectBoxTest.Objects.emplace_back(const_cast(this)); return; } Min = lcVector3(-LC_CAMERA_TARGET_EDGE, -LC_CAMERA_TARGET_EDGE, -LC_CAMERA_TARGET_EDGE); Max = lcVector3(LC_CAMERA_TARGET_EDGE, LC_CAMERA_TARGET_EDGE, LC_CAMERA_TARGET_EDGE); lcMatrix44 WorldView = mWorldView; WorldView.SetTranslation(lcMul30(-mTargetPosition, WorldView)); for (int PlaneIdx = 0; PlaneIdx < 6; PlaneIdx++) { const lcVector3 Normal = lcMul30(ObjectBoxTest.Planes[PlaneIdx], WorldView); LocalPlanes[PlaneIdx] = lcVector4(Normal, ObjectBoxTest.Planes[PlaneIdx][3] - lcDot3(WorldView[3], Normal)); } if (lcBoundingBoxIntersectsVolume(Min, Max, LocalPlanes)) { ObjectBoxTest.Objects.emplace_back(const_cast(this)); return; } const lcMatrix44 ViewWorld = lcMatrix44AffineInverse(mWorldView); const lcVector3 UpVectorPosition = lcMul31(lcVector3(0, 25, 0), ViewWorld); WorldView = mWorldView; WorldView.SetTranslation(lcMul30(-UpVectorPosition, WorldView)); for (int PlaneIdx = 0; PlaneIdx < 6; PlaneIdx++) { const lcVector3 Normal = lcMul30(ObjectBoxTest.Planes[PlaneIdx], WorldView); LocalPlanes[PlaneIdx] = lcVector4(Normal, ObjectBoxTest.Planes[PlaneIdx][3] - lcDot3(WorldView[3], Normal)); } if (lcBoundingBoxIntersectsVolume(Min, Max, LocalPlanes)) { ObjectBoxTest.Objects.emplace_back(const_cast(this)); return; } } void lcCamera::InsertTime(lcStep Start, lcStep Time) { mPosition.InsertTime(Start, Time); mTargetPosition.InsertTime(Start, Time); mUpVector.InsertTime(Start, Time); } void lcCamera::RemoveTime(lcStep Start, lcStep Time) { mPosition.RemoveTime(Start, Time); mTargetPosition.RemoveTime(Start, Time); mUpVector.RemoveTime(Start, Time); } void lcCamera::ZoomExtents(float AspectRatio, const lcVector3& Center, const std::vector& Points, lcStep Step, bool AddKey) { lcVector3 Position, TargetPosition; if (IsOrtho()) { float MinX = FLT_MAX, MaxX = -FLT_MAX, MinY = FLT_MAX, MaxY = -FLT_MAX; for (lcVector3 Point : Points) { Point = lcMul30(Point, mWorldView); MinX = lcMin(MinX, Point.x); MinY = lcMin(MinY, Point.y); MaxX = lcMax(MaxX, Point.x); MaxY = lcMax(MaxY, Point.y); } const lcVector3 ViewCenter = lcMul30(Center, mWorldView); float Width = qMax(fabsf(MaxX - ViewCenter.x), fabsf(ViewCenter.x - MinX)) * 2; float Height = qMax(fabsf(MaxY - ViewCenter.y), fabsf(ViewCenter.y - MinY)) * 2; if (Width > Height * AspectRatio) Height = Width / AspectRatio; const float f = Height / (m_fovy * (LC_PI / 180.0f)); const lcVector3 FrontVector(mTargetPosition - mPosition); Position = Center - lcNormalize(FrontVector) * f; TargetPosition = Center; } else { const lcVector3 CenterPosition(mPosition + Center - mTargetPosition); const lcMatrix44 ProjectionMatrix = lcMatrix44Perspective(m_fovy, AspectRatio, m_zNear, m_zFar); std::tie(Position, std::ignore) = lcZoomExtents(CenterPosition, mWorldView, ProjectionMatrix, Points.data(), Points.size()); TargetPosition = Center; } if (IsSimple()) AddKey = false; mPosition.ChangeKey(Position, Step, AddKey); mTargetPosition.ChangeKey(TargetPosition, Step, AddKey); UpdatePosition(Step); } void lcCamera::ZoomRegion(float AspectRatio, const lcVector3& Position, const lcVector3& TargetPosition, const lcVector3* Corners, lcStep Step, bool AddKey) { lcVector3 NewPosition; if (IsOrtho()) { float MinX = FLT_MAX, MaxX = -FLT_MAX, MinY = FLT_MAX, MaxY = -FLT_MAX; for (int PointIdx = 0; PointIdx < 2; PointIdx++) { const lcVector3 Point = lcMul30(Corners[PointIdx], mWorldView); MinX = lcMin(MinX, Point.x); MinY = lcMin(MinY, Point.y); MaxX = lcMax(MaxX, Point.x); MaxY = lcMax(MaxY, Point.y); } float Width = MaxX - MinX; float Height = MaxY - MinY; if (Width > Height * AspectRatio) Height = Width / AspectRatio; const float f = Height / (m_fovy * (LC_PI / 180.0f)); const lcVector3 FrontVector(mTargetPosition - mPosition); NewPosition = TargetPosition - lcNormalize(FrontVector) * f; } else { const lcMatrix44 WorldView = lcMatrix44LookAt(Position, TargetPosition, mUpVector); const lcMatrix44 ProjectionMatrix = lcMatrix44Perspective(m_fovy, AspectRatio, m_zNear, m_zFar); std::tie(NewPosition, std::ignore) = lcZoomExtents(Position, WorldView, ProjectionMatrix, Corners, 2); } if (IsSimple()) AddKey = false; mPosition.ChangeKey(NewPosition, Step, AddKey); mTargetPosition.ChangeKey(TargetPosition, Step, AddKey); UpdatePosition(Step); } void lcCamera::Zoom(float Distance, lcStep Step, bool AddKey) { lcVector3 FrontVector(mPosition - mTargetPosition); FrontVector.Normalize(); FrontVector *= -5.0f * Distance; // Don't zoom ortho in if it would cross the ortho focal plane. if (IsOrtho()) { if ((Distance > 0) && (lcDot(mPosition + FrontVector - mTargetPosition, mPosition - mTargetPosition) <= 0)) return; } if (IsSimple()) AddKey = false; mPosition.ChangeKey(mPosition + FrontVector, Step, AddKey); if (!IsOrtho()) mTargetPosition.ChangeKey(mTargetPosition + FrontVector, Step, AddKey); UpdatePosition(Step); } void lcCamera::Pan(const lcVector3& Distance, lcStep Step, bool AddKey) { if (IsSimple()) AddKey = false; mPosition.ChangeKey(mPosition + Distance, Step, AddKey); mTargetPosition.ChangeKey(mTargetPosition + Distance, Step, AddKey); UpdatePosition(Step); } void lcCamera::Orbit(float DistanceX, float DistanceY, const lcVector3& CenterPosition, lcStep Step, bool AddKey) { const lcMatrix44 Inverse = lcMatrix44AffineInverse(mWorldView); const lcMatrix44 TransformY = lcMatrix44FromAxisAngle(lcVector3(Inverse[0]), DistanceY); lcVector3 Position = lcMul31(mPosition - CenterPosition, TransformY) + CenterPosition; lcVector3 TargetPosition = lcMul31(mTargetPosition - CenterPosition, TransformY) + CenterPosition; lcVector3 UpVector = lcMul31(mUpVector, TransformY); const lcMatrix44 TransformX = lcMatrix44RotationZ(-DistanceX); Position = lcMul31(Position - CenterPosition, TransformX) + CenterPosition; TargetPosition = lcMul31(TargetPosition - CenterPosition, TransformX) + CenterPosition; UpVector = lcMul31(UpVector, TransformX); if (IsSimple()) AddKey = false; mPosition.ChangeKey(Position, Step, AddKey); mTargetPosition.ChangeKey(TargetPosition, Step, AddKey); mUpVector.ChangeKey(UpVector, Step, AddKey); UpdatePosition(Step); } void lcCamera::Roll(float Distance, lcStep Step, bool AddKey) { const lcVector3 FrontVector(mPosition - mTargetPosition); const lcMatrix44 Rotation = lcMatrix44FromAxisAngle(FrontVector, Distance); const lcVector3 UpVector = lcMul30(mUpVector, Rotation); if (IsSimple()) AddKey = false; mUpVector.ChangeKey(UpVector, Step, AddKey); UpdatePosition(Step); } void lcCamera::Center(const lcVector3& NewCenter, lcStep Step, bool AddKey) { const lcMatrix44 Inverse = lcMatrix44AffineInverse(mWorldView); const lcVector3 Direction = -lcVector3(Inverse[2]); // float Yaw, Pitch, Roll; float Roll; if (fabsf(Direction.z) < 0.9999f) { // Yaw = atan2f(Direction.y, Direction.x); // Pitch = asinf(Direction.z); Roll = atan2f(Inverse[0][2], Inverse[1][2]); } else { // Yaw = 0.0f; // Pitch = asinf(Direction.z); Roll = atan2f(Inverse[0][1], Inverse[1][1]); } lcVector3 FrontVector(mPosition - NewCenter); const lcMatrix44 Rotation = lcMatrix44FromAxisAngle(FrontVector, Roll); lcVector3 UpVector(0, 0, 1), SideVector; FrontVector.Normalize(); if (fabsf(lcDot(UpVector, FrontVector)) > 0.99f) SideVector = lcVector3(-1, 0, 0); else SideVector = lcCross(FrontVector, UpVector); UpVector = lcCross(SideVector, FrontVector); UpVector.Normalize(); UpVector = lcMul30(UpVector, Rotation); if (IsSimple()) AddKey = false; mTargetPosition.ChangeKey(NewCenter, Step, AddKey); mUpVector.ChangeKey(UpVector, Step, AddKey); UpdatePosition(Step); } void lcCamera::SetViewpoint(lcViewpoint Viewpoint) { const lcVector3 Positions[] = { lcVector3( 0.0f, -1250.0f, 0.0f), // lcViewpoint::Front lcVector3( 0.0f, 1250.0f, 0.0f), // lcViewpoint::Back lcVector3( 0.0f, 0.0f, 1250.0f), // lcViewpoint::Top lcVector3( 0.0f, 0.0f, -1250.0f), // lcViewpoint::Bottom lcVector3( 1250.0f, 0.0f, 0.0f), // lcViewpoint::Left lcVector3(-1250.0f, 0.0f, 0.0f), // lcViewpoint::Right lcVector3( 375.0f, -375.0f, 187.5f) // lcViewpoint::Home }; const lcVector3 Ups[] = { lcVector3(0.0f, 0.0f, 1.0f), lcVector3(0.0f, 0.0f, 1.0f), lcVector3(0.0f, 1.0f, 0.0f), lcVector3(0.0f,-1.0f, 0.0f), lcVector3(0.0f, 0.0f, 1.0f), lcVector3(0.0f, 0.0f, 1.0f), lcVector3(0.2357f, -0.2357f, 0.94281f) }; mPosition.ChangeKey(Positions[static_cast(Viewpoint)], 1, false); mTargetPosition.ChangeKey(lcVector3(0, 0, 0), 1, false); mUpVector.ChangeKey(Ups[static_cast(Viewpoint)], 1, false); UpdatePosition(1); } void lcCamera::SetViewpoint(const lcVector3& Position) { lcVector3 UpVector(0, 0, 1), FrontVector(Position), SideVector; FrontVector.Normalize(); if (fabsf(lcDot(UpVector, FrontVector)) > 0.99f) SideVector = lcVector3(-1, 0, 0); else SideVector = lcCross(FrontVector, UpVector); UpVector = lcCross(SideVector, FrontVector); UpVector.Normalize(); mPosition.ChangeKey(Position, 1, false); mTargetPosition.ChangeKey(lcVector3(0, 0, 0), 1, false); mUpVector.ChangeKey(UpVector, 1, false); UpdatePosition(1); } void lcCamera::SetViewpoint(const lcVector3& Position, const lcVector3& TargetPosition, const lcVector3& Up) { const lcVector3 Direction = TargetPosition - Position; lcVector3 UpVector, SideVector; SideVector = lcCross(Direction, Up); UpVector = lcCross(SideVector, Direction); UpVector.Normalize(); mPosition.ChangeKey(Position, 1, false); mTargetPosition.ChangeKey(TargetPosition, 1, false); mUpVector.ChangeKey(UpVector, 1, false); UpdatePosition(1); } void lcCamera::SetAngles(float Latitude, float Longitude, float Distance) { lcVector3 Position = lcVector3(0, -1, 0); lcVector3 TargetPosition = lcVector3(0, 0, 0); lcVector3 UpVector = lcVector3(0, 0, 1); const lcMatrix33 LongitudeMatrix = lcMatrix33RotationZ(LC_DTOR * Longitude); Position = lcMul(Position, LongitudeMatrix); const lcVector3 SideVector = lcMul(lcVector3(-1, 0, 0), LongitudeMatrix); const lcMatrix33 LatitudeMatrix = lcMatrix33FromAxisAngle(SideVector, LC_DTOR * Latitude); Position = lcMul(Position, LatitudeMatrix) * Distance; UpVector = lcMul(UpVector, LatitudeMatrix); mPosition.ChangeKey(Position, 1, false); mTargetPosition.ChangeKey(TargetPosition, 1, false); mUpVector.ChangeKey(UpVector, 1, false); UpdatePosition(1); } void lcCamera::GetAngles(float& Latitude, float& Longitude, float& Distance) const { lcVector3 FrontVector(mPosition - mTargetPosition); const lcVector3 X(1, 0, 0); const lcVector3 Y(0, 1, 0); const lcVector3 Z(0, 0, 1); FrontVector.Normalize(); Latitude = acos(lcDot(-FrontVector, Z)) * LC_RTOD - 90.0f; const lcVector3 CameraXY = -lcNormalize(lcVector3(FrontVector.x, FrontVector.y, 0.0f)); Longitude = acos(lcDot(CameraXY, Y)) * LC_RTOD; if (lcDot(CameraXY, X) > 0) Longitude = -Longitude; Distance = lcLength(mPosition); } leocad-25.09/common/camera.h000066400000000000000000000222331505543434300156610ustar00rootroot00000000000000#pragma once #include "object.h" #include "lc_math.h" #define LC_CAMERA_HIDDEN 0x0001 #define LC_CAMERA_SIMPLE 0x0002 #define LC_CAMERA_ORTHO 0x0004 #define LC_CAMERA_POSITION_SELECTED 0x0010 #define LC_CAMERA_POSITION_FOCUSED 0x0020 #define LC_CAMERA_TARGET_SELECTED 0x0040 #define LC_CAMERA_TARGET_FOCUSED 0x0080 #define LC_CAMERA_UPVECTOR_SELECTED 0x0100 #define LC_CAMERA_UPVECTOR_FOCUSED 0x0200 #define LC_CAMERA_SELECTION_MASK (LC_CAMERA_POSITION_SELECTED | LC_CAMERA_TARGET_SELECTED | LC_CAMERA_UPVECTOR_SELECTED) #define LC_CAMERA_FOCUS_MASK (LC_CAMERA_POSITION_FOCUSED | LC_CAMERA_TARGET_FOCUSED | LC_CAMERA_UPVECTOR_FOCUSED) enum class lcViewpoint { Front, Back, Top, Bottom, Left, Right, Home, Count }; enum class lcCameraType { Perspective, Orthographic, Count }; enum lcCameraSection : quint32 { LC_CAMERA_SECTION_INVALID = ~0U, LC_CAMERA_SECTION_POSITION = 0, LC_CAMERA_SECTION_TARGET, LC_CAMERA_SECTION_UPVECTOR }; class lcCamera : public lcObject { public: lcCamera(bool Simple); lcCamera(float ex, float ey, float ez, float tx, float ty, float tz); ~lcCamera(); lcCamera(const lcCamera&) = delete; lcCamera(lcCamera&&) = delete; lcCamera& operator=(const lcCamera&) = delete; lcCamera& operator=(lcCamera&&) = delete; static QString GetCameraTypeString(lcCameraType CameraType); static QStringList GetCameraTypeStrings(); static lcViewpoint GetViewpoint(const QString& ViewpointName); QString GetName() const override { return mName; } bool SetName(const QString& Name); void CreateName(const std::vector>& Cameras); bool IsSimple() const { return (mState & LC_CAMERA_SIMPLE) != 0; } lcCameraType GetCameraType() const { return ((mState & LC_CAMERA_ORTHO) == 0) ? lcCameraType::Perspective : lcCameraType::Orthographic; } bool SetCameraType(lcCameraType CameraType); bool IsOrtho() const { return (mState & LC_CAMERA_ORTHO) != 0; } void SetOrtho(bool Ortho) { if (Ortho) mState |= LC_CAMERA_ORTHO; else mState &= ~LC_CAMERA_ORTHO; } bool IsSelected() const override { return (mState & LC_CAMERA_SELECTION_MASK) != 0; } bool IsSelected(quint32 Section) const override { switch (Section) { case LC_CAMERA_SECTION_POSITION: return (mState & LC_CAMERA_POSITION_SELECTED) != 0; break; case LC_CAMERA_SECTION_TARGET: return (mState & LC_CAMERA_TARGET_SELECTED) != 0; break; case LC_CAMERA_SECTION_UPVECTOR: return (mState & LC_CAMERA_UPVECTOR_SELECTED) != 0; break; } return false; } void SetSelected(bool Selected) override { if (Selected) mState |= LC_CAMERA_SELECTION_MASK; else mState &= ~(LC_CAMERA_SELECTION_MASK | LC_CAMERA_FOCUS_MASK); } void SetSelected(quint32 Section, bool Selected) override { switch (Section) { case LC_CAMERA_SECTION_POSITION: if (Selected) mState |= LC_CAMERA_POSITION_SELECTED; else mState &= ~(LC_CAMERA_POSITION_SELECTED | LC_CAMERA_POSITION_FOCUSED); break; case LC_CAMERA_SECTION_TARGET: if (Selected) mState |= LC_CAMERA_TARGET_SELECTED; else mState &= ~(LC_CAMERA_TARGET_SELECTED | LC_CAMERA_TARGET_FOCUSED); break; case LC_CAMERA_SECTION_UPVECTOR: if (Selected) mState |= LC_CAMERA_UPVECTOR_SELECTED; else mState &= ~(LC_CAMERA_UPVECTOR_SELECTED | LC_CAMERA_UPVECTOR_FOCUSED); break; } } bool IsFocused() const override { return (mState & LC_CAMERA_FOCUS_MASK) != 0; } bool IsFocused(quint32 Section) const override { switch (Section) { case LC_CAMERA_SECTION_POSITION: return (mState & LC_CAMERA_POSITION_FOCUSED) != 0; break; case LC_CAMERA_SECTION_TARGET: return (mState & LC_CAMERA_TARGET_FOCUSED) != 0; break; case LC_CAMERA_SECTION_UPVECTOR: return (mState & LC_CAMERA_UPVECTOR_FOCUSED) != 0; break; } return false; } void SetFocused(quint32 Section, bool Focus) override { switch (Section) { case LC_CAMERA_SECTION_POSITION: if (Focus) mState |= LC_CAMERA_SELECTION_MASK | LC_CAMERA_POSITION_FOCUSED; else mState &= ~LC_CAMERA_POSITION_FOCUSED; break; case LC_CAMERA_SECTION_TARGET: if (Focus) mState |= LC_CAMERA_SELECTION_MASK | LC_CAMERA_TARGET_FOCUSED; else mState &= ~LC_CAMERA_TARGET_FOCUSED; break; case LC_CAMERA_SECTION_UPVECTOR: if (Focus) mState |= LC_CAMERA_SELECTION_MASK | LC_CAMERA_UPVECTOR_FOCUSED; else mState &= ~LC_CAMERA_UPVECTOR_FOCUSED; break; } } quint32 GetFocusSection() const override { if (mState & LC_CAMERA_POSITION_FOCUSED) return LC_CAMERA_SECTION_POSITION; if (mState & LC_CAMERA_TARGET_FOCUSED) return LC_CAMERA_SECTION_TARGET; if (mState & LC_CAMERA_UPVECTOR_FOCUSED) return LC_CAMERA_SECTION_UPVECTOR; return LC_CAMERA_SECTION_INVALID; } quint32 GetAllowedTransforms() const override { return LC_OBJECT_TRANSFORM_MOVE_XYZ; } lcVector3 GetSectionPosition(quint32 Section) const override { switch (Section) { case LC_CAMERA_SECTION_POSITION: return mPosition; case LC_CAMERA_SECTION_TARGET: return mTargetPosition; case LC_CAMERA_SECTION_UPVECTOR: return lcMul31(lcVector3(0, 25, 0), lcMatrix44AffineInverse(mWorldView)); } return lcVector3(0.0f, 0.0f, 0.0f); } lcMatrix33 GetRelativeRotation() const { const quint32 Section = GetFocusSection(); if (Section == LC_CAMERA_SECTION_POSITION) return lcMatrix33(mWorldView); else return lcMatrix33Identity(); } lcVector3 GetRotationCenter() const { const quint32 Section = GetFocusSection(); if (Section != LC_CAMERA_SECTION_TARGET) { return mPosition; } else { return mTargetPosition; } } void SaveLDraw(QTextStream& Stream) const; bool ParseLDrawLine(QTextStream& Stream); public: bool IsVisible() const { return (mState & LC_CAMERA_HIDDEN) == 0; } bool IsHidden() const { return (mState & LC_CAMERA_HIDDEN) != 0; } void SetHidden(bool Hidden) { if (Hidden) mState |= LC_CAMERA_HIDDEN; else mState &= ~LC_CAMERA_HIDDEN; } void SetPosition(const lcVector3& Position, lcStep Step, bool AddKey) { mPosition.ChangeKey(Position, Step, AddKey); } void SetTargetPosition(const lcVector3& TargetPosition, lcStep Step, bool AddKey) { mTargetPosition.ChangeKey(TargetPosition, Step, AddKey); } void SetUpVector(const lcVector3& UpVector, lcStep Step, bool AddKey) { mUpVector.ChangeKey(UpVector, Step, AddKey); } float GetOrthoHeight() const { // Compute the FOV/plane intersection radius. // d d // a = 2 atan(------) => ~ a = --- => d = af // 2f f const float f = (mPosition - mTargetPosition).Length(); return (m_fovy * f) * (LC_PI / 180.0f); } public: void RayTest(lcObjectRayTest& ObjectRayTest) const override; void BoxTest(lcObjectBoxTest& ObjectBoxTest) const override; void DrawInterface(lcContext* Context, const lcScene& Scene) const override; QVariant GetPropertyValue(lcObjectPropertyId PropertyId) const override; bool SetPropertyValue(lcObjectPropertyId PropertyId, lcStep Step, bool AddKey, QVariant Value) override; bool HasKeyFrame(lcObjectPropertyId PropertyId, lcStep Time) const override; bool SetKeyFrame(lcObjectPropertyId PropertyId, lcStep Time, bool KeyFrame) override; void RemoveKeyFrames() override; void InsertTime(lcStep Start, lcStep Time); void RemoveTime(lcStep Start, lcStep Time); static bool FileLoad(lcFile& file); void CompareBoundingBox(lcVector3& Min, lcVector3& Max); void UpdatePosition(lcStep Step) override; void CopyPosition(const lcCamera* Camera); void CopySettings(const lcCamera* Camera); void ZoomExtents(float AspectRatio, const lcVector3& Center, const std::vector& Points, lcStep Step, bool AddKey); void ZoomRegion(float AspectRatio, const lcVector3& Position, const lcVector3& TargetPosition, const lcVector3* Corners, lcStep Step, bool AddKey); void Zoom(float Distance, lcStep Step, bool AddKey); void Pan(const lcVector3& Distance, lcStep Step, bool AddKey); void Orbit(float DistanceX, float DistanceY, const lcVector3& CenterPosition, lcStep Step, bool AddKey); void Roll(float Distance, lcStep Step, bool AddKey); void Center(const lcVector3& NewCenter, lcStep Step, bool AddKey); void MoveSelected(lcStep Step, bool AddKey, const lcVector3& Distance); void MoveRelative(const lcVector3& Distance, lcStep Step, bool AddKey); void Rotate(lcStep Step, bool AddKey, const lcMatrix33& RotationMatrix, const lcVector3& Center, const lcMatrix33& RotationFrame); void SetViewpoint(lcViewpoint Viewpoint); void SetViewpoint(const lcVector3& Position); void SetViewpoint(const lcVector3& Position, const lcVector3& Target, const lcVector3& Up); void GetAngles(float& Latitude, float& Longitude, float& Distance) const; void SetAngles(float Latitude, float Longitude, float Distance); float m_fovy; float m_zNear; float m_zFar; lcMatrix44 mWorldView; lcObjectProperty mPosition = lcObjectProperty(lcVector3(0.0f, 0.0f, 0.0f)); lcObjectProperty mTargetPosition = lcObjectProperty(lcVector3(0.0f, 0.0f, 0.0f)); lcObjectProperty mUpVector = lcObjectProperty(lcVector3(0.0f, 0.0f, 0.0f)); protected: void Initialize(); QString mName; quint32 mState; }; leocad-25.09/common/group.cpp000066400000000000000000000021261505543434300161170ustar00rootroot00000000000000#include "lc_global.h" #include #include "group.h" #include "lc_file.h" lcGroup::lcGroup() { mGroup = nullptr; } void lcGroup::FileLoad(lcFile* File) { qint32 GroupIndex; char Name[LC_MAX_GROUP_NAME + 1]; File->ReadU8(); File->ReadBuffer(Name, sizeof(Name)); mName = QString::fromUtf8(Name); File->ReadVector3(); File->ReadS32(&GroupIndex, 1); mGroup = (lcGroup*)(quintptr)GroupIndex; } void lcGroup::CreateName(const std::vector>& Groups) { if (!mName.isEmpty()) { bool Found = false; for (const std::unique_ptr& Group : Groups) { if (Group->mName == mName) { Found = true; break; } } if (!Found) return; } int Max = 0; QString Prefix = QApplication::tr("Group #"); const int Length = Prefix.length(); for (const std::unique_ptr& Group : Groups) { const QString& Name = Group->mName; if (Name.startsWith(Prefix)) { bool Ok = false; int GroupNumber = Name.mid(Length).toInt(&Ok); if (Ok && GroupNumber > Max) Max = GroupNumber; } } mName = Prefix + QString::number(Max + 1); } leocad-25.09/common/group.h000066400000000000000000000004541505543434300155660ustar00rootroot00000000000000#pragma once #define LC_MAX_GROUP_NAME 64 class lcGroup { public: lcGroup(); lcGroup* GetTopGroup() { return mGroup ? mGroup->GetTopGroup() : this; } void FileLoad(lcFile* File); void CreateName(const std::vector>& Groups); lcGroup* mGroup; QString mName; }; leocad-25.09/common/image.cpp000066400000000000000000000065751505543434300160610ustar00rootroot00000000000000#include "lc_global.h" #include "image.h" #include "lc_file.h" static void CopyFromQImage(const QImage& Src, Image& Dest) { const bool Alpha = Src.hasAlphaChannel(); Dest.Allocate(Src.width(), Src.height(), Alpha ? lcPixelFormat::R8G8B8A8 : lcPixelFormat::R8G8B8); quint8* Bytes = (quint8*)Dest.mData; for (int y = 0; y < Dest.mHeight; y++) { for (int x = 0; x < Dest.mWidth; x++) { QRgb Pixel = Src.pixel(x, y); *Bytes++ = qRed(Pixel); *Bytes++ = qGreen(Pixel); *Bytes++ = qBlue(Pixel); if (Alpha) *Bytes++ = qAlpha(Pixel); } } } Image::Image() { mData = nullptr; mWidth = 0; mHeight = 0; mFormat = lcPixelFormat::Invalid; } Image::Image(Image&& Other) { mData = Other.mData; mWidth = Other.mWidth; mHeight = Other.mHeight; mFormat = Other.mFormat; Other.mData = nullptr; Other.mWidth = 0; Other.mHeight = 0; Other.mFormat = lcPixelFormat::Invalid; } Image::~Image() { FreeData(); } int Image::GetBPP() const { switch (mFormat) { case lcPixelFormat::Invalid: return 0; case lcPixelFormat::A8: return 1; case lcPixelFormat::L8A8: return 2; case lcPixelFormat::R8G8B8: return 3; case lcPixelFormat::R8G8B8A8: return 4; } return 0; } bool Image::HasAlpha() const { switch (mFormat) { case lcPixelFormat::Invalid: return false; case lcPixelFormat::A8: return true; case lcPixelFormat::L8A8: return true; case lcPixelFormat::R8G8B8: return false; case lcPixelFormat::R8G8B8A8: return true; } return 0; } void Image::FreeData() { free(mData); mData = nullptr; mWidth = 0; mHeight = 0; mFormat = lcPixelFormat::Invalid; } void Image::Allocate(int Width, int Height, lcPixelFormat Format) { FreeData(); mWidth = Width; mHeight = Height; mFormat = Format; mData = (unsigned char*)malloc(mWidth * mHeight * GetBPP()); } void Image::ResizePow2() { int i, shifted_x, shifted_y; shifted_x = mWidth; for (i = 0; ((i < 16) && (shifted_x != 0)); i++) shifted_x = shifted_x >> 1; shifted_x = (i != 0) ? 1 << (i-1) : 1; shifted_y = mHeight; for (i = 0; ((i < 16) && (shifted_y != 0)); i++) shifted_y = shifted_y >> 1; shifted_y = (i != 0) ? 1 << (i-1) : 1; if ((shifted_x != mWidth) || (shifted_y != mHeight)) Resize (shifted_x, shifted_y); } void Image::Resize(int width, int height) { int i, j, k, components, stx, sty; float accumx, accumy; unsigned char* bits = nullptr; components = GetBPP(); const int BufferSize = width * height * components; if (BufferSize) { bits = (unsigned char*)malloc(BufferSize); if (bits) { for (j = 0; j < mHeight; j++) { accumy = (float)height*j / (float)mHeight; sty = (int)floor(accumy); for (i = 0; i < mWidth; i++) { accumx = (float)width*i / (float)mWidth; stx = (int)floor(accumx); for (k = 0; k < components; k++) bits[(stx + sty*width)*components + k] = mData[(i + j * mWidth) * components + k]; } } } } free(mData); mData = bits; mWidth = width; mHeight = height; } bool Image::FileLoad(lcMemFile& File) { QImage Image; const unsigned char* Buffer = File.mBuffer + File.mPosition; const size_t BufferLength = File.mFileSize - File.mPosition; if (!Image.loadFromData(Buffer, (int)BufferLength)) return false; CopyFromQImage(Image, *this); return true; } bool Image::FileLoad(const QString& FileName) { QImage Image; if (!Image.load(FileName)) return false; CopyFromQImage(Image, *this); return true; } leocad-25.09/common/image.h000066400000000000000000000012561505543434300155150ustar00rootroot00000000000000#pragma once // Image Options #define LC_IMAGE_TRANSPARENT 0x2000 //#define LC_IMAGE_MASK 0x7000 enum class lcPixelFormat { Invalid, A8, L8A8, R8G8B8, R8G8B8A8 }; class Image { public: Image(); Image(Image&& Other); ~Image(); Image(const Image&) = delete; Image& operator=(const Image&) = delete; Image& operator=(Image&&) = delete; int GetBPP() const; bool HasAlpha() const; bool FileLoad(lcMemFile& File); bool FileLoad(const QString& FileName); void Resize(int Width, int Height); void ResizePow2(); void Allocate(int Width, int Height, lcPixelFormat Format); void FreeData(); int mWidth; int mHeight; lcPixelFormat mFormat; unsigned char* mData; }; leocad-25.09/common/lc_aboutdialog.cpp000066400000000000000000000045671505543434300177460ustar00rootroot00000000000000#include "lc_global.h" #include "lc_aboutdialog.h" #include "ui_lc_aboutdialog.h" #include "lc_mainwindow.h" #include "lc_view.h" #include "lc_glextensions.h" #include "lc_viewwidget.h" lcAboutDialog::lcAboutDialog(QWidget* Parent) : QDialog(Parent), ui(new Ui::lcAboutDialog) { ui->setupUi(this); #ifdef LC_CONTINUOUS_BUILD ui->version->setText(tr("LeoCAD Continuous Build %1").arg(QString::fromLatin1(QT_STRINGIFY(LC_CONTINUOUS_BUILD)))); #else ui->version->setText(tr("LeoCAD Version %1").arg(QString::fromLatin1(LC_VERSION_TEXT))); #endif lcViewWidget* Widget = gMainWindow->GetActiveView()->GetWidget(); QSurfaceFormat Format = Widget->context()->format(); int ColorDepth = Format.redBufferSize() + Format.greenBufferSize() + Format.blueBufferSize() + Format.alphaBufferSize(); const QString QtVersionFormat = tr("Qt Version %1 (compiled with %2)\n\n"); const QString QtVersion = QtVersionFormat.arg(qVersion(), QT_VERSION_STR); const QString VersionFormat = tr("OpenGL Version %1 (GLSL %2)\n%3 - %4\n\n"); const QString Version = VersionFormat.arg(QString((const char*)glGetString(GL_VERSION)), QString((const char*)glGetString(GL_SHADING_LANGUAGE_VERSION)), QString((const char*)glGetString(GL_RENDERER)), QString((const char*)glGetString(GL_VENDOR))); const QString BuffersFormat = tr("Color Buffer: %1 bits\nDepth Buffer: %2 bits\nStencil Buffer: %3 bits\n\n"); const QString Buffers = BuffersFormat.arg(QString::number(ColorDepth), QString::number(Format.depthBufferSize()), QString::number(Format.stencilBufferSize())); const QString ExtensionsFormat = tr("Buffers: %1\nShaders: %2\nFramebuffers: %3\nBlendFuncSeparate: %4\nAnisotropic: %5\n"); const QString VertexBuffers = gSupportsVertexBufferObject ? tr("Supported") : tr("Not supported"); const QString Shaders = gSupportsShaderObjects ? tr("Supported") : tr("Not supported"); const QString Framebuffers = gSupportsFramebufferObject ? tr("Supported") : tr("Not supported"); const QString BlendFuncSeparate = gSupportsBlendFuncSeparate ? tr("Supported") : tr("Not supported"); const QString Anisotropic = gSupportsAnisotropic ? tr("Supported (max %1)").arg(gMaxAnisotropy) : tr("Not supported"); const QString Extensions = ExtensionsFormat.arg(VertexBuffers, Shaders, Framebuffers, BlendFuncSeparate, Anisotropic); ui->info->setText(QtVersion + Version + Buffers + Extensions); } lcAboutDialog::~lcAboutDialog() { delete ui; } leocad-25.09/common/lc_aboutdialog.h000066400000000000000000000003451505543434300174010ustar00rootroot00000000000000#pragma once #include namespace Ui { class lcAboutDialog; } class lcAboutDialog : public QDialog { Q_OBJECT public: explicit lcAboutDialog(QWidget* Parent); ~lcAboutDialog(); private: Ui::lcAboutDialog* ui; }; leocad-25.09/common/lc_aboutdialog.ui000066400000000000000000000074141505543434300175730ustar00rootroot00000000000000 lcAboutDialog 0 0 400 215 About LeoCAD :/resources/leocad.png Qt::AlignCenter 16 LeoCAD Version 0.00.0 LeoCAD is a free application for creating virtual LEGO models. true <a href="https://www.leocad.org">https://www.leocad.org</a> true System Information false Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::Horizontal QDialogButtonBox::Ok buttonBox accepted() lcAboutDialog accept() 248 254 157 274 buttonBox rejected() lcAboutDialog reject() 316 260 286 274 leocad-25.09/common/lc_application.cpp000066400000000000000000001501201505543434300177420ustar00rootroot00000000000000#include "lc_global.h" #include #include "lc_application.h" #include "lc_library.h" #include "lc_profile.h" #include "project.h" #include "lc_mainwindow.h" #include "lc_qpreferencesdialog.h" #include "lc_partselectionwidget.h" #include "lc_shortcuts.h" #include "lc_view.h" #include "camera.h" #include "lc_previewwidget.h" #ifdef Q_OS_WIN #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) #include #endif #endif lcApplication* gApplication; void lcPreferences::LoadDefaults() { mFixedAxes = lcGetProfileInt(LC_PROFILE_FIXED_AXES); mMouseSensitivity = lcGetProfileInt(LC_PROFILE_MOUSE_SENSITIVITY); mShadingMode = static_cast(lcGetProfileInt(LC_PROFILE_SHADING_MODE)); mBackgroundGradient = lcGetProfileInt(LC_PROFILE_BACKGROUND_GRADIENT); mBackgroundSolidColor = lcGetProfileInt(LC_PROFILE_BACKGROUND_COLOR); mBackgroundGradientColorTop = lcGetProfileInt(LC_PROFILE_GRADIENT_COLOR_TOP); mBackgroundGradientColorBottom = lcGetProfileInt(LC_PROFILE_GRADIENT_COLOR_BOTTOM); mDrawAxes = lcGetProfileInt(LC_PROFILE_DRAW_AXES); mAxisIconLocation = static_cast(lcGetProfileInt(LC_PROFILE_DRAW_AXES_LOCATION)); mAxesColor = lcGetProfileInt(LC_PROFILE_AXES_COLOR); mTextColor = lcGetProfileInt(LC_PROFILE_TEXT_COLOR); mMarqueeBorderColor = lcGetProfileInt(LC_PROFILE_MARQUEE_BORDER_COLOR); mMarqueeFillColor = lcGetProfileInt(LC_PROFILE_MARQUEE_FILL_COLOR); mOverlayColor = lcGetProfileInt(LC_PROFILE_OVERLAY_COLOR); mActiveViewColor = lcGetProfileInt(LC_PROFILE_ACTIVE_VIEW_COLOR); mInactiveViewColor = lcGetProfileInt(LC_PROFILE_INACTIVE_VIEW_COLOR); mDrawEdgeLines = lcGetProfileInt(LC_PROFILE_DRAW_EDGE_LINES); mDrawConditionalLines = lcGetProfileInt(LC_PROFILE_DRAW_CONDITIONAL_LINES); mLineWidth = lcGetProfileFloat(LC_PROFILE_LINE_WIDTH); mAllowLOD = lcGetProfileInt(LC_PROFILE_ALLOW_LOD); mMeshLODDistance = lcGetProfileFloat(LC_PROFILE_LOD_DISTANCE); mFadeSteps = lcGetProfileInt(LC_PROFILE_FADE_STEPS); mFadeStepsColor = lcGetProfileInt(LC_PROFILE_FADE_STEPS_COLOR); mHighlightNewParts = lcGetProfileInt(LC_PROFILE_HIGHLIGHT_NEW_PARTS); mHighlightNewPartsColor = lcGetProfileInt(LC_PROFILE_HIGHLIGHT_NEW_PARTS_COLOR); mDrawGridStuds = lcGetProfileInt(LC_PROFILE_GRID_STUDS); mGridStudColor = lcGetProfileInt(LC_PROFILE_GRID_STUD_COLOR); mDrawGridLines = lcGetProfileInt(LC_PROFILE_GRID_LINES); mGridLineSpacing = lcGetProfileInt(LC_PROFILE_GRID_LINE_SPACING); mGridLineColor = lcGetProfileInt(LC_PROFILE_GRID_LINE_COLOR); mDrawGridOrigin = lcGetProfileInt(LC_PROFILE_GRID_ORIGIN); mViewSphereEnabled = lcGetProfileInt(LC_PROFILE_VIEW_SPHERE_ENABLED); mViewSphereLocation = static_cast(lcGetProfileInt(LC_PROFILE_VIEW_SPHERE_LOCATION)); mViewSphereSize = lcGetProfileInt(LC_PROFILE_VIEW_SPHERE_SIZE); mViewSphereColor = lcGetProfileInt(LC_PROFILE_VIEW_SPHERE_COLOR); mViewSphereTextColor = lcGetProfileInt(LC_PROFILE_VIEW_SPHERE_TEXT_COLOR); mViewSphereHighlightColor = lcGetProfileInt(LC_PROFILE_VIEW_SPHERE_HIGHLIGHT_COLOR); mAutoLoadMostRecent = lcGetProfileInt(LC_PROFILE_AUTOLOAD_MOSTRECENT); mRestoreTabLayout = lcGetProfileInt(LC_PROFILE_RESTORE_TAB_LAYOUT); mColorTheme = static_cast(lcGetProfileInt(LC_PROFILE_COLOR_THEME)); mPreviewViewSphereEnabled = lcGetProfileInt(LC_PROFILE_PREVIEW_VIEW_SPHERE_ENABLED); mPreviewViewSphereSize = lcGetProfileInt(LC_PROFILE_PREVIEW_VIEW_SPHERE_SIZE); mPreviewViewSphereLocation = static_cast(lcGetProfileInt(LC_PROFILE_PREVIEW_VIEW_SPHERE_LOCATION)); mDrawPreviewAxis = lcGetProfileInt(LC_PROFILE_PREVIEW_DRAW_AXES); mStudCylinderColorEnabled = lcGetProfileInt(LC_PROFILE_STUD_CYLINDER_COLOR_ENABLED); mStudCylinderColor = lcGetProfileInt(LC_PROFILE_STUD_CYLINDER_COLOR); mPartEdgeColorEnabled = lcGetProfileInt(LC_PROFILE_PART_EDGE_COLOR_ENABLED); mPartEdgeColor = lcGetProfileInt(LC_PROFILE_PART_EDGE_COLOR); mBlackEdgeColorEnabled = lcGetProfileInt(LC_PROFILE_BLACK_EDGE_COLOR_ENABLED); mBlackEdgeColor = lcGetProfileInt(LC_PROFILE_BLACK_EDGE_COLOR); mDarkEdgeColorEnabled = lcGetProfileInt(LC_PROFILE_DARK_EDGE_COLOR_ENABLED); mDarkEdgeColor = lcGetProfileInt(LC_PROFILE_DARK_EDGE_COLOR); mPartEdgeContrast = lcGetProfileFloat(LC_PROFILE_PART_EDGE_CONTRAST); mPartColorValueLDIndex = lcGetProfileFloat(LC_PROFILE_PART_COLOR_VALUE_LD_INDEX); mAutomateEdgeColor = lcGetProfileInt(LC_PROFILE_AUTOMATE_EDGE_COLOR); mObjectSelectedColor = lcGetProfileUInt(LC_PROFILE_OBJECT_SELECTED_COLOR); mObjectFocusedColor = lcGetProfileUInt(LC_PROFILE_OBJECT_FOCUSED_COLOR); mCameraColor = lcGetProfileUInt(LC_PROFILE_CAMERA_COLOR); mLightColor = lcGetProfileUInt(LC_PROFILE_LIGHT_COLOR); mControlPointColor = lcGetProfileUInt(LC_PROFILE_CONTROL_POINT_COLOR); mControlPointFocusedColor = lcGetProfileUInt(LC_PROFILE_CONTROL_POINT_FOCUSED_COLOR); } void lcPreferences::SaveDefaults() { lcSetProfileInt(LC_PROFILE_FIXED_AXES, mFixedAxes); lcSetProfileInt(LC_PROFILE_MOUSE_SENSITIVITY, mMouseSensitivity); lcSetProfileInt(LC_PROFILE_SHADING_MODE, static_cast(mShadingMode)); lcSetProfileInt(LC_PROFILE_DRAW_AXES, mDrawAxes); lcSetProfileInt(LC_PROFILE_DRAW_AXES_LOCATION, static_cast(mAxisIconLocation)); lcSetProfileInt(LC_PROFILE_AXES_COLOR, mAxesColor); lcSetProfileInt(LC_PROFILE_TEXT_COLOR, mTextColor); lcSetProfileInt(LC_PROFILE_BACKGROUND_GRADIENT, mBackgroundGradient); lcSetProfileInt(LC_PROFILE_BACKGROUND_COLOR, mBackgroundSolidColor); lcSetProfileInt(LC_PROFILE_GRADIENT_COLOR_TOP, mBackgroundGradientColorTop); lcSetProfileInt(LC_PROFILE_GRADIENT_COLOR_BOTTOM, mBackgroundGradientColorBottom); lcSetProfileInt(LC_PROFILE_MARQUEE_BORDER_COLOR, mMarqueeBorderColor); lcSetProfileInt(LC_PROFILE_MARQUEE_FILL_COLOR, mMarqueeFillColor); lcSetProfileInt(LC_PROFILE_OVERLAY_COLOR, mOverlayColor); lcSetProfileInt(LC_PROFILE_ACTIVE_VIEW_COLOR, mActiveViewColor); lcSetProfileInt(LC_PROFILE_INACTIVE_VIEW_COLOR, mInactiveViewColor); lcSetProfileInt(LC_PROFILE_DRAW_EDGE_LINES, mDrawEdgeLines); lcSetProfileInt(LC_PROFILE_DRAW_CONDITIONAL_LINES, mDrawConditionalLines); lcSetProfileFloat(LC_PROFILE_LINE_WIDTH, mLineWidth); lcSetProfileInt(LC_PROFILE_ALLOW_LOD, mAllowLOD); lcSetProfileFloat(LC_PROFILE_LOD_DISTANCE, mMeshLODDistance); lcSetProfileInt(LC_PROFILE_FADE_STEPS, mFadeSteps); lcSetProfileInt(LC_PROFILE_FADE_STEPS_COLOR, mFadeStepsColor); lcSetProfileInt(LC_PROFILE_HIGHLIGHT_NEW_PARTS, mHighlightNewParts); lcSetProfileInt(LC_PROFILE_HIGHLIGHT_NEW_PARTS_COLOR, mHighlightNewPartsColor); lcSetProfileInt(LC_PROFILE_GRID_STUDS, mDrawGridStuds); lcSetProfileInt(LC_PROFILE_GRID_STUD_COLOR, mGridStudColor); lcSetProfileInt(LC_PROFILE_GRID_LINES, mDrawGridLines); lcSetProfileInt(LC_PROFILE_GRID_LINE_SPACING, mGridLineSpacing); lcSetProfileInt(LC_PROFILE_GRID_LINE_COLOR, mGridLineColor); lcSetProfileInt(LC_PROFILE_GRID_ORIGIN, mDrawGridOrigin); lcSetProfileInt(LC_PROFILE_VIEW_SPHERE_ENABLED, mViewSphereSize ? 1 : 0); lcSetProfileInt(LC_PROFILE_VIEW_SPHERE_LOCATION, static_cast(mViewSphereLocation)); lcSetProfileInt(LC_PROFILE_VIEW_SPHERE_SIZE, mViewSphereSize); lcSetProfileInt(LC_PROFILE_VIEW_SPHERE_COLOR, mViewSphereColor); lcSetProfileInt(LC_PROFILE_VIEW_SPHERE_TEXT_COLOR, mViewSphereTextColor); lcSetProfileInt(LC_PROFILE_VIEW_SPHERE_HIGHLIGHT_COLOR, mViewSphereHighlightColor); lcSetProfileInt(LC_PROFILE_AUTOLOAD_MOSTRECENT, mAutoLoadMostRecent); lcSetProfileInt(LC_PROFILE_RESTORE_TAB_LAYOUT, mRestoreTabLayout); lcSetProfileInt(LC_PROFILE_COLOR_THEME, static_cast(mColorTheme)); lcSetProfileInt(LC_PROFILE_PREVIEW_VIEW_SPHERE_SIZE, mPreviewViewSphereSize); lcSetProfileInt(LC_PROFILE_PREVIEW_VIEW_SPHERE_LOCATION, static_cast(mPreviewViewSphereLocation)); lcSetProfileInt(LC_PROFILE_PREVIEW_DRAW_AXES, mDrawPreviewAxis); lcSetProfileInt(LC_PROFILE_STUD_CYLINDER_COLOR_ENABLED, mStudCylinderColorEnabled); lcSetProfileInt(LC_PROFILE_STUD_CYLINDER_COLOR, mStudCylinderColor); lcSetProfileInt(LC_PROFILE_PART_EDGE_COLOR_ENABLED, mPartEdgeColorEnabled); lcSetProfileInt(LC_PROFILE_PART_EDGE_COLOR, mPartEdgeColor); lcSetProfileInt(LC_PROFILE_BLACK_EDGE_COLOR_ENABLED, mBlackEdgeColorEnabled); lcSetProfileInt(LC_PROFILE_BLACK_EDGE_COLOR, mBlackEdgeColor); lcSetProfileInt(LC_PROFILE_DARK_EDGE_COLOR_ENABLED, mDarkEdgeColorEnabled); lcSetProfileInt(LC_PROFILE_DARK_EDGE_COLOR, mDarkEdgeColor); lcSetProfileFloat(LC_PROFILE_PART_EDGE_CONTRAST, mPartEdgeContrast); lcSetProfileFloat(LC_PROFILE_PART_COLOR_VALUE_LD_INDEX, mPartColorValueLDIndex); lcSetProfileInt(LC_PROFILE_AUTOMATE_EDGE_COLOR, mAutomateEdgeColor); lcSetProfileUInt(LC_PROFILE_OBJECT_SELECTED_COLOR, mObjectSelectedColor); lcSetProfileUInt(LC_PROFILE_OBJECT_FOCUSED_COLOR, mObjectFocusedColor); lcSetProfileUInt(LC_PROFILE_CAMERA_COLOR, mCameraColor); lcSetProfileUInt(LC_PROFILE_LIGHT_COLOR, mLightColor); lcSetProfileUInt(LC_PROFILE_CONTROL_POINT_COLOR, mControlPointColor); lcSetProfileUInt(LC_PROFILE_CONTROL_POINT_FOCUSED_COLOR, mControlPointFocusedColor); } void lcPreferences::SetInterfaceColors(lcColorTheme ColorTheme) { if (ColorTheme == lcColorTheme::Dark) { mAxesColor = LC_RGBA(160, 160, 160, 255); mTextColor = LC_RGBA(160, 160, 160, 255); mBackgroundSolidColor = LC_RGB(49, 52, 55); mBackgroundGradientColorTop = LC_RGB(0, 0, 191); mBackgroundGradientColorBottom = LC_RGB(255, 255, 255); mOverlayColor = lcGetProfileInt(LC_PROFILE_OVERLAY_COLOR); mActiveViewColor = LC_RGBA(41, 128, 185, 255); mGridStudColor = LC_RGBA(24, 24, 24, 192); mGridLineColor = LC_RGBA(24, 24, 24, 255); mViewSphereColor = LC_RGBA(35, 38, 41, 255); mViewSphereTextColor = LC_RGBA(224, 224, 224, 255); mViewSphereHighlightColor = LC_RGBA(41, 128, 185, 255); } else { mAxesColor = LC_RGBA(0, 0, 0, 255); mTextColor = LC_RGBA(0, 0, 0, 255); mBackgroundSolidColor = LC_RGB(255, 255, 255); mBackgroundGradientColorTop = LC_RGB(54, 72, 95); mBackgroundGradientColorBottom = LC_RGB(49, 52, 55); mOverlayColor = LC_RGBA(0, 0, 0, 255); mActiveViewColor = LC_RGBA(255, 0, 0, 255); mGridStudColor = LC_RGBA(64, 64, 64, 192); mGridLineColor = LC_RGBA(0, 0, 0, 255); mViewSphereColor = LC_RGBA(255, 255, 255, 255); mViewSphereTextColor = LC_RGBA(0, 0, 0, 255); mViewSphereHighlightColor = LC_RGBA(255, 0, 0, 255); } } lcApplication::lcApplication(int& Argc, char** Argv) : QApplication(Argc, Argv) { setApplicationDisplayName(QLatin1String("LeoCAD")); gApplication = this; mDefaultStyle = style()->objectName(); mPreferences.LoadDefaults(); } lcApplication::~lcApplication() { gApplication = nullptr; } void lcApplication::UpdateStyle() { if (mPreferences.mColorTheme == lcColorTheme::Dark) { if (!QApplication::setStyle("fusion")) return; QPalette Palette = QApplication::palette(); Palette.setColor(QPalette::Window, QColor(49, 52, 55)); Palette.setColor(QPalette::WindowText, QColor(240, 240, 240)); Palette.setColor(QPalette::Base, QColor(35, 38, 41)); Palette.setColor(QPalette::AlternateBase, QColor(44, 47, 50)); Palette.setColor(QPalette::ToolTipBase, QColor(224, 224, 244)); Palette.setColor(QPalette::ToolTipText, QColor(58, 58, 58)); #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) Palette.setColor(QPalette::PlaceholderText, QColor(100, 100, 100)); #endif Palette.setColor(QPalette::Text, QColor(224, 224, 224)); Palette.setColor(QPalette::Button, QColor(45, 48, 51)); Palette.setColor(QPalette::ButtonText, QColor(224, 224, 244)); Palette.setColor(QPalette::Light, QColor(65, 65, 65)); Palette.setColor(QPalette::Midlight, QColor(62, 62, 62)); Palette.setColor(QPalette::Dark, QColor(35, 35, 35)); Palette.setColor(QPalette::Mid, QColor(50, 50, 50)); Palette.setColor(QPalette::Shadow, QColor(20, 20, 20)); // Palette.setColor(QPalette::Highlight, QColor(46, 108, 219)); Palette.setColor(QPalette::Highlight, QColor(41, 128, 185)); Palette.setColor(QPalette::HighlightedText, QColor(232, 232, 232)); Palette.setColor(QPalette::Link, QColor(41, 128, 185)); Palette.setColor(QPalette::Disabled, QPalette::Text, QColor(128, 128, 128)); Palette.setColor(QPalette::Disabled, QPalette::WindowText, QColor(128, 128, 128)); Palette.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(128, 128, 128)); QApplication::setPalette(Palette); QFile StylesheetFile(QLatin1String(":/stylesheet/stylesheet.qss")); if (StylesheetFile.open(QIODevice::ReadOnly)) { QString Stylesheet = QString::fromLatin1(StylesheetFile.readAll()); qApp->setStyleSheet(Stylesheet); } } else { QApplication::setStyle(mDefaultStyle); QApplication::setPalette(qApp->style()->standardPalette()); qApp->setStyleSheet(QString()); } } void lcApplication::SaveTabLayout() const { if (!mProject || mProject->GetFileName().isEmpty()) return; QSettings Settings; QByteArray TabLayout = gMainWindow->GetTabLayout(); Settings.setValue(GetTabLayoutKey(), TabLayout); } QString lcApplication::GetTabLayoutKey() const { if (mProject) { QString FileName = mProject->GetFileName(); if (!FileName.isEmpty()) { FileName.replace('\\', '?'); FileName.replace('/', '?'); return QString("TabLayouts/%1").arg(FileName); } } return QString(); } void lcApplication::SetProject(Project* Project) { SaveTabLayout(); if (gMainWindow) { gMainWindow->RemoveAllModelTabs(); if (gMainWindow->GetPreviewWidget()) gMainWindow->GetPreviewWidget()->ClearPreview(); } delete mProject; mProject = Project; Project->SetActiveModel(0, true); lcGetPiecesLibrary()->RemoveTemporaryPieces(); if (mProject && !mProject->GetFileName().isEmpty() && mPreferences.mRestoreTabLayout) { QSettings Settings; QByteArray TabLayout = Settings.value(GetTabLayoutKey()).toByteArray(); if (gMainWindow) gMainWindow->RestoreTabLayout(TabLayout); } } void lcApplication::SetClipboard(const QByteArray& Clipboard) { mClipboard = Clipboard; gMainWindow->UpdatePaste(!mClipboard.isEmpty()); } void lcApplication::ExportClipboard(const QByteArray& Clipboard) { QMimeData* MimeData = new QMimeData(); MimeData->setData("application/vnd.leocad-clipboard", Clipboard); QApplication::clipboard()->setMimeData(MimeData); SetClipboard(Clipboard); } bool lcApplication::LoadPartsLibrary(const QList>& LibraryPaths, bool OnlyUsePaths) { if (mLibrary == nullptr) mLibrary = new lcPiecesLibrary(); const bool ShowProgress = gMainWindow != nullptr; if (!OnlyUsePaths) { char* EnvPath = getenv("LEOCAD_LIB"); if (EnvPath && EnvPath[0]) return mLibrary->Load(EnvPath, ShowProgress); QString CustomPath = lcGetProfileString(LC_PROFILE_PARTS_LIBRARY); if (!CustomPath.isEmpty()) return mLibrary->Load(CustomPath, ShowProgress); } for (const QPair& LibraryPathEntry : LibraryPaths) { if (mLibrary->Load(LibraryPathEntry.first, ShowProgress)) { if (LibraryPathEntry.second) mLibrary->SetOfficialPieces(); return true; } } return false; } lcCommandLineOptions lcApplication::ParseCommandLineOptions() { lcPreferences Preferences; Preferences.LoadDefaults(); lcCommandLineOptions Options; Options.FadeSteps = Preferences.mFadeSteps; Options.ImageHighlight = Preferences.mHighlightNewParts; Options.ImageWidth = lcGetProfileInt(LC_PROFILE_IMAGE_WIDTH); Options.ImageHeight = lcGetProfileInt(LC_PROFILE_IMAGE_HEIGHT); Options.ShadingMode = Preferences.mShadingMode; Options.LineWidth = Preferences.mLineWidth; Options.AASamples = lcGetProfileInt(LC_PROFILE_ANTIALIASING_SAMPLES); Options.StudStyle = static_cast(lcGetProfileInt(LC_PROFILE_STUD_STYLE)); Options.ImageStart = 0; Options.ImageEnd = 0; Options.CameraPosition[0] = lcVector3(0.0f, 0.0f, 0.0f); Options.CameraPosition[1] = lcVector3(0.0f, 0.0f, 0.0f); Options.CameraPosition[2] = lcVector3(0.0f, 0.0f, 0.0f); Options.CameraLatLon = lcVector2(0.0f, 0.0f); Options.FoV = 0.0f; Options.ZPlanes = lcVector2(0.0f, 0.0f); Options.Viewpoint = lcViewpoint::Count; Options.FadeStepsColor = Preferences.mFadeStepsColor; Options.HighlightColor = Preferences.mHighlightNewPartsColor; Options.StudCylinderColorEnabled = Preferences.mStudCylinderColorEnabled; Options.StudCylinderColor = Preferences.mStudCylinderColor; Options.PartEdgeColorEnabled = Preferences.mPartEdgeColorEnabled; Options.PartEdgeColor = Preferences.mPartEdgeColor; Options.BlackEdgeColorEnabled = Preferences.mBlackEdgeColorEnabled; Options.BlackEdgeColor = Preferences.mBlackEdgeColor; Options.DarkEdgeColorEnabled = Preferences.mDarkEdgeColorEnabled; Options.DarkEdgeColor = Preferences.mDarkEdgeColor; Options.PartEdgeContrast = Preferences.mPartEdgeContrast; Options.PartColorValueLDIndex = Preferences.mPartColorValueLDIndex; Options.AutomateEdgeColor = Preferences.mAutomateEdgeColor; QStringList Arguments = arguments(); if (Arguments.isEmpty()) return Options; Arguments.removeFirst(); while (!Arguments.isEmpty()) { QString Option = Arguments.takeFirst(); if (Option.isEmpty()) continue; auto ParseString = [&Option, &Arguments, &Options](QString& Value, bool Required) { if (!Arguments.isEmpty() && Arguments.front()[0] != '-') { QString Parameter = Arguments.takeFirst(); Value = Parameter; } else if (Required) { Options.StdErr += tr("Not enough parameters for the '%1' option.\n").arg(Option); Options.ParseOK = false; return false; } return true; }; auto ParseInteger = [&Option, &Arguments, &Options](int& Value, int Min, int Max) { if (!Arguments.isEmpty() && Arguments.front()[0] != '-') { bool Ok = false; QString Parameter = Arguments.takeFirst(); int NewValue = Parameter.toInt(&Ok); if (Ok && NewValue >= Min && NewValue <= Max) { Value = NewValue; return true; } else Options.StdErr += tr("Invalid parameter value specified for the '%1' option: '%2'.\n").arg(Option, Parameter); } else Options.StdErr += tr("Not enough parameters for the '%1' option.\n").arg(Option); Options.ParseOK = false; return false; }; auto ParseUnsigned = [&Option, &Arguments, &Options](uint& Value, uint Min, uint Max) { if (!Arguments.isEmpty() && Arguments.front()[0] != '-') { bool Ok = false; QString Parameter = Arguments.takeFirst(); uint NewValue = Parameter.toUInt(&Ok); if (Ok && NewValue >= Min && NewValue <= Max) { Value = NewValue; return true; } else Options.StdErr += tr("Invalid parameter value specified for the '%1' option: '%2'.\n").arg(Option, Parameter); } else Options.StdErr += tr("Not enough parameters for the '%1' option.\n").arg(Option); Options.ParseOK = false; return false; }; auto ParseFloat = [&Option, &Arguments, &Options](float& Value, float Min, float Max) { if (!Arguments.isEmpty() && Arguments.front()[0] != '-') { bool Ok = false; QString Parameter = Arguments.takeFirst(); float NewValue = Parameter.toFloat(&Ok); if (Ok && NewValue >= Min && NewValue <= Max) { Value = NewValue; return true; } else Options.StdErr += tr("Invalid parameter value specified for the '%1' option: '%2'.\n").arg(Option, Parameter); } else Options.StdErr += tr("Not enough parameters for the '%1' option.\n").arg(Option); Options.ParseOK = false; return false; }; auto ParseFloatArray = [&Option, &Arguments, &Options](int Count, float* ValueArray, bool NegativesValid) { if (Arguments.size() < Count) { Options.StdErr += tr("Not enough parameters for the '%1' option.\n").arg(Option); Arguments.clear(); Options.ParseOK = false; return false; } for (int ParseIndex = 0; ParseIndex < Count; ParseIndex++) { if (NegativesValid || Arguments.front()[0] != '-') { bool Ok = false; QString Parameter = Arguments.takeFirst(); float NewValue = Parameter.toFloat(&Ok); if (Ok) { *(ValueArray++) = NewValue; continue; } Options.StdErr += tr("Invalid parameter value specified for the '%1' option: '%2'.\n").arg(Option, Parameter); } else Options.StdErr += tr("Not enough parameters for the '%1' option.\n").arg(Option); Options.ParseOK = false; return false; } return true; }; auto ParseColor = [&Option, &Arguments, &Options](quint32& Color) { if (!Arguments.isEmpty() && Arguments.front()[0] != '-') { QString Parameter = Arguments.takeFirst(); QColor ParsedColor = QColor(Parameter); if (ParsedColor.isValid()) { Color = LC_RGBA(ParsedColor.red(), ParsedColor.green(), ParsedColor.blue(), ParsedColor.alpha()); return true; } else Options.StdErr += tr("Invalid parameter value specified for the '%1' option: '%2'.\n").arg(Option, Parameter); } else Options.StdErr += tr("Not enough parameters for the '%1' option.\n").arg(Option); Options.ParseOK = false; return false; }; if (Option[0] != '-') { if (QFileInfo(Option).isReadable()) Options.ProjectName = Option; else Options.StdErr += tr("The file '%1' is not readable.\n").arg(Option); continue; } if (Option == QLatin1String("-l") || Option == QLatin1String("--libpath")) { QString LibPath; if (ParseString(LibPath, true)) Options.LibraryPaths += QPair(LibPath, false); } else if (Option == QLatin1String("-i") || Option == QLatin1String("--image")) { Options.SaveImage = true; ParseString(Options.ImageName, false); } else if (Option == QLatin1String("-w") || Option == QLatin1String("--width")) ParseInteger(Options.ImageWidth, 1, INT_MAX); else if (Option == QLatin1String("-h") || Option == QLatin1String("--height")) ParseInteger(Options.ImageHeight, 1, INT_MAX); else if (Option == QLatin1String("-f") || Option == QLatin1String("--from")) ParseUnsigned(Options.ImageStart, 1, LC_STEP_MAX); else if (Option == QLatin1String("-t") || Option == QLatin1String("--to")) ParseUnsigned(Options.ImageEnd, 1, LC_STEP_MAX); else if (Option == QLatin1String("-s") || Option == QLatin1String("--submodel")) ParseString(Options.ModelName, true); else if (Option == QLatin1String("-c") || Option == QLatin1String("--camera")) ParseString(Options.CameraName, true); else if (Option == QLatin1String("--viewpoint")) { QString ViewpointName; if (ParseString(ViewpointName, true)) { Options.Viewpoint = lcCamera::GetViewpoint(ViewpointName); if (Options.Viewpoint == lcViewpoint::Count) { Options.StdErr += tr("Invalid parameter value specified for the '%1' option: '%2'.\n").arg(Option, ViewpointName); Options.ParseOK = false; } } } else if (Option == QLatin1String("--camera-angles")) { if ((Options.SetCameraAngles = ParseFloatArray(2, Options.CameraLatLon.GetFloats(), true)) && (fabsf(Options.CameraLatLon[0]) > 360.0f || fabsf(Options.CameraLatLon[1]) > 360.0f)) { Options.StdErr += tr("Invalid parameter value(s) specified for the '%1' option: limits are +/- 360.\n").arg(Option); Options.ParseOK = false; } } else if (Option == QLatin1String("--camera-position") || Option == QLatin1String("--camera-position-ldraw")) { if ((Options.SetCameraPosition = ParseFloatArray(9, Options.CameraPosition[0].GetFloats(), true))) { if (Option == QLatin1String("--camera-position-ldraw")) { Options.CameraPosition[0] = lcVector3LDrawToLeoCAD(Options.CameraPosition[0]); Options.CameraPosition[1] = lcVector3LDrawToLeoCAD(Options.CameraPosition[1]); Options.CameraPosition[2] = lcVector3LDrawToLeoCAD(Options.CameraPosition[2]); } lcVector3 Front = Options.CameraPosition[1] - Options.CameraPosition[0]; if (Front.LengthSquared() < 0.1f) { Options.StdErr += tr("The camera position is too close to the camera target of the '%1' option.\n").arg(Option); Options.ParseOK = false; } else if (Options.CameraPosition[2].LengthSquared() < 0.1f) { Options.StdErr += tr("Invalid up vector length specified for the '%1' option.\n").arg(Option); Options.ParseOK = false; } else if (fabsf(lcDot(lcNormalize(Front), lcNormalize(Options.CameraPosition[2]))) > 0.99f) { Options.StdErr += tr("The up vector is parallel to the front vector specified for the '%1' option.\n").arg(Option); Options.ParseOK = false; } } } else if (Option == QLatin1String("--orthographic")) Options.Orthographic = true; else if (Option == QLatin1String("--fov")) Options.SetFoV = ParseFloat(Options.FoV, 1.0f, 180.0f); else if (Option == QLatin1String("--zplanes")) { if ((Options.SetZPlanes = ParseFloatArray(2, Options.ZPlanes.GetFloats(), false)) && (Options.ZPlanes[0] < 1.0 || Options.ZPlanes[0] >= Options.ZPlanes[1])) { Options.StdErr += tr("Invalid parameter value(s) specified for the '%1' option: requirements are: 1 <= < .\n").arg(Option); Options.ParseOK = false; } } else if (Option == QLatin1String("-nscc") || Option == QLatin1String("--disable-stud-cylinder-color")) Options.StudCylinderColorEnabled = false; else if (Option == QLatin1String("-scc") || Option == QLatin1String("--stud-cylinder-color")) ParseColor(Options.StudCylinderColor); else if (Option == QLatin1String("-nec") || Option == QLatin1String("--disable-edge-color")) Options.PartEdgeColorEnabled = false; else if (Option == QLatin1String("-ec") || Option == QLatin1String("--edge-color")) ParseColor(Options.PartEdgeColor); else if (Option == QLatin1String("-nbec") || Option == QLatin1String("--disable-black-edge-color")) Options.BlackEdgeColorEnabled = false; else if (Option == QLatin1String("-bec") || Option == QLatin1String("--black-edge-color")) ParseColor(Options.BlackEdgeColor); else if (Option == QLatin1String("-ndec") || Option == QLatin1String("--disable-dark-edge-color")) Options.DarkEdgeColorEnabled = false; else if (Option == QLatin1String("-dec") || Option == QLatin1String("--dark-edge-color")) ParseColor(Options.DarkEdgeColor); else if (Option == QLatin1String("-aec") || Option == QLatin1String("--automate-edge-color")) Options.AutomateEdgeColor = true; else if (Option == QLatin1String("-cc") || Option == QLatin1String("--color-contrast")) ParseFloat(Options.PartEdgeContrast, 0.0f, 1.0f); else if (Option == QLatin1String("-ldv") || Option == QLatin1String("--light-dark-value")) ParseFloat(Options.PartColorValueLDIndex, 0.0f, 1.0f); else if (Option == QLatin1String("--fade-steps")) Options.FadeSteps = true; else if (Option == QLatin1String("--no-fade-steps")) Options.FadeSteps = false; else if (Option == QLatin1String("--fade-steps-color")) { if (ParseColor(Options.FadeStepsColor)) { Options.SetFadeStepsColor = true; Options.FadeSteps = true; } } else if (Option == QLatin1String("--highlight")) Options.ImageHighlight = true; else if (Option == QLatin1String("--no-highlight")) Options.ImageHighlight = false; else if (Option == QLatin1String("--highlight-color")) { if (ParseColor(Options.HighlightColor)) { Options.SetHighlightColor = true; Options.ImageHighlight = true; } } else if (Option == QLatin1String("--shading")) { QString ShadingString; if (ParseString(ShadingString, true)) { if (ShadingString == QLatin1String("wireframe")) Options.ShadingMode = lcShadingMode::Wireframe; else if (ShadingString == QLatin1String("flat")) Options.ShadingMode = lcShadingMode::Flat; else if (ShadingString == QLatin1String("default")) Options.ShadingMode = lcShadingMode::DefaultLights; else if (ShadingString == QLatin1String("full")) Options.ShadingMode = lcShadingMode::Full; else { Options.StdErr += tr("Invalid parameter value specified for the '%1' option: '%2'.\n").arg(Option, ShadingString); Options.ParseOK = false; } } } else if (Option == QLatin1String("--line-width")) ParseFloat(Options.LineWidth, 0.0f, 10.0f); else if (Option == QLatin1String("--aa-samples")) { if (ParseInteger(Options.AASamples, 1, 8) && Options.AASamples != 1 && Options.AASamples != 2 && Options.AASamples != 4 && Options.AASamples != 8) { Options.StdErr += tr("Invalid parameter value specified for the '%1' option: '%2'.\n").arg(Option, QString::number(Options.AASamples)); Options.ParseOK = false; } } else if (Option == QLatin1String("-ss") || Option == QLatin1String("--stud-style")) { int StudStyle; if (ParseInteger(StudStyle, 0, static_cast(lcStudStyle::Count) - 1)) Options.StudStyle = static_cast(StudStyle); } else if (Option == QLatin1String("-obj") || Option == QLatin1String("--export-wavefront")) { Options.SaveWavefront = true; ParseString(Options.SaveWavefrontName, false); } else if (Option == QLatin1String("-3ds") || Option == QLatin1String("--export-3ds")) { Options.Save3DS = true; ParseString(Options.Save3DSName, false); } else if (Option == QLatin1String("-dae") || Option == QLatin1String("--export-collada")) { Options.SaveCOLLADA = true; ParseString(Options.SaveCOLLADAName, false); } else if (Option == QLatin1String("-csv") || Option == QLatin1String("--export-csv")) { Options.SaveCSV = true; ParseString(Options.SaveCSVName, false); } else if (Option == QLatin1String("-html") || Option == QLatin1String("--export-html")) { Options.SaveHTML = true; ParseString(Options.SaveHTMLName, false); } else if (Option == QLatin1String("-v") || Option == QLatin1String("--version")) { #ifdef LC_CONTINUOUS_BUILD Options.StdOut += tr("LeoCAD Continuous Build %1\n").arg(QT_STRINGIFY(LC_CONTINUOUS_BUILD)); #else Options.StdOut += tr("LeoCAD Version %1\n").arg(LC_VERSION_TEXT); #endif Options.StdOut += tr("Compiled %1\n").arg(__DATE__); Options.Exit = true; } else if (Option == QLatin1String("-?") || Option == QLatin1String("--help")) { Options.StdOut += tr("Usage: leocad [options] [file]\n"); Options.StdOut += tr(" [options] can be:\n"); Options.StdOut += tr(" -l, --libpath : Set the Parts Library location to path.\n"); Options.StdOut += tr(" -i, --image : Save a picture in the format specified by ext and exit.\n"); Options.StdOut += tr(" -w, --width : Set the picture width.\n"); Options.StdOut += tr(" -h, --height : Set the picture height.\n"); Options.StdOut += tr(" -f, --from : Set the first step to save pictures.\n"); Options.StdOut += tr(" -t, --to : Set the last step to save pictures.\n"); Options.StdOut += tr(" -s, --submodel : Set the active submodel.\n"); Options.StdOut += tr(" -c, --camera : Set the active camera.\n"); Options.StdOut += tr(" --viewpoint : Set the view to one of the preset viewpoints (front, back, left, right, top, bottom, home).\n"); Options.StdOut += tr(" --camera-angles : Set the camera angles in degrees around the model.\n"); Options.StdOut += tr(" --camera-position : Set the camera position, target and up vector.\n"); Options.StdOut += tr(" --camera-position-ldraw : Set the camera position, target and up vector using LDraw coordinates.\n"); Options.StdOut += tr(" --orthographic: Render images using an orthographic projection.\n"); Options.StdOut += tr(" --fov : Set the vertical field of view used to render images (< 180).\n"); Options.StdOut += tr(" --zplanes : Set the near and far clipping planes used to render images (1 <= < ).\n"); Options.StdOut += tr(" --fade-steps: Render parts from prior steps faded.\n"); Options.StdOut += tr(" --no-fade-steps: Do not render parts from prior steps faded.\n"); Options.StdOut += tr(" --fade-steps-color <#AARRGGBB>: Renderinng color for prior step parts.\n"); Options.StdOut += tr(" --highlight: Highlight parts in the steps they appear.\n"); Options.StdOut += tr(" --no-highlight: Do not highlight parts in the steps they appear.\n"); Options.StdOut += tr(" --highlight-color <#AARRGGBB>: Rendering color for highlighted parts.\n"); Options.StdOut += tr(" --shading : Select shading mode for rendering (wireframe, flat, default, full).\n"); Options.StdOut += tr(" --line-width : Set the width of the edge lines.\n"); Options.StdOut += tr(" --aa-samples : AntiAliasing sample size (1, 2, 4, or 8).\n"); Options.StdOut += tr(" -ss, --stud-style S Close 18 N leocad-25.09/resources/stylesheet/stylesheet.qrc000066400000000000000000000005411505543434300220710ustar00rootroot00000000000000 stylesheet.qss branch_closed.png branch_end.png branch_more.png branch_open.png branch_vline.png close.svg undock.png leocad-25.09/resources/stylesheet/stylesheet.qss000066400000000000000000000041771505543434300221230ustar00rootroot00000000000000QToolTip { color: rgb(58, 58, 58); background-color: rgb(224, 224, 224); border: 0px; } QMenu::separator { height: 1px; background: rgb(80, 80, 80); margin-left: 10px; margin-right: 5px; } QToolBar { border: none; } QToolButton:checked { background-color: rgb(87, 97, 98); } QTreeView::branch { background: transparent; } QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/stylesheet/branch_vline.png); } QTreeView::branch:has-siblings:adjoins-item { border-image: url(:/stylesheet/branch_more.png); } QTreeView::branch:!has-children:!has-siblings:adjoins-item { border-image: url(:/stylesheet/branch_end.png); } QTreeView::branch:closed:has-children:has-siblings { border-image: url(:/stylesheet/branch_closed.png); } QTreeView::branch:has-children:!has-siblings:closed { border-image: url(:/stylesheet/branch_closed.png); } QTreeView::branch:open:has-children:has-siblings { border-image: url(:/stylesheet/branch_open.png); } QTreeView::branch:open:has-children:!has-siblings { border-image: url(:/stylesheet/branch_open.png); } QDockWidget { titlebar-close-icon: url(:/stylesheet/close.svg); titlebar-normal-icon: url(:/stylesheet/undock.png); } QDockWidget::close-button, QDockWidget::float-button { border: none; border-radius: 3px; subcontrol-origin: padding; subcontrol-position: right center; } QDockWidget::close-button { right: 4px; } QDockWidget::float-button { right: 22px; } QDockWidget::close-button:hover, QDockWidget::float-button:hover { background-color: rgba(255, 255, 255, 30); } QDockWidget::title { text-align: center; border: 4px solid transparent; padding: 4px 0px; } QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { background-color: rgba(255, 255, 255, 40); } QTabBar::close-button { background-image: url(:/stylesheet/close.svg); background-position: center center; background-repeat: none; } QTabBar::close-button:hover { background-color: rgba(255, 255, 255, 30); } QTabBar::close-button:pressed { background-color: rgba(255, 255, 255, 40); } leocad-25.09/resources/stylesheet/undock.png000066400000000000000000000003631505543434300211640ustar00rootroot00000000000000PNG  IHDRH-bKGDC pHYs  tIME 2 iTXtCommentCreated with GIMPd.eWIDAT(SQA >z9f]JQtfW& 0~s$JV E͹wޑ1ce3&]mfD4u-IENDB`leocad-25.09/resources/time_add_keys.png000066400000000000000000000027071505543434300203150ustar00rootroot00000000000000PNG  IHDRw=gAMA a cHRMz%u0`:o_FbKGD pHYs+IDATHǥ[le߷]vڵ&0`'SA"db$x#*(1zcFDh8ۀ2umwx& y^IZgTdBG$:֜3_qa_O 9@ni5dWr)wz h( )t$A L٠erwU&вK>b'WvR@H`LJ[ S2;OSo-.|(msw׬# jhEo9d>gQs!9o1ǦЪ<(=(^:H d.?il@r癢'dƔk#f㉟Hr0Qr!9Zt KpRр(E̞ʒC$TszH;2)^^ϦUsMKrXR@nvn"]`B6dZ¼ճ vvv˚1wZpY C$x@Π{$4_ d2q4b$=.  Իj!tL."&`-FNMI%cqe,TH>f& |#--UAՋ]E$"4`Άf6@/-U@5˼[T `@ IB0{p~l*h-U@z2xf<+A u;fіK{cٜ6F[Yd}^T@.0d1x 9Y"Fmu 0 :~v޵V-KfnS^FT9\{y% \&x8"*imRUpxLT6Sǎ$4_A$%6]QSL.X ! tq!R<)$O<_y042!]B; Q<^U}|M*>JsBcBQ/}tZ  ٲ2t !U@1+!ct׷O@XqL2+jǸit]| pJ.h@%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/resources/time_first.png000066400000000000000000000024151505543434300176550ustar00rootroot00000000000000PNG  IHDRw=gAMA a cHRMz%u0`:o_FbKGD pHYs  IDATHǕ[UΙљAcS],o&a8>&]+(1"A‡ "f ,2*"uʣsqsξz89.lo}{̌q[Uj8eurohOb:̠!U#s+2A:KB% VSl{֧^6X"eǫf( a*0Sb4j};k ݛ>H.7Am M h!#CB Ҟ{_qQT6AT jĤXl=sV߽{V. AIQIIIވވ6DB1Q^ _}o၎!> !)1R^bJJC_020w,o:I #E%%F#E{W0P| &$źNn骎W;r$ ZbͦqrK HDJۺ×]^?H#7-O 1*j6J(+HI ^0 Lfܓ,9tcĤ4P x1WRR45nףY72slb+HT.Z> Mp97gh<ͬyH|TbBe@nZn*w1%e Zm\_;yW nۏs0p]%vii><z.%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/resources/time_last.png000066400000000000000000000023331505543434300174700ustar00rootroot00000000000000PNG  IHDRw=gAMA a cHRMz%u0`:o_FbKGD pHYs  IDATHǕOUu?{spF!M1EYQM(#PD -\h[H4$ŤS--H9Mo9紸t6>w>=:3F׼՞ K[~(IAŋ2s\A7-A\m+-edBbKOwkCC}Y(jaj"5HTܽt/ mi>ZzEĈb$5B2,4(GJƷ[ӓ᧵Ȏo慨$(I!VRa}-OKss&{%$%&Eb)ALGFl޸u=qb/#jUAQQI%3ʠDVr?l~ߍoOlbM@B(ɂD||UOظ5aUϷvhJ ӛrRC`-/n}6}w$F PSDC0SyMowNWW%MW |`3CSSO~%3VW2dĚ b6ʙ7n[qe|)`:PU|0éN(& T"cr|K?AVFfD"ph], QKpy5<ݳC: Av)䙁dX3JB(gb"Ŷs߽x6''F^Ѭ& ES+ߏ-y5BHo+ An9!q9dEɗ.SR$`yTr\91J#[y~3=HF+Ս< >|$Y9}X56%!svSwS[6Qt5 /p )]o޵/ bqgJ^_Pж%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/resources/time_next.png000066400000000000000000000021771505543434300175110ustar00rootroot00000000000000PNG  IHDRשgAMA a cHRMz%u0`:o_FPLTE&&&ZTL|FtLuKpHjEdD`A[>TScabbcfd\Uq>TgW(ۻGRxz~y}e e({n~RUoW%%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/resources/time_previous.png000066400000000000000000000021631505543434300204020ustar00rootroot00000000000000PNG  IHDRשgAMA a cHRMz%u0`:o_FPLTE&&&ZTL|FtLuKpHjEdD`A[>TTbac>SMhZ^^]:M\\^/6b~Q/8Uq/9/<8tRNSWVVH稩VWbKGDH pHYs  tIME Kk$IDAT(c``DL0ęa4,F`WHlJ*0!:z0&idlbjfna \V6vP" =||<~A!P:84,$cb@|)iYP:;;'7l~AaQqqI).+X.PU]S[W_limkm=0 O8i(=$ӦϘ9kD/XF#%K-%b0%%֬hArF` MRoQ%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/resources/time_stop.png000066400000000000000000000013671505543434300175200ustar00rootroot00000000000000PNG  IHDRj gAMA a cHRMz&u0`:pQ<PLTE222KKKiiiUWSߙࢤ⫭ߴ὿¿) G`fs%z [: 6+{llG3;0'mrֈHمzKvp1Kup'HxY%NV} 9Xt-%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/resources/traintrack.json000066400000000000000000000226501505543434300200420ustar00rootroot00000000000000{ "Version": 1, "Pieces": [ { "Description": "Train Track 9V Point Right", "IDs": [ "75541c01-f1.dat", "75541c01-f2.dat" ], "HiddenIDs": [ " 75541-f1.dat", " 75541-f2.dat" ], "Color": 7, "Connections": [ { "Position": [ 320.0, 0.0, 0.0 ], "Rotation": 0, "Type": "9V" }, { "Position": [ -320.0, 0.0, 0.0 ], "Rotation": 180, "Type": "9V" }, { "Position": [ 333.85324096679688, -259.10357666015625, 0.0 ], "Rotation": -22.5, "Type": "9V" } ] }, { "Description": "Train Track 9V Point Left", "IDs": [ "75542c01-f1.dat", "75542c01-f2.dat" ], "HiddenIDs": [ "75542-f1.dat", "75542-f2.dat" ], "Color": 7, "Connections": [ { "Position": [ 320.0, 0.0, 0.0 ], "Rotation": 0, "Type": "9V" }, { "Position": [ -320.0, 0.0, 0.0 ], "Rotation": 180, "Type": "9V" }, { "Position": [ 333.85324096679688, 259.10357666015625, 0.0 ], "Rotation": 22.5, "Type": "9V" } ] }, { "Description": "Train Track 9V Crossing", "IDs": [ "32087.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0, "Type": "9V" }, { "Position": [ 0.0, 160.0, 0.0 ], "Rotation": 90, "Type": "9V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": 180, "Type": "9V" }, { "Position": [ 0.0, -160.0, 0.0 ], "Rotation": -90, "Type": "9V" } ] }, { "Description": "Train Track 9V Straight", "IDs": [ "74746.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "9V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": 180.0, "Type": "9V" } ] }, { "Description": "Train Track 9V Curved", "IDs": [ "74747.dat" ], "Color": 7, "Connections": [ { "Position": [ 156.072265625, -15.371826171875, 0.0 ], "Rotation": -11.25, "Type": "9V" }, { "Position": [ -156.072265625, -15.371826171875, 0.0 ], "Rotation": -168.75, "Type": "9V" } ] }, { "Description": "Train Track 9V Curved (4 Segments)", "HiddenIDs": [ "74747c04.dat" ], "Color": 7, "Connections": [ { "Position": [ 0.0, 0.0, 0.0 ], "Rotation": 180, "Type": "9V" }, { "Position": [ 800, -800, 0.0 ], "Rotation": -90, "Type": "9V" } ] }, { "Description": "Train Track 12V Slotted Curved", "IDs": [ "3241ac01.dat" ], "Color": 7, "Connections": [ { "Position": [ 156.072265625, -15.371826171875, 0.0 ], "Rotation": -11.25, "Type": "+12V" }, { "Position": [ -156.072265625, -15.371826171875, 0.0 ], "Rotation": -168.75, "Type": "+12V" } ] }, { "Description": "Train Track 12V Slotted Curved (4 Segments)", "HiddenIDs": [ "3241ac04.dat" ], "Color": 7, "Connections": [ { "Position": [ 0.0, 0.0, 0.0 ], "Rotation": 180, "Type": "+12V" }, { "Position": [ 800, -800, 0.0 ], "Rotation": -90, "Type": "+12V" } ] }, { "Description": "Train Track Sleeper Plate 2 x 8 with Cable Grooves", "IDs": [ "4166b.dat" ], "Color": 8, "Connections": [ { "Position": [ 0.0, 0.0, 16.0 ], "Rotation": 90.0, "Type": "-12V" }, { "Position": [ 0.0, 0.0, 16.0 ], "Rotation": -90.0, "Type": "-12V" } ] }, { "Description": "Train Track 12V Slotted Straight With End Sleepers", "IDs": [ "3240ac01.dat", "3240bc01.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+12V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": -180.0, "Type": "-12V" } ] }, { "Description": "Train Track 12V Slotted Straight Without End Sleepers", "IDs": [ "3240ac02.dat", "3240bc02.dat", "862ac01.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+12V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": -180.0, "Type": "+12V" } ] }, { "Description": "Train Track 12V Slotted Straight With Signal", "IDs": [ "862ac02.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+12V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": -180.0, "Type": "+12V" } ] }, { "Description": "Train Track 12V Slotted Decoupler", "IDs": [ "u9230c01.dat", "u9230c02.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+12V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": -180.0, "Type": "+12V" } ] }, { "Description": "Train Track 12V Slotted Point Left", "IDs": [ "73697ac01.dat", "73697ac02.dat", "73697ac03.dat", "73697ac04.dat" ], "Color": 7, "Connections": [ { "Position": [ 320.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+12V" }, { "Position": [ 320.0, 160.0, 0.0 ], "Rotation": 0.0, "Type": "+12V" }, { "Position": [ -320.0, 0.0, 0.0 ], "Rotation": 180.0, "Type": "+12V" } ] }, { "Description": "Train Track 12V Slotted Point Right", "IDs": [ "73696ac01.dat", "73696ac02.dat", "73696ac03.dat", "73696ac04.dat" ], "Color": 7, "Connections": [ { "Position": [ 320.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+12V" }, { "Position": [ 320.0, -160, 0.0 ], "Rotation": 0.0, "Type": "+12V" }, { "Position": [ -320.0, 0.0, 0.0 ], "Rotation": 180, "Type": "+12V" } ] }, { "Description": "Train Track 12V Slotted Crossing", "IDs": [ "73698.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+12V" }, { "Position": [ 0.0, 160.0, 0.0 ], "Rotation": 90.0, "Type": "+12V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": 180.0, "Type": "+12V" }, { "Position": [ 0.0, -160.0, 0.0 ], "Rotation": -90.0, "Type": "+12V" } ] }, { "Description": "Train Track 4.5V Slotted Curved", "IDs": [ "3229bc01.dat" ], "Color": 7, "Connections": [ { "Position": [ 156.072265625, -15.371826171875, 0.0 ], "Rotation": -11.25, "Type": "+4.5V" }, { "Position": [ -156.072265625, -15.371826171875, 0.0 ], "Rotation": -168.75, "Type": "+4.5V" } ] }, { "Description": "Train Track 4.5V Slotted Curved (4 Segments)", "HiddenIDs": [ "3229bc04.dat" ], "Color": 7, "Connections": [ { "Position": [ 0.0, 0.0, 0.0 ], "Rotation": 180, "Type": "+4.5V" }, { "Position": [ 800, -800, 0.0 ], "Rotation": -90, "Type": "+4.5V" } ] }, { "Description": "Train Track Sleeper Plate 2 x 8 without Cable Grooves", "IDs": [ "4166a.dat" ], "Color": 8, "Connections": [ { "Position": [ 0.0, 0.0, 16.0 ], "Rotation": 90.0, "Type": "-4.5V" }, { "Position": [ 0.0, 0.0, 16.0 ], "Rotation": -90.0, "Type": "-4.5V" } ] }, { "Description": "Train Track 4.5V Slotted Straight With End Sleepers", "IDs": [ "3228bc01.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+4.5V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": -180.0, "Type": "-4.5V" } ] }, { "Description": "Train Track 4.5V Slotted Straight Without End Sleepers", "IDs": [ "3228bc02.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+4.5V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": -180.0, "Type": "+4.5V" } ] }, { "Description": "Train Track 4.5V Slotted Point Left", "IDs": [ "948cc01.dat", "948cc02.dat" ], "Color": 7, "Connections": [ { "Position": [ 320.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+4.5V" }, { "Position": [ 320.0, 160.0, 0.0 ], "Rotation": 0.0, "Type": "+4.5V" }, { "Position": [ -320.0, 0.0, 0.0 ], "Rotation": 180.0, "Type": "+4.5V" } ] }, { "Description": "Train Track 4.5V Slotted Point Right", "IDs": [ "949cc01.dat", "949cc02.dat" ], "Color": 7, "Connections": [ { "Position": [ 320.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+4.5V" }, { "Position": [ 320.0, -160, 0.0 ], "Rotation": 0.0, "Type": "+4.5V" }, { "Position": [ -320.0, 0.0, 0.0 ], "Rotation": 180, "Type": "+4.5V" } ] }, { "Description": "Train Track 4.5V Slotted Crossing", "IDs": [ "3231b.dat" ], "Color": 7, "Connections": [ { "Position": [ 160.0, 0.0, 0.0 ], "Rotation": 0.0, "Type": "+4.5V" }, { "Position": [ 0.0, 160.0, 0.0 ], "Rotation": 90.0, "Type": "+4.5V" }, { "Position": [ -160.0, 0.0, 0.0 ], "Rotation": 180.0, "Type": "+4.5V" }, { "Position": [ 0.0, -160.0, 0.0 ], "Rotation": -90.0, "Type": "+4.5V" } ] } ], "Sleepers": { "12V": "4166b.dat", "4.5V": "4166a.dat" } } leocad-25.09/resources/view_split_horizontal.png000066400000000000000000000010431505543434300221420ustar00rootroot00000000000000PNG  IHDR(-SgAMA a cHRMz%u0`:o_FPLTE | r897 |{ {z } {~{ |khtRNSbKGDH pHYs  tIME Kk{IDATm0P ʀ(^Т@m45zm2E3ΓrJr)U ٬EӲvۺٟ$-4tn:eb8 lo pKm%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/resources/view_split_vertical.png000066400000000000000000000010631505543434300215640ustar00rootroot00000000000000PNG  IHDR(-SgAMA a cHRMz%u0`:o_F{PLTEu78۴ |{{zz {~ ~ILtRNSbKGDH pHYs  tIME KkIDATeY0HAX9価_趦yyX8 "s"iB8yѩtRNS){K/3?CNQR'_>@.bKGDH pHYs  tIME KkIDATc`1F1 I)ii))i)Y91agAMA a cHRMz&u0`:pQ<bKGD8IDATx{dy93s_{>OMIV,N٫*%+LNeE-Y\c T%bL%VPlFVĸ4 R@b=sg}N3g ٙ{ޏ&˅ nKL<—~xibuv<Dz0!0H[&҅9sOxzl"x ڗ>7662~dնO&@@`@ D? 0HAIvKg鷲^K9oS?"F죸; .\}QW?ھbhnA^caaY B\@D( RHii@%c!,ZG뿾ˆ#l /~Iwx `R-(MڋTw+$,@$@6;|?wo;eaB<,h0^"R$D Zql 00t9DEf^"~OK]w=ȅ }>/>OlwHi+a 1E$/C$4Z!"VDx1IR,Ϳ/qpW#\rvB@6f)<: EƜ'}?W>«x= <>1 i_NٟpaY?/`{6| ip'o9Nt-.w7&qS S4^Le m(#\tu%.w5<9Ktml`7Ird&/(lD&@SO"`0t߽非Y]˞Dz%tI֯?h a1X96:O{%gH>e= k]Ƹ""/pm|[H '"rZwzK@DFE׾g,YE7JyVu-Am8#HUg|ܼ~VrO}yz,ߜ\tۆϟWM?秞icrOVCoo@BJ)2{l-ZHS*끲(MDH7![0!`&߃7H@$RPXUtְ(+”iNaEv{Kz ɓcz31<.?? _0 G3?2`a1Fyր DAk ?4BȒ.: [(d)NYI`(00à% АP$)LQ( `(I0C>"]^8~` 0+D% iNb,wz.-Տ~]yݏk7kp_.vv1콵G#SZ1 @R$p!9Y+ _@ȡP|D&BYӅNS4iQy#E l`DPA0 R 0P(n XRRoC-&ǹ5H@H P̢DJzIN²dis-w!@rG^RS ~|~[77xgvo=pE0rqw?_J-^D Zc/ U =B) $I Pęo(آ "P 0 nD0,(}|U(AYu ڱ H$OTiYV&t|ڱ_xB GjQ..6"^zߜ߸Wy`P&8{P<#k6_DG <ZDw4:ː),:s0LaQsEQ`l, ,[°">QcC(`Xq0V ۛlA%b89[H"$P>Eʚ$K3e)R<.tywϾ-Ο?Ҽ P O}7~ݟ@>~#|cl-PEVhE2Ywg @^_({P"뮠t"di f!@"ϑ0e;0cI,V"`he ucpbuu X#@!ΊYR. Vg*QN J{]^yO1Q< U}п}|@ʌc":5{#Fڨ[/b@>ʠT ^:I)4%*Ѯ(,cy(GCւ IR _#8;`XQ0A^]:]58X]YEb-2@ 84qoCY+V7(f $0GGGoYgFϿx7ޏxzm-FƠs$5 PVAep;=8X+`_BW ECGHU$Iz.,"zuga xpQØ-rk`IV QN0s6`@q߃K+H #Ur俈FRr^ ˈVaV H 6uX{@\RUd KV)%JфezkbA?+B+ җеY^@;ݴN" NBiw) y[ QxmZ v +taȉ+`F0{}gB@PPG<7 GVE QTxa$Q:#'t>JX3(שּׂar0P6QUdZ1٧ WOCD ga,,qI$@Fw#TKk*E\ީ;ύnقs>tĒ LzRcGa-sڈX'`R RhRV]Q&G!lL 209SS~Ov)Ǚ4,Xu׾Ydz3ظv d.BzF5@,J~o㘷9@)g@@< *$ 'z Xnl[Oz䞳X^]CM2s|9!@C@B :0ɁBM%^P!sR@u`7!F",¡!!KDN0zJ!T"!p[xvׯCV9~ I@ [:3  .@J,-j qG5+Oo?y:'O`iyN'aRK'7]fӴكxNYcee! P.L97b_RN:vyW2;w-` l\"#[;&nm`U!TvKܝ!dV+e&-VE#*N$6 n=`qun+'@(no0.\ nd B>Qa)O-m,LcK`C9kJĵS֍kؽy]BzYZxT&aHQE T9#þ=u9C}2A{U{!Icxac8ĕons/z'Nbii v2) b)UҪ&*Dق<u ;JDaA뷱y ,}5t26pLP8M_Y@)FI^t(Yr=(? xR'q|q- ^Ƿn}7NAN76`GCwёGBŁ$. L0A($ׁ93",Yuvo\]dǰrCBnzuBb.pB) (.=%@Kix%._2.Cc+֠1{xdr.o  !dY K{@y_56>z+K}cs$diVgR6""$Y`3+˛q4Iǃ%7oK87c\߼y˰K+@AsUk3L5l @{*R8 24݀L Jg謜@[aW9rGVbJ\Ygr?<;iXiLUptvDaPNHY HI|15.#1Ȍ l?LUKe 8;P"\`o(頳#I5%=u d~<'!TCFs(EНY`\iTx,cD^nAuzD ,- ׇ#|+<Ɲeh0t1t? w)=r*_N #3Н,:.}OTG2jMdXR#{׷6\U#M6K@ @SqSlyvd]jwGc<35MAf)Fc :L jrFd1JTe=0)PC M.z hr(JQ-'ե@`h'f ~2<|rmؒb-0~}Yr{@>s!p f44AN@AϑS$@ZgPk!b #tY:DE0)|3P{`x4ae eFGuY `7sA."xV]fV&rYw"XGDn.,pg\noji06 ݋:"@H"`0,Uda$&\wHOP˚7YV[&^4!SdO~Q젧\O=9'4Kbeg5όp{ ˎ``3^8FE^y>zHBG&)'yƺz@3ھ8yx1Y{;nOأZDm?%h?GZϪJ0R8c x1gv6\  SE>nHK,Ak7.y#%pNZ1Uq""ǻ6% x?2{}"@.F. iSi\DP@p7^={Wְ5Õ-|s[ml :IP 4'L*}1@9BC"*K h*ZL;#D_aAO_;7˜)ݧRCFX\>*.I=#G&)H,H T Ӏ1ˡ3~w2o>501dWOjNNIl6Q]Ojꞈ :=e=}&vk#&o?j9IMDl3c" 8ߦФ&_iS& 7#HMM*5'FR/ 꼄᳃PQ[5 R ۟H'KC44LUG"@RX qͽI^=R^exZ~,Ԩk%~]PA/ù2AS [qteS2u[>F.煷+%9Mq})hYc >NԘҝf`HAjI-urq|%M'&w-R}d!fFoEJ{QIqĽ >ե:LraOTkr}Hn:[9qFDƼt mmQ) .=3y;k FgP|Z_!jӾ{e^w]֧ {kWG9s|G4&PGSOuG& rΤAYFZ}!׆ޛZs!Z]yIuwk0J;倨zjUks}^h"B+%B|#JXCP7+ ̧vF-b(h]67ˏ;hPͤVdfJ,-`P00 5͑KSMEB}T|Sa(X:q/a[9#5.Dvw߲{S)n ~tc;'M`Pp}N(wRZ\rr㋮#Բo z'OL$U׬lkiP3sF%>8!r)b>z|%m73BGƊZY>+N֓Ԯ2 Tk>7ϴNu4=/s= 2W(BZx8%@Rsvln5v42SE>O|rdEsB*n?bS;;e(xֲ^ *VpO0T,?};UFSzݦZi8<"sYh+gs2liÓ0)mR+xc_l$i=\``~W,J*_ױ(ӯeXq{z g"KS|w~й0m.(sl(MCDOTo2ܫ;w䉎(]fKd\pl'hUŽE7nI<Z_p=Tn󅂁9 )urk|* 㤟_ U*ޓ!ijRv:ޣzgP]W4YC@uxh-7' <@`n~_kC< 0w(Q Q;p xA\`.> ANG&53_Y=~]Cۘ1=F\_@DByuo o"yK,%Dbj7AU)'nIɞL^e & s"@ NS R̶}fmv6D?Q$F4}Z-ߵi A߆jgZ(@{[|PBHxUʈR4M[Y!Kŵ"?>U5|tA沦;Z+bk9[82w(ʐ؁/\D&򅚄%ߟ'6 v#qCwqֺW}i#}+u~H0W eN\9&ϒQZ3x++ h+uIg vFs[F?[ӅdwF{̚vnڄpvK̬6MFn|UjSh,;l¿?yb.*x$W3S5U6$2Mʓyf@5*X~OGNRL|B>AR~əa<^.)5(aW+8 }g ⿟}"mJ_ZPls ?%5uX`QR=K6g}V$> H . @!ܢ,#v[8 IXbD7=`R{f`wb +~δizzU̍ 1MVs㎵s:gtMrS̾6ռ~/zIKp=RV+ۏCKmQp= D3qR7ht! K c?*oCV%^aDٶ^0C &R U˚ijfSiGgL v9U޿,;T$8|Bv8mN,,{#%GÛ ƨF WI"m[I;&ٿL AW6OQ'7r"[Sv8I3V v*z3 R $v⺃aR7 #nPD9Os; I"|Zd`;Kjs#@ K=" E`w_< t5|=݆ =  HkXN`nN^<$F1tvͯeTA Byؾ͍!$;wo ;BPWKD^ؘ4&t ;Ӎuٟd_@جrYaśPպQ^c(0lG :.~1dy®[M@W ]S5DvJ ε*zrś")P-k΍%4RAa@Nac-e~3kfaaJE˴Fv&uuԹA51YH9Q 1~YC"BЫcqݦ.,s#@Ͽ\Z4#nа2u'.M}IDBRxEpҌZP=ii؝6Df8]x "Bqm4 KnJuwayl\AC'h5m Q7_YKx1]W\.`p(/I'(f~k9@8hewJEhT,7)*KuUJ~y;*->1>iǖe=#Yb'i>h_f9#:`NSDT:ZH )aV!ߠxELߘmR2iAx[RȑS".MpQc]TA۸VpP$6*M*Bx UŇ(HU= r^*tĀWㆺ۔9HoJC8`d8nPSRNM/|FA(AN-~0K>ssE4IT"V^'TT ^Өү䒰xxTOS9@p6d7(sdyd}8PCkeJ'ϲW0o|s/lg>FE rgg|?&%٢(H@!aA!nV+' 1uK뭈RcOm^q k &lmේm+oK/Ee +X,.VPX#1֬co͘F~J^0Ce/Z䍫@O;G~`yk,CGtCHQJ1ɫsUVXpWJyAqxVPTeR p(g\-;|՗fj+e G.40PZ+uگn~r?w@ʋ%&@?"ϭFasJt5 So~;nhb]K$]kG\APf0gE%~rR#~(-< Jd<z'n}/"@(cY{w"I~D)2DkM SwPy0"8ce5TǼ J!>+@eͩzgmWL`/؈$ѩa`Gͻlkl?w/UyQE@[;_c[Vtz4'"pa *Yw Ȯ 2(Y .@K6泅s >T_9,S=;VTQ}`C`!5ik'oG-8v_9D%/xԙ; ϭ锌͍bYN,hE'"Jk `turVCp*: {c|VDءX>sST N !K0Z'}ky,Oܾ(=x_r6#|@r (~g_tLP|BNA\L%!_O(/ xHJaq@&sK7l鍌y AKJg ðb։hb?;,_|(8v,|*կʭbkN-ҝ~E%.| b# (!C| 0 G\A{FTo+7 h" sy "XwwFB{ҊG$jR4J P]w$b`_DP8bi⁏ʮo_B efNF7n= `۫{'N6|@ P|lgWt zuOWU^,(Ϸ gP8D"\1PZN NJ^VXĐ҉(v=m6vVPO,ٳ?~BOB, \)XP$4 d(:sL8*P* |f4 t0ECmJ NXNuB;\'7oo RXH?$GUcS^,8k(r Qt!8j>; dYdgT:Hݼ PI; J,Ƕw?~j t@l-|J)U ʱ[|~^O@j-4dz  CJ% =Oo5쾭ܭX,+wJ7, 1EJI}^"$cH"b'Qls`۳#vπNUB}co c{;0G}ܙv'tmnr\B#ERF"A+PzD,lJB%Ew-o+wh+X~UKR=]}OJZ) |^?g[Br _kއ`5xNea޵_?0ݷ; ad .2DiML=ҭi <^(d`X(Q`>_iEBGb'sW}'Nwu} |?|aiCCPicc8Kaǿ(A`f{CHLeD宿شmY컻"^:f=**9R,"t%1)fm-%*t̩vOvSA\\zN=/Ep cHRMms{n3'IbKGD pHYs  !IDATx{dW}?sngfwF+SR]l(HRvdVIP*H'UDlX#/rqH02Zkfg۷{gNӳ;{{~󻢪.M9Vޫս0[o hm0*)ǁ }5I+g}=7t:$"xx92s;>#<p +qc; U%0h߾}:S0NRՒwU{{Tuȑ#r77$ `+Yk!IPk_}WUhw޽OnƟ612Ωyh@5*G$scǎmڵkכ AI 9ZN|JDUgiܹ믿M @`!Q^hr-{#uf@0i$>=Z\\ٛo{^̲@&QPTӫzi4n^zPQFW?ƘS_\\DUɲ,`HqNJՀPbp,˰be~~7ox]wW6msλw}ӟ8`]T<$8~8ZFA*%A^;w;J S:EIcޟ`jC nny]wu0HuTAsL^ҵvΝ_&cDI Tgh$pT%t:g!s/cqw|U x6 ⓐQwy睫* %P+\d(a5T\" >O$X@u{@0R_j X)rb} Xnr 9ݱc="o` 8 Nf`"B+%8 :UqZv¾nwq1vms@AUC0G`}_2Ƽ[o36^W@1T<ٻw/{9W4M2d]wgy EQCqQXZZJzΆ x ^_b.bfffjt][o}'"n X)Шh@e)De69<ǎ'( ,c˖-l۶ /رޢ(~@8tk$lUUZ.T@eujZ&^nQJ% ^n?`si-bQlݺw>cO|^nQm XUtszO=˘nYOݰ "!Y~Q` oMOOw>ϼK_CV,}8| |~ӝ;e8)5B^Q;2Wh?[7oE fs.^?AUI1 <ϩ} ]KନPU91~CtPsË󨆅mt#)r9?$/;|HC33=:Jon#H>÷iF 2hMOsw%6e?^*.xKi4dIT9^rh@5C'ɔa`-gzq;>=~YyySoY33bsas K}Wz5c-nӟ ,,,"EdEAw>? ?q6.}k9eӘj nbYVQ Ҡ`%I}VD$&My3z<0G z&W _j.~kionO>XN!YơO |gUSF|RfDQ L+ 4R3ﳴ3YN//XXs{ϒwt:=[- .}y2 QA 8JPzNts}e?m7pSXF;=1¤+5p^ ˓ Ͼ f7mjxG@սA8*,qV9OW=]<=#t/ zyB(yfQz- @K=u爫z̀EP;>9;`MOw#YbzuM (ox|+\g{GaQÛ7agհ^2e p@+hZaj!I\<9\ ǔf5J*3( lRϔWjz2D9t|Gr|q#fN^n@\qDIm܈|Vh4\-G g,?:4Z-Ɣ*u4!N, Y%.HL9+^ Vf `{d&D/u927ǑcGsG^c5P£"LoL9 Xeb_5Y}MЂ>Jy]=ECn ZͰƒIH >0rң%2Уhzk !V i0 }ԌXE4-S#'Y+|. ui(5響cِͫ[5A<|b@CH-{ @hRknlX-i5V k0HQlR C @00kIx!ԛ\FαWs݀Xx V,u#X[`xjT'&V3k\4&, 4VtQg A<v`T$p ^͵͒F;ϱ2HD.CFeG=Aj*Ys l.K i2٨AAъ:Ql[3y՘5Dp>,j?FjR/֙)/ELdf?L 4i2&h#aɐÞ~$M>@],1h*O:MV}AD]  а/VB}flD=XJi$ tY2ıD]%|6*1'8&ii1OM2#rpt48B"$,f'W.}N[MDpOJ T0x7hE 04y* ``0L?-FqD.A"}b`̙/I ln̞zLlڀ3 !/TF6W /ԔVxt DAN?#Ñ>ZxrRVZqqj%،S%̆jX5uLcvi!Fn?DŽ1>鉧a_ fgV{4OJzmYS.QA71R'M@PF[aآO OG7*cRa)i8 i3=M"0TMZh`"+1Ed4F\R›2FR:frZ)QfõLa%aN5'eUsk;$cL)uz |@Y@tHg Lt-&^ InSXb"E2H|edٵas!I?#$1eC=RoOf*&o5:6f,N=:#bD, -Ʌ_' R(WT`[MISDf i¶2cĂ PxKɵ\_R!# +)1q&`%JXZ;V@ÂQ.A4TL +~^AE)VR0>$e7β wXš,YҬ01FJ"Bh ).%wR ˼!oG%62_ b~ L0* ۰9Q<=NuaʓIl dRb/J)Mtq&i42wЯ{ UՌ`GZCpdFyš4|XћVY#Aa1Ht*ߴ|hdĒ@Mu. "F! GE(vDÄ)T~ыeXJ’(}` JO*9a"xZ):qbɣu\T ..JI10%P'wpe[+H`,5l?2kVɝg¼@BO{r(( ͞|h1|>Jp&Z)@SxKIh'src lA$dJu^9a-KXo{(x Q*\AoPxsTH8 ( I<=Ƚ~M7L4aef9%ȫ?,"(XPgzIh'0 C *ȣ{|wDQNPk(Tɽ'g N(\G?;K.)7̇IamZ9?z/&%wʒ K]驧0ID%BNs 6d VBؘ*w{#}cxׯ[>{T>$bJ|d ʏ}Q^oA]fBwdPj C `l(2-Lؑ :^!8Z5o>-[ʇ?)˲ 8,jt5 mV]sKO6:[^wd5tJ(=D`* ݜ+„N̼Ýw?OlBas/t(f}\s4 3d>W #'uyOm5v?o_.Rδ?Sxc0:}dt ] ~:z=B+/TZrUrx*7}uZ;q \͗^[Nܝ,R%JW=9BE `VHD~ӍߤjOpږ_ݐ1, [voGmogB$' U6/ >A}6YD6^r o6pgȯx) 1(Eoo|޽W\q։x E7`G?ȱ VOwd7i_`ݟ1c b_ =(;8_уyG>¶W8sC hO42Ƽ1Vܴs&[=<"wf|+\;-:g 19g~m۶!Pݻ={O|}ckR36@vZV]l߾;v<繶n-UW]i/yo޽{K]m6걜 o}[}E|8u֭[˩@ncWUb-YQ|h܌Je-pH-hyݻo%:'ur>ٟXλgϞZ'g?;[\\dϞ=|sݻe`֭\s5}EgM (EF)|jtEXticc:modelGeneric RGB ProfileoIENDB`leocad-25.09/tools/icon/16x16/000077500000000000000000000000001505543434300156435ustar00rootroot00000000000000leocad-25.09/tools/icon/16x16/apps/000077500000000000000000000000001505543434300166065ustar00rootroot00000000000000leocad-25.09/tools/icon/16x16/apps/leocad.png000066400000000000000000000023001505543434300205360ustar00rootroot00000000000000PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<.PLTEoiffdcdcffig@UUfjMKIHeeMMC?WWXX+(*(XXXSS<@++LLq*)v_ h*)ML{))-+!($%"f m lx z#"s})%,')&("*%+'x z$"}''0.(%)$*%{! {"!z"!|))0-)%*'z! {"!}%(1*)#)$*',(v z!!y""5,'$)$y w p#.))%'#($,(!r p h#0(%!'$qrnU# %"$!loR$$RCUROiQPSRRPPN^]+)F*)^]85?@mM??64&# "!+)*'}v!!{#"('-(-+1.$#u!!'&-)+&0-$#v"!-)0-$"&%,)-+/,#"w""}%%+()&,)#"w!!h!!$"$$)&! ia%"$"fg$"| 42{tRNSZ\ FG 9<{|jkZZIJ:;,, !NL~#bobKGD:`tIME KkIDATc``db``faec``b`f`嫮sED%$d[dZ;*j]Z:z@C#޾~ ̀,,&O:vP~Lɳfqqp9oB?E,\   ,[arU5I@RRoHK߸)#!!;gܼ ܬB;JJ| R{G%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/tools/icon/16x16/mimetypes/000077500000000000000000000000001505543434300176575ustar00rootroot00000000000000leocad-25.09/tools/icon/16x16/mimetypes/application-vnd.leocad.png000066400000000000000000000014701505543434300247050ustar00rootroot00000000000000PNG  IHDR(-SgAMA a cHRMz%u0`:o_F;PLTE檪ߥ⨨䩩бsr<;.-nm뱰13--}_ v,,31̯*%("*'!v~$#ӽ2.*'.,%$v +*.+)$,*""uz&%DD'%(%" p w>>wv%"urqؕlݭtRNS+89:;=>?@ACDE6OXdknRabKGDH pHYs  tIME KkIDATc```bF `fQ0c K L@Zd"`VyPTb )X]]CSK[GWO߀,ahdlbjfnaiwpt p9{xzy;s}|C|MNNw\>x|˧O]/˳= "zxe;A9G))ces ?h,@6 KB4]VJ 0@f&d@`zYX@D$Ed)E0)* f `1<0W$KJRT" %g d0;g𧡽77?zop1cFQ2o<)*8H$BYTJe P+-ÍN$ZqFOK% '̂22$JaF,.^ogx4J;Z΁f0w23|"(2ϔlCRJ%$ko[1OI[sy>c?ҥxO,)#j>P,v ~[ j{ >WjHoo?z ٠HnbQ/n`?YޭvOq[9;b@1iP.%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/tools/icon/256x256/000077500000000000000000000000001505543434300160175ustar00rootroot00000000000000leocad-25.09/tools/icon/256x256/apps/000077500000000000000000000000001505543434300167625ustar00rootroot00000000000000leocad-25.09/tools/icon/256x256/apps/leocad.png000066400000000000000000001362441505543434300207310ustar00rootroot00000000000000PNG  IHDR\rfgAMA a cHRMz&u0`:pQ<bKGDIDATxieIv~޷Ė[ef f7@ 9q1,ڌ) E MIch# 5c  "(h 6FUe/\3?|;ȪFzZ{.~پs8qF.'?>s.}_i71s `|_4l;{jW'ZW'Z@)e0jc"XNɂ.=qB[[W?x #">/>u:/3Li<.SK*ƃ>j+\;Yxן^.gkXuGGWVtZ'OIlm(T:MƓ==W+{_onѫ;>{k˗O|pL _ zc>f&|/SS{kߺ6kWourG1m`;n a3;J (#s俁"(Z)3"5дXYFGdƛۭmsڇ?O|u"Kg?kϠQ<.X3K3s_{{@7;?Fr5bEBJYD$(+-#Q;9G?r+b_-Zf0AdҤZi1nJvv^loƥvc.}~+=fOy.iO/.{oC[kX`> c C+`"kUY)7= Q"@랶 E!@5X+e iD jܢߞln+>s"=P_|`3+fOQ~>N!3;zN8:6-Hf0) T!#S.)Iza(?zANJ'(J`Ax@~N2YMR K7T18̊,},AJ~Gi{W>>\nb(HR]( +"e7QY֞xʻ"*k,Ko=~8e<.;r@pM  ~j8y|O=#}597VA6kbG_W?;-3?^Ҽ f(o7ހѱ(?CaD8;_(MJ9` XO/W?c22j;pk93-u!MZsX*k:z?1'2} #/,]\Ht "OF(e\6\T90q+erٝ[O_ x^SEݏڃ \4r}?i⫌#o^5~.U<7_o^kMxbko~ 3?ԛ Eonn/*[%V+ L\h4Y(|rAȢmzk{CUwipV*+ֹ̖N+jG#L'#**Dcl6}̱zMhDLHBw6+ @8N9r/?R,"F@8ű9VZ"v2`>?>Kt=d"Z^|@ བO~fՠl|;cϰ|˗1Hd؀R)?S2;~MCJkM&tit8g0qW`:B7D@ZTRlk:WbK`2Z!hHh nq sa's`]&:6h܀@5TӢ.)+Oz ^|E/~>q  ʧ67~__|q&{?%NN% g;YZ,;7װx=j#bwݪ]an-,ȐR I^xi},޺{rK`W+q)ZXk an8s;lj3dOw7/n8i86#4 툋@EIEB HA8^`Xkљ1+, ,K,N!܁aPL'f8#cp*vfc=` \~݅qk,[ bc1bEKu_{wcF꥗^w)ڍ?GwVK5?:2,ģr ݅cأ9 " )RYcZ,|9- ^`n;,bizlFГ1jԢiZn4iȧsRaas@jYuX-0tr@ *e=S@7P.99-5gz4F3܄Lu j%2F[DԴlMoO>?Kz Cضw~kؔȉ~_[b~tsOu55ʨ Re<\Я<.0's(1— J5Pu+WU1X Kc֠3:v/9@H{S5lMXOP8rDGM 14`R| -ĠZk ̏0؄n[) FOxcMր ej4խִ1tW}=o#|_|Q񌛰~3oj >T8տw|-fk%bX)%n[ѲO軷Zf bs  pO 4AR3VK,;U>pGvCHˉeL ; ſt :aX=7#`'2z>z04f{jf Zk5 0&'>1Q(<%2VLZeYkEю@ xtw'3?GߐEo=ϫ|1 Ok__#|OܻG Z`q2VJ)c*i2(0`Fiº]`<" [_57GГ$h@)("l^gǡ򛗆܁"OK}AP-JCOm3ۺ/m^=]W/~Y@ ́Kû8y <{>MndkL@j^Av?f2VւctΗWO=3;w|ǑοP4ޛoó,W[C̭V+" !z I+7@P讃6R0KnziV^+nFhh%H;- "޲#r0`: 8lXft֠cޢCG9f`uP`#I|o̰ڿHz{j4qLa"x[řH8"J@d֔ Q#S2ikav4|e_y>}1c>oD@/Us?oݻ.ܞ{֪\җ_e-KXB<aWXhI(4@dcZAZ9wN 8`P)3mP òq ;؎2:g"t%`y19܆H~xootpGC6ϯ6dEI{ وI3F#y:n~[#k?'xWE o gTYfhʻ4h ښk0}[G2_|L#o&OC{?||E<:~*DJOc5\8+娅}6JwK^l'|`$(_u3Ja1;j>j;4#XMn@~&n~Pk?JZp \ qP5Yi&k-ՊOҕ/N.oë/|'?u9^}_}_GŽ{ߩMG .cFFyV$6.v]xy?ҩZ77^G И m y MC=x2u5dAR^) 4.@9Rn)lFZr8՟o:X>Y \;M j·E H?T#.~b]pm_Fr-T`O=gګڏ?L0 @E 60DulPq `_ڼzg~C?c_9B~={O.~{\b>?Ag QDƅʄDyڊٟǹQXZ35}0fNiz 0&3(8 m0na49 ȅO@ba` Ʋq9=z:35>-JZn}BZ{ 0r1%` mta4:6?`H9tP;W< nz)<‡^@@qG\ ͟<!#IGZhgw13d&bq'cftw~9^|b Ν_W_Ń?xj1|>G3VZb^POLK4D7,>h޾+FchW-3e="@Fck]A#!I~8&+ApYR-" hs #wJ޹ j5<?m 3_ ifo+&F An@Ӕ7A kE1fcRvz6.]+|KK.GU΋DbȽ!{\`>_e֍a6 Dߩ^wfk,65JmF "4fs;&Z7񀟆n4zr (Ѩ(~Zcv.GmuZw̳Ơ!f  UOA'f B+H< Ȳue֍]e4-sOG_HzjK;66מK;V!rA2T U=6T^/+k:=\K<E? <2p1dl-UVuH1qƮ]ڽ&= qTwpkh4v \5zgwaO>+W0ti#݅5ۚO|7ir; _…P}W"hB0  :(;p+/QLVQK\X;aqRtKx^gtF vZCp/Z,|HYt -P 51ҏa"<r$ɸHʭ$LigQ.3{i}륿Ɋu=4{B83(gB()dCF/p0;xkX@};I5ۘ\"=H4rm) ENpswGxgy=n<<6di*H~$U<]7rWHŁH2c1 m?N@*Ql* N6 4p M  \b (f ۠ k |,@-r` -ctns`KG4 iXX` 561wq`M``60`krE:])e+`LBGSHOR{۔|. GbgũbޅmلFLY,Nݽwwj'1Ѷ#.U%r.~UۀِeFC'&\Oj'Ý+Mo$^xsqCL`'&~S!(r/튨SǪ^ 4Z70VAgq)4hTs[@-,;3s8 ]%8u0V9+:lDNUgK|G]05 F 8r IV7FV`-y ,>DO)b1w@t$ 3`B~ ZX.fxp6zdz xV/aKZkܼy ׹Ey _?4JIa&MńQ48Xpg>ÝeI(vP3)0?tȪ33h@+Rt;%o44֢Q  N):ЬX' Tg'е&@<+g?HMV1UNKz$`B9oC7-=E؆`c < F?I~`s"@籒 )I}pr @Xh10 g %SL"(}P!xpfo9at FmEwlPq FO&DV:J4)[/NG`FsےuFHg]0c=j8` l58 }PJ`djA# k #*W{u_ x#b0MV@bJ"<0 g1L1C޻7|uڼdmx&(I0y꩙GU^ ^')f` bcIw'Ãk#ar:6w.a܎L3L; CzlMb?(_B OPӆcve@1 }2 pH 1 bhEUQڐ`A@@S٫Ծ&Tt.(.e'w9Ȍ*Xb-X+h)r^p`3 ($؇oA`.л*cVT c0FiQ`'e/ 2`a< xQҪt*܅2$ALn>]OoaΛ.]+4;WЎ7ЎhUP PJapkA=ޚt!p{h O&G%Y}zd%GVc੍M<1ı v{yG70$._xsm.)/J4M#+7fiPjؑ%ױZ[Oyww<&a.aܶ h’' a"!?u{P!Z̃N*ML )(8:,`"O*4b:6+?==8Zpuq#E|r%c =샀ء+vSLƹl V+CJ>K>HH: f´!lh`L@ LI{ S@9%jg5/ƷocםFz2M(VxUAH}I$٪G?:f|ǧV- {vkw6&3Mi^i6iû?<u-\oAXaޫ8*6Vy*&ӉK 57d,ܹSY !]r8Bp&e6КuV76hx) Z}kkR`pW$!d'lx#%(fgClg`mB3`bp}.xnGp 3{_т=;9IAZRh(1܀c&Rr7 Td2 @g:{}GhǗLnp;@帑|~v3!Ϣ$ީl~`ZAX@kޕl ,OpoqZcr:60#ʕHQ 8a d4:"@Fp[^t2²[b.B MZu@8ЯS e\<RXll2zz .0r`V]YYkWR%jv*nG_ԁVغ&w?mZ!U-ZAàcR:^RS {5ށm!p',f{xpnAjc zfp#%x@>OU^J!N1ʉF@ ?^ȳZC vVJSX~zsØHg=#|kMOޭʮ|Oh'5Y/Ě3iLjD9BH/}pipKF ;R[hl6۸92,p;W1*nbtIl\Zi_{/|MZ/lBXm v0vƭkF@k=|0lILsy': %{M#ZYLn`=`hR.Y"P#\:3tP~?P#-4m@%x:4ZW*$L ^r︛sY,NN`7޼ =D; zX'BҏSMY "aF[L /a5EEvc7.HReVN *_[%oEX1:hƭcMjWe1u{AV߻`#hC HJ]9W+hB1ϙWWn5O;Jb2) 8w-k֣zf9MUrLHD`Vnp2i ^#giXHg@Y\+ _a'M7Q_(<Vv{76 ]n7Þ No.%ʍFK>7!I;f7uH"r~{B# F1BXg5&3#DW7`Kv9 0n[Ԓ4@Ic+{܀W jtjչixi4nF'(rj5! l18EJWT?0ݹ{o:~F=u.<ݎ\6哦xe( k~I߽sGخzV>V_zPXMea>DĂ9\l1c -/M֘nl_wW=WocF^kWf-M$N15I QnNVp<8z G0S84W`ƣWнu d()}bwm0!K(FܕHXmYT"9ZǐȂSgs%fI( )j!mݨmZbr epow6vǛhF#l$)I⧌S!JP9rp3\ tz. A`a߽{3:&1=z7w 9y\2*Jn,Z&\\tÎǸ`ocp'cr*`dhM;F' 1y@HՔ<~ aH`s.K`׏W GQ=f?dv)cB1sj64Dl56mܜn`q*X-nلzW`nVU&3CHHG Fw m[,>ƀi]Bxn!IᢠpbM$En 0 _'ؾrm,Wsկ[MP-āz>Az[!b黴2.> ,ǑqEfq1h?>wѡql)^dzo2j}}71؅oLpm:6/渽8n7%A\F spn؜zc /$";bja=3{ YtZ٭|Pw>69w ?33"& s[ l]fbXޫ_>@Fh 7Bթ|g@ (_DJ?%׵&XXGL6駏wzT3Ȏ/(,lCn]^^lzy \g&;4j[<5ΏqguWP[0~fvl^;hla +o2pSr f7G}WXެp$5L/C5 NN0{t[s?ـmO6Xgoٕ̩6 T U _迌_uM *({ٙOdWp<4orҏ4ඟ;5^L}Fmx6PoKnίU Z4 `n6<16總<fGwj=\O 6d*Oug(2j@B0:JB y` RCe{wll D.u%*gHX-6.D;0;]X1.nm'.bP%񭓖 dω~ q{\ j\bnh=ڧ`}PA(v2+-FS({@%^7EIa<22 #J<9pPk=agbkivܠ۸u ,O'@SJPl@4#tj[ D6īK` K A'Ӿ0p΀`ю1R#taw0q&&o>s!)QHBj=$ :HbFuj R ߿d 4` Ld07vfmp+$~')h[$X%Luqd :XZ]½,q~F$[Ncgk7LaELp R3b_yH)yÄiÊlKکـӭM9NtKll ŋh4IɦKIY'5$Tւ0d a ֦\ b}p *ɊX$GWqn$X/+7-O`O84p'wJG b>x_h1NburЎ7/Oc~}`,- !-m T=+?u[|V;oijnnh/ğ~e ]ЩOY0v C+}S?i]YHpDi](:X@aUV%0PXfn4M4LxƃOpo>`5l_tXW.=O)@/&b  j|q%ai ΰ8zu@@Mwhf 䶽HRC0dF?|!r>G Ѥ|7bb n8'Ii`A &. S H&K?QE?rK}8E%0$F@!"(TaMؘb;cYaNUCYssp/"Ǯ6Ⱥz^'}{0~Ұ݉_?h66`Hx~;oa8v&xqMfԺ|n)'HC~F>:>cfؼrL[+3 Ǝ*^',ZddˆK< , ZPN%$8e1^H=E B/z!4޽:k ,^H󲺬xd4}Ƴ, Vi~5@3rҞ>ys4 ab RAQ !c/s(aYwad^-S1²aZ[t,s-GfhC*&%_R4m_j+4٥- _;g$xAOLMJ5g,n#l#Skm@'h wBq^$jC3-WAr<H\ODײH5gOPYM^2ûou4 ^/ H QޠP5 *$w 3H^oG)(1!hrwk4h'76G3^`Mノ MӀ]/@5 ,;=ˣ'Yj 5Bf qʵ/jC"& =q\-<\X#5dŅp߬=5-* 0} 꿼1M:{>\9߲;g<>t3&Hz5 Έݧ38}K!M]Gd ?/RXvFMM)>]c:>½spridgcݢ3Kc[8VjRki::H]j@J9rKP:/Dƹ^;(,SfT9W#1$J74*ܻu\\>)8TX4B`hC{ JAgVPH@FK+@ 29^Cc)P X[HpUd7ёThB;rGgRZlqM 6dű{ڸ5 t;r;ECN8D:IDI ^ʮ-~3M S`KWX.eX@ijq+W/AK2w5.8i0O G C$1ܳYr CX3!˟J=KAr iͭM|\{ظg1[zA(!L1RnKp& .MZ\\sb[o_dmzWWG_åZ)Pz6ՀݕboR2X)r}[M`$3xfO$QG_ gi|/΋W"QDu6Cp#6Z,U) =?oIv ]~ʴ^B J!n9d4t;{,@9ϼ}5[8o-E LW׫PĩNV|OOu]T?w5j29<:ץ)VܻmhbJPv*dv$pp"&ʐV"zquuFk=pꝟO"!ɐrE "tf$8W*=}1KBgL$%SxƬf.* 3ARk[1Pa &?1&_W\:}(Z"uss.>xu.\vHVn8z/z>8CܷZQ77yZ Tؾ_&KڃhiY8sOp d)#ꠚ7ֆ#c k7nǑkI>!^Bl Qp5i5p S峣;<qj:/5mK 2R(P墐:!u7^=vpbߺ36^W5dIr+Rq]B?7OU$ mh!oVׁ  c1Œs ’3͡?}ϝ,ܷ,2Grg%U+#C? 3l3Bp'fR_rM\!1^WrK"8UX+ rVU#;3=SeUwM+w*=*Lf{@OgS~JnSj>K?<"+[zpü]h!4-d VS`7^8촆V$纴a9 ?䗟٦} @~֬r7PAq$_-%u ם^J ܀t쥽 ޢDL\|m*jA@~J0JDbyτ#$ ]@2E9H"K;G8r~ K/|Y/B_jcǪUpa{(rG@)<6Q~:rHٽ2.3/B=*kll+G"gYi1=ĕj5 /WڧS% Eu0v\s|ef2"aP-D0g=) aم0V奞oW(4)k-,kA^W:4\:KY?'֭i^ *$" C&"fN=_b'^rՍ9wMlj$>rk2?n; V*Oy!,H"q%lmTs6H^=I_>XΠD+.)7=8w(Tz9w ?M/S@%7 }h,6-.buFe 2x+Rb?@'\~gٓ8UW*$ 0!`iWn:T52OK"9kRw6V ݉嚟k={ۋ3==IdxgkR֙ <&J{Ex"='BL7-՚+ 㪌p_"\>1 XpeU[R( weyq/5 `Xw(c/Y&[F3OԹ.6'4/:jqc\Sbheylr*+[K?.82X.GDooM1;E?*.z2lOHR.P{#- jb8aWkI1ml(6bjTT!\q)KSbY  @DM |2?dmq8 #Yܻ3AV .)_WA@+h)sͫzjj秆,0$^tZzg{3x7L/F!$D+1{x˹2Bi4&i3Q@"`(t!wsQOfzAN\{&5Rwmnݑ\tY&d}R:T^ $1K@NGEJ9dnZgK ǀkh~zz.<~n[a+ f5E9Wq{@Jcoy"b~NC/FīO/oK#lrumZYd-2]Rzќ8NSJKS ;6+mU!TT,5}=6#aT^Jӡ˃+f{{"^Pe%5t?E#L#@,%]XT$)0*B j5 >op@$\&?HCŵ,pBK aЍ/~{vͨl0+TN5ŒH3ǥƥ2߸ I*@+iQdNa4ؿŮe(_py_xg1BQ9*å/۾ g ]M/? 1W*?@&fcX7`v#(kEU@^;Q9lgW? F[}GVda~(SJ(IRѥ{U EhN*XUo{)+KoK~~I;xs.>[ݨ; 'r!z}fu zeʽmei޺$߀V3XJ\=!?|KB qGX-ܫHԒzoU&b[x~ @74},~鳩Uΐ{$iY(7pK}%!R!@Kk{#e_I $>$) rɯ)%7 իg*`ah"Ȼ>PjQIJeuU@OP٪ʢz;=/)P_ְVVx\ B4\lh_3%ňO ?uβm%w@<ܚ?42T"ܜNқ[(պ 9SVV)<$2%;RTNYd>Ɂ x^aR1ٶW8G F&R0,!{/<nuRl Fu#Ueɥ޶nԃőTgdEА 稟ReW*_uO9I $g~W_b(N,=f玻wa+ݯwÝ5@_y{{F#}%lJJ䲓jkK*l^Qk sX  Ӫ|~%X v9_-"4IV"Z2oLɅEZst{8v ^Zbcc`TCͻ-y qns6*6n$ j$K!ӗ~a?DWf&$r{[ұq< b }cMadAŗ} =,;f6' фw cǓ੧NQsea:Q3M:]Qod6zUn J='PީhE:qfpp=p-t_g,2hr)}fE=Ԣu*i49x-y7"43Sl*{knuE֕.XL'h@``6d"/=(kz dnD*`!<ᩒt~D|Wt/=5Tc0;1SZ !8NR0+7)ca?2j-3ÆU˿ -g:@PT_cT MϨrIr^mgH{&j-yS>& ?mk/<$㬦@j%96;Qm?K4IȾe+ 2[ Ր ҏdPں*$twT&}'_o(ueӏ*UEes-B,ugrX5G,QVC*~'P<ҙ^^SD_&b7Kq6z)ea[p&C<.'#i,"Y#NW%ŸU5r q }ʙKظߐ@8֢'c{C$NFc[ԗ mjޓJ죡)NnPӂb}]8@mQFɈ\>`H|B~ M zAݧOAuCyfln]gRYHK|!\dy@A:oaDu]Α_ ׆ 8PbVy%f1prW)IF2EZ%HLXyLLVS1H#|HGMt֥/ LtU!zϩLg׉Wiͅ76}}HK$v%W"x* "@Go gfU6hD)R~ҹkHA.nƸjL ny.۳hZ,$}ji -kSaf&}W x*ou&hD!Ө{<־`K7dԫշ}3"V8oVYhCM@ #0˯J7zف+!Bjs9:"F%9@qOus@X)!lT˱-.pJxRHu/~\@kβ Ϲ\3 | 6 g Co&A~Ąl7W3xTfuy|$m/x qdS#K5/OkHC_O3o$BVqe$IgtOhA՟V("VAm-N>tHBa? 9k?#AjHNC_)#`oPoPܲʔ*;VXrBW̄?;g\$Y>@j_Vƾ-R?['"췄k bb(d@, \Tx;f<[9IqiB9ͷ ݀~`?.Qtw7U7q.BUv>nK?*4m_E-3mҦC*X7pǓ:ݖnŒk 74;F7 6`R `±oRMqbɽ A#ȥi gώ[AɏBep#<@ļ|qƯ~ ԉE +4q4dk= &Bubנ*.ť w@E'-x5XY=xw=Ei>qd[9- T}ι8%C|Up/D.BtfQ]** rG,>ՕFg8IgZ i 96ĜWZBa6٠* is5ܦz{uəOFL*JE~za[ra>ō[?mƔN-+\<$[#^Ы-&Dm,,p1Kc l63a(MF=5: țY Pb312KrbEi%>)*Ot0kƨϣ^vZ%?!lN}Fi'@$PzHze}bkfsb5ȝfVjOgy-Ʈvu2$Qbx[iš `{@!}db/'f g哐_/ U@W,%?LkRPcH~qo^- )R‘Z8|B@_W̘yjXu8KѺF0\̃GL[=Y* :/,/}ؾ>KHzJ<zˋߥ ۢyN5[Z7@9wsFx [k4T|f { +&OV=4[y+\es{y{5:.((.f;7GЯPS4"0v&C cy Ad8@ϥ\ 78с[jZC_u{*]) K#R(o%5U{)LE dAka4o?(Ş?ޒaEz3ًɩ(2͋<^W~d ޽[ə1U{jA> K/\Kat7`!*M n=2x(I(՞#1Ty"48/DalhIҬ٫/H kj>:r`w />kCvmr*qjb M(zSZ׈7;-{(u]FKgoK|Vy6k ϔz8|\Է.*ȯR'vMK`̖Sˌ> ?EW! i|==u" - ?2&1VUpT)Xw d|&hVP0l| s[;ܯ4H=V pIn}rK/e 8 SdIcmR.U-Yd gj$g5>QAS!K\cD8,5o`Y홥Sᥲ-" !+ḐC2+tw\.Rp3^aN=+>W[ZRv`% nbdTq?{:୛Dj9K\Ś.{pI{͜#@O>k՞_ז_uY]hf`k 'L_^Ay!o3ڀJ1^+TA~y3os`_\Dzr9lŽEzOI=E9-G'ā7_۾u2952JMdP!|<213O}AL>H@ًR ȧ u({B(l؃^)nwTWf%K!ӳ^*\])]5H_U6 \#|%ˠy;IDAT$Q"O'{gGS.\o͘с&X}<>/.Ce$a]pmTȪ0lΑ*% Rb^܊ȭ2""-"ܳZu=gP'zڀɃGj]S*0޽C YE]Zc=T@KU'n+}+-& D̈:ʿ@CRz)rj4 w ܣ0TtB 9ôEfϓ`@*89N (;^)e|@`ֻVC/v8 (Ic%ΕbE*4k85|'L'W*D9O֕0x2YC؃ʞy(a;|~q}K'+W.t)0>o4͑{!%k윚gv2@y}a6.qkL[(_jsR Ti TmwcA)zweBV\5`ӯ_Cƻ_Sj5aqF?<<8Kݏ\86Le,/-4u;C0 y~ȶާ sN*t2^L0KtMI19f-=0EF5a*Z\Pp; EbN؜`RNFdy=XZ2'>|bIC%}%i h4[ zDpo0( 5" ˁ@܂|V+CyÅZ0ϧ[7_@¡ʉ_~ X~ =pKN BabGPXOӋC&" 8떚 *Ga{ԓ%1M  2@) uyrԘn\8)^dŗ.FUBawc~տ:N&s  UC8\ >41|b(< >?rw"yHaNPQЋ.Fn=;e.ÇR2/LR>{, K;..̑T*=&Pn\SPE55bh:i.TKs"M>(.Lr*:uk yP!r\f-ۨQHoM)ih)m IpM!_nx(cgc( xۀ !Cɩ` ( /Jp $]=@nV!TQz`cyNPDL`aI0kFgw%. Ł>֗kv'l |" LC9/ALK& J]Z\ϕf<*0 ♮55\^耩|9+a/*UgNӉ*% 2.ͬb&Ni0;*Q:D `fXf<;6Y >3}kLLw2$/X!k@m%{1- X^$M!6k8(a!`l_w^T.=3c->.]|r_ jvmIP)? zczйy `-Cv0%Yr)#D#FwPq_ ȼ"ISDM BUJKa})uZsa`n V\b?6BkY x`ݘu?ZJ̙+7@ 8<>2K( LM֏ۗONJ dFBc3e >B{zTydSY,$sM@<)Xj1sgAW1H[EM~S k#4&Uڋdڑ C 5d% -E_ Vvz\٠ND鯾$d[D(:&}{hP)ߧzpr)uۻF E`e=CFI{'lEYla7 'zjC;Hz,'QS%w3rP)͊**䰹!Eeϗ匃` h#pJ&R2*FSmoyQ\+4yz8|7/ZA&,1 x0XnI)@`#LiA+\vnb[g C0m`2TKIX &P寳r_D t :/aMIr yݕ9s毟~0|!ٳ`&vh=,5 8l#i em@VITc#.`K3 ^. sܲhs(U3H+;-4fr&X2M5dž?So_'l }CfL]Jois^3> @) +_6 + xAQ`cÌ(l^X$ &nuo$$ a$~[ݙ d)C})&t[% //.Ay(]Y"& qIR[DdFG|haƌYA@E g/P0* ?s唙%u8Wrч* %b`Ή9f<F_ŠmR[D)hNg,hb́!PFX=ܫC)ހuCEu0%9NXB?Е|*K!F"d%%"CI2E9V\#- ZIrV _)Iۭ{c?hzͳ:&9K5Dk[ 3['g]$oYI"i 1ϔ", v्NŜYx_Ui3wT,$C?gʉM]-ԇ"$|^$HJ}=N26'is]0q-+z*7>#pQXARZܡ<ļ_iYw};[Jj4Kȏ#À%V^x蜀qE `bL.UIJ_C4Iekj UyU)Ϫ I!!ֶN2rX f;m_ST|vm#~ sIJ:q.=SJqF=$)|rߊ S)6@b.ד B1pU)53pԌc>ӆ g:ߞ؂rjȦc!2 E!.(X\L2.&*3%%trs[/r_fĕ;T@A#d^9% PY'VLm)Re.~!> h i#iy q|g76 =" 񨼷.瓼ixiN3k S2ò~_€^o9tQ@&o !AiPi%͌|/]yU '*g&j%U )?X9>X.07Kq@ 2+(7騭 N;pmP\G۷bx\LD8f'cܚv@ )g^zab4/6 KP*w$$IP!1UY<]tXpE)^dJ PUsEFGMR"/yG){0.-R7+ϔwR(W_C:ҼE'ӃaТ-K2}`5ov_.[j<id亾**\]PcNc)uTHk\!T$"^+~boR ם-m$8RE ?s,@Ĥ?%Q_\2"V<N\1H'bl7?| * '>Fֹ ?$lZСSAR{O!X(ÄsݥQpmw9$:Źn5< ,,N)GX? XeXVXRZ*Te˜/8x5,"(T4N,FJ;at3[6oo>#˧?ٍ=Eb7 a$fG!ct@LŞ2-SlZlTOؐ$f  -ӕ.Dy4gmԃkϩ.C\Vn")92fqH>䎹e7Vy8wR2ag*'Ι85c_{ٰ9ܝ#S.pipk c-HiV-pqK_#?D2H@ a2eGd/@De`s>R# rwd"^}z$&t`2 .京.ϭRtg_7NLn@%ϻq}K˃9] eƱpIAR\A=zqa}e+G6P^Ϗc=i\A,1Xl1CqpL23YP˂P .; c<)Tv,k"{؛#󟗌&ߟ|LA _D@0 7էLFF"r.oDʆwPRBE ,)53D qk2)*^Ą+:I~rK7'`(K(pXv7GybUV 9].km@Hz|AL@L ˵ȵb,֜RSxRL!AS)@K]rFQ#=rfw$^ qm Z&bb<i2c]CK h ZBX3 Ux8(u}t9`a0ȻŎRLy]r"'J>DZpɚ(x`::.rLLw[.I(F֗̓z'_H!S^/tpYr±~K&UEpӎ.Bg-)`AqM;v9aB N*RP"B ^-0I #D !7 b>{5E{0S*Q~ YnB InCaXoț;b{opM%Hߙ>@VM9UL-}a_ S_ [hW[Fؙ䭗nmR f~~Xj1穗ĔYƥ:y*MRQsOO 1L#Q '~O7޷RRkII%1:DYI 5<^'tu[vwM{y_et+6htX詑KF@u4k5;M!-A-gIYl 1\Ę@f6˘ADұ"3;:H;gj>[>ͨ~F7ICnu5k9XC_wUgː}a0:Ɵ ^5ZFiXxޫxWʯO|{:[KLH:C2Np u()Q4*ng4{AF Rv*>S6#'^U#Mh0p$^ 2_Cx,VD?_#:k~KbE_fIf@M[9ڬ[Zvf02n _|QR/]tyaQ[2-k RڠKj %E%bnIHڒDL`T"*$|2c~%XL"CXfo;A)BG0pURuƕJBؘs,ذ$)s-!G@iHaf#y½\?!U~ a4Zk4;''eYxmW_ay s4 H7*^k^aA))x^Ȓ A# ^7@y=BBOQD:(Ul LqXᕽ}|;J DLJ^o+L<43L(p+9m ߯u-Pd.h{iI׽D /JERHj$` "lzNEH,dE*;Kh6Ob:"zPie,jm rn^@f2GFs!b;Ts4=ُ_N6j )3ZV791ekWdҺ R^W7Ε/k2(f :BfD 0I]v S_HRJ6%S_鷷2\AJ (- ,xM?k?(msov,>rGF? )?+;c2fԁ˽~ `'[WO6jEs7nlm|!`jI+bLg8UY~@D !1.I^( _Tqx댠ӽ| F , b+3DA+œ4^O&@:s X6P "vXŐcQs2Y讍Kϛ}f⢰wl!tKμ}w E|ChEaxh|t4G>w2>CED+r#7ZFdQ/OITƢ[1CYlI9On_"Ja^HrBU&:#} 1] iXq$F)y`^ZcW%n+xD">`+.euPs휭o h=-.ǒ}`qiOO2p/3|+Ll 5MZ7V@(~CO537?® CZ5<*OӒqA& L( ib6FJQtrSP/ܷ]IcB6W=Th ^v-߫J)MGYX8Gk*'&Q|JpNH` 3^#}!J5Ԋ{Rڣ'o&t1 Ѵoq_޽߉,ohJ4 ^; l6͇Vy EB9ݩQ$z o+AlSJELƤfzsBQќ:2l/(yIK{ s-h';P!~J4 2Xks,7 f5+klFkC:?ݻ/}| lAa,P?Υo)iKt`J)(.XBd Z D+Lx.A(2#u%" 8Tzf?(Q3eCͮa21myg/x{]s@d`y(q%0%,ۏ֚JkoͯX_@}K}Y>(&@h|u2 2LZfZUk)bb 92iP $-EĹsF􊤶 IRJcE% Vv=1>kifdv0H|yb |rOD{$K2m@SZcؘ̿o~ ?P Ypxx=y7n>ܒ/sB#[Dڜ5K"],$yb @nolr\Z1Ȱ1gLKGD!206%) >7ߡdDmjTgWc2P/b"Ѫ'j{bIj-U$03(V!b>h(Z5{W#Usסּtx06a1%"?XRBB") jB~% $b nYlc63]]޽]_U`i_9VCI1z#OF5~!Tg"ȩF>"̈ 8v6ծy̑BU1J`;գ`\RPX\R+qV叟]1-;aNiEiU9qkxq:ApTܰқ}EjؾzFwX8=c9V %Rj4JAQQt7nS~BΦQ)Bo<4 LhA._S8_0L#^1=d7JH2y׸֑6[p.\~;Om̖aru K;!ݯͮ 9%B6 rϗL 1,-2^I܀;*Wc`k2J1#,HIѼX975O_E>Ye.ם?YW/-};O2|# qx5~}GC"hERaȤbCbPߓʃHL']/-)\(8:> z_KJaStݑ= pCS#\qaÈHK=)Fz5;!SFQ>XU:ni̖aAyWsȁf }"b;Q+xl ,'2$GӀ Me pDkJ>$24M)2eQh/8{9R~L/slݍ9 'IN-vPC+~֬B̜8]4ۅ'@! dH(cҶۗ+ˆF6£= 8 x\)u d Pj_H cc^cﭯ++?DZpj -WoЗ`=s."USHH(ѓ7>t 'Wq*D/-xf `W:X$ *(? iDBvJVuwέ+~q kN$x2;%U/ )i E`6O%I/0d * sJ L@PYi@Ǹ\i`ud:F2/:ݿ~mرw:5̆&#u+?_}S&}2YȨ0*vDTYsEPbps $#^&ۗGPǔJi1hx")i*r?Ac5Rzo.h|o-;NWy_ ~M9p4p_Ki{ tJT%E'2̻K <#X雈BE(*/Odp^fŞ!@cS}f/%(Fl%XѪryW]gy|-55a-[s/ܿZ{9 bg-RT1S *< $dR셁?EHpq9hq\YV;tH_ceu#@<䷵sLNG‹LWߵօch[,S#*, } 誳H[s>[TGktl7.(@Ұ\z.T QދPR@堏^tW4dVޓ I (WnpXq_i<&)_A@`o+cUrߋ.[ڴvੑfXPY}uUtc^,uTט<`Bq m)Կq/TV-68vr@Y ?a&;(-@4$*mJ}|8KVі>Pf-읹{Mi\E>,4ӆP6bHWIG%Y<בBYCax/e?DD_B1C{xk!.-;qEsd'"8 2[$~7VOdfzU f1gX `f2+k(+rj@2aJP^kUH K< :_ÂHe( K2H9;?o ;q5z5̇..k$8}"r'3MUek0 a 4 eP*5A9IC^ !CS0#E?/04*mAJ% H"d8 (Bɯ,?ymxбW;tPeC=o3H[ y$W}λh4 aҊHj4c :}((=AA~@PC~(bX:Fa.?3'叐?m-p1 W)oi̮x-|^m.Dd-[#&J{81/ߘ;$ux/A(l@L7n *;3gP;fv"'|b o:i &ryU=vKK{TC^ߘiKD J,, jRëX(d=H8{/{݇0*v__?|=ߔ҆[^;!Mq3R>, (o2  &)t#!AxX"-#`:ޅdd%"B{>~V7` eŤ?=W#>KiV)JwʯA+* a XF aO11Z>ߵ([]` Ȭw?ZyPcx>9Da_ &eJv?O!+0/z(&ʏ ѷ? `يNkw#k_>`oi֓:4=~s8X l!@M N' #?/aJ! p#Z>ܽ.V񷘴`eEXpŹ嫔!Mŀh}@K\`Ia uW~Xe'W!--mEe68 ϭn}Qz~mb9,RGz*:VciYV[;aqNk֪G{}Koyiޟy9zpo!U 7!j`4VZG}5m/mͥ=0;ޛ,|͉pߏWt*9R,"t%1)fm-%*t̩vOvSA\\zN=/Ep cHRMms{n3'IbKGD pHYs  [IDATxy%]ٻLw-&[e0,,;LŘH vJ^b b=^B" ,˳!pࡇݢ(.5&tCUd29G>|_O|ǁ3: XCԡoQӘ yE1 t)aŸ>>|_'?8*wᒰ_"p?|,==K q%"eYb9OKKNEo dܕ A^FYs{zrEZ1Xk  SW=8נ[3 *=!WH`b[`;2@:'O\/ԧ>]wqdǻjV#e1f_D)CkOA[7?F8z(_^~!@&=,4@JFx;ti?}`(~g~7D&=ì4H c?2]2?}Qҏ؏w22 fBM{]p 1|}-s=۳%"gi `+t?}`cc~/|3 f|5HIaim@㬯?rv9,@4[p6,,,^|׻odxN cG88=N UN8 Jw]{ސI9FdҚ6 H }=."<ü/,KZ|׻>W~哸E]1\#[v_K8}mڶɓ'+w#[22d[YdjAhWN]E裏2??:#Lg[v}{Ǐ`0( l <1Lo+f~Zǣ$pwgx cKLPݞ?|b>Za$p ̺{+Bvxꩧ6;p]we8%ΖݎZN:h4oR#2dDk00<*tZs eY(2[2d v۷vO{ĉzJ`&gLg4W`ZViu)AtIӈH%H@Dgx ;uZ>xs̔@gs p;񎋖f2.=t^H`')u9Zk/Z`+m'ӧO8?k꺞:p.VAǏc}}xxLZz^{-/{˸z܁$ `pA@ =4x<,Nw4+0z0p5e_e\qܞxՏ>U@&N` x2\ L4: { x&` Z%1WUW_ͫ^*Y[[{蕯|OktH V' N dt++0>i74K]=@JoӧO˿˿Gm^ g2L2bi`( ϭe #}O> `2@xO~cǎ׼~~8'8sفL0 R߮eFuՙU&OSYo`'lmKE+EAo8\X`D9?OoyhL [Hҵ L?BOZߟj.Y!e-p3'NvmoOMo/8/21dimɓ>z=ʙX1"kSyS4VJ Wdt Xx5C1Sh~H7@k=50-Nϻ*|}7}7} .bH`fc?xt ѣ77+__W8sj\2=s8F㚵Bkh[PXq^P@E$ ߅Q8~.dx_Ͼe L3>O40hv*^I6c%~W3 ~x? 9d@(s ;k  NX薀9K^daŹaxY;>L]S$.B@Ksi^ ^/7X!8Mw v7[ݞnJq.A<r-׿g~S8 `\l:N`8PBY F);*57J%mAi:͑D-qE۔3x^毹&,vM l~i`4 "=vszۗv.8d?." C<_5_O8+&Z0%'~ԃ>g_@-{G־X'w(q4G!/؉,! $YS+RQ\4</ez0Vvnv zHt CK}$"9ԡPMjN>'Y_ gZ.Mz y:; hn0LKu?c8D|Z0} ^O!i^v0p(K|Ss#jYR^~KKKz}$UHgD}`0:X*_W<} G8dB0h~߽Z*$BםPl']loNv4lA6 p {L3KIuQbe '~?͠Wrp#O9\veF9FQh6[mvb}@q).ԶfMpjBߴCۥS#6PlL*BL&g9'9u>h\up& 9~aϱss>.]h 4 BXG@+&R"kPb}?{x3`1Z599c >CoGά1(G1@Y,\NOꚍfu즑@89l4e1f.X`֮eo<œ)}c<025xYGDKg[U]MҌU(&bA,%, zcԆqU1L50 k&RZrAAA!ʕ,[YV @V[6 ˣXy-pK^)CQ\A7]luŴivL&nfL!yA#'?s|<`TWLb=6J5)Ա J (`MdRS ЊZ\3E>!bQⴻ``rցՠ, % Q_%XP+sCˡ65fc=?チrJl2RZ'S|ž_o+o}{^Mdu}낞U̠"KYn!L#ٺ,[0V=g|ħ><0L0qY&Ivi[gDX+A\nO+T FV^z UP[jEaTb >5(P4FYRN`[uL+{j_U^?K)PTPU</J~-\YZz~2ӝJЭFLuo"kZ#nПQ}15U]y`DVO%+rb]iK>0(V00J1CiDF"WZk cvxRaj{iJi* $R+NǓ U5XُR1V྾)|9$_mTq*#,b>pf{0ƴ& ZtV10+uJQS~Ϛ#<8/cq2 !%N@b,jN^S"Lw\P[yRYPJXo, zUE(^k0Z c"T Ԣ6cjBUhPZ*c0Z .ұFQ*E ›KჂZPGsݼu`U3PYIxO}9heJ )g>qaqe';,5a*eMj zڢB<~>D(v;QXe165:Q7dR̡YP0'0D/z@B'|o0WX\vӚ/XZzS# ֻl4ᐗ#Gp1[p4OZônKѢ(hjc1TzD||>1AxۢZG =Ƅk-n[,`4}_/1x>E}]O:œOSO[fT(p5bLw<=6?Ӽ;j"Ѭ")Y%zT7gCl);?e he/ <:'!ǯ>@>a%%BP{M2 Q.np]|/>(ָ%B D- }5W1a p1 B? RhW…Q65WyXR(||6^( ~  uRP*4IО &$oEXTjX@L8u4O?uOG[Xd~VXKX(nk4NHhny߳PM!`}[!87a(En[U|_aq~RzN(+qߠ'uj(<^ś[j*YJLK݅wFP1ͱյ ~iz8ژriѕWPB7d S ̯szv7]2(lj.AѵZ~G+*8&+j~ yi]s3|'8y6NO5SpRl14Z~%'P 6k `~a O~z3O</.0Z^F\ ACV*ytZB?WhQ IdG$u~f T-%o Ko)/}ևʂ}.rlmg~kϻ@A} jl^>S~6jj/ؖ~ ?AИ4.D]XTa3k7kb<4aU!KtXf?t[ɾB!5 S^|3c~tׁ莀˞VS >kMʕ{M.(d0R禙we:,iSFԸ@X|jO6}|a=Ug6. gz}TOSXL*d@p&kNRtݴZ|P&T[S@bL ass<#~o_0[$_OÊU3av,af `L,-2门кRo@ R$MKxN ѲwaY^Cn+LsTLG*TRߗ$K|ELM摢db uA{%ҾI0'!\Ƙ nc RR[~¢_dvY9iY%D `8D#k4IR {êh(|PM^|oSEA/6#>?uab~ c+GRyƝQ>FbupĨ()Tѧpy6DZH]8k րf`JB~\N\pLJk nQYYB& V3$\L{ X1P RMG?>g]IN4 J81yhmϪ (1kIE0G9!eԜؠktGo~ DFH0j6 UT dg p*Zp@0B&k!RAr~R79VDihPTƳҍ)߮Cm7#6~W\1c8gNᑹ9ʕ`RM8ƙ'1"!(\@PlL5U9]2hJS4D4c)/KOp/kvL їPiJd(-mpA)R߽QYii|w ~֑Td<7o, e-,rO7x֧8/89^G#ER6 h Y'.MŞc4KG ؤ&cE^IHE^ce 8;26(z\%q8lzfikGm}&ݔ%E!-FBPEEg:ڌ]53q<_v]Яu:LV^U#O˄cBXmo%b *M 6qh( Ņ8 (vٝU4ck G.j168-ұ>|WIvQH 5 RwHMt?WBT/.8>Ѭ5xLH J6.4.jk}oOLi|, uIe֊ްY?0cgC_\(G@jo4NjmЅX$*?Y`)%d"ᩒ 1&Z~P*!=x x|GTh7m",40\p@҅:3G&]4WuAk q)_%HR;LI=! nRě~aO-$-t$=Bb vvbo 3B hQs2 oYA&]Fk + t`IPݖ6?bRPz-1ӡU, 9t,=3t˓ӾLvج]?ДJ6VŢNg-H"tҹt-"FbY@MتA(`B>QR!i&".q0-u/l,R!B{\+VNIM¯i,ne ssq#.Q.-au݂[Oj{S_s=DiE!1fs{}+4%Z ArQ!x7^Zhu2&綕oL˥ ^6HIL7V彾=.8d-._AJU㪈jLtz]hPmyFՂdZajiiϣ5y5xFC$<#f6ι4-kXJZ{i/cB(05r ` Ajn1IIA$Qv⫊S)K}c2Mt?H1jI#R|6M3q41o]S-WAp4 a%Հ@{gΥl!h4 _QV*/M5u^ؚ:Z= j7!h$BkBZ~>R8Z.?&{~OD-JUKA嗔 ,V`.7vY EoB\Zv( @(pu}NZԊگꡊ$UVow-=7}S~8#md'%1ؗWb871]bf `-~5R(_1Q]M#(*ɥڗKwS]8H{,TMfyKCL)6=Ri#!PGIz5VM7pIאHnht$X .?ͭ;Gvv #+KheQVIT74jP|WЉ~efi4tӾBXKqX'Mhʐr+WR ޼9Pjt"%XRc;G&"F z+mS;MnnD3Z A+[ݬ㬏EA;W%[Cso_h}4:~2{J鸥nbRz*E!X;:5XXf5dB M^@c{lzUsv/KuN¦ޭ'[Ӫ3SRG8C ǦF.N2N^m|qcHf sfdҖ`]S} jZ5?5{ Lu;5=>K5h&Aspgr h t6&VoR$%ԔtjF~hn2eu`Pe em81\M{JTm(E+2HyL8||- >J[b&%ܔdD;Hq{x_R4\YޛG&]^^r qF{Z?ǖ$-n_8BiQJcw!P!V#KfQퟱW lR&D !0SEMt29f\h. `/,ulfO l>.X i=Ek>SJ}@t[|Ɂo S?5uHM ruy1inG`ԼO%߯)jA FIR4affßӖKKآ[`ft77.6iE&h)j*TS_'Dↁq\TX;O돥S 'NҬ5쀷 DFCtTA2qRja~yi&59@,eBd=)4Ϳ,tKԔ[֥lAfBy JBxj% &$ԼᆵS_TߩcJQzoIHb/vj/`EalKՠhxn7#ViLPϤZaSmjjZ}Sjio'{o]"h}3T};Zq` A[h;dL &ШTHi߯mZ5xthE4->LY:d V+g.i@34TZK$}|OR7+b $vĻx2vBCKli{՞Ӧ"!qQi6Da1MWd8G @#!v AT1cq$BPW799.8ib#5lڭjצ𦶎L4ٝtKE9& )YGyIsF.%*zq-6V>Zg]S쿧$y֐W*"h(hK{Pk}V: ?.=ZJiY$/֊wߗ>O6ŧPu)Da;`FW=00hZesQoPj4lRf ~݀#x tH<3uVU$SCRc&L9 eHZs]sZYzwDS囔XHI;I+zQP Lz~MTѽ59ݩĭeh wwҜӫST%F_d5?X:4 qYN,߿'ŀLDlۿou+v&uw\7AA&W CnRbؑQH䃻`wU{ЊhlhA.H*f< [ќp93j W: 7r"$,1:pZd)ƿ.nm&kB J4x;Zم& Z6>{xo>s4Eق\ siKaz 4Iٳ; ̬"[D(5- [o 5By5x637¸\5m͛:Bse,`:UO"i8>X 9t܀M@ b&ZiCgG519 ڬ".|)Mv "V㛛[1 b߆al{8_7'#ѮW"ZpiGl4)?BP=‰gf?.x $MI ]e,9 xΘY`V-AI*ډN E"֯KM 7 JҥZ}j$9ƶ*Ђ ˇ"#s3¤ʗM]5BLsx>K4FKT3J]??瘱;d `&`Z3SC^ѵ*"YXXf{!\=Uqbcc۝<gbMfVg&-  M 5 |.ù}|f,#nob4X7R(cn|KS`qlt}#F ? I%98 `DlgN7qA ,3gSnR32dML'%C,XvQ3z" njF@nTG ;͸-H0LwcI1M nyMd)3I5NZ/IW!>C&g@M%Kyȹ"[DІZk⢫W (Z$rI|݀t_vqlIK@!礄b#iM:rKl/ǥȐЈ#&H;,|zk,`i Ge:ό#[#`2AOa &xWG7L Wnx!ĉNKl6z^% FHE:ܙIbc>A3^@ۗϥ,RKFBOAL8vSw0Zj:lp.BR^v9R ב ;;!}%ZT"  "x|\I,>yKj ?eY/]<~Ć%hzkN٧)y~8!r$duA-WV떱[d8X+,RP)5yi/(Jٌ=r[3>5Mx!hmbwNBMr < 7U6Tt5đBCӎ/Uu ! 6 CU,@.. \00eYUn]ZY@IiE`K֪įCӋ_~If}DM{O iݕD)J]Q8=(T!.F D}\B#SIb=PZσ`QĊ2e~U,\( ͆J?ݮvKzP>(fFD7 9s2   ~DH@"nqFCc+œ`=N.>kb!1>SI`R0jo; 2<lhymhwkqBT-.s ~n%hq2}C4B.dVMOjۤ 9 Zn[nV7dZETISQ ƀ/"E+Xȋ>#dx[blaZz8-pvae`! AyDc@5aCJ!xcB0 &YGrhqġ`7> 9"qxhZ}ДCsb#!k XIU`p,gL/}8;Y 9eGŭģ Tʻ֗7ࢊIi/ęNTT:ԢR݁0C3!*O O.k{07#B'9)T:4C=dg2ff:]EA&BoCՆ(}PK5-~ү +hF^# {zKK ]5CJbIuwSj,>h T#ZYtӡa^K\ 64U#BaנB,bV r%9Ak^*^ɩB!0ְ.cJ)jF(KܫE(Ν bqkNk+*/߂fuU_@" h7k0'0;*@ 9 4Mɵ8 ƥYwRYCmk8kK|O\̌#_sgWmԗߊ5aBr$ 0.]a2A}$ވ+%6^x*툠֮%ĵZ*v߅&=c3 놑N=,6LנmbL}$ 7.W1&e%">XuX.+^X1_{?|? IBƹ 3kF~佌^u οj*+TE\qP *I4];26bmjg6B1My$~r6 MU_cHEKݷ6h|M0Fk򝑂/O;: 3D&g]cZnΏWbUXX:_#T=B7_K-hh#o{X J /z/ʑ."~XY0Dw:k|cЬ{`}xL}-#ǚ#[ok (ܑ <( 7ijuyou9X+&xj*ܠ%P RI7+ wskO"iν7ah)HLl|0S<'7Fvn!;"uv-ڹ_wG\,'xD0U5/b/y`|􌰁00Q0VH\k*>p%ʻ gZufU5(4] A $6-ˡ)MiPXi(I_l '?ƶHq)5Z)e4Z?S?ŕW]EUU'یLJQzG>99=QPMV3P0Q~hb!]gu ^kb&xK%ntΰ>MzΙֆDWhJA{]__;"q ]w}SuRSYX uxx JLV!݀pq 1f gi Db|hi;i~o|Oʍ '"{$řV9b VKy!ߊR,#_g[p}!/(kX+*TS#0b)@:ֺYhE93&|T7QtV^(tw.q|tb ܄ڲC?s۟9wTU sL[`Mo;Ww,Iڹ+μq&SPxq>vLbѮHTj*mMǀ}1HHeV_y׿? +}^1EtST,E|P,AR6jܾ֗;G'FJBhK{|KԞ~&X^W>A;p8k9@&AW\=Wgn2Teg B !+ *Z GBouS!|j%A f^(T(UP[?K_D&Bp Xcz=G {ab\BZT,%}m{u+F  >?_ DTEZ)-ȇoܟQdAh[x gᎯq(5cLhRn)Tl7*kkDoeW|e`ѥ3kcֿ?CS5Zl(fӀE9߼9xu|! -5P][qJ @QeA?P+q U6D$G%`!0k.o6,\KNf<t݂vo%Ee 횋&>FP+|˱O E0%m4|HY늈ߺ^ST_]|y÷}[6/0d@J)SG?7 WԳQh&Xe(TƗ #Za=qOA M-iVY*ݺæ6|+Q*2\`HG֯&e&*qǓ-8N5fV \{7}es"A&/1U?{W߇zPb0 {:*S}mǀCqo ?{7fs"C&[;K~V-RZCҊ߅B;~#|w~;dsC& -ƀ䏹;~JlXR~^o_rql_tpB+*~Gyo孯bƅ*J? P,,~o/5 "G/;~_q([So>Mojy  (0Fƍ^_  iG'x~)Jx?L&ǀ3:0*22e2d.#Fx1q22.adȸ1.{xno~ywY]]M7M7[w};A믿nYgG&K?<@KovnVnv>gswrme {8~'~Y9UwsַT2\D۹6?ǎd 7tw}>=ʡC6p=pwgx "ƽ;Uoַr pNh>|^)n{رc>̻nַ$):4߿-n.7px;jGgL)o6???SqS_{&1#ECm2]i~T+.Bl;[NU^EL! ͚ت([>2\d8v믿~OmKlU`4͍8pѣS_q{}j[b~~~j̙3{}j=2\dJkzaͬŊL02dd\paH,a-,,i]pa`VYTմńL<85m|ȘL!riV/}K.zdUeݴYooovl<pn?:th欀2}dHqwN>m^رc=ٴy>sL)n֩Bt1]z;q<,,ؑG]xgX]]{ØFoeUaV7g9D&šCv{Tw'4n@=fW6kMK(Ș5q'{ClB^4Y3fAkhHf@YpǠ&YDם54Vm*i6`O1 mH74ɂqa )̜4-͓4 =li?HSv 3#c!S~v ff`3 dϸ![< y!PFF!dd\q #@F%L02dd\q 3nɴC%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+=tEXticc:copyrightCopyright 2007 Apple Inc., all rights reserved.f)#tEXticc:descriptionGeneric RGB Profile8$tEXticc:manufacturerGeneric RGB Profile=h>tEXticc:modelGeneric RGB ProfileoIENDB`leocad-25.09/tools/icon/32x32/000077500000000000000000000000001505543434300156375ustar00rootroot00000000000000leocad-25.09/tools/icon/32x32/apps/000077500000000000000000000000001505543434300166025ustar00rootroot00000000000000leocad-25.09/tools/icon/32x32/apps/leocad.png000066400000000000000000000042461505543434300205450ustar00rootroot00000000000000PNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDIDATXí]%Eޙ(*#&QJLb|}2d#|B $$AyQ"hD6A#h01~VT@wqٹ:LJ1,&v[u9Ok:vS= ]˲!{@ k9ȑcF?gFB3!c1~ߑ#;+}7`np+x@8vl|ͩv^^KIHa?6;~sg:J& m4{_\/vF6v>%//2`I0``NyoOBҘ{< 8<2v>x+ZRES"տUWWvu;4P;۶wɵ̲h^iF'|>W]w^v,HY.ĪeV[_767n&IʀL6ɌL(8)3[f˝T`"Cñܸ(TN@D/mJ!Q'Ӂ1-qR*tf}:۪/b Dqpi1!qVLwΉ1)ƫ9WF_q+cVc?dzM;t62pبє~3df‚jYyΉ؄5gaiQ\MVnkǺw("{=f +ͨU"6Q֌#LOX0Q>ū0:S̀Pf1dR5򠑫.j0H52G4$&{~Nz\sN$*z!wW 5(&I&iUR!P+Y0sbH&#KZj`ntkҒxD;'OU̡b8S"UP79g"4 Т0nCUSj:Ad) Vѡ9L 3-Qu2j0$W33IpsV<p:M>\w^E { Ml^?\QZ璥ED rNRQY4nxifъDf;ԫ0/@Ny߼[Y0Z<^$9aoJsT_ZVe# ߻ү.:VH<[X@^1;.kcym~/XZzfY_lmJ&x%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/tools/icon/32x32/mimetypes/000077500000000000000000000000001505543434300176535ustar00rootroot00000000000000leocad-25.09/tools/icon/32x32/mimetypes/application-vnd.leocad.png000066400000000000000000000050371505543434300247040ustar00rootroot00000000000000PNG  IHDR szziCCPicc8Kaǿ(A`f{CHLeD宿شmY컻"^:f=**9R,"t%1)fm-%*t̩vOvSA\\zN=/Ep cHRMms{n3'IbKGD pHYs  IDATXåoY?y3 nfJ,%(\h\m4kbčШ^c0FHR@e&8^ID .BungS:Ng/ʌ-v쓜=9}9*MDv#l{F|#333PU1ZjZ:}޺n |WJ$j5rɓ'ͦ755z DYw`q|ѣGgΜ9nŋ=0|-ݚ1}&ϻN:ӃZ6u]0R`axx=q/LDڢJR$IuVرcUK.Mwཚ1vJ\EUq=zZ˗;kV1@?ШV!C_z9ƒd2m/ȫ/fɬQ"qFX4Pk6q s'g_uUqrѯa{L;Bb _w9w_ܳuZ:fB$&8<܃iz/ FGG㸣ooBˮ_իW9|pFn7orݻww^zʰ^S*ھbH\P(N311ATX,}vv@r07ctt|>Oa266F:\.wO"~2H>ݻqEyrzN>r<9CP((88p]vT ON,J~.[r~:&Nwη1=U}cwm02@=[j}wL0)>T%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+=tEXticc:copyrightCopyright 2007 Apple Inc., all rights reserved.f)#tEXticc:descriptionGeneric RGB Profile8$tEXticc:manufacturerGeneric RGB Profile=h>tEXticc:modelGeneric RGB ProfileoIENDB`leocad-25.09/tools/icon/48x48/000077500000000000000000000000001505543434300156555ustar00rootroot00000000000000leocad-25.09/tools/icon/48x48/apps/000077500000000000000000000000001505543434300166205ustar00rootroot00000000000000leocad-25.09/tools/icon/48x48/apps/leocad.png000066400000000000000000000075031505543434300205620ustar00rootroot00000000000000PNG  IHDR00WgAMA a cHRMz&u0`:pQ<bKGDZIDAThZkmU1ZWIZҗдc(ܠ"kAі>R)XRPPH@}=m6-7>ُk9>sqbלcoo7vKE]cPOh.E  b(D~SOdě(xËlm%Nw{ v d!B ʷpH@Ӽ7m~%O' WCDN 9$ÝkV<86ނգX`*-`a]w/c|5%ʱb<#0eO+93gzZ`\N|e:{\@{}Mϕ6#(]UBo0`t1QXA Ü1 1Lk0< T$iJH97W]_}bkk49iCuq_ ٰ:xX1.t:pz7HJ,q)jdBNAU 8(qr6 A,Jk*g:G;uh =3"&&@, p$%^z/nl*nEDdC%M`wK/c}r Ĉ\Q0.3 !0c!8`d,ѥswc3G¸Ztj4be6`0r.=c!H@`p69R S#r3 (edtpqwG:9ʐXD2CX"3Ca¬\1.JR: أB{E\`-h.G 0t-৻wTṪ3 .eG )LCD%^j,ر7 4 Z-| kf^0@pI6xp#'Nt:x:^.^JB7$Sc%fFeC 1ƝŴ? 0 ]lD6hh$a-^ h X{p~"]ԠMf60ТE@2kZDڼ_ld$b?bc֪5-\t uA<peD 4iTc*i۵F2(k8{e9{W2`phW,ɳIb+U!^nR,7k6b{.[V=,{ureX&<@c l9̸=O&/^{-i0;ٗa06-p[EEƟMleG >ފ ahy[yM92{Hr9i`Q6y&7k`` Njz?rs~AhV=]X:H;ub ihlJs7 TZ\gԩXX0QY MӬoN&va36? sjin8roAzP} mRo[g┥%ZZ*l`\HĆ43!ŒlHpd-Z2P;pj٬JTS I @Z 4N 6#Zϒ|~]`d3}uf#enW4$qQ Tuq2:eͼ`+ SAݑʁhX%=K0#m6C]b ٞ@,Z#]n Obܑ3R.bJC$# !iڬSyN蘛{ņ#hsj2i^2p٧us,zveBv60 ,2(+k7prpޅu5@,Y`2sʕhe c#W[޳ e@<'WzN:(ܫ!D+$E$ѤX&&5!Iuf5%. P'(9B i\ ثK# t 4bȵW9@rɌ D&yޝsRk4jw8uNn67f 0~Ckh,@Fie3nr4^7ݙ\~jwnZuw`:knwhwvr5iMo5&fmmlvo;>8 _W{ãsn pSD%D&M|ϰ@D3gb ȷ!Dtx3ǓA`f m A 6)dw[{W{m…;w^nw^3W\m76qk66Z*״7G%f@睝{۷rνwy{ky|ro-G轋0sLQ&S` qdD['m>@!}&QoS9zwn? ڠcMnj 1_"K~̰dnn`z,fg;;M77:ٍͭ '/i^4wI00]Vo,XӚZZ kZ7CAn3{{oWo~t7>vb~8jdmdYmXiG#kq=-\`E֛5sd`N ?I";tw%@ H#vc"ۗEA6 @CgG~>緉tݻM`vf/ξ6ϟrܹfmXkt⋆>!.4ִ5}#Z kZi$df:fLvwm}G|oWϯs 92j1he|51)%d%XH8"Qֱ?6BBR[Ix3F U|襗޿+[c~7M1 M3W1Sk<+XVr-CuD CZeԸ)j `Y<u F8'!do1hSB1GP39A ֢%°BZ ~w]6_w}a…niɗ c]kZӟ(Z kΦHgbX\+oqn1G81ƢT5rZl(J$`|1ӈՁ@\6_+ލĐ+Ͽ63 _w`lcF4AwW8:8خ&1+

XHRhXEg$%ޮ%=Bǭn'_g#G*o&[7|>Oן|ǻ~Gvk0k5}ZXӷ7LZ^zn~SW;~}wqt16fD(B1Ďj qKyvODY_Ђ.R.j۹0>~\ '˿4̉ijdbՆ B4T#-̞ʽ9&\'QBF(}d2/[>lgytw?̙[4:pM޴IOΜ{Od23}̍3O6g- MURxFNx9Ď< O{pȋѠkS(LQjD-ދP!!'2h!)=a PwQ x]HFC ͧ}}w{?矠Cam"Xӷ'5}[pޝwyc|晋Cm=?1Ce'_ }m{̇+f8O`r`䢿FH6؏`1QKN]8(1_;`E 턪1~mmtIb_^{Χ?oC?ߟϧ._.~mXӷ5}{P*j4w^[/Э 4B@P`,?cF*~O<%fdNuUc;g?r&W1JRќ:q*CA?U#D1iʝP e!&Sr x} bB%nBcCDkANY>Kf|s~a{~>na-ۂ~2fwSk|sO= af:ʴI4~Hpɔ6hyMšGoc$G8KS,{9@ t^t$ }#,0b/hr/1k -$TP2@ PӂZױK샯~ G<陳=_ ^ӷ5dSZ;Kk_|349.p(>5NJ ORF{g 淬:<8 XUzGHO_]*TH fPʽJa<<ڦR{Rr Џ+}8- %#@5۟yҟ^~ChMkh-#]޻_^o!h:M٩/ a~"Mȵ=JȘt!^bOoT߻%棙}:>S?=n)7- ]ͺj Dw^ ,# trpHL+I%1_PHҗRw B5-n>^|o|_x/ߝlo竣qM5Lgb3_oW~ F~NZX/ S5QNr@ITR(_Pl[ڋ]3<ۨ'yCU }6'k0z%/Q'j=+yEp#pPO}f%uG̨{+5ʘ˜2)3^s衟Cc^_cMkh-!Tng'~>xcQJ[yԖAG3ݜd%Vٯ*|+h8G%Ռ=;U?R#]'OJ3흊=Lt"2pV?q<N3dfl`5<9/Cvsc-Onqp|}vo`MkȼXӚ)bv^/}GG號8$,R61&6Tқ 3iOpYf|ʊ"[ 0]0и\W~ڟ,DRՐ ͌YI8ye$T d-|gz= ~N ?zޅpG>xPۂگtZXAM x/_{0l"pH`(oDBoo6R+xtaai;P7A *~ PT9Q(_~ cQD Ejt$sP@Nh9w s)`fS|i^~o5QqMo@k`M/WOM>U3F; 5bG9kmऄ=3/-PHqj$}\Y8@3"@(ehtU!.\jz+&se~1r\PPړ\2 ?{m|o=qqVkzcƛAW̧Gdb{h# $ƩLs}Rŏ|Nת l+UMr 6Xga7䞑]-j=xt~f'aq7iwlF(D 55_!0ǂhL˱FSt7v,T 7@Ն2j2!nW_c7z` ޿=~%߼v2ì5}ZXD'Aoӟf&iVFȿbT0܀lq1 ڥfr41f S(._{m c3>otLWBي@UN#>iZϏ Fj(sCHu-_|_0_\I$̗kZSAع3Oگ k*5<[ YW̤!h O9Gg5%?#lڥ ??ѦQBr)Zw D8w#)=4o}:)22>ʴrrbE`576Qsb~nl'fdc2 c̘Ky N侯sk6Y#ߔ x'!hA1a `7Kt_1r_ٗytII,0~]X~J^ho,%2CUi8Y a *C_H:_9ԋG X40}~Oϻ&4XX6Mt\ӚN7&K>:Bwvjo:~{4Cj ec'8LԳ w8a vjS_hKN]+A CEaS95pv zJ*y:d&=#\dNBQXkآHw:%ʾ.TPyTL.bŏ̟2:.WЏPl%.IEJ$Bg;菽414p}7 0ւ77&%viZ(sͽW1 CrfS2U}bEcD>G?W:m]g+hxS9mN \m^ )c+@E[zjG%%NMk#OXJ1b;QzWc-㤭/TKuZR7=א%Wp/]{ذZ ;8x5a%i-&TbshϞC |u|ǯ;V#0r*ْIzk:>Ke٢ŋ?ȫ6~YAJp[X22*iq#U,WT-t;r[mT?GN?,pe]8T)PZygC͋<\Y)s3dhq1~7on5śJh&x_ i@։MZX7M밺~ >fg‚ca~=a gr`D.#Lu]jre?a>FaJϧ qۗƕ5ジk>KJb|,XQ-oĨoZ"p6*” gQQư c~G|Ŝ0'U; %L>G{mM6na.u5}M3L&0ls=r"s&0ךd:1tL 4 JP{9 ?⟰tR'h0n3o%8'_3]*}JTG82R%\;gzʸ&t^E_l$6I{U)IT!1c/%Ǧ11vk@h' ߢH5}{ZX`S c8Sg3A΃;S)&#ʦgI3)hCyՑK1yfX'08F^s?}Cϑo94&ٵs?efVkaA?iy& Q0W)n'J',(# #;u) >Z~wqxXoD1i0:[w"S4[1jZOV4Ҿ~]篐4C &%RdV#1W%s>fjp-A`9׷lTϷ|Coo5ݽG# :~@w=oB4!;1&62r[f-oV Z,Sp򋓪bx&"35el.F [_(nTv_?4^NlF"Hs" g:i)NTɡH#L}C~pX=#5MÁf ) ZۀW1?kcZXa=>Zlfkަ-3`a@`F76Sl##C ^خ|IDk]:>vEC_ 9s}%DΔ"9x䍮w { 1qEњs6/J(Vwͼ7!=%l# 4 1\@ zxN5Qh-!" naҔȂ hC*rM CZbKe@SP;<huFj>/&  }9Uy HAr0"@}(4.5^ ިNPj3J_?b1mr9DHM`^C/1?c\&` B`OidO ZGC1Lӂ魥o Q/7zswF&czM7/WKCbP nsvst&®0R0͜˔ިS/naW,LEԀAfL4_1G;b*lƌ}yC%$V+wl~kZXӷAi+W@KNjYLdp`ͤ:M( q}&t ca8ڏI9eE8"O2^R~JTȅH3ƈvXW0†caQObD:%LѶC'M*6>6'#\5"s> }{r8jw4#qy)?Bj _Ae pC=V9X.!f&O1轇k,IgY 2&:Z;FUD$}lg8>ҿ5[Dk`Mr2b^afsDh1hC]J?qB3M)D'LruA`s5cM:cfۭc%Ԭ]xo5{l{ZߥS:A a!OZq|c @  SY2`y6% hL_8f_y_ <\?`Xx9|h 3Á#`hZn26MD3C4Xk4 wn#PVۚƴ'up{w@c4۰[[TVh," "Ӵ.ރ(2d@@[ Xobdfk3loa1C۴0&1@P=߅ gb6 [پj^%_yL-Vdl5*QrP2 L"8;Rs素Z" VCg >nM.lg0M۶y"(XNw [8qӍuxߚfZ kz۩ڂN۴+;iڴwRc16նvf_AБ }WX^ru̻-4[g1l,hZEfN!+jo*T #,NbwNΉm-[9qNWv/_Fj@3Vwrq4s. C% Pu](1b a?G߯08>r>GUm m@+ LJD%clYD,oy/駦g~v68 UD ִٶC 꺍/| /~ns}dr]x;3clmM3Cg-S,Vh`-Z 0z\`8 [g0tk t] 8AIP +K>*Y=psu /&,| !,zyAuL[jҏ.k{'}cx%# /ϜTr!|Qk4rLwy,f[8Zܘ}"d(b?7vvէx_}c^ڹtSd~o?G| Z}˖5}hLvπv{w_[O?;p%a$H DDsL~|L&4mb+!`i;>0V=8ۀݜa}& h4mN J 0`LkbA52 ו0B'I1SRWBzX(wH*_rWV& J'!i]HBC'PxMêr>XA/cҝh&F=܂ ۘ"j !H uxsGz?<{w.^|}utռ%iMo%5cXحm`:?t>x/>񵿺Ws=>ۗ.}b칯:tMkzSi-MĀEwf:#{/=ko}t2VA"( =9fAѹ+4S C?C + fذ8x ~1Cv`ka Y +nlNv-ڶmm Ld_aDHk cȟ][4kM+Y+<ӘUweMP9OקI)CBpÀa5`\b9cqtb~q `Iuہۀ x6t̢s|BDd<:NN<+O>s;;?sbG?s'&m^ŝ;n.7xDYn{=z'>p+?s㩧>K۷6S7A# S8^rfDxeweF_ǙQI`2릘!2Ep0p > p8v]~w CjA@;mL&&34E:H% ('1XkDT 8ĭ B^xxx~ 縪b!8PAD>tG_P%!rn?'/}<ܰjjD?__a1`:0l4P {p!FtfEAwg`d!(-V{{t L>fҁa?g.^g _9tpGGo_]Nk`MxJq-SO~d~K/^ hk;jL*J:Xccq&,̃Jո9Srva mm1 S8\0xnj=<9xNᛀ>.,1,%Yi۠Ma) tmס: l61f1%qv(SMy:6_0>&cm`P4sߏ9pPjZ rɣle 8Bayy8r__.1,Ws %VF&jhA7p!X|1Ikɑ!x1!jr"S 0æp찚`d XCb`:Bm;8q\{~泟3\?3۾xW/_sׯݻšBZ kllڂL{~_yy/`>f*dt˹U$ kWK˗kJEcy d."fnK wpgpx”0a7Xj[i&h Ibumi`FcSbTGKd>}GյRPy]U t+}d1~ =碆Za{ nazxaӤ( dt 01A"s"!3ÃSE?` ̺(t2㠅s-KRx* I#5)3pt&[[@9 mAmܸۯg{޹pq_G~u{enx5%t:% Nf@ۡ=x~ٟ>|rjv6J\fx.Hq. X8qӮ*~ *+jb<8U r:Y!1 +lmkKNx;xfpܧ{8&c <,@;8_̘S60if0]`(X+A60ƦE޼=cOjY8 /P T2xٗwADsp{x\H{ Cp!8`dS\ 4`PF |ylc(7qA"&:uv LA1Z@| %M?0RKBK71}PScQkSRu 0 x_;v>}tsSg^]b8:jB͚֤i-)'hv4 Ȯ7o>{w0̗l7N`B bЇ"͉K*Xe&d-#1ي SI09pᝋ$2C)Zw 2c,,Ym>p\]:qHO{" 4QF0oWlV>p g9YL " j Ll|g1& M|&R#CD( ),/ځR{_:{v.]zeX.0p t?brf0,6ã?{_郗_7%3&^Ių+mRǃZdG\k `AC0 ܀AL=|mZئA-`Z%)7Q,mLN;|N=\b~.0\:9  =i=ʃ1-ud(Cb!GrNJPR/Ѐ9NPj W>e[|Z&Y|LÓ"ge` d6ġĐ J1h7brjĹoKG?}{sO9VÚsi-|f2E o/~tg?]aG䦁܈~_Fku0&Ճכ8#4m< ~\8xjlbFf%L 5@3pC<1bB28x#J\BRNzilBd^`;G'hjP[L>1N&Xui4J,!m4SA9h7WDy'4rhF9M Z=sL `;X2}wV (oL1x{74 `cΉ=xIWy rPB/è1LJBCL' k=y'fsgg/\?|fK867u"oZ )Donbz :|?y^LJb67f% g'JͿrW?%8<E\Hh#A̛ 8,l65Nt`dAad!m&\SB %RZedSNsfxp>֚.9"8D-W`)` HBRBcxT7!0OqMBlv; ѓ؜':F"^҂y{Q+Ohۧ6 Y 6jFLt'gw_jtXB9+KiYE].f/iJ;JUzf# `g8?↚r 5 ΁i1O6|=V&{,(Ɏ^A(BE<ܖ-hWgG| GhFHĈ{6j~@0LHyIJVmB?C:ߦsi 4J>= ]!%V!@ K@x=S4y$I63f6j릍4< H(;N5+Z2߳d+AMJI'2H2ØȌ uUbRZ{nɝ2t[IlIhH=d2* :8y n;{{s{>s'v7G~`kۙqM~xןЭ'^`cb,dtjcT*V-e %<;U[j'%Lŭ&0Lr2s!̌ ޡ&M{ r>WKE֑zTJAp7_ ̬> Bs4%]T B؈L/DO(8F8 bDZ} Mt&!22ѼB]4 l_ߧlCm Q Bq,&K9&\2 $Cg 0}%:ɔ?ax ??V jZDAJc9<9&P L97@< g'Y+TJ!Ǚy~[$t9G{ϵi!UQh[خB͛kz/].>ЫOs/݀x^Fkۀ8؍ [0Ơ;W~/n?#t,Būa^mWMsJ#s(SA8ܠ(~ `%XL'=$"mKICSR^礯f5!t'cK;mU 3ܞcd܅;8dc!F0pMMε; %I^޴QГIh{A$ lFX֢_@ b7`r j6nD@XӀ h A.1PvJgSfIѮ F/s4mPy ]dkt dK{r?J~PJ:~O(r" h.Cm xߋ_8{o]zgν<̙lӠc/N5]VbLllN}_׿tg+v/kOyUzo65-S'n; a|Ŗ)ǁJٴ8W+š4 iNy-*;{|l09 0,E8!cqS7`߄dP Ea6B!!nHQPG ss&x,h@>LF eDфK ҁh E[>1xӤy0$DS.ȓxtD]a>t'oTpz?ln3 m>0jhƠbV3#0b6=[ڪ ҙ8'/ wJ%iѶ- xK_<_nns>SO}o_k;yi8_2i-- N1;\yg_~7z_!@v:J}r;54i$q;Tq4q5{@c"Q!h7>eE֢`bYK8 E!!&Qp#ma$@ܜu "3l"Q Q4,ϧSԘCF]H8!B!I04ŏw^l>~B`KpI3B4Gyǔ$8&1Iڱb@t Mb^N=f(а0|]C\4~̨,O _,#)cZ%M_ި^+ ۠DH_p#~+J%i|S"  B'Dǵ9 7PA C0pWOϝ=ݿu~u{?y( Z ‰E3l/~z:u˃P4-t#3 Ir}Jd$f\7m٠d8XoIR%, !0ФkMiFCjm:(f~thD*0,c.a╍m8<3/+Ʀ;%!%XF, |Flr >KGcS;εh6} ЅdJH!dƍcꕀj4c6u=g9StTT]z GbeZ" a!x8'1^=lA&t4/HS~zN')P9ILe鵧֦2/*302s=Gf;پp?=?~;lfgM5Re\d}X\})-X= ymXJKKx6B`*n6^۹|{}عOyOkVGs5]f궶tS0W^_K׿Oy{]Kma'S4x3/Ǝ&SxI%aFPe޴8AQb:ZHcbhh Cc؟AK q kH F$!YMZb8X6ǾĬZƒ``0%5iD(^1&_GTl= QYZ]NF4eƘQ byVSp/ b̈́C 4HaQ z\TdoeJ&ˑ }d]gaZg%F;('ڠQٜX a'm41!^}_gGym|#魥p=;]v6}`qnۿz/|sˣxP /YѰ-9?m8/Бe#ߜ4٩U4T-L;I(1 P`X]YCImR컋^,`)8bX$p1X6:NMI@YbqGD(E&Ha)UK\@ /j3rh?K$yw",ǜ̪Q 'Q Iln5g.U@`b.;J_.fI!,OZ{bّh$S~(R!1?)A B}NF"- [5Z*m[K1 @o:_y$s`\/ҕ_ln |dOl}r~豦[Dnm)[晏x韾?qά!zOKs[od#i%Lx+. {l8Uq7k#)Kd1j[.c,d/e-2/irݎh5>+d>"EC_Mi4"L8f< NZbK'x9{oHrC~a&*8y]%!dfIDP! LLM:a'at\{+q G ۗ./}w~l>u⓫1yAk E?Laf3 o}׭ϿSןx/zu6O&CӶIH9CV;5%al(^rJאU5PMԺe3>bB#UFr)Nb +ʱE;8C-ИeQi# ( RTRJZ6|O0}LldsK, 7| h@ވ5=y=꡴œSJkA3ʤS2cvDZ$Q'@dN߅ k: #MGH98/`6K`BkYJWB˨wXJ0PcTtka)Q$\TMQ"HZK26il{#;~Ⱦ"E(O| C>1n,"9zō_Ov[?}"_z{>szefX" n- it " n|培?UO̾%ue3M޴=F!٧mK1ut³ar68r)zWm  h1KD'yGonY#5ͥDaG$Vy-Œ<#mPmE`&#%вhcAâ5Hk $!K~}aw9f?iZʎƯ5q&żܶrI?iSE/~ TJ9k!H7dmi֤Z=lNBG I:!2cAEjV%n %lA$R"~f)*8;DSMdtsM(ɤ(R.yf6 ޫҭ߹|?9Ȼ~o{?qw~N~ ZclJL` x? /~'o<ܟ92V1nۢ_G TIyuKrI }͞O #pdv]3,9eXi(=ZD%h)EJ<MZPg2Zl #%!upL乆IUӻ00`Pqa :I )c`f4t\:~%*6H[\ZnjWWB+8FB8Q5Os38O:=HVM$3=RoN+I 纯)Q(ByVT; ZbDPJ`W<ᅃzs"R-6vk`ޫ֋/H;K}=}Ս?nX?>5}cZ 1vg rc7{짮?O^~r t]ng'nIC+팸h@ٍP1?鬧AԔэN{jzZ@)p|ÿt[M#BeڐQ('F %T*@ =b-=PX[iO(&%g)E0RwqȂ|` 9N%ʖ씔'ű**Es $d#)E2p-VhQiҞdzG<r+>4ዳA3[2ͩJ$$zŅ~ O RĜ>+h'BHe(AD"* 7ƛ sAU,@mҨU|rfAR~F#ƿ"[J(=JEr0`Mۂ\Ws _xK{v>)0_ Z Q&0nh^xǎ^=՟ڿz{2@v#ḞI!?dgFeRgx'W h#6xWRn[4q߲G(1/({{ 2A>qC.&2o AJ {I2Qy "f*ua&$#)-YO 6#uSx Fâ -@ !CF|p0B)&~rZچfӿ0|#i] y-)? nDXJIt EB|zJ r-w] ㊖nU!T C c.̝l{ͫ=I]MnNhܚWY]r$sZ\$l 8xw\җٳGv};M6W0`X.OTִ1sλo'_n=xzGby;IeEM@x_uP>U덭%zB\R P 57'ñ μytyO T|'iQc#&ppi%GhtQPBBE!:!-Fk9[WE qLҵ ̜s3ҿbOc:A,<8!BvbL43K4:i~A=$9-PL =@!W  n5 `%X.Tk-;e浗' L\(`/DE:S 9:ty(CSٜ*c ,8j? ,HDtDXm0~/__67څGuk{?}K>Ng/{GhC4h66`'-0_[=O=Gob{k3 VNyHsr"ugQ\-&e)^i鲒V%9bof fuN9˦8nHmѾ[8< "s5m|D()?Ր2VXNi=JU1ec灊aG~.UK-'{5l(D'T9= @&6i(3WHԜk;=X! ٌ!}mߤ橚ud>{<,`@lc [ь#s8W պY88^ sJU!t Ť1qݞՅ0J)Z@|ZZIBs /<wv|~{1c_ݺ|E"HE|y3LӢmn[˛7ǿ}}]7oߡtLHV0Ϋ%ªL#yئ"UMLHjՐ$,"[ z;mQh*kA#3ےaRP~e>8C,)aG`R'$`b`?J(H$a T*L$(u%leLPc̀CRTFZ|TJ9KXJC&ٸEԨh_/=e/_g|,Lzݗ?-gf_tl30z~ C0B p1`&aOeI>rXldi@I fHMV0^h zS'?mOfR*oӃG[V\ƵP pSxK)p11E3M7DkO|'+o\};ٙ_}~~;c[Xn/nɫ;'>x<~3fMa]ਝi8O|?d1[9D(M[Yh"8H(Q;m#TE/ʘX xa׭"Xn#I_: iUu*cF&q-4hsg$O9)I9F&R>K.Y "?EE͢sp't[پt?rx{]LA)ڤ}zݮaqII[s#D5륁vo5RPT/]7uPj "xLhß\1( \@չYϭ~”G׫s5c<\߃c~ ){'ib|vC&4'I{R9`$303W*r_Ŵ8caJr\3u"j!- '>mDS@3:eT*%J1]kq{g?6>}a硇>w=fcvs 1'M%moiZ/~ǿS{r fwY~&tE\\djv]k\ g{8J; ]f=B$(~O)YB.y++_QJM1v1tCR?n{s_+;?oQס.!ގ9߳ SgY vhՂ EjY.YJ06Y0-xR\')ؽ, 0 bŅN2U6C*;=zۀJbb_'x{4"T/1B_4=NEW.mDmm 6O? G(h@Aϒ{B6酄h}6% AA#Z`D $,LdVs^ @!Dox1['8TOͰ$F̺ԃPt WmZ +Y ~>Vc =HnX1D'V.)8і@~QEeYy@N/z>뜄&뉭)ZQMXw\ E*c>Gׂ ,"KO kkaW^W>ؽoҥo\t8e;cv6maK?y ֳ\XF;[ۢڊ6E;eNXaK_( @x|KGQ'N@(׬=@q5.q>)h),G:¸JckFfJ`@wޑN%pRD6 ,%!; [ΏZelǤjT9+M)X9m5Q 9ʯ$>_՜a!E ksx U1ςg~BP_#gIt2BJV ab H~a8B` (5E․@RP TUDw {+<((żRe|M\rɲ_PXYyeReV(jB8wH!%DuҏC}6n{^ǝW~/|{7/^x{~{!0weh%plw=O/g<}4)f.{寜v%F*ާgWœJ!y\TyXզ 9K#=녟牍TKES?YVt{pCrY3˲JfH.gH>ا銔 xDca2HĹTּ)ϔ an*ܠ, D:}N}k'U#oEK:g,O㮜·V617j@jR#C8%1|dbpXE4Eu qt&_{| w.{/==xnlLRY]c7mT @֨.a*DUqjr'~wƲaf{f%n,SU ǬaZHׂz՞76:`zH 1 ˊZhDEKK/Bqaj֮$~ZheNJ?7#Cf *\FOdXE$%~kͬ9m`8 `Id>!D >-!0E?ئaDmz0!6 ۴`L  "x 紑d X4l҈)T)鏓 K>$詬 ]k:S q =4nl .LvΑE*O6Apb}!C6HjTM_&;Qʗ/=Tb<lDֺ89 <,coF܀C"[=ж[{N]a:#d}虌ʃayvAdf@< ,+Ѓ yW)FA4!%<^* UިN?'IKӢ IygFoLi`XW8<[8ڿ~~e̶_k-Ed^|=K"xn^&&1=vcA$ TK /9Nq. _:dN~ _$``^kBh@4S@ )ۀ$q1b.y( -%r )%uq*fcbBm=1ٳ5qnUrj(PA)d1a?GO$FD0'2J2CxQVV&*`U&XO0ے >*{ddCuD0Qq_&# q2QuzK2]&Z<_2gr6}yZ,pw7o6~L Pۂ< P;dcdq1" ~6pai1vWq ڶ16)bWaƅ :N%FrO#kšPZ3^8~Yb)UebB q*a0k5ȅxly<}IiHS2WlP4pBCKoǾ.W&0@ܧ~ynv>D;%DsXcT @TS G< G&{S-?e=ϖ 0ÇdK̟- 2kiđx'H?Rb9AT(b́>(~Y E>1 .(PY y0i08?(G& xDރ/򫣔+ Xx@ ,( 0p!m. (%=Li>ȗDfaYGD<YF$1N{r,+3BZׂD1AygBCUR _%)Ҫ/AW K_! c(-6 Ί@>E.{)'"Kk 1XFpZ MI%fhyhn.` 1:Lgf8Z-ZbX, XFWqK8lm7#aI YdE^g֊ߣVpEnAMtM.mLLNPTtz%@5xN@y.b@ݽA2+FykʞQH#.id?g3ɍ?ڕ9}dԤ1lR>131َh&,xQ 0ȇT4E(-`9Lv"aHN]xAS/з}CfP@ `~0$y/ BS[00D#I E:kdDSDQ䒩 fRIDATE& zm! ^QI(BkRBX0w nSH@e'۲ dSrMB$Je 3$l brUnUǒA+9#\Ǽ>Xx1%I[iuޏTHUx= W&=17V9ppn/Z ca]th34Mࣃ c渋1q(33kqvc ;M\t=VG[-q< cb} nc|l;qA@fJ?3Kt~=΀Wq! ڄCM|O(X&8m4%XBA+ݗF!;#N7.oMSu|8y0HDBH&EBʚ8P>VH0{ 2Z\܀,%cd 0,`P`<5 C|>Ӗ\Gеnzpnۧj| N+@E^}n&&> xjo-$7Y+h~$A #6 Y%I g􋊲}_zXAў:yY Q#y?rDTaFPk$ G_WHv18>:ؿ} =x7B;i#"Ll0lvfs"Iamxnm'T{g a`pnp8845@X/wU3]Lf3FHdP^jPy Lxj '1+D6:TK=9w~!(^ %[3(h^AG!;DDXy=G/} ubQGh+ ~ &C &iRnEx4L$8i97@^JqIUD(@YIXڕOQUYGIC֋X.W8>88}j41'B E,X؇@1^81!F'|7 z':uF И6 5*9,bz /K-?H9\ج5~"`+0E리dSԝ MmXE#o5]>F,"Ŭmݹ-3YH{vv:E;@cX1]Zxlm#oŖ%+{'  . G91챴- a`V7Q1=iW>`yl oG%-h}؛Ʃ P,V"5QCQHH'D+ a+kN@`p.ی;68&0)R}ܬV\6N+ I%&u5>@D>q '$d߆<#֮b@囔!Ts _hVEWrMc0kYCm^u?P>F8%5?n/k ."& ka>M>f"l |S4z;¤?9-%؁d̞T&(dh9 q~3%!t֢%I)RB#)PD,Ň Ԏ.[M zX꾍8'o4NQ65ɞ88u ncZnB{Db18]Dw{ 9x#2iPLHk1ZnlbA@ pl%Vbw shwbv,&[hJd&x\Km*Tf+@2eo]{,X-1IJny4DV։8}7n<"-i! 4fK>C1|/} bþ'&:fJm*ctЕ dB!CI(q쟴#!W2~5+*HdԋSb(m$#`E&>!] &83^srdaDuL.:3p.ؠ(]ixӂ0bվ<3M 죙HŎ0vqd\DdIg6,̖{C`L$1.2sgu4it;6~u2"IUރ\Ru ΍9/@ D,aQվ08,8ܻ[p((p(ˆ7sF{(Gű+V^!|gt1Ɵ($2ff ^9W1>a3*@`Utj>eJ b.X N6IcaxOU4Gc?-41m*pr_=:`bbD As4_,QbtA/CL2;Q8(O3zgLy Lj[GjfBe!OL&ՄBO iSc9ߺ;𼌾8b$Ph2h&[lN&gp I#5ɻ,+@b}*\O֌05ެ) FYncasn 9KZBрxfo9LwvfST6yR5J-4ESdQM9b2&*H7 a@ɇP#!>FECG-ZSa&:6X>$ F[8zNayLL?gPKb o1"?R\WP5̔el|qH-(oY(Hw)0iWXiz@zN|W\< dπon/ezsW*G=AGĸ90Xhb )S.jT'V/iK& p2X (*!"Jh35061Be䷢j_L nZT\QLD\G }'f:dZ3qj_ؿR jb }c߾[7<>~д-<94]L[SXcr͐Ur!wX_}EtW >vl]ߺY4j$I1- of"J"Y>p>\7 fg88\-CYtVnkXvў9.[&X`Fo2y\l<+ ;ED[A(pi#viA1" >%}M! KRbBd`lՀΓdC~J1y&1KٟjJYTFrlj!R8&&o<@&Ϋ^hHϛBb $9W˛r(̿LGQR}/e 7d)s}(BD @ `BJ$$T==s.GOEma;Xa#BXpFe`w D&ͮfك]`e 7- 9iHX v } ΃&VC2b쇤X ,b_fM~Z4߱_ŨzWQX/LZS8LJy>X}fYr l#_0g/8}bnx& d Lc@-ŠaP3E3B;@N#&$4I;asL'Lbwcۼ~j:z/!8l;Wz?#[q c$DMΑc>Rţb/k}!{9zpd0b~5̧;9 nm(BARJ9)(=ֵ*Y::'[lBd[23;k@A(?W RDdDst)U//{&. CˈL-Y/ĺ|PK` 1]]dM =Y;3oV.IPC|鑨DH$E "%H JdU&ݬ6:7 _'o R +pp>k¤~N[eyH rRΑ[Mثʁ8q8kנhr ך=@T2jHȋ-51[O_ r\wUdlbr"c4ZG,+{O &6 |g +xǷoO'P4op aFQNn,H}Ռ$P[.n 7FaYNuU>< _@]{Ʋ IRdzx۞<1noZM 936  BDZ'10"(,Ե~إ{)FmXbu4|7:EDAGwwj8&(2j4b^ 3\h9ƵT3Wb6i?Ss F3i 3 F?]>~àizah/ @p\Ț3fO/ QkU?.[Q QSp"8dv lh:hq4P"r~*Wɚ)cgOxuI  qC[`tYg= ѲiRZq툷 8y:j5mѵ;>w-kU]- 5@˟XG_f{%k,r3\&>[K*(:UJcqP &al־JYCZ`T Z}KP(EHWK5z+"Oy0o//x3o/303\ntg2cYfkw{t{}Ŵ]E|QAF_hiIb ڮ;?WJ'n@d(NaEfsX")M7\PpMۢ:<,{\Y2!C #N/Og}O< 0 %2|Y#Y8aRPhӂI#lzв , xq% BtP#jg֚w,{Z]$y,h\ |#~-Lpg0}jd&hV|\3"pKp(x "01vZ+.83Z ?!.^o' c&\Ng|O?t91Jփ:s%o6h& i`+5cfVI3bbzOHp۽yHk]F,cXB=9m:7>M{^ pW t rlJSET@F7zRj)f-0jdR zT 弤{ mQ dj "N=G'#8,pm3e| Yx8O% R*XxXb8Y}SfͷQZ6 #V3<#pBP&.f, #ka#ĵkb3xAA x`QqUj9H`@!S _ŭ7FgBh,ǠYZ؇àR`̅} LZW!YӀ~dxO'3Dh'N3ɧΉ+A gkA)rĺ$9w S ^gv~4;U|P(٧ 9i~\px=7߾b8":xc/3C١haQ#!$Ur{iMKX W͉D_ h6y?A K(<)7 `D9 CdSq"l}͂\ySfsL a#>D!iB Arhhn]Cy=&3<;OAP*EKG`4Bdd>N"#9GϔM1GTqD;0ڠO OCX=T3bCxk\IBF#H<i4 j @u F1|Ղ:n%f`$Lj"5f=^ ̜D?)é2 A3h I9 t-XnZ "s|HڿԎPDJbxuI*~9zDGK2!Bi|>%bҊe tU=D8"c=Dzm|W~ <rsR%\ۣۡm:8v\U7ƚ^SmB2+r10*T 8a_%_In$76b)l2*lw-(Nگظ(5uvam:mpf݂ab/p3.{A ;T"3!1dJNf.=7x `B׮^*ZFt@"gY? J#'T1Bn$A~D{Of<˂y>J`#bHAj|@bJ f]][-yᤏ`8]Avڠ}DB5E끕\mN!qBA3!p`tG8т0J)`nkF"wX0g,18,$e/ԐX18 L, g6˚@ 80Wؑ60./eЍ2sU@yfp ⱥ:Zf fnq?%㦊rUi]Gke7_rUipz;w޾a8g'4B1O ݣv[4Zvh^Z+au3󕕑| U*l߽}M||(p7gHH|UcTd}ٙɕ,dې!։lv}myy6xN8YZ– 2zo_glRA*LfcKf{MfJ}yү|MMe<]5Dꨤ8DP;i _SQԬTg֤͛N#Ki0g63ypM#Ń8f0A5(0)cœbT B`zd3íRaDS ")6"?I#H}hֹwb&ǬVF`[0`n@}+UL=q4c[@Iߛaz'8I0Im ?@ ʂR̉C| I>~/<}#Z~XLvmx4p~͍D;AS+^DH-Tϫ`AH5q (2oa$ڈZpWbH߻xKjo}$ito/p>`&x.AQ{}罘ժ(H:R*Rlٓdb :o60lQ%_~!J5̦Tr)@9բ8w(Z[%|Xރ9%wޡoemp/8,W\1=9L0'􏟰VXLP_0emM)M6 ֫$Ur,AM^6K tR/#t2ar X67_jp}'XAMlc A3k bYD(+;2'B] d&C H !z T"q01xjZbGOe/ZyBe".f)GI}D4S)l\J^ 8G  4-hY>M \A@fa[ hB=AS,TdcQᝲXSʠ35$TpUeM `!'Y@ GZ'D#ޫV"huT"h΢ֿ`\ɘW);nkY4I$ ?N  |vxZ6@0q-`^f*-/V Z&@̤%|Ea}PppiBHD>)Np@W1ӑMRjZavtd{ӷf.ݜ z$1'#+_}l4ke4/֛枼;+1q/Xˀ ?*@Gw]GmY N k^mTFb>S[Trflwo~t|(h_:I74L$)R晕yieS_aM߶@G$\;<;ap}x|CѴ-<|=k\q216W듲`5WzW}zz>>| |ܬ%Jh-]GċOBKDפUcҬݰ} k F9çͽXG3N`=9l<0p8 glo;xߨ.  "Ld?Q-7JHrlxƨ"˨:`kaP'&c W ZrPB)}*8[p@"LZ5Q$!3?Fа',SǢZg;<4s ; 742~:1X, +ssNKJm:e* |u XڛR(Y92FKB'k?8=ҰfWQbz,N/x3WL.oſAx~v{/UW $hȤnI3SWXyCj\PLKπ^[ ˁg|c - @.&Xîr&m+:nنJzei~dhi7 txaqg cZfL'>|mA\;$ 2񨍘ZANG܂yT) 1Ft220j.$Ŕ6S"4\൦7@=@27Lk--kWppL@Ã@|F83mt\pIԄD)'fd3ج]RYG%H_$L~x8 ,i?LlTp׃Cp psv`OjePf L QhT(➁_\X(#F 4sF`b@w w @V|Xbx)L0'~]oAD(og6pcwHË;D\/LmvN\VNjGu4EL~ma-1G- oe[cSvxxOw8??~ݮG2eb l`P7jM8xfR懭Am); b-X`KaSP#g- b? 3:&[{:8?"\G#i0p q6֍#'xߦHؓ+u߇ǂAN  &ʁ0(,gяh[IA"rhB_5r4R%/#jo0-ib7["]J\;"*&Ikjh ACh g SAd쀈GɊÉܬeʻ,&P D =dW˛E!Ƿ/_q~}4,5 -ۡh=Q<$&f4J*KyR=Z4%0dP#an?G=oBFe$Y/ŵH07>6'iՍT9rnV-bD]%2nqx8, 4bG6`^0ӯ}|Bߢe+ϝ2=rJPNս%Z(kG:⃍:qV_sM.T 80*4#]k0jV ^%D[ P_$t6̒+R>yϝV HiO`UXup:rXg=""E7S6< , x$p$b 0M fӸ QJ{F0+d,dsDjC9GY3<˜$1͜0 {'``= AI%")tS | "$NnbAt J~ r9&#2@LdHwHSҦ$}BRB(GfOHdJyxw^r|FFNy`[;m n|Pڀ0LvQ& ,%! raZ;;XhԶfAh@rK-:u<Ճ©jt9jJ@X0дD,EyEyDZwh<4<1<-F?3|ЬR[deMAW]t d(&|Lb@@aAaK#wZIqҾA*R%+8e4|57\ab0 ҆dW-$K488| hZ9o{4m"%zXq<+P߅Ӑӫ1kn}[5#S2pm?M#Jg?=-_Yߘa9jh/ս)}Y+?Y<ռ$ͽ4T&L%uDv4H C`\` z'81|q={#6|׈6N%>}cB"d dgE#N9MV͛ .]R͌NZT'&P lw `RxƉSD ; :e[kuPz0 p1Ľa}RfeAVCFou7D(k5 04[PƲT!`p=o{c|C mSOX>( Wq5b5{eFn)<^M 2ӯ6$ߊd}-msf<8x8LG@]C؆Z ~x3Oz "eZARAS l^0BC4ᗢuz/:ihSľ~Lu;84H]L#'XH^œRd]B iF.kxN&/2Y tb DkRL DUd-4Eav=`Mt ahӀ(лY4=u6~ ZnuA2E7'aܭL#eܭ/igϠyO,vf`)0AZa_SAP{4 #gL@L0yr]]8rw#*ڊ鸫cպa)W4 'Nf9Cb8|8'_~`&RMqAWCo7M/( 6eX^:͊zZnNkRҮ ٻr4qmo?? ;~sb/ j!<ߣh*m?Z*ͳa<HSaaS$ͷN֍fK"^o],[?WBpޟ~j},tX1 Deqh|͘\3]k7\Ez% 䔺r&wp}90+Fk *z<8:\6#ytWxv3OmzuƼg!eġ&tOj39N7 PpRJNuM gv0DAh 3$,`*D_ 6* "-b>e  ^м>[$~At-x1b4 çI 9j\M9d4Lp9L6: 8 ϓ<Pnb0}/Z5cK4풤@F6ڷ0￉pR܉%H \ pG"1&q qoL؈ILŷ$E."!Qޛ&l** jXLۃe| \''_EhK<8cAGGCSi !'⹊iƕ8+)J,hi/ݥV 2TU򭎼+&.M۝wOO1 S* 2%?Z f~BaȊ舑d 9R-zZW7Hh}o <*6Ǯi{}9!G&5#bUma6ڞ15Fφ $ Y)[HżFgF4ʈ&Is_Dp2am$(b߈)&9:5@e-ZK fQz7h&=L f MC^ aTK_ ΍"V?Mz^ĿEgHlcTb+QBیNsQ@d.l!U4Ka*gz _q>~2ƣqS˄@MfGhF33" pIRPrMۺd0J3wQptO-2=h<(YeݸFȱEO\h6e|PMnJ?U+ g5]ilNq9`^P[FBRlmb\ Vp;~^3 oˀ3y LsLMh{Yz7dZ Zîm4J10crsc`igt62198Z>%蝙I nNǻ }u_-Cі#-Dl\޻($N Z Z z.&V%VIgU0bҗE5А&EXƩ: j:w$XӥV4̠j_{sJ$i! 5" f*B;g}7H\DLuxTT¸"BEG?Wy 8+0`r:g3 f/NqIP#/j15I rz$hƪ',itl(}tR~^p,4e0R.õi2rXX[="4,:;p[&\gWG+*fõ?uUFM[dt32@eDd0Luˌt|,@\hSMQ4'U!6a1j&aunnUye(iGm\Q܁!v{2Fڲ"C1/bAhc43_ NEU*04GvdE,RǠBH xɏ n4j~ !^t!В)7^QQf h$,B#.# 0Up„1`F? 'b_ %Zm" Z\iL`7!\܌J)jw RH1yݳ%ZI'`f\N_g\G`!` 3:жG6𾑵ŋ6!Lxbax_q-&"K#&v'-nW'[2syMbn+tiG:>p_p=x?۷2$iP5Wr_r}b0.xosُ[%JU7s/nn{.< ( sC]`>yYpGNhF}a0o~\>}o4g@PȆvs*0IMTEX>3u^a줚1pY3$i0)SfR3>K|H}GCHD X(5 *He:>YJά(IANRt,`, hp^c0߻ ;kލ AAH4g/? 98Pc %t!1 xуz+Cꉵ"/B],,BN] BepR@Xr>),ip>N?^0M'3#I\+f-m)9n %sbFPLt{&$"s,pEj]$=6^_*[^NfPGoM|Z=Go.3P@hL %vxp-~Ʌf^Bm 3_TPWukW^M%d8~kx+ 6EY 춸lyqFGW 9`ZLa'#'lGy+_ %EOt `rbAX(Q2ÑӒQ >U55 s j2cE_4&e^\W^qx ?sp\3&%w[t;M.^b֔^ ىIߢxWuVJiIceg%$zRH ~#w_9.HLJܧO>9ߨQK2w5mZ'`rf>҂kp_%1wMR{"kr]k]9F1nz-NӠCgc$;>` 3+ ?ἿG# yTh^H_v Z七Ŕ1]L} ;/`RErjub~b )"?^ դU]'q /Z3Iԉ8EL sVuDd@'imb>/ۊX$_@ahX  vg):LڠF2|ԈOeЬB{S{ש牢$1Yc|QrN0Ks¯1[5D9S9f I;PM:I1/Nxr)1?>$&3wqxw1^hz)A_`;m,X'ҺLKtb)rmX$>L"]ϔ.yA,ƥo2`,i_+(Ԛ(VMX~ooY)>!#3nvOhLJlwZ`R0l@t9YfNՂi!ek-1j]^d Lq}& DL E6;_\=%Zl ӈ|%,h]{lyq}`|3Ov$ͥZ{Pɿ2DbDiB"Kʝ >ߡ$MktIApxfHP!`= {CW$8kA _7_ J!qk)5 !:54x<"Gq/2& o4޵@@όʔz-c`;fM!A"MоX`$(x<^,@өFˍqju<9ZF5idd|N&~^$tx7N߱q{5[ ۣ7h>kmt浏ssV8cX%[)ohm,*" WvMvd=m| `}xXNj- ur P,ؕ&=K/mqܦ0.KzG̸x=ߑ[JH ^OP$~Ǘq<#&Lԡo&,/_p;\>}zVȄIθk;asߊ3kPL1j͋)PL">E0j^DcN#5P5{ 4FIܤʀċ0`B`pTxѾr0ߒ$Km,bf F}@?m}!B#K%ϳ>@k(˙ A&ujYA}Q9Es972ruo=.>Y $V96dO1]Tjg"ē{U5n%1w0 )/0Q_~g #B\#r:3%N$]+.?BB\3Պ tQBaV7([LE-9#?LnP#%Be7U07yc^o}P]kfw==e>ZIʿ@Xȫ;یyNn쑄ۦixx o:l0+ƗWn<| 3;)`g800HMca4Z).p9΄ 07 _>- +mv^TZ_>},F5vK=uϭ,dw nYF/yB;8#^ +.P %ӹb;K'"2aI sN*ׂH.[X [pҬ[a.MpySȁ bߧ1DKp 7\bѣWxMQE IwH>ǺAPY1I&{Mw\uY0$wgL?# N#3.ʊ-:G D̯3L1g9v#`f #/?p|}p> \{w?sth6Oh-FսTTLYo3^)Xxl"#V6[x$ Zh;_VޙyV`#G WʨnxO)b]w[4hCOxͣev Ab#X[e}Xz x6˨ZQ '#Gw"lj4UZ~fj*:7!Jr#A*1V$ViM5 ;H`@; I`yslL-Ϋ%ӘE1x*Ȫ`<,:71M "żv4,3@@5E@|&4^$ j%/(HLb|`P!4 &KyxF]\'e^{ +9Wh M3Ѹum+N_1 h5ҏ@0-o;}Wh4L )Zbf,m1{mKU+F]]4+#TGMk̅ܯ[(ʼ @l #Q/%%4"w_o%g(LJOG'Zw2ש9kfo{v tn}i3x8Z_Իr py#}a̼>{_sAx;|f0bw4yq=`'vw3;hxL@\Aai.(6EMhXPV 0i_~SFh*ܤszbA*e4h]GP.ઘFd~o3bQ7DzhE}G]r@ty6CMyMsĐ4PW m3>}BӵO︞c&icR'U=~z+A9Ko,1x`r9X u/F NuCK$= [|5dF#, Jߴe(#+H4efVSo74 ˏ)SJh>/:v{HA+`_=(Jo13eD}~1PeԭN\#U4kW^#DD!K*t&dCh$ l|4^::M8!\1GzlL Ï#ן$V~. /?0aklb Ws2e55@̣D,ƙG=@A+GHamڋYvAv\[WB&bfP3f8HMYH^ĴcAD _$柵kV!$0ȄjRf>iE0Q8NҦ1\R !:q1k6~ewOO{|kz\'cf0/(90`&*M;22}iiCؔhI0;Bq[gw޿ n}cj?.wVٰ}KI֪]5O |?>>JpMSN:X-|rR'rkZCgi7j$LH)xe5(s|M?X\ v~<0F\.&^0O‚<F7蟞1`x{rj.}WkPC)mM#ށilA&;./ renR#Z%O, 2o#O]>$J" ѤL:kY0rYA ^pxJ%#jN|2<'UdCZ"LInc+V EZ ((6P3if4>J  gQN: p8;eL=)/lhF< В}JQC*|k/Ht0LF CFk^V[c*m@q^4-<oFDg0&HJ2f,h|kM,jAAK1lPB洷4W $` FtsP=0Ӎ&|܍1qWq.Ĥ{T?{b?b@ }< CPE/3\ O1?Ïo`^^c&a\hnq@*20EM fe{b*x9|Td SHg̽VޏƵ[1ohEzo=`!JSݝ8Kӟ0nʅ1z[ܔ5v6*eKr U.}Y<>[.U.[#K1X&f'e=ōW$mqu #J㐕x-i f_ o#GG9`<}pCs36w1qnڠ4(;2Ȁ=2A4g #Q `؉'R HXc3xPRRȞ$`7biڀ?^ek}B2k}v;MQ3Q+Rіh{kD!1~o͚{Fϸ b0{^7{-vc^pz'\9G,Wۡ6hΑٿL2s|~#+fE?M\7u{dAbشBzRuL`w(L7^7*+Yʗ:+Ǝ6qW?Fk:?Y^[,p6g ivQ &}Q `ڤp!ak*/tĕZл;0NG\Awwh?v0}t0 h#f B78( ͊D$Ł@uN<2!_}n>h4[ 8QL)$ g6NYed",.K*X|qN[: Ll)! zYDGN}!}xY<;)3H2q o Q7#1/lqxr>?g8_~!yUt+ P=hZo޸7]mp{́QpRM޺"/8 7k^śKN"JylBwƻzijGb Y_MX&F]12ߔ\:1WK6bƭbja lɥBo4Z'ů\, q4Lc-bR9Xx487{R< 3$Xd8aa2c8ϸڶF _1}Űy31_aN9TUnE5X 0$U(A]@O`4(C<(O_ϝ% R8`R8gjG4G o 3U( iBF؏ֲ cLL:73P2p%~]TEV1 aHn{㯰#ǗX6.H`Tߢ7h۝Z$`{=ksR uצa eOV7e=fCi=0ڻXk,>nPJ:)y"ZޅjEV߲+K<>WP$[ߖU)-'˪aEf\"2̟rS$ۛ5nf c|65.:[@$>PG4.br/-&y2dGMZbivcu<`hupZ&LVsń/>8 0A`hwy2N Gv F~hdċHiP.x뎝=eL|- DCz l`9]B̬mz`|lFiq3hR?-31QΗ4^&rxl{|B8p:b8|ۂFւPmfwݡiŁE,nd8 ƹJksA~ĥg=IaGīj]m_dM}s$t[{5^ oin0kr&?8}J0%xNXS3ҳ1G!-j6z|b%#D(D+lG\ +4.b4PE+y)VBga 캯hٺI f.k%}=3treAPЂ+>j ȃ Z 0 X4U`p%;GQH ĵ`2q?ftH 7e,;#N8MTxX ,v@F)w%f~~\11iX-05 vO>u= \):F>Xoݣz8nlE+{|\j>~%5xX;8s>w{uTBT}hMVUm9+X! HKOO+-0(Μ8ZVs d X5̀"Xbl%+FBLU:xUp!)iHfYcβ[Gz}9̴ld;4# \M7JB*a0~ d+wtçvMap2:^q 3&fAG 7 =GQ\WS&LSM!7 # |-8Fh=V$wCb~X+:u2Kaf  1`1NjMX[jfj$;<"Ca>i1""}G92R"?>"0a_aps:/X ~AѶ*?]+K@,"eE۔7FeNsFHqELQ Q+hɿLZS5oISVV<2k'cy?Mj%zjgMDAM {|c wRY"yVC"sA{*fIhgʤ-d |-3(g aK:Dډ J*g VoH̋Cx^SKR`L >JѢ&QPʒA<@R }aulp&x 0- }e{=WN3|=gEQ<#ERG`G'";'ebF\ 85"'n@d/aKqDqeN*AlF ѿ$S{hAnCNs.}(^ނ+pMW@4+ r@Z a<٣ߠmhhrH[ke3"Y؆}=PayM򷕛/ZUA?pNnt]F׺o&X&Kx8%[Yq8'ak6<>u =yapt Z #;n ?}{.G8(zE\ Z)_&D`>>sL/>VX2CdIύ)fA¬ˈj~aR*5{MNbA( ݓpMK (i^ָ ^=whv`.#_i༃kz:=W<IDAT ~mm6~VѲSO2fR-[[-0oVaՍ2{5YY-~.qܢYņF^\5R9-$su~V&?zZjE\4߿yG;>01#C+`$t ppoIxрVi񥒪Y?@Vl"cR(/Gfݸ}ieI XYG&t f Di1r O}`۶8 xg#t l4_pqts?ߣrD: jj _pRQmT9/`Ok!#(ӅhǴBYpR8y`HB ٌ]_@$)TjM"fH{sBH3xbA n1/ǯ8eN#fj 6^-GKVEfI+ӨYֻ|K ,޵Pke%7K~݊5E!Нk# ն]ʭrEZk]yEP"/K|;!w/h:?}i*e N >HoqHv6W.E\nq*Su"7p]`wo4ҥW7"o1u!ʕdKvnbE Qyoܖ3"|Z eC}CҸ O[k6t26\:\68D|ϯb=?y\Xh~VS-~Tlh@Nt_Ufg =9;* &g= +k5ʟIBo q11k@ ,>)0,s|Ȅ4] =3M oD39vn A}c*9хURj:D$w=j!QBOL-͍76׳Dx'wTEP&=MߟNo/LIJ˗˰,pl9MfVMV5G.ei ԮXBre,@ C}me6,j{ދP,:c *uªR o4aj;R8VSMzO[/3u1am%FKnbw4q^ WѺwy41b:v6ܗ2,{]Eb@RQ '4R8b&k@ ӿASkYa X吜jN+m0b%D.d{mC@R܂È'le+iak<iA!Yۣ:49MM3aL5tN]2{6 6m#+CB rTaC`nmB@|݊#JYm7 I)Ibk),ߎP3dͲVX1?GkQ%&v/K楌FV;j+Qx`zQfᖯk= _\& Chl7SZ>꺝b})F3Q5QR4 tuش;'AN^:Dz؏*gɷyYopoq׸XzW&cmF(W/ fT?`4_,g 36*|, ƀW 5m5;y+bرŹ[Zӻ{fFIbq:Kxa"\XJtJ   3ߠOX/4@ j%0 0^ ĸ@ axp lTAb"&PL R x{rh7[=|FC oqbNՂj7;4;MӨ.ZrVq?Ҍ`$Mrd* nz---.+IֽIK76̟W-q4oiF\w1nT v3Bxp;?snS ;+)Y<%8h)H*!Ί+%EEka"3G&3HmyaW,5Ad +q9C C&b2x GJē+cO*iwi-o.=À,Cˀ6cZyw^bݣF뿇-/7L,<  8n~&$?,Z])hlA+@HpOp 2;mNeu`8 0LH faw ]'~y< v-\ŋ5-\Eޣ:x]Kҧn2$5ę=̂2+{u=`ӊL{$d)=QhZ{8|f%YxG)zk!Wė<0L  SJU֐ciYmol-h~c ޲XUn3,7R\}фZL$ 6Ęl\ 1rԇk̖b|='zc]?)-((Sz_}0RH̍ȝLZ\tn3"R,9.Ac5L%@)-զu4[é_(L_`{\U "/BɻɓGL_{4C&;u3@642JFUxz'XE."sPԹ:#`:a>CXAM'>C|_?xy ǯ_1N#\[ 3vm;5si]i՘+:bZfVg̵KlVrT7Av;pM$rC|yMd&YdR1=%Fvk@ \~D":sIX' #%k ӹR1hzXiZWSem0~B-F_ roi5 I Ns#1)_1$!tM×e7u gB:ja^.|g|oq?}|op770Nr 8ɕ@*DqO! )<b OϤ<[rZ$ǁ!0'~ m0 W|3o1\K}p͌ ص@Av;8/ھe~[É+]WkA3 INyi U &sZx#FEiA\ @ZVf}Xfߙ"qqs>b(kA*dhe)TvVd=)bbۧ~_/W!= s濑,#Un6|F3smyCf*NK2Kŕ8cnЍK#+TmO7\)[QΑXd0Cm#WFجڦŮkiiae<0]q ]V{+ +vS/OҐP-;rK .Qo\ף=ssŒbMoo}Yܸ5P ??lGU@<>>a^%]/o^@)*cV_,ntz!| LFf gS4aTXw :`EtQ 9"]޾!QJ*ho4ߚi'o ?lWy)K|=pu-xY-%[ fpOdW4 %jLW5`e&ՂNN 3ӺQ7I%,mFlXjԜZ #Hޭ-f|&RQDlpVEKXj]N Eökii2v>`b0-3w\޾ݡyO~wLt+/6P JxĈpüLUد?|aYpx{O8bHK2X-|Ah CƼq-Ng+Fr{Gnlb$ׯS3뾡vmN"1+/Q9oN{dKZ]|m3$"{JH(3+f%c+3>w{M8fŅ,U[mv__"5Z3]{5&^)22$NgB*΂@0h 'Nc X*fltߪνϒxdF9\l@K@}FKx%D\5V2Ȱy BbNJP 2kLHw[ql.-, QT7έxFo7Jmn{zeyОkS/2kKky) &+WDa0xԻsǩR"8ynռj`[ds4o:|8wxxg3s;8Lˌ#?h?c; ,<ᜇo<\#q ߾y5sߴw,Xu{4^qCz~le]"/oi!+ПHiW?_^ ۶Eid0YHt/ Kihנ>_WҼ?$Wc2׮mXXJS qX>kZx4 |o{C _f_f (q1'sZdWVܥ{+BO-Jׁ$v+?-eW$ !EPxO澯jRa+Y!ݥmRNOn|=@NV(W"=eۮŦkӄ? O`-:`\GǻOGol3&p9]qx}^XA pu;^}(`GjnjmcBYu?&, Zn]WYqٮ,Oʯu/TOQǰ"l&ͽ1opwJ~Zk#uٗV.6˗f RZ7q%6B- TDwW}Y{㫧֩h^GoD\iݬ5rn*W iZIށ l/Ral [>i+ug6 @C7{|8 W^x#]10p}{?av;p=p|{zx y8`av-ۭyfJQP2MR2e%v (Q3uhme垨>V;z]e^QI1z* fK(I asbIzg 5 /G\EJL·ۈ-(zE7h\o/|hJL'o/߾LJsy~8ĒNt!]-6o5Ġ]EX[%EZ:k+F^LPMmY_o,۟KnFYidUgL٢ i=1?Qrk eW3}O NcSƺrMa6=;zvu8j gt .?{#fhwDNLUr|v QX+AA5:Ӣ b ~u0-xޏyզRH@Y$nxL@ q ~{dщ WLف>fB7>jEoxAٽ} VJ ?97$M m!'ƟM=1e9\-Ej:nSunөTi5~\zo?~9IL8 F{@bMG_.ؚ)iI),ƿe 蚰bƧfZ[V5M1_@;tmiupqœ[aeg?:I|k B#xQ%r|!{mTJ92P\ŀL]U,H9XsSv6,q$5e;Zʌ@ Zl{ }r9b7Âa󄦿o8Bf+BZ!/jyx| "ۤCkvC%ckoh٪e + 2 lsf&.sK)Kn픺*ލ09VKV-}I|9(ƽkA;0vۣnQ%\/iqO8X]d~@ffjLa6[ے7VMSZ%#[MZ cJiNI{# CMRt3^E /Ej$IdRY3ڧՔ[6*3.').'R/sw@\x8^y<;K bXƿ&\W/]Y :T/N*_۸[\W7/Za-D̯ 'rzs_(y-4,ܐ[gQ@:_[]])M+މqh? { 7}*Pe>pxk[^dZ3n>uN k|zBmW|tɠA-oadm#t>#)н"ug4ovҸՅrd#Q x ]+IYi|793R)2f(-I~Bbxנ;m衕Bn'jBqyѝ  rb-Y! iMT"7 MV2/ucB?gLt4*N-GV~ݼ>@a&RСԱ[sĦmXc@WTBo??p8Ok(LJ.iAmdD[ѿod&yh\]H􆸦ՖLQM<{WӀV>)ƾPpg,!(CL"UnfpYMncEhb15Hu-F N"KVF[]I2vN$pbO|zuflMI_ {XM9Zn=ɟp18S#jf}%oAa UEABi7?jk5zXt%9SiCJ~W;b|_'47.Ep j0ϼ~i ^Zu J7{SV+6{n;ȭq[%^`ؗȋ{\_K' ?|)i8#1r5|Y(jH@5+p2KnElQ3z߳f,|YK^0 ۪don.creX6ך`q{uq;Kщ9){IT3b؀h aх)?'}<1}(Rq!E?6G9fHȹLY2R,,إkV D*蚽{{}a*^3ZF{ch8.q/F (p D5L2~q[̆!s5g-tkgyDR w٪ټW)1:R_lO^xo,P=>=8kiE*e,(21 ;i߁ʭ+6Ԋەxw@+j}ojΛ֘IJ1 md([eH- Sm`s|cbӜIP7& dS,mGIp|o-B$Rgw{Yrlg۪;դQ3,8BMy yg6QK@&d]~;GWO4g BhYH|'9®_Aٵ'&yZY'uPo4oAϾͯ_UiiA&\%X⪿{FDa?XTY.M28m\A2ƵeBfnW20Sͭ=`ΣۮL) 6tu& jĮZa8ߨQmVʼ4 XEl237]FXmLAK+ p6ٮe{ 7>ݻ9Ҽ!8~wP@۽!̟3h,Yð}V{t9C nz ?M/z 4aCͫe hEP8) /v]vUwWW~X_d眯לk}yEdf B(lq JAIC;#!Ź81CgFw,u9Hm]xyqwysj󔞓(?\^_.V]((Yu(RX¥ XV⿆ [N LZa"FLZ1 CCC(3<(3х*ޡUPEWƻyNP }>:P+"Ap6Dy4]W.%tlMhնv :iΎw_￟oTǿo.}X/|q$ ES(ߕw7XZ'cS&ңq,:?E1y6Lo PO! % #Q_|YiQ+sǍи=zCOwYvtBcXʔN/b<#XXϥPVql'aZ<7X>2rByі೓pVO:Q5yכQ/{Vo VS%}f>@f~@oUY.ۗ/ SyN =""o|}sIX kMgoMXTjZ/oGYV%#pm@! M^/](Qxz`lE{"ֳ+ )hpBlfj_RNGJۚ~U|Aҙ/:NTĴh/ (4UH/2 3Z.5Ȳ`kBœ0~z\q;Pd744%3 I|H7178f;Çx`\ eEZ &]>g  dhCO7) (y mqwf J신bzsd9oN4WD֏r~s櫿仯S~N ,_}ӧwZadᆰW$ZNsc/IӸ| [70_]3 (z -lI%7! uxX`Y@RD릎a,| 2NRE=1ݴPhh i]B.0~XګK>,xq*fӭ9 ;`NRyy{͠F@eT~$633lE=j%T>{ Ea3f=PkK]{_{SU)3 XSIfVPnxtM8pmb809~ z9k6OlƳ'wϞ~(@DDnܼl<f% HNF445P`Ih5;!r]Dn u yrSLTJ؞?55PgGKHsW=IQO1T@Eq>ABA2)-]E&p}oq6ːEڦsg:W̪|Ft`#Cxa( 5 Px1!M]H+7V8s}ӹ)=g&*7hT/zroF+&H~&!Ͽ+K7ׯw)?'?MED7^Z0Q@s]WK~n8^ V""ගl0'P|}rམ>tCre||,$V5 yNDe 0 a,8V>0^EZJ ' H ;XX3O5]Td̃Nc`h:aytXtD-e, )ff]YT žȦybM=ֱ8brm2XWU9X.'7l;i*s^6c] 8 EQ'7z:*jOvhFQCYN,.Ι"g_xq!xwM/.d{_`14 e)GNT~m= "V[Qx ۙZE"$-4DNuco d!NXkK? #ԕJ3WaZ?Y@A ai-D{ |"%,Pe)b=zzy5@O>G,N_Mmxg/ͬMьדS#DZԧh;Q_yQK{TH5vo؍:eTj`6Muwv{~*pDևf9_|I91{A3yi,bQFShU_Duj=%0=*&Ngƨmc@ 3 ٴZ}6' ɓ\aAhUJbaȚ{1OhZܔp<1EI :9G)}ݘ* @e/iB˘t,ַRdwςJDjj 3kcJb Y2ǎ-joރrȆX [Smie)4T;d<;W&C˧sOOZ͎ Qs@;wȆOqhDF_oN:/q\wwf+H&Úl*fhT<^NQyjI49ц<UyF7dT@ ҈FoRƐ+ ā?wپAR[Ue#1Sp+8 'rQov'#nBh:u30aZJ%mWdOx5jt]32hV0 |,i[!8y\d ˀ,Ky pnIW2`ෝm2 4[W|\~^1o*ȩ<'/}w'ǣh\gqBj5T ʞ -w26Ac@s)Qzay1ʨ20_V _ c1>jۍ & ;*^4/ϙ4!^j -beM oЪ5GC?UfbCI 5ƥzY[#IWlBp\KwBPC[xުʴv+**>z5縙,slEP= m-ki>(J}E$[b?F`L6^J㩂^ȼ@8GuDAx!I uՇL{SyEV Y% ]ZskzF(y{Tw,-Ƃ`f $n+˄i0) pם9 'IWW2YGh]pvٙ XL\l˫7ߺU{QIi%۰ޏktE ^LEqqp87k6'N&viyMl%6S>㯈àFm2ZAޖe":ԇ`V-1?\:Ug*p#tGwzXqU[[2vr~p 2~[~mx |h7Űx}wDl-b0K5eŭB,B]$'w,_ɍߑv(.knOlN<ͳy*Ƹm:S969њ=Clavk٣Y_0)Y`/;9$ 3擣h](^Ki_UIZ[ڤGC51f›-1-YZ<}Ǫ*JB<ʮs Lu0ꈈrxsq}swPI97]"Oox]d;^9#H'--Ub! #mQƒJ0]Hy\3br}SLK̤]CܺRS&sl47mfAp1O0鷪ñ揣z>X(+\|5/$nmē&NCYO(/dPD S- Z4i~P.] VYy}.~Pu Ncmoyg2Dj?W=L V>'oo8Mꌭ5?OwG8 R+#d,cJ!)Mh- WYDh9ȱ&^dqW+39;&@H {ٖ`v0dak3B:}unŤ *O&Ƃo:2$ |'#QS}\` mrN4uϑ^c=EuJ;Xf ]W [((,[AMv{}k[?UYs6T\lzxbk̨ua@չ6R._lߋO /ʩ<'_n/_}%Z>|(sr^in 8.V <"Zn,8)joC4DvHY"x В1a2 ,8 'AձyBVoLit/ 2}e10q0PK:~X~ǻd* i sb"QGˀ2(C7#4li-PK c=dtBTο~63`%@-5XAFX )NmnYLVЩ"ASR>K|&?>^ԳcwQqPI"]t`n H`i ZՂrq}/DFsR "|Bٳ.]L%c1Lxr2yЪL˭A룜i׿C XI9@CzUpΣEKz&!|~v}ٲB@X' F9c%e[lbVnQV;SW ݵ*$uV Kjv~Fp6Bb}.]T`@vӉIWVˑn'zt@:6RtU!vtPU|X9Wcʌ?(`/77w/_ԟrq)gOAVq$ S7zbXupL,oiܔ jyh=ErX#+D+oP-)#`1MaA0AgBf /K!ܳPe8/N@T`rB*(D>hr(Vשm/VrUU т U"/:䠂+-Lm[^$o NF=4O6AF5^Oҭ[~ VN%=+ʦB22M"l<`pcax=rWTRg#7ta+1^b)FAcw9 5Sy+!3üw MMd.IՠVQή<^'9) ߮o^1[VVxӦ͟xP\1XDhENQ8yAe|V1EYuv ;*1}ɄU 84b}{' x~r\gn}WFs$ T@Ms*S3ۑ1-mw-7ƭ1M;RV ­$0TAp }rƷ5D* ഡְKөz:2o9PDžCPY"i,"`Thj9[|N  QXqN{ˉ)'_~W?N9)AsYib@n&( s\w K&cר6 J' m>5Gɚtԏ̫Zg4mE4KS/ŁGSG%AԬw&VK3?Z u|ΎGP4C +6{j(`_h,ldZ=tU4(1-W+JB\WKݓv ȼWdn̫:xVQ/EFISm•1/ t_ςۡv 5` Ŗ$J6MTdUί囗^o{_:>'x9;{+W" mg?ެtq˟~?>C&jZ9q?(Q5 >8RZfIY6>+B=(hVk Je::?~1,bs@n$;ToHw Ev9x(Yl,{`yH):2MZm9vX*,nBj-8)8HFǴbC”x:MPOh1OϜP ƎhĵH)1T ~B5ha趜!…R;D"^zx46Dd]W|Lߖ{r*I3;?E?,e#m(ϟӲݒ"oDOkFBwLuCS6,}, B_Rki:~mR)tn܆=V5I.x8*-4-^bu#(6%-ZZs_$Jx޴KA1.`x!( 9H&z$pKDm; bQN6L@^Rؕz>A%Ftv7K]pQm3 E{,IMc6@_)`4v4?6,쏽6 ='(V/uuDiP0su# (0 + jZ]s!6ξ']X@T9RT¯`-N[w~Vˀbo45$ 4Hr/CQdICBtsj-5| BB*΅8~zz?'/^(r8'Wz]ˌ琱j< -l\%^r'񭮑],=z""Hơ*"D2^ùIcҵʂr_TaP"DiPpWU6N!yQHnӨuZp%LV;=l몠¥ Fv&/ZIԻ8`XKめgm[_jh P)?wk憾6il'n5J{ fIl> kU=Qah6cpryIEl59}{[5'/9x<'mߘq%[d eL`X"\Uc'(_5( Rd"ܴI\R=d4TNA*AUf x[&l|HQ(XY HO}($P#&$l^r+[ _J1khl](s^7I,[^V;tl$@7 '>O`PlϚ)/V֠($qC6LDڞ_w;yxJkv&RI"kinX ,M:IMzq[Yg8D//?,O g_uңZ0#3y On?j=KYfэ;,M1dpʿpD't} Ti.i>$ U26~.Sp 7+Vqۃ߯5 ¼Uij TlO߇-Ο>9G4(otZd:Kr}_AQX# 34 ɳӨuTͦ#u7I_䨟z'F PO'@W9^^~IpfkYƙq}LJL@ ʁjuҴV{yXGND@02ݓaI4W@$a+IEGv:?nhәx)6yF;$!5@v#U;q<7*k VouKNW +s9QqÖN9aC,6;ʄ;yzcw)0yZ6\=c>?A$ē>HQS;l7x.kZm/?TEonDN.3WK  d2PJ&5P$xZ^ #.8iʍ'&SCבBg:- ':3aE3I&:b i1(N`iBqi&1[;UTx" WK0W4S[7?(\No\fh׼CZ<6Јp PHU x,qϐo@~ǀ/&B!><ZySꪾ ̍xl1SI KGbL{\)cg"bfrۧo޾(zyfȠy&ѧ\{m^OsleQGrwIm,=\(ee:01+ox0hʿ~ F1]zC00&=/}?iH s΄I0- {,;I7i`3F=--L I>?x2*;z7w;"8?W?_ HVI*iĝqի> cTSp?bc=6nKub#80g3r'/ވΝJ{T(P8iʿ3mqt\@#_hhK¦uiQhAb8ZL(8FphI8)o3EYY J/+Ф2y捰,})Cxk?o/4>9 - 5MoXHO(^{RosR@_|WOQ$"e.hm{`9wTS,I֍4Ds2ppKٰLPu:5,iXܗYP2 *Uh bqjPM;zpVP $yDZ(]v fxЕbOU<5|C ֯DcWJ8|6duY)f iMӜ`#(M瀎U^׎(+ S4Z`qqT D7A)כi`G ߙGKSB= L~_?)߽~X!'8<,ϟe Ik}~k[dj r$k{|W~bL`Lad~8kVGH 44?qļo?֦ ַ̫&9ibs<|8K<"9-ャ͛Zz{orܮ(Xb(b`hNs`i'~oꣿI,؅NqN8@m}˼0 k`7)& ~DD)$bэBk QM_QGID u33ZUl%D بYNחtH:a*?f qV QSU\3k۱X&1@I} ѵZ%Z0, gƸ$j6:p iUtYSPrdQ^ٙغ:E/^Vg~> @Z6tsO)Ro_N|dZ3"rYB3 d}G8R)!;L /n#ji.UMuD`q tvC! QeuF:I@4=Lac&Ծ PS)||F'㤗 3^ݥu=uU"g 25}xhw^$(lbeG=Wz`oP"boɰDEV=B9<'ߟ=-gg"oH$f{*f"QE{uyڵ*=ؿXAS&u"@7VHBK7.4IhU[J(w{&OW{~ {_m9~kexgw϶$f?ɟZYqnmmq ڔNߡ ܉֚u\B8دPqES []JI\;U4ʟHRI /cT.NJLȻq@im ˫B)ZGkӒՇ|A[8|"zuV./ P'mݙj'񽢨%nFzn݌R?f>o]E4 i֋> 3z f{-6KT7Y)J{r"ᦥ`F2?Sn[ㇱ W视Row983AqGjo3yX0 Hmku̵>L=c7mS ڤww,0A>3yE8\ o4tl\ˮaO`u==|~O9) ϟ,o;[v|VP])˓Iı/XXV\-5oUz<=%)m5cEN9=HB3O "UV9\\|zwg?_ų\^="ru%zsjc/7CTw?Vp%<ݩw3ف{3?M{!M +RKߍϳ-n߸Ky~ܶ$ꫴSKkX Id-k޶ pKfzMvT¶&vxwvEgQoh?+\B"R(AhЌs4GkppD"Ae]@yF8'ELf0\xowl8q!uܐ{ F6/ޜ]]Pӟyh `,wJ>S|N NɒOX伿}m,D~cr#ԋArIeeyL/b?~7?~w}Do+*t4.親 @;^ VgN(b&i͟zZa3M?:dcZ5tixz1 l*j]q;þI?AIm otrQn :$`ŎkNw8WQ-n!q9Z˅IoL|BA9߲' '+chR~i!a<ǧ<; {AH4ћ3/Y2r%d ,s푺&"jr|Փ/=`h4m V BM(lyb:h]xlcYK#=! !nY@PɏV*ٹıC?-*rwʇwC?SyN ?ˋ/ׯ^}cG*Ŕy}KQ=,ʩ )?jϜRPo6Nf6OG\$׏EXuYIO`Ʊ&M!.T,NTE'V QFTI >$6uR5y VoP-)cf|r@0\y;E V;{O}'E [cFB`c'fYǖǴѵp "[l_ GRT !6!$ o|08ŗ嗢_eX`A.J#8h,`EQXl% C&֥HlRUmɝcҨEwo?SafiuMgfhMɹxK/K{M sG^fE-8I'oh4] OVA"AVA("(4_4@Ɔ;#E^/Co0xozvzja(xcL%Bl ~v!15Y¶ރh> L E}B61AV.ZL4B̿ck+g[}{Ӕ,fBD?ݮ< U2]+&QXWы 9|y8;L>pA?sdϸ]NV!smB.d&+GݪܤVE,"*&[Ee9 뾷Q]';ؿ=EgRU F@\J X;&Eȅozi\zj;A Οɻ} ?Ww&1$>eRʁzg^ʫw@Q1QuŰ%y%BXر4 8eZ)#4EwlZ0Phy&4/D&y5AD|Ջ/d9|9|g߇歬_z:lA;'[}ȥҗkO߷Gmk~J+ `O ;FF,чVU`%w,ED1@8p}z¨̈́sګ()@}U+JBRDdRA>!M穭PtWCIeډױacJ'‚!ut5(+R-ؕdSF(tiPi6lƴY)D#_2pq'*5r |$D&]࣬W!&yUM&,)uߢθl͓}$jב'H @nNh)6A  Uɀ$i:`S5rvuuw߽E>嗏U\ ,խ"5EO9?rӪ|b8| .>t|@?o]]6\ X©gt=/"CG`jsC( X<~@0|CJG:7\]n]g;)! 񶫒Bc:R8ϝ=E~LQ!K=;f񞆭U[q%J-IB+^PۦOTkZX*.t6iNW8Ynۖ.h U` 3ٖ= 1JeE>21dy6`|e{@}AEj:jl@D,G5c|{T˸MqAJ!6)nFo큸|qX(5jZo.Ե@/,k -RFX>UF iJd8QVkc4Ё5 EgC5K6mp٣A*fIttѵ@ls⢻&—T.nL,*;;RC`Y/:5zf>js>cnٽՠ9LRp... rj૟}Z_eW -X/c<[ AU>TX9M , EY<:G97YBV>fUQx/AJt:G,+q Ζ3uHP><15 jPO DØ ~BB C;khSa0*{O9xlB{Ty$&>P37*3~&lS;{O@ ރF lA`2OO8Fcy ѻܿab}GNj39|9|??F& ePUT}^,$rukܐ'(rt?nq 2f(5ۑR wÂ^:G0O׏zCTWTf@iXb hд ׄ >(p,N*zѲq4ZK)MV~iLRВ2 K@nri UMBhO |a[ 3)HrIYJz0oLUmtTc[6b5K*t MZ<VbA/BQ%V؛'/xf}&I4zs#fZ/@"pe19|vjCbSz~r+t}l^~Vp^-3Ij)BR=17qټ9xsZCyC;}u{HKA짷TxJŀ> f7\_,Yb-V3pˬYlyU<2 S?8Q4f89)p4ܫ`CsCtw=|(Hʚa-k ǴrCb{t6p 7wqS{̶t:(2\a:v/mcwR~*4rr=A,,2/i{@ bYXzx}b-φ?tč>5Gȸi"x 7Ŀ&qv>2Z Lo?t.WDh \mBHUwC D7BzZ֯O M⋙h"q* (RU?˪{:3(Tl E\A> 7-qtjٕK,sP@ !o0w*ϴ:@as(O$̓G/jfYy=p5v:|T3m59sZS\\ܾ 76-~jG3C 8Gm-' ۸/8^ ? 5FX?3]E," &wIEc dž/fڒ@# -(U:QWWgrx!sR?FEZ/RQ OB43rԷ\FQx}ܟW5,'[|WhUp" U2 = AɆihjg:c0;m'5diZ4xyH)Ը{@+x-іaNG5J6E,HW](%t5d9;+]ExjIoDggbf歭e0OrPt=<%̇'&5im.vUlkԑ*"a@-Xϱ0C/&!]x)GB0ZqB~1fmT(hh&>Z'BTXյgLgHΓnY )(e ؎倗_NH67v|ҰQ 1oO-ˬojV#S+(8T(Db mu k4玉*^_<S _~^_]+gհ}L_B %s[8 DNq8 ؅ džH{k]y!DS!ꖃx^t)WVGڤi֝<Kq5P?-T$# U: ^hUN=Xf忻6 Ѭ鍱2`jd&˷o~x~G֏w<'@DDǿ~D9F!''{0i=ۀ:nĄg!izXI,Tk-Օ,]M)2;ni\-R;|2pTG_"U5;҈Q!(M]ijb-(@ZK]Gšz]wӄWij4w:i >ώyLKg"HU40>G]*$g 5,xy}7Zi='/ "_~[Ub@9G+ NiNU&hMV~X#`%ZEھˀ|/Z]GJ{QCzRk͐)" Xiԭ dCG8Wc x{PY80T⪾vfxJMm ةl2\5{`Нc `[@Ox,XAwls`y +-X%<8$2U*i+yWoSyG{9QQk"s.I<-cS]7۶ Uޝ8""77֘ĭ e|97㱎ɕdR¶YlyzvV|&˄1L*MHiY¡i 2HBv^s5^l^,H-ye f@ 3 ͘|pqxK E}%T63fe#`#6S鬱ۗ]G؂JD>tJk2W.I_SʘJi#7iSBmA22ʞ.qe2!5YWgOS@Dd}*z}jvL)-]A{n[:MpW5eCvd(Mh[y㽸=>HW:EiJ2c!PAV\->s1>.p n*޵Ag+'(fIH b$YՀo' "4 $ݰ8$ nDaXe󢬒8z:4*捧;D$߫ρk۞rIEm‹ӢJt'Wb>EN է;y8+C~aՊ ޶gVO͌)IF#QQ$.0\hέyX/&^wf NϨIYnkFkWHA.R' oru |ZAę54Lk:5qE+e] t}>*{D͌O(,&S*2ѓ(߂S"]2z Jw&16<xRT>)9BeXU9N!rv.ٹ|nix<Ȱ־xR'A!, MIL~U~߭)r5aO=-(=\Tx+5廒FT =x"~0Uj&k,crGDg\"iB·*bK)0 PO`y^doDDGΐ(!00~yq]j{?gx?ϛ=>B7䊩SR֮Dd̚&qXyݟ_Fhyw/|1g'~_?)} Aj6k2_<۴~[ER9'0 >_ ap5+KEh\[}ch.-̀4V; #&A6*{0Gb̦;7YJ|^Z(ie{"Xk+0Qjͪ0 lyqPdlycK쌷<(#[OgP*~yS'}c5u"S=>LD%#c]Dίo^^>znN9)OJWWbWOD>~JK{*^MȾlڄfI$MZtV8Q=(L/b%Ȗc@"L/{zv"T"DLO|%aM\$|6nHtzxY2v|SڶŎeH:V$vgIwjm)3$m J` YsJ=0;Ag:Oݥ`6 4a6b}/3G肩ggx8$(ǫmg2m|$\^ȇo}o}-O9)p'ӛ[Yw^~XW HKײ¢*2Mz  eHV%sezȘ:MV ]4*:&CGˣ 7b7wUƥg"zJf vQCX=6#p߿|nIOp{+wx5N1e=+v6yEgF|wF\/f@9:M:Uxdeء}#hSp۩d͒hScu"hЊH'poHDعрf=l/.AH lJ !} SZ<8-wzv^Ls{R5CH0hE6 ebxr7A^? 1=j\EpZRҒvLՒ(wڕcZ Ӑw m>MDrN^J]rpHF]*ccIAT6/}f#(CPiYr ?)3/கfinI@%I3oX!:!Q!yBퟓm0NQL_笼)gKgscзlҤ$1hGz%F]a|QQ[ToήopZSriqFv~.z.=X 4 ,h<7kxA )̺`zRUp9Bs@t4݉ulkyuvLj xܰ2A ;)Qo@Dq$ DIJ/I*[9cdaRR&[p35~%EyT^C!͡uۉ;2z b{b|.+yJ{x}h8P7L*דL)^dʅ2xO赥̭|ȏIN\ȹ)SI*7D.ݣOY/.Do_{[׋:tۘ3KeV#h}}|Lp2C(ExR̰?;;!(9ιg!lջb< "%S /f2?җDzG$<%Z;fa#gwDz8Ѳ9{AFpv-L 0 =V0ANLx[|Wt5hBI7}@78'P rDmDW( # y&gMKzR͠LGŻ5_*= [UAȦ'r8իŹE:7>)o/2ZRag,U!, P"m%O#[ՕɊg@P-){n]tϦ5WBPXI֮ļ[!E*okƾ42Cˠzt(^7U7,^"Z3Ӣ,,SvG :49؏y?5M&e(1녁[:W跌N"+`  );ʴ`i"f^ym#L_r]l_WYΏoiOyNGgٙOOW7w[]9Фu`N 52DV-2ce8 -V JBk{|F\7FTw ~VRj#n0B+j&Nq7%Ƌ,/[k]54m;WiW4o:Mnc@thƷ8ܦ 0{@}PU@}#+|DbkG#5jL |ɆBԩV}̡I+|Pw8}m3V?ljTZh"]n7J :af(V9]}٧}B-]oƄ!d.XZRkY#3ks_@['1*i,۹$0VcC@׍WElinB6줹 )2HmJ\;j:+MAO5L5tG-MHw51RkJB,-ATFkX#[ʣz򏴺5\S yu+⨚٦ 𱺨%S C %|w! "nÛ^eҝD%5ȤVP ']Jd4Z+r0@h Q?i 22XQߙa?ڀ%p@i,+v-;fU`@3!dXLl<-RhI 1ڍ\)5WUz:&!y* JS`yxz,U"'Ņȗ_} Қ?@>PdE)Lbr-8 I'qS.m<_TLcL]WU v„%UNȥ.i2h/dd| [YÒ$ G%IY0"Fd^SvVQ&?V *Cu< mWrQ[|>\϶6߁5OȃIz3Ŭy ZQ8{M2es*XNHnD._(r<)UIrZ}\W/_mlQzWӫ#v|ݫO֟<gy'Fgbŕ+ ajjw[H[8\@՝bƐRCՖQM'bUE&4H F VɂRWo *p(R-o[Fs4>=籙\ޏd& R.>0ԃ%[ATF2ڒ@aJ0i2Tl lS_56F@XQPpph'KeQe4scZVWՊU_oX&oo_t W~"9;]aBN൮ca"j^C>?3vPqge="lP7QD @wtvMzk[fSa1AnLվEm> ʖR.kwh}XLzyx:퀻:5|v)PGEMwlj$&ˀ| y oTcy Mi[SH68辰fO M)י_w`V[PStfTuʔPmru){ iOO7zyv"y]UV[%4',M=1jt3TՌ\LY,/|R-ŪTkG\%pSY 4A]!WFץ 'UaNg_X*aIUŰ@SY4TJ5u J  ,FuB)>BW\v$͜D ':ha*QV/KCY%Z9& ]]ܔy*H@?צ]4-[nx+4+yzٸdւ]PTpMh;#6hJHE2an[~E[[G aP*vYDd~'^][y<00 31YRږNeU.'A&*6ңJ|sw̆X؍َ:Q&D!a!rF&P$;-!:5ϳ7,%+>c*=ʺKjP9D#GM`i@֮c#| S*᷈<5F,ƈ$uw{xy)'VO2My':WTӉi 7Ԑ0F2Z,-9t*4Uj 7bAٱ;sR@@8Edycm~*U2nVlmUMO;~۸b!Gb*~~,T47į#LO(hIlpxʍ#g<;yRhGrW&A+:in B=Yq$Ͱl iųȽ TC^-y y;q &VG5sUsvR,+˸\[p>*}Hȍ$ӠV1O}Rb+"A@lK5] _.34i&L$ tuJwkJuilt9NAarv&sR໿zbѧ,`htDZK`@3dt 3cX:Փr~)04--O F7*fANyeTDuCML ڟhNml<^D(G o,۾\%V.J4+oFY@tq͜VK+6hJ@ gXB$yWfZI]J<1߾cr@spgnE Ơ ^"8^FV:w ꞆEw!ak;@#[ߒ`#d_:Pw><88""ŗoeN?Kh!a&q4^욊ug[zY_E7UZY3 7Ã0` zd:p+)h1M]9hD%_uHvTO6<@X2=p 4غꆙFx92kթygwM'<*>ȓWU+p(b9;yYж h {Sbbj*y Mir< :oC~4黮ggoOzvRj='ճ3ћE!{)ϰbfa.6IHAk`l|ؤ-HI(;vKˠ9@S_s*\D:a+7`,MDi* @Z8ĻG({&T8oevhMyЪdkpwp ֘,#4!Q?k{Cf_H5ݦ,0aN%q4P_RЋ;agvtcF؈X@ \b%Ka-m>Or>Rl Z})˒})[ e. Ԭ1 huFvo9wQeDO r}LR (ZZګ8"JeV@SwSG%Z YPJS'LUYPO ^k͝i%&TrhU`x=\+X]4#Ţ:G4V|MSyq\t{ pfb_ХRnZc\ CLlƿ7o@ y2s1䶌 TUetG``Nr~RGO=(""bv<]Siu;Uqi&Tea2&#͠$ť'C'&&S$H%}+Q$uڄUy¨]Ц(Rtih#ԣaPJcKlBMn[D9*V]fBdy7R:Oˆ"!{%a Q8.G"+8, rUߴo YtYΰ\D,A[4[ܰ[?' FP(ĎϦQȜ0=ElߌVK@a.46+Q7T~ ]%t ,^۔f2K08dyh?ֈ';EV(c+s[Q)#n 3xh 򺩴so2N[V`>!X,#*m ld9;Z ,rb,OIEv\6Ae@ڱ˺JQv~ u) yZ %8|7f\gXBs Dj$=%.zOBVPRwH#~f l`$X!e!QѻgJEdF*QtL$߰;0=W 3y$j|I3J>~swk*`?'~Xso߽E" |PCo[V-;bGᢎ gWrQ$wp57]yqnS&@ onuR;߅@<$,p7O*[V^(s2jYLU:*&|YWlqZ7.u [mͅK@w-х. I"XhD. eFpSL 2hZJ,k_Nd+V͠o3V*=-Z0b-sXCH.)Y [BM7ʂcү hLPus07! ,Ԙh&)f̃RF).MQI۽DLvm9\O_ rvQcj]_tpEYњ $ l=?KoჹޜXO*Ը&m\_e.@?b*?bEQ8&Y]Y ƦE/E2QTJ6N*eY1^D6) qb⡈rcyqH[MYY/>M6(+J~H= OK]c̜ jqr!$cR1w%r+('IdP5)e.eP \KBl\&WyNdw K^xza/ =*zqFǟ~];;>\Da1OKMfus}$CVºAvމ*<ޥ!Ft:7YbZ0qBvQivrW]73?"@(nua@F VGsuU1Cb' rKi*>rZ4aѕ!o7L -9zo@rHsg" Y"ئ=J7RiMMm~0C5WPtȇyZieՔDq'˳\_zq.vyZ-!-8ɧ$B֥.⃏_ * z [g>5X:(֢4շ!k؈h T r$ )MdK׶zӰqI(Lu#1Ι)JcDEX[pLR  5=!ќ5= ޏQmXEu+2춱2WXM!@|*-hyǤe釬z9 8/ W̹ O@$)M JС1˒}mXɯ#б.9z0V7{ V(ڇ&yQ@x|got9[-sR@?ٷru:BsVcpvk-,AX M(C(r0B4tl&h…D(k6_0g54Jxqe9[{M!E@ܕZwYxϻ1Y\-t @'>8`.Ͼs6b0Wc3wF4,{]H_>^0l.z.7^ibxl܃S(^3kutxO4}ڐQe>=T|Io_aTDnoE[0djm\f|GJ.0+qDܹy/-Wdޟ6+׮]ч-!Z=.<\0MXְ`Fuݼ]h8ZnC }cnەQ̫ʡJ@8ّ`hMn~Oq_> ēԃǓ,]_)R{k0ZZAЋ"#q p:L@45xl9` N|X``5:]4BX5:C&/dh Vy-@u)6amXEz~c.sRY\^^1[B!9A]ɂPqs>)3J':_b_q・+@ћMDf26ձ'Fi8qZ3 FE}8~SE't3txP]` 3q`"`?i1@/ ?Fy/= )r{:ͥ0@t ]`%bde О]An/Al|o_!jOhIb"-5a$o B(,DIrvI~Ѥhq -MFRC$B4pyYEBHdPi!mRn764:*C[:V*<(s/:Q(s.Cq.V¨7'NL`2 VJV#|(vBF6ٛOe=|/91?4賧m`ư8WO&ү+ON/Z)CKÝ.(=!m2Vkȅ&qLq*x:47ںQq FoC)4֖2!pϤᲯQ Sx;$9}#u6B8$ /1,+[CkU Yk@QF?' pfz|6A1&l_=tS1ENbEk޹^xv !$rY N .meQfe8IY\9Ԓ2l3 #Q%Ҍ/h;ѴBܐ]`!~GQg䘔}n6v;y`ۏjfĩ >+vnڃu*#NMJF@l8]Ik )CULg7gHɏʳ<}"*,),r6R+[VKyt {_Y(S}6q@}̓J@@h>T{$ܰ*B m@Bkӊ0- VPR%V9xO'-<2#!2hpɕ4W$pU\6:P/4T8+ Fl OkG7qC(j$ˀpט 5eE? i$h.[eE[%T+ƘA)JDT)ʟ+T o2\oqָ=\g6ʷ8|vop91\\<|-!cmsl<&,4"%o+NBĹ45̪8NN%Y4-#/a7454r1j Ha"jA`A [,80,scx9Ka0\k 40 H Xmxō!kO)p+q͸X0(L)KirQ ?߇c? r6iԤMe { P8A(RPsLB6 3Ryɍ|sU]#%, ^ M\b]ӒAqs[P)WI~\\H &Md!֠'aQ$}[*:2؉g\+YY[ oj 7wmX6l{,2,84. D%uX0KBzec{y?st ``ͰsXYThblI؉2@lYeGJ,JRB_[ Xٟ?g"/*뺩;)Oh~=*4.\Vvx-y &7o!"\ 8ȒKl".L9\.XSXa%x *e^myɁ Hl7Yp') v`l;~[87E<4FY+aъ :[>a<ʚ)y|%} G,&»L]h$!ó1+]vlcфgѤ@^KSLYƦDK)]奥V _ؙi=oŏQ;9?/]b*DGKAPDbΙG@'S1zD:ɩ:mː| g#9zDo >Ѵ>7S`[ {ֵ0'v$0n-/(&Yv׌,#u?7+<&^|eVr7>^OvZ o{*1} , 9^7&_ IV &u8,Y,gM§0lWa*8/)*'FwD`4b,sȃِfmk峒ǗAu'WotY|}N 8ǣ؝\\|cD) qufl=òڤ,ٍ;S_Qtz0v_1R%Odl{)Wt0hvnhpf;o8\[ַtڥu!SJɫWؑ'"1}fb A ]S _@y/B7`A- KC%)ד~̈́B+e̽ PHx|/ 2ڼB'A!}iY;3xVP8~JD:Zy=A@9_./D',W?8brWod6SP /A+-rK ۟m֬NA I %>[LXgw'a ] &#/O:'-~3^qfocPIŚ+?xa"rC7!aR<hoCJm#py"=e`\ [UQ(A=iuǠ =x&x$2{[ . .E,r y }GYݛ NHe<(ME/'h"ulDW ue^lݼ+yr}s-[4 +b47E]mN\`JG@: +V&Er.@oHs^dP4웈FB{.e `AT9roz<gOGUDnnLYk0(0⌷R&1O"d4|&ǀ>Rc(sRDU*h$Nq/P(ح]fK]U ifWwgKҶlbGmc*)[T&5w75G!HiJT"`L (ډhw! &#.l(h(X 23@3/4A~i2J؁~yD^km$uxk/=¾`!O¹H*q34k qvԆ]'B6کҩ6:M1ſasROo y;R`?5'="OQq2*r糆 {Y6YSxp hC]hT%+fzS̨|2jwHȯ"ZFT<u90@:+9Go{ܟ?.ߋOo߄á6F 1,DžMUE&Vpc\BC%8Q,MH@p_9syYT#L"M؊q`Y])0đ\aђщ g? XaSFP  Bfrմ~d4̉*M=lp(홯*hS<2*zPtA׮ަL Oqvz{^>|z{ږE*z,r9m4KVciRHc[5[t@駒5:P+ܮYWd,' [n)L^ܟ)bǖ^@Y+!R,S.pMvܡڷjGF&0df޿ -:L tz v[K / CoSr򄆔%=e|صV`%~ ,GyhZr'R#R"AhcDgs]ٺ|)L"eH w*!Rj(!ߌ `,=;>e=c~^\|-3u+ /ĘRm?(%ϧg59\x0u-묾ղj/kVnPW88L|KX(!m1--]MQ(7pbX@&'!;XoP0:P16ːE X@ @ V[5y e7˰#am[Pe1[%L8U>XLoߵ25*IOXY8 Z 6mf;6h:Reg;f* ^C&hIN%c T Bޗe—a&MJ2PEܝ~'ZSV*ƹAV4dtX3'?ɣ (LgPB.@=r\?7~\ƳsY߽}ϟ SbYLd[,8Wz @AI 4iBiȍ$u/&5J.2Z&5@%5g%/X3UTqDm &ƥX/ž>\sgoG-w1cAT\ ̹9Ȝ$&k㛁X°dF1^#NsSdzR^;@%c>+j ^(C'@eJdT IX/P0'PwВB d#>{&xRz]."ϜwJ|$wyD{L;sN |?y>yzOn`=t'; &F9A0@1Xx/ܨpAi4 m+Gvm^SIf}v%"y 7 _8uՇ4>q2-0hH5lfb<(y9%\Aab0Tf,s&ZeÒ(/mY%Ii"0ks+ ~[;L4Ɂ:p'.D4]tի9) O|"rv~'߮zsa)KD8Z3>-dF$PU7=Tnn, YKTewϲc|ա,ڇhtS{,ױhFcJZ㊅M' i6lӣY[VtHhB:rt u],qHcUh-7,}nI*z{ܗUyh\*JVmgy5SK3pLub=;~g8<}2.\]މL6,g7E8cVCRQ#Zh]-.1p"YKTicӈe*c:?sp e80tB T&GA+(kQREe2ͤ(.yTk:#so]4<] NxLyvu*x1Wxe*Is_eI-q3HK\t)j#[i7|!hO@kgk#Ru_Y{zu rDLG=뀸%D'[@ɘ{T *hVM\ި_Wq\Bc[^qJJgovtQ=}A+sRΏ˨͵Ȣ<;Q`Aux&R X0TKX+oK.m"(,~W:"`27#vre0 =_.}w3H.O&H֠G1:  ,[J#vB4MXWN6Yl? |SU]qe-@x~7_bK^|0mV֝w, _ ;Tؼm#PpIt]+5ÕEb OڧAky"ϐj n&9ؓlz05auz5 i9ztʻnJ Bj(8EXsk ך2r#=K 6|A{@rgKoea/X~dۓDU9B)2E,QZVR.doPOtVs Yn8f:ðz\E07m+?95Cy4LZx`V8aI Gx6K5M^c|mJ|mkcD 5x 0Rb>i.DLl3UUD}-ߋ|u{?:/_u a=cJ\5kllZϠDj&IDe& K*M\ 5ghB1p>!-)0@?XTL,ܼN6 nV_I1'TPDB1;0Lq`LFw>+h^veM@EZȳ*!5UE]zo>@z /uMOA!Ip`N:L\ C:%i^fHC󳗇K>'罹}y+0skW+R`@ lW'ZUq/ދ@=BXL`R/Ln*$!F+ʌN3D9 -}Ex}a".+~Y3ղ1 F Z0s®Zjb[=-XTf U[EstL*Cky~fΣثDHͭt&>5};2V@5l8!\@S4ywTNs:÷7zvG" S?:`=;Z>ދ|($DGLrǛl BGa~8T$P>Va2vb7 >EQqHEE!Rɚ_"V#P#Ҩ6ayi "eEqQ &(?쉻7rĄ?İ(aN #!} 8mK.^A:G]H806A T륝y1*/ v4$* pyŒNZh鞝< :PUS"IDAT";B xJ#~fI?:|K;;~^DΆ0"]1ʖtnF?CN}WP2XQ˽hCWPP@oHS Nc}*BjTl8rH~SvCbho/*H`Σ"! ~> q*PY5sБu$|}_D/>\G^7xˎIn@e#T 0ਖϠR\#*n)DJ=t.ԩ.vPEڔ2fa4v|Ո k7b`wK b"QSF_f"W&-, 6It^}w'oťwȎuZH7aC ۨ%sCE4f$XP |ˬSV PP#IeS]/&%,mmP,-b0> A ѦySR0"4:oBJFd.D XhS}dlfJ~x #p,+BFB(.CcҮs-iyxx<љxbݏz׆0!|RD.*sSo5K@;{bK"*af7KLV=ҳ>ۿ@n}}}^8_d# XzfD*u .Ƣ!\?&Dz5dEU'ױ#DXF(˶LiMf)X4E-6!Mm] RusUX=`!n 7ms6^U}c? +;4a"낻 9j BT0zH}-iR#'޲6WC6V^(mmeEtC#5Nؐ!L@YR~#Em(0H@뒅Ȩǐ1&"ǣfsRBɓwzabj :Y^ܙl699<[B~3Aq&㚚BYցܛaUM;5tAc\GeGf[d<%`;V,'_X2@yCZِvy@}D$hPJa 1U4,O8m’bǽ90cʼnÇ(;h$r?cBy@l@,:8}te4y*XX8r20YT`I¨ehA) |^rOTo^s?*I×/~|fU'wzqVd>nѾ7ĎTTP>TZ5MDd0ۤ-_{ͳ{R2PQ})sS0fUM!(Xi6nmVQ} dVYo;?ⱊ$g4)mV!O$o"WcB33.%U^N9I+xd]8 Us ocadHxdX*~ӑ@w̳䋥6䖡kDu..)KJ9~6bmm)qb>UBDY-x"JIKNcZEn h9/?e&Y:`.T!705N܉M8W2J O\J^~WsEK4`#Z O^HdQ0j±UtY.w'k,?>,>y:V=#4H_:1V*g̮tA \̓wCebwkEpT+@ Ԥ?].@새_ PPw7lBqKU& 6`3ȓuMzG43 "sa*mc&KKR[46c B5̝t6j`*롕l{~/l4;*rT?Z{ZR֙E@ W}B\;*GkV܌Iނ:C k߾(c_r?#p) '^ym"z8|>?I=}eXalr_G+K)}m2M".~F,QZs|hY`crjкjP*^,{> _Xg=>"l3pPnf(nd aIY> @J2*s S4ge% 7GP4oCȋu5Mgt ):~Ŀ3+N1 bJCu2+Y'y׍x+tCd?@wF#nmUZT,Λ 9BxPTp|g8x3,77/h;ITe@;;Ax_dFW<Nzea]Z'B,[pɇ q+ O.EfU/`*ؗRz+~1L=5 O{ƒ)^}#K|#)s/Bb |Z6[_wec`{6s{7;`u3_[kɳ~ d' Sn;r62拸*w*0y׈b\oB|t"z84=5sR"Ezu%"l! &F2_k8gX%XIL|8Xabւ)nR1^( OEy[.e JЪ%K,tVEZ( (c}83\:cX+~BZFE8g \m"FB6ƛR8n&`HpUW#uMXٿ`YF|b6%2  >:|8VmfʩʎYx"s[1 J)}LE{p6}.u&W+F|~wJDWr<ւdi_a˥(r>7 j7NA `R*xH-!g/F&.8U\)w4^ X# nKcc4׹م-{\x1{h?t1[1Xۮ \)bYD݉pF?A=*㢆`P-vw"r9˭*{6vvOq,3[ëY|pjq竨=Q:hi=sJiIHG&6Y=O3J=\$`;yR`M$ @~_ rbO_(r{+V{ef)xG$4idCƀ7V6X%vP9ɫ(K]HtA=-2=f|+; H6c[ qL(c6KkBTJC ~{ Uãֈ{F,p:`E~l43* ! -p72χ@.IJ.陋&%ZV pX&8f2J=^FhasZ?jʬ$'!˶hxbQY\~N~ill "2X o>/Wl r/qZ%5hxbW*, ܡt/#2!E7dI`'xpS-ݴT,1{056'߂m)굼<5V ,ߡeTf =Hd/WIk^ Ttn ͽ9]R#kj|xsR@u""zs#zߋ(N bjql =xlE1 M`?d@aı9Q>B=v?z6(2`Qȭ}wB'p5<%a)X9kADJ#+eP:IꞆG" f^5+E !gM{\BhXV$~3?!D-MM\eS "x"1yzM>V b*@N~h{v S/YrH $M 9m5;#ȯK㛴SfYR.[EU hMEJsR@.u""rq)˓vv.akf,(,UX@ky ,JxFrUmIv3RǤcs]{Pfk7Ju{_0_c=;C+і-ܛ wj~M\54NADK,ފ[l( <] zfPifMIa3o]6ګJz*! 7M`BFA>weAVl? OI%.5l 9sj) _ɓ ׀ιrǑbGXDdyT_g<CB7 D )PSұȓMYfoԆv\]}U+}E}xV[u3% d8A[GԷ<)K7Wb0X2yT5/1em#г9H0ܼ$VxP7aG58o6pQX-M]%˶Ejn`8@^Un&D]Ҡ`+ߙ!XQwtŜS,rJھ7q8d&p|ezӺC}N BwoݻzqL2%95x~㖱*X 4Y:\z@"4)vn_UHS[LR2 ^ D9p&#Xx`mzS:J/$]廈ohNf|Bz2()d<(.QQ[F`a@pP@,LdP% [b0m"5Z 5W(pJȷeYi%P.k>\ݬh]kϘ ^AB@2hh{L[\Jt3(xڲ﹬S%AƊmXQw:}:YU;zm-SxB`9\:nwob\'oW[[6m㚹HeCck VxNt;չd3AJ%K"AGL/w9YJOa*0#ILhS`5\gK K>5']DkV Z411zL=8t_LF3.R:L4s`aXKdnxJI|yCB([uqA#6 NR6XCc >a[xSC$4ɶVv[ʉ #if%PF Bhn7HD%׌MbxZs^Pw8ML4z!te=8Kc0?̼3{WzeP6*=L|@iϛ/q}YA1oPیg ';$*Lb󢢮m5<;wxoYۨ3MzM',njG|~~̝-#()>v"u# Ou2˚̯ΌFXryFmŏa(MU~soŷi<%'aR 1R>.Q r/&B[`w 76DhHIeM^H2;!r܇`?2/) (d<("pOC({go>Дdfx8~MOh_lą6[fvj *0"mrȄLP~_z*GEZVOZf"ę:ے_M~367mϑ.SBlj> 3hLmJ=#|ls8#sn9W:)Ǹ)d6O7O:c[{Ǐǎ'Nq"H/p{]HL=Vu#Wb({i*4̌r7DqLY[ѦƳ1Itr3#9؛G{ G.CZ5kB~5sAH"Z/ƲK3M_uOf:c*=ﴟ;Ֆ:s:k8Smʱ@0M%PShRsw(g-H|#*O툝9a?HN$ʕIL1fϨ0ٓ\K.Nɸfhnps@vc`v1id$ 3pd,27SagQil{pSGh`\e^Ԇ"~Bl&$˼vIc8UYeCKJFB{ci{5Զ#SQؗB 3C΍- r\*GL-b剪MΒ!=-׬ HG ~HTW5I8_Si\A;EwJߍB8*M]75pY g(M?4aR>`,7HA3L}M~G4Lee2_n%ߋpAp3Mm/hO'iN; qZ;#c[S&>.%ת!3l϶E!X@*VcFeT궇j".U^9jalS3%,~3YR6qPa5J9mvT }FF 5;kFhzc dsaՐuӸFS I(C\ Y^Դfk߶H#+'#E̜4uڶ)1y's R3K}>}Q)Ց$]1I %M=Yxp`?ېAᜮǩGrǪw!.$kD VNT-NX<% mC1bI,Z\BդVk364)>Ks *IR:|XD@'O~cZ6@$qM;%!Bq޽$uA2pY c"-x"6LLg_H4X/UJ͜&4~<ʓ=;B걉M&̝I-GZ#=}wosGIرU6S])cRw,hY5VFW@rVe3#G1;2$|x!80lgdpmoymȱ<'Թ6bV5+&D2.{UƩ{jMBJ1Ƿe;r!05KsAIcxmQ HsIċ]`E= B0OwqsTK+Kh`_DZˑtbi^^bHy{J0&+yܵojoβ$:;L5' UbO y+#B#JgyZ uq3;5&@jpY$񅼝tV=H3&B d:/Vy*Yy!.Te=|`^d1Ln9˵"|&ޓiskL \gKBL!ؑ%{#2B[+W{{%O>:[zZg!Fv==Ptav2G7N4!&S猁ExB9 sI4He~z}Ho_y8fxSf2٪_ZT͝ 30&ct3 qf%y$-Jce},g*X6612~mMh&LGrxsb`0l6e)quszEϜrkm<sRac郥ְ`#sPeD;vkF/|s^E`n Y{J8Œ ;`{f@o҈K3M=1!Ȍ4=MHƾ6ʒde |i'aq> t L/r L̜THH>c/`NALF% #>if +gAgifDC>+Sۤ}a"HgX;Үw"mAӼZ֡.JOk5|]|ͤd~vFWbgN?6'.]bk%f&f  ~GIvDN[~yI'=zW41a$z528Ko1LgIc2-۰ҫ9E. |蘙mļDVZ:΄TʙYZgnsս}CI%WJ0tutf4szxidI]?K75_gB3ߌCH3Izzag-L=c Mq:ϑ&SbfI[Ѻ3#27vQkBP䲬guXAo<@p-o (۞%"7^rKu\<[l% S&!;mۅL/ޜJ8Qayߊz歮.v Pٰ0>2#ʌH8ɑw,+ֱ;BQ)O9&1D]RqIG$ qFUheg~(s"_λVNfPNG?OJӱDF3LZάL4hdewJki% #3~L@Y~~5ֈVHR~5滮 auLSXWE;p-h/= #w|M+߫U-, (ad&&ҭ{UQHRqUM 4f~m$D-; ;>9pVDn%8¹UܥOn dH"fD4q+:(blUBjHo'.;`UcjEGoAf~wN9c&=}rׯ# /.c ^QtdA m۪ZM:Q=46 _ִ3B;4#sAw 1>hlƫ6KibV]rVߎ[Ϋ6pe4E_@?9!t@!!/Ҳ& (M> QJBmHV6R&*[݃$ H+?vh΋=nK(2P%#3Ks`q4.9T"OPfL{я͜I&W% Z>%:JoT`#`k{My_ŽGK.c|~H%1ݙDՀr沧NHWPdMMNwZ&S;Q4 Mj|U?ñYjK6rUg{ 3w0\6t?o9xc4LcͳTgwG[& pbbbBB#(aUr֔g"ip+\31.` &WUb Љ0Cw50X9̗M>ֹŚѣ9Y6|IemG>T >)!ޣas kƇTeJMݟ|DE&JS{6(e١%mJ,N&ZWf&ĝ8|&#&:)-Ijiy@,BN0\j&X蹇]pm9 Q!Nesx޴r.FfU=3E]d}}c3n XfU֜ Y # 3=2120D\WF󷇄&P')rό_;b= ~Ch~tOD"U#qqǝHfV3p]1WӮ\v ]$=qa׏ 9X| u!^Wy8mz?$+Ij0#Y#\@\mQR8y+*´QkY9zBJ3S=0kg (B/1 $ 4 V7TXbȓ:AspI`E:LєTziD:,g׿=ٸ¼lh2! 82|v&8SF-r)YkH!V#ɔb~M|I<Zd86< &HL+ "`ѫf ѝOB]H̰~rE ]o*ztp8prrgb|=a{̼E4CGHJd:t$ ܇u;%[bC; [{Dɜg6/D(IN°K)759= 3Y?CQPDAinHI衮08gbR(Ͼ"ǁZܷ. 'spzyscշ!5zL7i.ݣz~V)n #RQ !s*VŴ8"o)?=pK " tD\0DvvQ?򨑌i ׂE0-{#F,}^O6q"aFY}g!_</ԒLXy}f]h!ʘ `yGǂ"7\W sN98֫j *]4QR"н+J&1tnDmxLРXX  0^>s.A G"BXg['MC7$5LM}͹yB%.2|U\r)c%4N8SDB7y5]9#.CIaFL>_#"5)R]cFL%W];.ւ.st8iP"H%rOkTGVйwhLͣ@"ȮѨ{G2P>)3[\~\ŷjHo6 06nӣ f 'z\7ti֥[?:A 2Iq>W"d%~)JEh*Vl. U{=:MXt 0G;Rq . ͓p9 tF<5jh~ȵGD%oE?a1-3.9$;I ĨO"14R#Z>]qbba vBd:gf~ګ4g$R|OQ1Gz=ND~fKy:,Po: =b~V!^i}&Bk4 8,0Te;h5 Waus9^Coc//d%Ƙg v ޮ a՜3) _gh& % :71`LC8ƍQ2΁P),bm闅v\Õ ȃHiM|a ;$| :RL2Zy*.G>CDfyL,3 &pUA8ioߠ 䂈E33, y>D6?1JM=[G|fw-_nboh߲1]9yPbv3MQGk_ĺ dθwu\ZQlwf{?`laߥ~V2 <.JA1nQwq/mB4&')Q/N*5AR%MVN(wGFVv\hF=T3;FD\xQ+4g2:|I2zB!ثEm ?G>03Ag&vFS࣬|h4ΚYx"&8Ns[8a='rW,:+ :FF}Ͽ@[f&ˆ}bi<[]bn8Ex 8 Vp]1Oz]ӡdkgۼuVrn?J;#93C2jCBsH\g"\ʧ霥bgE,zŌ=-+l+3 Lޛ G#a^kS"'4($K/kkL3|B@tXNsMdTbsy5`LO$N~ǧa6ylt툵0EU+O>$~kbsZŸ?@ դ$r..,w Sr”_`/$9=MBY`+)X PDtp;!ȏ!e+rMGs` $4:S^'Q$ը)'Nk#&nDy2ҜX}M!O&bj^i2I^CC`2'40GJ0#Zҏ<|ީc 3mNJbdBM*cOaYePKv^=,Ϭycew%z2S͔\{B5&:h"X$$QTvg]=UXvrՋon= 邍at%|K. ўN+~n.eP$h]9ị6I˝0k,riNF3'mr\;MlٸrU.}ňX8Os~BlR9va넵TP a4IvVnaaR%^1&i&oRU~t+;nT 1Ś:S:MO +N%b؎l(Iyo|shA]O2w%3>Vf,M4`E tiMԡ:#TBoA~0~OE jDH2ş^LcAAҳ)WtTC4zpo02B+둝2 u6FVPYj_{燖aFĜlڌRi##lx(sI_k =֙EawBQGϫ(%{XYFM`}BQ@BC9,2&ȅe:C)/euLHB0j *sT{h8!/v'&Xh#k@iaDcZSw a`׷=#+jmjlyĉ8WA[2fm0; !h9Lz/y7 Q18] ϛZ*3!Ϊ;LX}6 w*Lߞƣȃ%gx\=HΗ(E%%t&#z+ۧ];4 cb]&LF{C!g-N$QXR5~6T ᬕC=2']gС&b0Z7tVZ^$\mSJ4.S5wP5SOTX #sHyCa̶5u{O3AD[qQ}*,SOѮy](W8vY72p]1;?+.;ϟ֧l6ݮ2Bqkڜ`qL&湜'҅#y۩fmmQ?(ODԑjYi+hD3g͉V]bɥ-"Hn_@_A?%*18iwDIy]8'si}]U hbġ|4?=[^Ybt=YhAl>1ap?<ҕBIn6%>k~],$X,Đ`wB \U-NM +o~ սGLMוx?Srvۣϴ7Uq#q}ՐO߁6 0'8Ѐjs)ZwξYIVͅz/R' {ʱѶ*ijų6.Vx2A|Ezti"?ʻ&̆ٙ; }G="ST꬞[ ~{[^`EC xu\`ë}]"H>LN) BV;*_$axZb0-SMTܽذѮ'S4ߺ͞@\gaPLmwqRͮlq+Ly]i7+g&OΦ]2qX+'-nglx>^BөSM}pݺbd=u| f_b> O? E_/[1i ͙~A_Hq7"H\.Kàbd6(M S&@ѤkGS J~n6 e$46$c0:R~rdEi.:#0hgCI"DĿAy9 bm87+%lEvdFE bϴo+XLhQe 3~1o ,٠]$T{worv9Bݻ YN L<ܳy+}k0]o¤:9liL`8fߨߦg P xHOw6 ?.f:rǎ /f{ }5ԮuTϷ{3#FxK|t"h2mFȨaB)>l,tQ23okcE^ RكZ]ssNI*qELUG%Kv>GjObc-Rd$xXYBaZ&;n-(̇1!Y9jm(H?e:8.!L߲K̄:{=XF}:-a?tT?Dl&L [ yfYԓ33}mM3Z &heu&|웢ià־,ڟI+ƶ @ ض@^~{w߿ZUH ukkȹ)Խ1wPs 4"i q,ց)$@n0 DA "7gfq*&#v-u:O6EHX> ѦkЮNۿmL2VubUUd  H@lUG4dv::auNHr'i^98g3g2Ēd&1hQAD1 BxDPKD9ݚ '`M5<`@3agi9YĨ1D ;^; Oà[kR#~2[/[ K.:\_>o' [F̰Go쮃;?Jb TNGȕj*ZL y/DrCU6] xf*`1P$ߢ 3> ɆNRU{~BABHRGyXwȠON7 Lm&gd)0ֆԭ%DRΊ) ONUL O+"k&噐c/~ls\0r̼VIIsP?JNथ9AzF{ʟ&LsLF-v F&5"~cpn4mg>=+HX+ȀS_w^񤶿B ǵa>޴ټ];J?#V6@\jY b$fS۳(HFNن%*2Kf́:a=9 =OYԧo$yuc*A-JY*qÈ(1DPB -ZFHBfy+riaϬk)ukbfMfyJ iGL!Dž/*q΅ͣ5P5Q־t/SəZ< (FUw֫oXK݃{NC#`*Q5~-hg'ƀ4N$]]=; I2j"f@Iԫ!NGܻsb R\zX!kC~{Tp͈ @elriL-q>4ghhM?i4pIk_zYOd!l*,)N p\oOkÀo0191q#Fa&_1H7!њsE 74h>&b^ӯF$qdD iFo)?;Rzrzm8Qٛ)as6&*( F'9F |/#xn%`.7jkPx)Jk񎕉I5⽩.m&a"$ k:mxgBw"VCC>cW 5~ethH N\3"xuf!o( kYNakH xx}j5+z?-XObb|^M$Pg%ana^w]ZISETd>!.$ܔBe'?s,jP&B뀌Bkb=$j6e̦D:=2 M %f#i&sLD/tiO(( Ǥቪ$+f8$<ޔ(ЙS;VٙckAR^58h7XӉwk6O~CoiWkJi'ؖtf706SҦn6(0½=oXmug *RppVW Q"EM !k ڴH418:.aj))zj"$DJad">ɻ Pf[3')3FP;ʦiJi/h)I5#d𬓃Q.-`)C~ŏ#}kʸqqgr>3F}a"f3k{2ә1*tfwl}'95qUӀL(frq&ZOD(D@ 9Gq}R6xq@0gO<ڏ/j 8b޾پݛ/]pY1DR"Mp_WYVAfr3;.MGE#-\:`vcS&2D2 *@ZNX5$!Qsw>g >~&F.me"ELIu}l!?#leRpM g,Bѹg*Z+K["f\3u!ul+|/c]3sxIh{ƿAg1FϛYli*GZFu\A=ܾ}ZlI>Xdbެ?`?׬ χ#]7r#/Ё kI`oO lgpy80$̌s(\G,]7؈xY9r4DD&I޿jYѦv"MRh B/PЀQ5?e|^wUۤ)~&A3L攸BOE&w=c 2M6GSɉ{!P;ahh|N >ss}ƃρ 8 їb̧(DpNpǣ+ȢZ0W ,Z [NugXfW2BF 8R0' i͉PJ1Ϸm-RB+1!<1 HiH@s ?;oPØ x~3i;3=~&Q9IsWWwT%&Cw}rz=3bլfV#+_r{ҠbuGW4_Uei(dSNK,aM :wF-%\=Ry0;^bIw\rwt*gK^T\~RjIK;:N,-9ž.T|Ea|I, B+=^:: ;g,-敻T}"ڭNF\*1*5$dGʳs3ktISASlIIN-Q˰'Ohj;3Θ9OUr)ϱ9|tM;@ 9 'gZwSjq:`,oĥk#<UŭO<,wv{;7_8 X[/`̣ Bm;Im%ѷ;ՑT$UswZhtoHnH6z2?B3 _BUb,1-ֹ$/g/IR*5Rh)tm6DZ5lUL,T Q;b~B33By `OGIu>?~~_ILDXwݒЈFN|Ixb oCıYmt~36<+ a0o̴tN8UYCNv#4} 0әeIWb~w!, #"x+޸}] [w"k2nwpf̦'~wh[AzYbU&–U( Tm`w!S}\?n{_믉Uȏ%qBl}bdVR(lc G7zGs~Sk}lnFiYGU4ݴ+^zV+KCHsߵNTWF̝٨Jk]dsb80ۚf~cCM_vEKžy5/s~p0x1]K/YK f>%B:jpNu"]s+q;zU?ɑL{-Ą_یbދddӱ U#}5Y3D3?J utˤ9k c58Y浛DRԐ+L_̊M9C;0GI[{Nu)ӌ2o4$ L1t"a{>γxDH[d ZImJu+/4x@1ܢ{۝{sZ_C6'a>V;MH̜9x.?l"42CnGrNdwQm66M9 VJca'Xvc} ZJf-qLv>an'r؃I<{}^%!{QaRkL0ɉ@ROP9W3+3od5F#x=ðt_nZ_SStN#Fng B| h\ȉ!3 ? O~ `KKdg휏j.J)uD0 ,ZҞ3b?9B=FfZ0?3&S+QʀGo>]l7w p2[;߰ʓɃg#Qh{5I0$ J𾂉tJA>ܞXl R Ĺ)K㫳6Sצv4 ʴ05D'Q2IߟG}i_:Fۅ&xi:? 7}v4C™1Km&/~U!ttnMS4WjUӍӐA;1c$4;*:~m-, -Hߵ@͝Y12`bLaI[iۋ@ܪ Q|}׿il{YFG' E C, Ø$AæH=r~ʬߞo`?l^ i2m$%1ȊH4> ^w+41"t v{Ba\A`xWdN4QdD&CDf:E%`hS ɸ3:gX/12e;VvJ57@{lkofFvF8s5̪PlkG?G0յwe#cMV# ])8B LEO T~Tkw>7\Gu1Zl߼1ZѶk,ꌄ_@] ! HK, ExFL<6Ey&MLKz՗f3M ({AH!$΄u~j#$f&hXMMINNc4Awԏ&])N<>4c-Xʅ4nWiFѴ#)I&?k٫+1YG@pȻCaTIWsi EhJIT!^XIQ띰[fR30 Oݷ?(_Ȕ^pqUljMl=ͻ.X| ye\b| 錓 9qt 4mӠjBN30^T]!u2Dgk~2Р*Em c~2ÔˎA!|ׄq0.zq&h`reAKzUi\vOPH͡Lj^+;GڼSWMir'̓%g1!iBm4j#3AQ"|XϣG)O.غA3C*ΫO {Rk 忮aacPx*]+_wA?.2=oT4łf^Ñ0j;xI"F"ͩ4""BhTۀE3pA3C߱q gܗmms@/bMq12^w 1*wF߉ =]9Z2yAݮ%{vI3!hj#Rغpf,\:r+sAaɵcw GI)a%%2ez+6Eb(,ϣ?u~>^07(V덛onh0d, }G6IAFF5i8$1 9!\f*@2/OIˆmJL ɄM-g`e=)G6" m, "yGs03/ +F^٦,ӎY F}BĿ y/9uXXcr #]FIͭHp4 5%r5v!d~F:~TLDx"jWǵ&%6*V2Z JԔMYϒؖB^ [vx+Qi@ƗDv?(Q&6fsGD#YJvݖәLm9KNF;C{8Dh[ :#uS^3e#4fc#<,N־o \^ō˞ހ`׽{C;YOMh$=VH TA8ucF- AR.| |Fp4BJHЛQ>"D=,n=!lm3q`EA]g ( +ܤNл (zB|FOfŒ(Z*D2bsas2̊<&~F`?v;F x̸hɜ,b]|}B!.еd}9xJJ$6kʀ!?ׯ>Y\c(nkS^}l= r]Is6'1^tBH4bm#j q&{t &N[yg|ޑ>nB΄hd7n/Rr-60ۻgd B84*kk۸3[kD_ 0  oDZ7޳sgyδ:h6ӫcT9ưy T\gP[;q Ƈp̭بoֻ6/|zs0qTDa7W#7Hg"<9mq87,4ILljP}mdimāؐ)蝪 ǷAz= 0XBVzA3v:v:zcu3mI|@bΓ&;3œ uf:C7~= .+3 ° QoE3B{Ǘ"3Ѳ[c!aq]E|@>% pb4 ߳|w>.e1͝SN ၡ1!CiIXej#cَmަ%+iYvQ?'*lË'46wylт8l/{O;e јPB]b&o2UuIsQ3&9ω9Y$}DJ>d]MJg VOz/P-7, M1U}R߾~vaf0jk -s 3Y8%dҠ{h4k=Z $_4:%|Eހtg}IkaUG,6znHz9H9 :#U$Ȕ: Ih칉OC}R]#mkbQ;z43hA# s;Q19~0qi5o9O1Χa'z?[&IpV ޳ݾIl2q4!Ts@™i>4(Mne56)009ҋl*!*m)ʥԍi lP1C*wARN^l8tJ:g%TP8۩#p4>@^w[2 cf0 N-;n%BΖ<*WGf9,dfڄ|F3G8#v G .o慅IA1nQ]/~t>k؋`oҳp^ځFp6?cLFFSL 6Rѯ"b)psG?ws!X}Lo#̾A<QTyɑaBhJ2e ڛEVoOCF$I[D)e`[hT,) ϴ>< }X5КQag(]_HOܧoKEE_`acal6w~VXx@Lp(3 f];9@a7+rM+!i9#acHujʸm]DNlKg6\c'Azg@1-4c%k XO2ƼJ_W ׀%[/FDk.B;䱂PaۃR#Et[Sc'Ae_6 YmP8iFG6uY^o߷ \z$eoN1k0Q|/ўW90ah󴍳,GT~끦:WEݿ,qUzl6:fH4"." Nk&y]f˒wG.NtCblȉg11s [H:063=>p"60 [#N͜|Ξ6ݻe}j?紎6PR&K`rzΏmBZ4rb}BihԽG~K~l Chx1YGeg7Lw-ĶF6ĥtHσaArSʌmrzPSX;u3k'gg?,H~#a9  @4}_޽֥aKF?\&T 1KCRe1{ ,G{/tĮ 4JE%]82/*e'a۩36L3!n*%}aVhu *c#+s~u~~"%2j/jr܃"}/sXkORq,W[W|y , Y~u78PK;tWHN~EdDXkq f8!R6gHz"n^]UZf20u#o{Jd ̍G Ogi߇DYNkA ^cv۽  `2]͉v?j1rf6o ASC v#ZJI#R0' BIWNVvY#&Ll&#J6?mWiDI>7K\i3;]%kяf۰#47I% >^sT$k,āF-NΎK5I6Ft=BLj0 "8/D;ꏭ >=X6SŭM߿ZǯvgKÀm B̌I&2rf%}TH3X>#!VoxfC^~<t*.YNjYm! };ЂP6l$70kF|ASLuӺTM*k/_ &g]>QQ֍~ Eg鮲@CaLA#>fÒ6x >0LπiMN~dpnX> ᦯R\x.0 <')3ol\Yi)9֋e;f)"m |uNaLʎ%IDAT~6:#BtwJmds햄DT^,gCV1 j $u־gAB̈́276Fn:bc1fcbjKI01X>R'`!vap৪[rm {ɆsM1@j}im?8-\aaxΠS TzXmtazmd:TM{'a IK1%!y`HrcqɁM]Љޜ@YJ5ͰŪ4 EO]u73 L|(_C^Oh=k[꽴*Md&7M0ğJj#A4&K2f8 h9yھlӿ0ʿՁX઀"5ȇ޿|7ۯf1Z`|Jàf(j ?64;jf5zLL 9zϳA_!bQD Ap}ZRo>4!gGwlsI ֿ3Wkډ *Y}0xv< ۻ הJ#AmxJZ^IZfKQ"p^+~M__[ \mX*($B/҆];ߺȩ;h\YMURSYQgB{Eƴ$3s x5MK<޴$V'D$X#g};=_'wZx8!6&sLNux(y%[Ϩ"+\`VǜxecsS jSxd.ɀ a՗>WDgsgzjw7/f C-zᰯS?f 1vF%B`ЈptL>Ri)ca6I՞">^Q]X=JB:.0-wFb:I&0[h smK'OS%IU+Ħ'O+~C9{XU(;`fcB2Q{N63M z,,Yc6-ڻ>^7l{Ƙ̉8!Xs3}nA(0vIF,{7cc 3T$A-;;Q>&q%){Ҽ8^_Td:67R0+v~R:MY ]"4'm ֬Of:gڻb9&{ͣdߙ2P6a) ]8+œ}{!?,X0: ^7'޾;N${WD`SB 9(@ bԎL W5찱Eem{o4$ly\Y%$ ?nj&8c&%W'UJw7NH93!`0h-"쬇L!삮Gy>~#6MB?4,iaFؾɚ9ޛ`SÀ?˞5-x`ax^a -z^* 2;/ 8+16@ti6qt-(Z9*礏~$Dڮk,oT1_@ hcEY0R={g|M s)}p~8L59,YAN^I|ƆsG6}m<6}B۫6|ZK2oX^E[Տ\Whe8'?qPN5m (V΋`ޤW$<'~kWT_x`axA@4>ޜ{Ә$ ͿI$E`G7~4焈lh5Z!g8Q84QimEr" f24]r$75q<ۉ)>(WߒP~f&բ QbS4'С4x)O]#N7'3s$2Pvaɦ?tˮ(͢_ZX3 o߻ټmwl FiĵWBl MpSTnYX3`"n(Ml^sIWqD" YyV^dxXy M,N|C碮ẅNNu xMzƄ: ÀD~$߹.,5X9P[UoogWWzHUqSšw/o ~s,M&,/?O!y8e,Q 'iY Ic-{lbMDzo"ksDiܘE/e]vkŞL PK9unZxx#0EA*&~Ҁ6'־dPgVaaaAqawoJG $@8 R&@͞B:Y"vDW"F;!oMrJ$ H2!1-mjl>P~ּ0 wa&h氪w9a!Ҷɢs7ڙ}k}sBpl7;CDpa?HK/ ]چ|.p mpy^;uP`\hňjאhZӅ@:9z cv"Jy}`i)rcp4WV2ypG#q\7-5GKq(VeQfA+Z!$Ą> wMAJĤt3?C^W\]%, (* ȏ޽qngU48M+N{d>brԵOztL.Iԗa?SY7&DO!4uи&၏ }f/p,pCN>07o_Mc֏^jXPL[=XhalVo:52"%MG[0p6Ip#&d|>D D|E RȈBږ;@ىDO@S?D7ZT} >6T4Z;fDrQ{wd<1 _;/?,ss Qaw|G7U17QCp%V390%b9{@=eǚjx`cW޶۽.b55w5 ֢D/޴3p[(tOFӬ̈́Z6cV8yWNk͚ *#o WQax>!10haQ!9mvSAk9d*?O<#[@y_D[Mf+QpOj[b!v3'B#ZN.r"\  m_s zY ;I~ \n8l q)QНlnhHKZUhX4ܳ/b䞏5Ǜ~%7#, 7%(U߾~vjs ]J8)䑠Y@cxsP7'W֜>@Dۙ ]+S=PBxygA_ ú@AZ>$ H:a0NcmCmEݿ M[_+qpC 1DxTF\=;{lmk/0zA3`fRwԻ%y2jK+q/5 hޠiU-2c~N"ٛAy=z?.|X , ߾k]k/$B(̝]B۞Z oxPּl?[O@V8;ԫ;3fz~MP#CB٤aX%R`a?O"= ;}/;Ҡ=?la *8\ xXo'iZ~hݿG,1Uqi~w7߽~)7oϳT}o. ʼn63 \֥~O}5aU2 2R''3nv߁.|#(dy>x/ ܪ +l_~v7_J[ dG}j^\ $p;ݜwd"??1gDj^Fb쪽O0aA". rw?ډC,l>X |v8h?|=:3VhKf؋п Pwo)՜ 3acB(4cIE%jtbECN΅տ@]/۟ѿ5 x_;Qj/g ̉pn=0`FB4S AJWBCޗ6t K?"6gW%9&}1+KLANާ g}Y ,aaX*b4 We7޳;xvo;^nZ G@d^8B4{((foME|<\Wk4Fw=г~ډ{>qdl{D$G~ #wd('ETkw*~fi-Ղ.-Up;6wc<!ᛃ==c?;s`9" 1>ɇ t]wost TAE /~ 8 ܩ,1U XowyEҐk /򜎄#'mpl~wܷ l"lM1b 6jE0OHK gAc(,cWnkBo ܠ0 ,Y,e$awY?D0ɜl&!7s$'=dTs>^3NwRry^Z7|r^~ 1Dk& M.r~|H})X`,  <*Okܻ~xXC(ޢ'oS`A}AlrD< i@U%ҺGPՑAv5}It>1R1<N)~ަ|]ʒg>0 ,Z[^,P)3Y_!!<'Q)-;"<Ig^~'~U 8= 2Z`;/Xm]݉Ȱ XZaS\H%, ZxvM+<p ?22@qY~+PkE_``^@P[(6_}v{vt~0=5w ¬3 (r]W +ad.ߒrE?61c;{闩;6XX`kc+"ߺ;3Zow8 (ZR?*euj:H%x)t2 Kpo#b'.+Eݿ,pP0{xo?Z?-Xou*!0FOQ37~Em6gv`aX-m{]c漌%B8l}MG'A (=4F$sm@Ż=XFA:7??~V@K釈JlW-iP4ژSOܛ3"ytlCvǡOoR ,pr7X1 p* XOܽ} 9P$oD #l޼r%R/-LE}*Ðz]lkJeXN` ŭڞ~l7owwܽ2`H' TD yv>r"H uC@p^}AŻX*֪=>};7۷> g۫9N{bԽZ?"ohe.Ȁ{}HW?BXzX` (߭$߽^vz^-Z@1o5O?o5Z@Or_ .hz! ,p,u 1ZVU]ɏqwp-ݏZ֒O0=cL[`OzʁWxL{k^XX`vXCyp~=WgӃE x~@H~ yտPk/Vw~a ,p?`zG7?|Çכ=`hT9@ $wT^D!`aXǴA~wvz}bhwcs Ð߿ל _-W`nPتxkO>^[rۃՀh7?1p Oݧw띇a/ 78#>kw~aKm*x%<1 GeC_Y7.,Z nU7>ݾvrxO!=O7|pb\\h@R. ,7] 7D%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/tools/icon/512x512/mimetypes/000077500000000000000000000000001505543434300200215ustar00rootroot00000000000000leocad-25.09/tools/icon/512x512/mimetypes/application-vnd.leocad.png000066400000000000000000002250651505543434300250570ustar00rootroot00000000000000PNG  IHDRxiCCPicc8Kaǿ(A`f{CHLeD宿شmY컻"^:f=**9R,"t%1)fm-%*t̩vOvSA\\zN=/Ep cHRMms{n3'IbKGD pHYs  IDATxilu}ks2o@ !HA5C2Ű;leE8,YhK 90-&E0 %(-vSh8@LPUoc>̛{߫?͛y<["f ":].(xXx'!7~)eDlvw>޽{/? ZP|n1m^///8(x0 C(ɂe*(ڶ|>g־?7/??+O"pww+tx!L +(x58C?CN}ZP0p!OD+GC4 >L?>7w;A2 (xPXgENq|M`www?wm'`B6@9T;Ő@_X^q8<<č74}۷g_{ނN@ (@Š-Wgʳue,zۖBoCgfc:kiܾ}9o~~oZA" &":r`y_rs}6nܸK.UoG~G(6 PC1hP ;[~T:oիWqEG?wΟEhT'Fri (x]p;,KkJP?xsxq-XkSO_'cȦO+'a8 4пWIR~oosg{k׮a<㩧?g߬F.N@cc3PPP͞eCENB4xѶ-z)?ߏ媁PK'\uǕ9N8l(e_?O_@(N@c(((8GW_V_2.¢ȿ=ݻ|+ƥK##<(@AA Ye}_[tǍ ]~7n+W0 '1@q VY8 9c_Y۠" |K/=x 03}#Xq LJ+P4ă-t]K>xq ^(@AACÐ?NrxH8yz*O{ (xݣ8 yYmB GGGx1Lp=QG>l{H/un޼K.*];c??QPPP@q74X&(xu 4M~0˹sBPCq ^X5?wŭ[pXk;N@Pf︠`u,3c2@u^r9|k_ÓO>˗/֭[@G?WP'%PPPp1|}ýh{-;wplooO (xͣ8+lðC&6M}kFڂ1D}C (xͣ8E2"*@۷qpp/.Z>}ݿ[,PPPpf2'uCmڕ0^z%a< 3 (x8Φ$!qgh͛7ᜋ\>q,g}8 (((X$Gb/qe~vvvy:O'5?H`h6D 3v4M_~u]cmm-: SPPP{'u,-i#"ܹs q3sq ^S(@AA ĺe˝  ^C8%ܰ(_ue}e}h߹ڶիWQ5&I'~c??^W5PPPYNچw,I2>?wy,ICe'Ռ<TwhE=zm.0L`C}眀 (x58<-"'`v[`6͛1ϝ~'ു<0N(Doٲ?.,+q-8簾">ÿuq ^(@AA κ%޷h؏Xq ^(@AAqRqWvu .SsNECPx؄ܹ=qt/N@k(((8gw@E)Ej~9<;*N@(((X fN,xCf3uH9tPʿ88+'yY_zwfݻwzƘx' YPp"DXJ)`=x1Us~+N@@q {0IҺ収4Ml;{j9}g8(((81Ίh[;I`iea6 7yg@_,(_۾ۊPPP=xq'(xw}/\ϙ9[f>u}휃1n04M\{8s*m;]]ONG~GŒ?g? d g0U{7M|~_䟷S 2C/sEq gque_Ǖ 3cq4PsAq Nj Z$YE띤c`^,[F |P'q (((85 8m`QYXuz4riQ/N@(((8 !|U". ?.$ZLTPsYt4xR>޷A?˜eZ fd Oq˲(%xgEpA뿯!&{e)f5̚pKK/u({N5;~NdOXe;l(((87!mϟ^Em3*<t ",eXN3L8 Gq M6޲|q5E4Ly9>@~Z'O?:y I?$ʂJjZ$}w_8"a8"Y: YߡϪ(ӣ8smUe9:-N信rtVN%Eq ٝl v -}'`Y"rV51}Eq  NbW%y^/mPUU8Y$g(@AAD'9Ϣjq 8)N0_~H˗N>pj'଄~*8PPPpn}M=iyap~^ N30EeU(((xU'A:7ΫuQW=N +'$:,N6 NqGaY0+Jg.*_2n*N@ifN rN SyLП/PPP2㺬,?YD'u;m& _nYOO 8տ,+P"Gq  91:(z?X2' ~P'?z}^ӣ8.7C58tX9rNB \+Ppr5!=:.pEe!adr!Eq k, Z 8Y;O ȷ'>]<#Kา@Q Nw> y9CQ}ϡgԐ١8)jW1h?6: 8|#]POG\.((8JO[d}C0<>W''Ɉi2^.z޹|pe?//w.2ykS(*>롟}>V'`Y& $ЇN 8Π8X<*5(>c_e{=8zOǓsG(@AAc~}CQ*NlN.pXP"x'Ă Np$19/A~9^+1C>񏟉(#PA!f *Nc8{{{xꩧ깯r-@꿜 fw+(?}? @AAǵY?7nx$GC\ZQ5FFQD!!x~A4@Xrg_cvx!x#gҞ]Өᜋ;:s.~G۶pΡm۸ime|UU'l,/h]_}g`:vc;ȔտzfR8PGWЯe v۶Zy$u{}a蜇_\x{o|7=꺎΀nm[LSf3گC?Cgt(@q VL_whos_?zFXpW_8rh]k-^x oF\pTU9MGGGi'ʯ?#?N@q(@A#i!?P::7C~201ߢsr Hlw6?<7Bc sfN8<<[m__5B& t(@q ПC` ~(u E U. oMMxc0cV 7_[? Xx)8C(((xMbe /34o=\eN~ey}s|g?Y\|o񶷽 Fx<mO){kgp(((xd8K@P~'. 4gH~}@ P6o\WˮIyPaQK}-o{ o@] 1O~)0G[ï_l}_+J|b{Dחe {3dTW2de.~|/"7?gyu]c}}u]m_+/wpN㊒8a֭[QwX0~D߶ 9!M 0PUז#y1aӚ8N{Ve=!PwAoC_ fEˢEE:gk !//} !0C(' I&౶fXcOp)l[.`;w1=8ۇomj\H/ˣS+#6Pol`}-1F/`|&W.îN&k}:l~ wrU!5΂]k:]`qF?}sQ"w'gy޽{h;Ncm/@ᛡ(i0W1}ׯcW0s|-\pރɄЧ#`/]n,A &A 2Ꮓ5u]Tlk4hW7`ɧ|M_dj9X" %;rdXq>hQ~8tˮqR?[tr>}|7}[kkk "f34Mf#pZtuY8kX|q :Qq>:+WWp^n[Sע;4`(=IZ|h s#<0i\ ,5ah*xDžߌsρ66:\:!_"g@., WuNrâTS_h?/E$x|x[c ڶL@N  xmc}(xc󛷰;{{_F4h=1*nɣJB'_FK+ w~a7 [WGK<yKw[P"IS3i-VH;q`MMS8>ka٣fdZ7|;p/;Z@,<`QU"`/ɀSw2Рot29I g|~o~ADW_G Ii6>3۷wwsk1s#qHm=]ssfsx mZt; `|s1]1aĒ@XQK865"w1e  v-.no~9Ͻ)CPK@"ǥ8<_KC_tz8)V 9#y𶷽 }{AD}C΀܀9(@"7T? |;7nBwԃ}s0]y@`-gC^)&,Cy<@+P B 0s0*6`^3 [/ MOtVNY%= 0!hjC2 *EFy|oeP֣O^[}C4_o%[@h) ,R'YL*xBS_'?;;'k`£E45 { BVR<1̋AiV:R@2b 9đMC&8ЀŁ8uD8 6Ɲ{gkxk6`.[ujGCp> _VXBm! {" 3yBҤyrTJE3R%=zql3CCKSP>'uwN!#A}+,|]m00 1gX&W} ~9 C!?2s!~HPX;ܰ /0x,ϫ_n3/~[[[ 0g_= _|mL&ܤhiQ =k>ˊAmPG;v3{qŠ}t`$]쑩z}iYP.3&'"/EX I8 cѯ[pя V}Qzn(csl5e̒EX3 |e%E]y[_@?iCEA((8%[|f2F 8>ԩ:9yibSrѠwKi}Y$fOzA8Hu2"}:(g@ buFǨ., {׮~??B4 C<˖_7W?S>dЇjzǑ>I~þOmoH޸oաL]}?'>1C(88;4FUdGaln|//#Ј93 7D&aX7k 9OqQ(j߇̆Hc dIdXJp-^o`k'~[aP ˦2O5f (CiC`hr;^s!~66ӱ }E_R@;:Bt}Ly__btmqZ>tV}=dsDNez|-Ǿ~g`-YA,[4;”h `HQ5~ͨGG@ߠĶ:9~D!tB.9Űr4ױOא 5H4dpO(t!x3ڹlqpx'| Cueb:(k@Nr?OyPban}y\gUsw'}9~OO9#&((8 ar4^Pud.-Ɩ~w^~!;=qxنǝ%adg 'A"C~!WxGG'8Sp"ׇm` LwIܺ!9 >%2bj?|N@g󮁌>*+H } ҇mL؆:&Lpqm3>SQǨ:?~) 7֟G__/z4Ue.f"Ϋ8pu?Oׯb)΀8gd-k097uc`WgTlp@P31:NuwM!Y*28}`.8$F2$@<ǚu= -L $q'p4=>scWT_`VGC>}P~W'PSzwCy﷏E"buPBZ5pr~~'"tS ((8x-1qy6MT3KdT`Ȥ^~eP=p0Ƥy5'TCsMsXa\s^sHsh}FLpt`Z=TD0w޴?4Sc11,"YLgmħ 3j :VaI tG~]>~] /gټvB@gji& w&肽P‹V=Q6ZG#\E{k;_{O\%lmoc}2 K ?9|+􎪟B|$z,w?R "i!NK=>"G6arBwq p]ܻ}-<-50UT k`dc:$.b-bq3]7;K}"2`e8_^_J}٧~G?ӷL,@CژNcwpկ`Xx"y ˌufܼ7que_:cTu%]6P 1&z-Cz1>SK {=gt8IAd8J:d[ :s`www^Z4f 110&$laxކzm=pU4 04%0" nThp1U {[0mZL)ZΰxGWMkkO1kU"Xc1D>'m;L$I/cgp_ZF fCf P`]0Z7ZB &5B{q)9sl5ݸ?O ߁7=x7k/Hf#lQ?A@ķ\ا+: 36$W(3 2.Ţ/rTu1u۝f'#X\(8ڂWh04;;O}?yT)懇8l TqXx qLGXk\Gc:L[#=8 .PoL`QOƨ'c&cUQ510 BD1A@43$!A(s_`PZ:i1mSfS̎ e10h d x0 85hgq{8 #`__ ߄-x;[O^UQ~C{ ~/l? [?*_?Zglk?=yryG|V}2e~JO?1!E,h[`43B3)l6~ۓ5R$֣a2$Zfت*`-[~˨907ar,=:= |3^K4kC[w_d <RT#l 10z5a\ M6D31Zp<I20b6aVgD5T*5*~#y^{`w fP< C= $7+3xc؊>HxXjc UfL8:̚y4m %֣Gk߸`+S{QhCx YUL]Z }j[ c Zl6 J ^& 8DPvn6Fa8gxb08e1B: %K/d"l8;ZC`{%|{u[ދ7o@V})2GOR_#8 Vm \8EE]J$e (llJ!\j[~%-4׮ᰙa[xcW"N,.Ԏ譨 <~ {MjTe=Bd <эa9'v8S4-Z@s1 ηpl]0Fk*&Q 5QW2 DN4Ojk C}VH }A5ۂRIBءuDnjCp?__w wቷ@{~X,s]RJ}ѡ~Wq {C\%c_:&k+ƿ6@s~k'>m9Xckᜐ /= iVPa f6G>cQ8qaE7;cS \6Du{kzFpq_} 2EE%|CϢs8?PPځh/s/W>\CsxdHͬz5:.d`:E!OdʶM/섬|b4tH [ p԰!e}! !n|# G>dxt:3H$+LElͲh@: ;$a /24yN0qܶVzб7qpYc_o>[fCq ^Ip>\ԧA{`ʒ27aڞ֕uV-ϕpcy_#N*:20ڽ!RґA"FҐiub0uc896Y$Aڐ1ň%KO}s & NgCQE@yT\N`aa)d#:Nޓ= @?R׊WB"F$1Mͺr@! *N lH#đu0&:c{4#\Oa _=7=x3O$3^j[ֆ*$s[8T/ן0ocr_&(B@=<;~S0=} B؅hOǕiԯYg $35(0hVjQ#ߐG[F@9 CcZ2@dpNySJ8瓏RbȌdQChCs\B1{LJpf$,dY ir:K@9 t 1dI~9Xq`(F&:},%cg8&XsfwNj[)|e1mZp{/s?7=g^AbD$](8 @r|`cpض G_ї/+ԻރM qW XzoQ?$pya!o \T? "o@(F)Ph3mʧ>,Estg ܶ!Rc-ׇjbQC^.˨)4JPd 8뙡#oC]Ϡ&3B*|`<_wU@ n0mHo3|(=(N$C Y тAdBDP`)8$Ѿ|)CkB+נN^7й0LM*Xv~y%)cy_yr,!ge6AXhAƂ 3\+@[x|7.yTȼm[T=y\]zUG Q|?/Z:wu$ c<<,1۷q/?ol6ԸP#o}{}0d${F^DȈ*搚u/y/qвIZJ }Bs 7F)!0°2=@&l1,Fײ*G^"}9:*+Sx @@1җ3!C q5͜BSdzh )u73GB35z5ـ,oE0/B| QR>zp88<7pW~ēzz;qm߈jsP!aE ms |J@ ޿p_ǵ|7>)ͦ8N2PUۜ>j 䬎WCRk Z!l#Q2 w Tꪒ9]x+!@Ia1s(?H1Pƻux @+;I)$X %qLbirA%c>gS؁3 %edT8(0x[g'S *NP4*d<yi5|:?Gno\=S.<ކvt feDz}В £qS? 8Z@+81=+Oo} we)CLd]6bE}h:o^;$3N!j S*On6B bq8 2ZH{h9%BGeMC`c:o:'-zJpziG0$6({~{' ѵ-P] h>RPu?ǀ7{H!+/j!v& -)R`Qpʷ3@̰…# dc3Du$8zaݳ8{Πa~8ïoSofl 5QI)Fi;C_DZ!*S+Od>x! > 9\5Tu}.{'qA10C@[Ta rc̚&.p&kZ/0G_9#?5`R{F2!PyPi|XA)8#8ʗYS+BM"A dZLe!2 OV!IzvyĚ~roT2hCi?FG&qB(e]m,0m]+-yUa6} |3xo3~z{0|3)OyYJY`H`2K~/P3۷o&oawN11GhVBZjYޡ1RE:m\dsԹ}PSg( Z0*x~zs0mb jE\ rzh٣Pʖ0D5M"gCje޷_@ !u€pU>fLy70e$5A=v{d cR^yHM!+"NPG0ȗZۏj (oEg3_اNx㨆)fS &: mUѶ?[/ ߀~w-xT*Xt [්QI!QW`6ְv.l#&>II ?s7%yДEu @XI*=4R( i _ɂT k1+F6TV ,3j 9QPca]0VhiC%]օ·e[4|Apn8U ^AnKWN.'pm7i&8aދuD"2%!GA/V +KGjY4#XYqPFQGvLIeQ!ALg~]ܼzbs?'?}bC~@1-J9x=8g~wܼ} _[O]d<rGZ;p Qjő͝yFA =`|hv_bRM%%}w&òc]ܽ} 0|ou|òYWY,p\bH8gPΈ>9&x6.ݫqR{k׮c5ۺW5Bm~f*Njt8IL䣬-RfuQ8m iC`%ɱY i~`5:`kP J*cX"X&T7M LUA rw`pdP`i8Hn@Ep tlDO o?vؘh <& @AaG$ OVAA fT(|q:g@4m rQ0pp4]ܹswc.l'Ud8ӟx_9c0;wmB˷JëUb `}-dN3|@-[jh ڹq$ Ae FGAЉ#S`#flpJ5Y^S^50QLiXĤ>Pf;w`+T[F"Y.Q:;cxMb,? gpN6ƠIo'e FkZt<pBx ->0lBr`S7$mnҏN?H&R &D"錍8 Oj.t VBZ BJ0dXyL+;&T(\#8F5jN2gb/%3JR0poE^x6kwwwpMi+;G&p(@!$' P|b5TWpƶ(1f=s 5ܘqֵk޸Í mLƨҙg2R7NTZ]F?Ojj0 @:ޓ tE a 76hZ`^[0 %@T, Zy(Mk-;X6Jb @A ujr&!3m#S,vA@fL1Q2Tq:  K -*20"t\/ʳ$dizJDgk vpmFcl]jXJ 3WE 3eJh}&CtLi{I.}EG)Ad\ {%^5eM\QV$ d(L߃* `=fd@00hb PEQ<aSbw9dQ"wrt0{wݸePd;ըL4'4p7]RhJV2Gu46-6.]w*~ 1M(Gq 1t m\ZaRϳ$ViİN"#vM[`{m oMp]+n)n]8ܾKX5VyM>]/i}Ȩdm~qR#Za;~$+ 'lkz psfb[ICFOR:C/|7rc9D݇4v  .(vCZ nc)L{ƀflQ5-`+,@G ZW6.XZI"5ݯN+/ ?TF8ej늎wJgh{ؽ{JUL`1QFȄG=H:Lt,| @/nwlp1d(8[hZYMfaIxxjIy~(8S 2l:\l%b(><5Y,bmʯ0PUx3q5 ܾvkqJF>4ƒHlL46^q DCa5eмq`ۑ  RD ;fހ('[[6M _W p T:3 xA@[ycj[lv0?2ln\ P m BcZ\akdR EJ&W3MG( τp4cwwvpp.2&@3C2# ! ?VCK,N) wGOijп N*NWٰQxˡƼ|lMd%=#d.3.#f` ;\ݶhÄMu @³Oj5ܜpvwc+=y [R_AG@9 ?%Gć7`ĉ$'m\H,-q(3=OQЈyXU ]<{|`3&DBo/n<02sʀd>dh䀖*=`׀mpzZ|ra?=003Jy@N^~BϽI>!`$5LHWHG 3|ppt{;عsaXpRÎ''e6]nBp@@g8)hYBKz(0:@(v" iZonr x}8gڂ@h0҃*1m( D:{aC1J{C+MpYY(ܻ~G׮T/c}s (L_4"UwFOil$^Ђg!GYai?dI1[@F"WurBPqJ^ס“O^`'6ܑ ]"rTUvƂEuj< iS۰@Ƃb'!cl# 2ڧoa]&Px(njQ%i* c}fLǽpp&XXiUKքK83O5(/M/~I'QKY)'}LV;g5!pn0ʟr(8[\mUH۫S@z"|uQ/aJ҇!'A7fed6k>opֽ]n=]mlՈgD(Bcxa]]x?\4脡HtE 'ua1 c7^l"D4dh<@#6s"j1$JT'0hc'$62L M%"TElj lm7G6ƒXd+QN6a$@`R?5GGd:086@I1 MF$8Mb449v[(S`#kCIUCܑu}m(]pA]_lʆMةK}z;vd0Yۈ20Gq.Pp.l1AХPK[gwI2 *=^KmakMvchV=­{;8wW.crak !*zdm{iU LrxJ<<&y1~GBDן ržgk Ae0H3[ -2zځZNumdW<1q|; 7)\ٵk8t mmnb2D& "*"!LU d|2=,(+}Tàș*h @edtoV4L۠#&%$+o5j!`&f$4 XeB`D_9{owo5M8 L=J}ˆ`l9|)5Q#iIq 9/wRf ޑf. :O`#šp5Vz'Qs6sRp#$jnԦ@Bj yzde=gF( D` vuhxݻؿw{W.auԣ ߂s227HaW/ƘX iy1"! MR@^ËaabA*jZ6`zCZ%$/F 7 Ux7 %+z$!Qc躈]d1b61{pcda66"odL^"MG'Hߓ]JQȌЧmvp79 b#"),3P:(8[)Ȁ& N}Io_CTH,-J)ڏ7?S8D43/|YKqP+k'WFpt#ܻzWqxukO={pZPwl aFPSc sG~f5.,uH2J9 ^p-tP)\-.Rzb8*G,x#[ғ`nAZL01l5񻈚$F˘K0rP%xIQ~*",V,f{W2lVD02V0d OXV~|Vl!̅MiLVɴtOWERӃhMǪFF&%EY8lSBa emIfwgkqq]Lwao4yI61Y|܈ _e쭥hˆ^)vbbO"xJHN  Hrτs /7Ȓx^NNQ"|; KlƸxy;Ë_:܆# xv4BUרJj@rc'[ KFi>W|[}4$.H𧮗qX¨,#84¯ (8p]@q剨gCOѰ 0o^U]qȆdv =)F0%EߺPomn6a;_:'/ll^_?݇@Q0*YXbIa is 3`T`(\Pf/bk*Kk Fk!MB8QħwyG$JSp; 0kZz%LwBT=F0u]۔Sjp;'G9SrG\DIY' &g4^%ӒZVC#~[q3]wՉ?zL?O"1vМ4XT=P@GOy8(ƒ*QG= C:E8L>(et? \UPY<7N9#ܾy3"[[0OMfyB pFTҳ|C#4K "h٫>sx,Ō%C^jۺid~{{xׂ`}s up>ۻhafںRJd~5N{d'u}`(!$@/f:dC&:;QDJc{!8(~A.ueBqPpiTâzs$7ibϓ.]V|X;?[@1ʙʇgK7;MvG5Npu6+n{{|2܄ti)p8 G\YYސc]0\2[(:䤍 Y0;5*QgvQxxh^.!!" O^ #hH9f21!{΁j j v s<ˎC7 CJb[ۃ[w=tT:2/[&n){G@7ESWM&djxk:pgWg:=&f 5`} hG ҺށLdO9cIbt<)umn Zi}#UDT t xFW.B = ص1zz=VQ>2rgs9 $N4B+ũY0nN{"fա0."N_/WXXx8gu._5a0YMgF*rU6'~IM!vhӹݚ4<;BIp,u_5b*${Zkx~21u\vwpB3YC6p!HNY8ǑE&)O1] Qx'JF\̳b4>}8;v02tH1"r-JC_X|6@3opx ?c__G5G%s$'yb2e~ԑc& sP.x@ȧK=^3QФ889샐\й? (8{ׯI6#o |e*i!П-R| DQuJki밡})K9j(nj,WR׸TxK3M9N;= #4#:x>g|FSBkrpH[q=9'w!`H ;{ t=4/eO[@>B TM8ljMԣ毲M$QN,(k*E^#BF M #e@%H5|Ⱥro*3r\z#h!Yu0܈5Pp&_E SCZ49Q-tHCT܆&DS"5Ek20ꤨWyu>c=$r@= }k OZe;n Lg:?}1__׀;`zwԆԵujBGl_H3  b8)qv4iF CՀ[-P[L67`Fcy&A,ͬ$<ޭ"QidnéQ!0iT/tt%"SL{Fqv&)$9،lu Cr(5_rC߬, oZn^ipG5pa<=?1FpPÇv8Nb>~1\ 8n[P]a|axi;ã`v챵Ll0#M44ȝLIgn7Fi) _P,D)yzHY.G@!k0d̂7E 9,IqQ'Aq *YJ/-yw,AdToYkAnIWdsPS5؇T?`SF YNˆ3a偌%NbXHVF'Fk5㕣n!ffcjˀڃCLfS}O&ʾ !9VdL񃼇7`u0w0;:khFU51sP(jM_CphXcK`:=X;$Gq_mgY٥~O!2[@RZ~H`P1`m_٣8g1Z#5Vf$;4^3aLZJAaڟWEk9|oBJ^OuL $:M>t9J+N ~#Z683 lua2|g6;2 T0OVBIwAHZCJ 48TKWPp>;hfpPq˯_.ziM]yuDF̖Fg: J4 ?3Du5s$jW+uhۦJ̀-  [Cq :I,%C@5sZi Q& fqNd/)g}=ܬ)kBSC6ɆQ/NRD`̃Qᙵ kuc7fs\=v0j-&-9 ^AɈA}sDf3h"F@Uc6==|ۂ*o#ت6\7V'bȞtF/|y޽)yOT(Dr|Zϼ1|VD#1բÂ./Bt w*+(8@[[@]JSN#0>Nd# +OqUjӧz `Ã8xg9n !ź֏Cb $Ƞto,M :v졍/,o(cm4`İ,10lmTxn}{Aplmo\˗CM@Jb8 :j}^?=hIN0kk *A.Ƀm,0"7"wbb {e#{-WNoW[H4Gk3zpI+ Y-Oš) hV&[Aq  ow$UQްQb(mCΞ]u}J>Y9}=+-cHg=yZi@U ,h-Xd^0"gW#Ƽ+Gqݽ]`>qfs [}Q$d 7@Uwazn `1l]6kcl"I*7}/ Jwy^˛&AB.ݡ[c9/u@Iv,8%D;PG7[?c4㵵GG\88gMVvci>GvblXJy˶4 t YWbM8N̜<[}X~v:2˓-dOau1sn'F%6/ύ'p̧{nts%.]hfM, ap;7o98`Fk0UU {6!4z ڧ>D B?Z+sJ.vX11z³nLvz>wA]'L̾7BKӣҡn c#7@ykM&,QqWlU_܆X7.!K7`];ts< ǟ]M@r2_! }c2?DjKH ";V5jδ/L7kI&%}APӇTx#*51׋J,d#HR3A]'{e;NC8Ոx/EԁaH$g CBb&p (8?X %h=͔e8hzU$/q:.XM DL`;7y}K6 epd:q>kq!mjlo"]Bq%bUauܙl}6oƝ(?`m #غ z!6QSǡL$C)j{A79 }Mf[Ck$rźf:2YzBP3'8$ᐬW@'9NiMB/^I=H'@pARp)Ġ0!K:0]:zq$T-1 ,my\/5]VH}{yZ}aHV \7/jL7᩵ fW6=mր] Lma>8f& fW,!BT%I|IS'7/ޘ3].eM'~)kL^H"~%/ޟɕ=щ ƥKP^Y_G 8N|d$>1YQa GٮBPl$&kq=Fߛ Y^ FHjiz[(:88F/@E  SIU#iŸ'δD I[qKoŽaqo2k靏1A!WH&8rErU'׆Lʾ]D)HS_UwRg ܃aW,=9\ 2t:Ek.AA٢C#\y|(C`tҥAU%Z<%#> \;[ϽwjQlPd Ktk&l'=ۓ1mGgg\6 r!S!*1{0Go1l'Dq֐`})$' Ofѫ+W@/)kHyLWg%] 8'SM'܆Y㸧 i#YΝ(߮Gd#-q@466J|FE!݇_<ӲA/B d4Tdj}Y]Z T4⑟1R@5~~aԐ${mKG ec9t)wZ[Cf4.s# MK9@!vP1%9 ;pQqƈ#gw RqٕJP X^b$^emyUu^,2NԌe#M~)o#fEAhEx)  U %Pp.lmc !UNL@2 , D^JJ1Qt \Қn7;)csTMvh">-ƾ|}]6ap^JaZb.)g_༦1MHvF%pE0Ef&r{vԅ)>}? ݬ\ ?R?zXz.O8mG?KPEe}~ee T2@x{3^も@q q$:x+S?KR9>SaE(F'#g|U'CV5 4]O'? H&ell# ;d4:פ_讣*RfR khL%6fD99}ڹ^PM4FH_hޛH[XaD ٵIv^GuݨnC;T^cH[,ZH(ӟ)|NAIܦgy!PsAnoYyC8S=:8Eb1kޭa%կi}h2! p0ف_f'f;mMQf6%θy1@M#^2hژҧ#eȮɽu2`Hr@-ê dwLioRhFwzU> }h*8~/),~eCy%:^6xM>: (8h^ΊDY04FH(ԐYB_ mO7gde-+FR7 `c6G|W_&JѹFƄ|~4.2$yZ /HvR1@$PR!Ȧ뫜 J:g5yi%H*E7+c;قxeyIJq#O zw4W"jVߧdt~8g%%C(u`RAyG€˕J+S+BYEǁR *3|_,D+w@Cv  \AkhAc1w%Av%}G@FxB}:LOk̈NDQV[wn9'V6(O?\?#iRszG/0J-~ⱶ g}88k*Cڏ_d:t]6.׸ t,T8Ftȷ-Ri;Җ$œU.c"}Wy$5Ng'ɅYPP2 y7GO~EVh>5ZCDCP "vg,)z4{10QW6BV:.Q'3>|򬇖/8}/6㗦++Ũ@'CG\BuN>'Y_w,<- HK4cs 8L[Fq TkcFz3v) fO1o|ә1 JĽrRʔy @>vDlTBXigT?CqP#!^隦znRZ`wX{ۀTqrY Dܑ_S=5Hh߿Q)m(2~ʩt< n'Gv?sW"^}N3Uz2BAy88t267a:ψsA3yJh U@Jݒֳ:'qr:N9@2T('QEhzY!^*` Ifsa%e'Ɂ0 3$ 6# :Ryw9~{4eLeD+qO_))dO%ccSڄȤWîM0!2 P<.jI q)+?H#퀆)ӣlXiŶLPTE7wR9h@iyN;ZCc X wU:IFy55H%XJ[~@&ʮw^w sě<^~|ts!CicQƔxrC#K!JR"mN"ַ/`4wтFq lmZyjtp:`՚!W; 4ͱdpS{Y*;{ +sMzO.FNP:?T C*EqƈҾއj8i `v`1~L1/I{WE3@1| F$`8 e`p),{I{/<&+H2gs$X?Wâit|KIX@fµ%zI Pn_I0ȐR}աܟObFȣtoE.@ՈwF t*G/;{YU?$t 8*ēyɅ 褐;Kޞ|n"puzsuk5L ekw6Q<(Bt=$G-%NwcPAy8uaƓ`@Hg \Yd&D&jGI6&܀4F>l)ـY$ndѦRTwN##g9GȵS~ E`Ai*!K"S#m.mR0ˁ9nԚvoC6N1}R!oe 4(0S_7vy39-)S|P]rL|eI8⠕-Pw^("5U'<Kqe`5K<|LeB{ބCj7nVR IgxluִE~>?IiS%,>.Ģ({՚?1aH$)j煞\(Is zDt~7(E؜aFJd48Is`<@΄:F 0C:|BbBd{3t6e'dَXOϷ!2c JvZq[}}~v2 =^qU({=Q^Q~b+Y"/u\5Ս9ɔ. *͋:]Ay8Mc n:'9sNڴY\K!`d<#isN~^e ^*̆)9}2d5]ߤѝ@b ]v\Pҹ2!W9XȤ;ŇH U(?) Wރt[RcJt u 6e@C@q jx7К" Q)Q}BU>aL'hNk/d|Mf)NҦivݲ1|_OhtHʟ%,dԲ:JCb &<֤%lA4x@AwgBLk~ٿ02x =AXМi,S됺y/Z buPYdb6yn /!\+"d-^܄g1 72㊤ؙ7$rϳ(lBt]t"ZH.,-DRӽǽE,9dVHsx|mmH )ϜsC4ºp j?3]kϡ# QX ]}Fzy`$`3{ SҚ2FO)p9"pw LTӼEcGȈ<֕ ^9c? I‰CUkwFYUNOX[J]J|S I'e]%G_CZ231oZ8@(X"8k};h} d L+HڜAFw:v$Szѥ`v2]Zdz)goDdڌ5DudOހ\h 2mg=(7jB)kܘQ@iS!m dS!EQVO];m}F^]'hB} Vilo6ʼё6igdX.FTg :/LG f[$0^s@)GAh Ld?&܉".-wYts44P6Z8(H]l-É H0# i cYiO4$LN$Nɀ磒2X6ː!^/`01*dL#Pp~a/\91FSGh*&&}a6(:~-{mSvxI:!JQ+(;M.9U.G+$=6g>99N3h@KnaWy໾]}RI-amqSZC`c30`,C!&A;iI pd&E&43O}1sNf.k.U-$U֫Uo^w <ZD$?diT X< aviGxG;'LX#N-EFSqgJ$ 2(s*#Qp:F"W]M'R;H4Ud fUA?P$?NNhar !fG3l8D8pP+/MLAXlf #ҿ ޖ`FY`LԕodTBGDzzLn7c1DRzL2NR'"J"O>XIdh +i ^v/w"`ޮQfy!>OyG pmz`[;҅]{֯}Vx. zdD,5Z[ Kv)ه;V<ۦ1R z|>BbӑXԴOGenO}HRMC"Zj7YϞuHz[ʛ%h`2F` š _4 #~T'~񞴘V= B|?xF"s.`9i Wwԗmcoivii7ٝ# vNm͜Dy}t~Rzx -RR tP¾7(vv>`UaM54r!΀e8ԹE@M3oo8YpffAAs='8t}ޚj<[9@=EՉ*g5&On: Lqr cxb)86R@ΔyYjm褙 IkA/A:䩂".8oAoXDr:v8BaQ@ag&bZ5JwRI/ ,oS}`ujJ>D< W_HݦŞZ=4|#@_KJN~GÄ́T|'#E6y)]vPDz#IZ6.EHa^ؿ OC ߿4΀7;6O]X'3Z'⤎S$-$>; cO)*2X>p+O8,4"3⟻g>?w#ibKsUM8kpaQ@aW?i(+!5 &ݮPڜ͞21Idf|piZ~V~3dGi͡`m 0 ^w7LD8 Y GJ: $1\"]=7va?}{Z<^_ dy6z&('A\o&$g*[|}Ou+(ztýo$==Hucuuhߊ(q,1x]>S)y4)' k,OMOctJip3[9-2ג%y]cSy~WJd4AjCE٠(H2~tn1԰zXâbj}(yz@Y$HlO%}P[T$k$Ax!`_!љǚZOs ͜YsV.au,8++Pdvq<B#șsq#9dKls]ɸy5]Kf#PKx00P~8+PY-K6d|x!_pr{xp}OeȜ.oW.c%"cn,ύԾ%rJ;a0,^*vv&BӎjLZX4p4 7M.DC}RK.P }q=0ȘK`'(`;Cf)r}""cxCSՃn=n7q2I>#-(?+12mUHDz+ND ac!`|cA8x4 F9]&(J} UY"m >=h9?&ĉXuV1l,M;SX_dߥxcaLz4YHsy]sӵF",uNLpr˟vi<Œ}tBr %t9>{ZkcF1QhަJF? Y1iœH}wɆT` r ;{MX]"k#s7{)M"`TŷyvdaͯKcz H0 f3@X(dM¸|Zri:ѩ>²_~y}r=%2G`I<\:1)x9] N(=p ?Ks[IJ9"wJ̈11F>33>ץPx*Q@aR"oҙR_m"k4> /e ( 4IM']`o՝f`N L͇e3!U:+!j,.Il7zZ`dG3Ⲣ݌-K)cTZܮr>.9j.7]L XA&dU#"V-}Q`&%8(9q ݵA rnClĩܓYű ts>BDߺơ9^WKG%VFu$Ul󑏙oc-0M ]ɒXم,ؽd ȹ"%%g#G蛎h,Lr6]:xl;7ݴ ;r iJhSc# |#F5tt-4} pm[闷OGb 6=/&2bdH<R`x_k͚r2qo* zz:D,k]HFjy][>@3{f>8 ;&d yKJ=NCާ~>i qyU'f4>XEPyvc.%503!xtZPWeF?z ܜn9g3S͙gϵ_" El@~?fmS1D>U0'"gn9V^Zw,ȃ~2oީ,տ>91}HD']/#څȎ]82<: ~?wsrpHZ=  ǎCҀ Զ7>"I{@,,xamuI:U_kcmS6?7U6#ؕu>ƒlH [IRXRק.=JR=r%&; Y ػ%7KZ': MfMz8U,D8YJ)6 9g)aAetڹ.s8*x XQ o r O^G_khtv"3/[q)XV|V>0&t@1rLp'֥Z=eP3bP,hE'`(#yNi9 _c[K0lC]C WMHr9m~_1-9f ?FvYbMsҽ鎡7w|{E"&Kz3E( xk]4,{3+cHwiMň2X]*㠒FFS##KB]Qc>YPȍ S#^n _wb|rwN`D=;qe%Qb,sJpiEV;c܃)bז>Poc7h (f+#$*( 4~|h?lo0jX5u0z2] W;҆e 봈ٳ 萎jڙ@9f3[L8rTo!;Q b)=jD|C;(FŎ8|iuVRQp4: Kß:R`DA'>`Q0f|#h((*h~fyOZUQa;}jv{]h_k39  -&#Չݙ@SHvؘ_ tv%6_QC6G9mƦw(3>fA {!8dÝ *SaYH_͟`K>]4䚺 3cKÝ }V+ YVdnB)aM7(®Mp0F@Ĵjj'gH&me ~@0ҷ]11x\'@XСkh:MjiY2Vit7AS~Cr|,pW=D!64ofҖs|VIa 1c#Ό~e/% } ΓYuS[2Y=?n:}PMPkIapMe,BHl]vbzǑt7%ԛd8H/!}og|ffgT}w1 i-jp`,پbD.4 J]4lљ7wd2!!<"N?; uY\,J3<>iP(&֮7CI@w8hC ZhCNCԙ$8.nN@4u20iFET(x[3CA&|QC~V(ڰ 4@=03` 6ׄޔ6ʃ,NNS5:"Z\Oҫ$!UkivNlV)_!Hq-׏!E54p,,E {KF9sKs 9?k/qT-4Rm{o .lrH!fTf2I|oO-"5 pP%G057>K:: zhGHxfvA_ƴ0V]0Ǭ5v.#8,=Sm2e^w?2mGShܜ,Ǯ׼ HAPԿmF|E X en686OȞB]n*CFhQ ޝϘ"i)":1I%>owpB5:|s O5*PuLǎc޷U/М18M'2\3{{hTؑeC$.- .@4n%͈76#L^o '۽/x8bndz=}ZYVn2k렰n+9QCU|; 9KÚ3nu~ ^V^ѴɛCU2h- 7/?BaQ@aAǎb5Ix,bj2]+}@zUwVDZzƘXn!<+B9ܻD٨!{vXp8PeEfȘ(m-W*H܏OX#^x֞dtCZ`#j_K ;瞽0F:XnSF ">Dvge"r:F2M~`,ܡv 7k3KK 9c)yN{tT=XNM=CyZB7a;ȧ$̸]4d Gj`aQ6Q=OSѧ ojgfh`0"R$nQߠw7&cno84FMn*J$و5#/ڱ!#c@ɐH ÔڒX9H\F*lqp7'_Ģs6~hC^%"ByH79""I3k@a݄䲹wfc 7.SI[omjLZ d]H_`Ĉtcٞ FHN@##r+ D#H Pφ3 zFࠃy}6j)+-4%yH30RJjLNGCvF> V~hy ~]\BԧgO"MFJLa%j+'&ZǁTL3pӱ#8Jn®="}"̈4?ϨМedm{,ܹ2,m{7j=^C@FY0]/ y!u;KzܘDjiL#̛ GW@WFkmc]jE`7aY ly(=+Oxd:Hr`A3 U|A9,*h;Oja>189V|®!7uj[s]w؀qR,`Lr [D,sD`i-2&&t?BhxIP"K`Jwݴ$${maD߃^gE6"jҖGџω i0R ~dN/ghYJ4)8Mumx )`N| 2^$.Cn5C;:j;ImEtE'"W:tt,F F9]M;[o4#,JRbkq5k .э\>"!"|ὂFM0puya2O!@sLx_.ZSC4$Rc )D<7S0 //*Ί[|Y"}- 'jͽk2vFhә#:A2X$]A~rF,e5(0"u0{DW$fwƪGOSsFM&cE='ei{l%i=C3Kizr>V#vE8w2XNYLYA#+H@5TN׈7Ul AIyQ3%vnVIsM3]mb#}<[24/ǝ9 M_kЛ5ɛ2!D6P9>MG(\PU v51PmZo>\/41E+ay if1Ζ$qmkߓ 1b[I@|P17)qCO@qk.# HU܈-<fF3\;n<[F uB/HN4ra!/J29m$rWBsK$g+P5Z0c%GV`畍JX?zt=Y((*Gq}10snjYIu<'~}0-ͤSu4#O*ᐴ]RiK ӝ(Fn#uDSk_s%-`@ߙ )tFE&w2y=vhb0cbnJ/To* 8EiI!ԃ6:YYBLP6Ҟek32b&)#ty! e;d#6`[u-v [rkƵ2+H{WugR[wX?;[:ل`܀s8wϩ5m< REbdS3DX4I!X #G'CV3FD1sz׀Bo`u4!'t2$YdBV498DF@ (v{RUD}oIk]h4j:q#(U#غƖ& ))MԦ:Zvurjuo!xӜ5hBNg8'uaB D`{ DVU"zD~-slI,7xDמ>g>R]Bs*@ F).l!Of/w w,fcKyS{#⮙ׇP-T0v.3ꝦѠARsE/w֖+$4ZF͟ϲ,En=x2[6]LG6:lfGp8c.C9mTmȉ1Rzi |ʏ 6L\{YXIi:qIkm)( ͣ~څeU5)èydΈ]Ok]LϯA⒐ tp r БuIFΝh0KVw~L(H)\#vvܮ?SyـpG܉xQJ02c)9My1x9>+ou~/dJw (/?YAE"!=k1$=Yg4RLZ@O)sg;b+d։S{D䰐~FoOW{2Yj?{$؝В.\-PU؃{#6D]6\g5O|3CuV!B*bRgh@ #qoy"!f9NDj7c.D4Yl;KAyQOz8=]ֳ A MHZ_)4 hh˸aB%4;`/gvPr.8:h 2ws1¤%{oM!YsAG 6KC 㡯23cգL$I3$M!|g]-eai Daxܨʎݸ%s9# A~t_f;܅W -nl?ؖ4^^L,UO"lw9qBS/IF>;BK;`]f=kX 2P.8|0֏W (X;~ bgUכ:a[O Xuوw]g/k5FC$#̠wŒ~dqd.$ʍp18tp + rZ BkMTXfik ] 5hG]gCt}fY3҇woJl;ܔdf#V'/z~&r@Z*hu66:,F7 jh-]j2ϕSZjݢ`;_auyNoaǻ":DQH̉ AqS`-X% @6HId Ç1MSV(<~PupߡC5 -~MݦѩיYXL31dq{9=UF`acg.&|'wvaHjzg5Rި)"P{-FDCIm-%wB`4ruKZ v1@fIҶyR^k8;阾\/&a}Yـ䣽Q(!?jrHi6AE itORa'"7;/JF9D>y#GnLyH}K5]~Nsr-yѾ-PPZ`xf bg5d@)-0rh1Q0sQ:;%E/58_KVhPb[d4wm[u&tQハ^'3:D:VK <;.l6@ #vh' XhIʒg#1*(v vw"~{"Eݦ}6zu"r#x,?0q:/h{`&ק٭aͺU$iҳS@Bhـ<;@ި|X]qX+@y`&Q.$a@g3v͜crQ9rF91}k uwaEFڽ`mCLGV ~ϩ|1>k{ɳ1p5pP@a܂y~UT^q%=`Pڽ:ԀwwߚZ۴} %%;y_6-O{zg(pp[DظRr̳D+X{+5#uъ'V}M-8mQܺ?sa6(S#0{Kf985,,G켺È# (EmIȖ2'*Q '[lsVsa^9E/ڎtM8%e 54Ӟy;7V(<(>a㒦t{]+0uډdxLj;6@ f X3'gևdiqۮEHlQ3vn9 ]ڔuUs^!i$hf?+@- JUCޣ2?M1ZLIwg8(("Z/o=΄}6η_9 p 㾈sY~Yf8b[T (Їc$kkb xkZem4edAco V6f&%T<-%: JfADbX1Җr>pXv#$oEߎ |di"C\;AF0#ѱz1sܻn5;YM^ىYF%ޕ3yK]ZžsyU7O 5ޝ;Vb.D3}9M aDm㥯y-׾9*@ Wff|ɫ_ދO-sgI >mд Ѿ%ؓՓHWP>kXLI jJ&F3茕2&vɂ-paPeFtwioŵ,W:| l "GrlNO O^JjZ= W(\5Jϫn>v wK f3V% IV3ID!3z&LoQ#HT5>WE>2=1Wmcd"w3M+-Xb ن:VCa͍tZ :XaHᆴ(^GK ib[u,(ޓ %a2A&$Gsw>Əf04%I6c&-SqA'c&ַ}}_WzIjmuO=hw/ ~#}`&,G@I tvhk Lsb`:О&#N<]5N);\hh]I="pbnh[d= #f>^Wq|9)Q`^Lk-ۺ XQ>YRf'K~B#'nkDrg_/$ՒG3Mh57_֟qΓ*/\[ @4aEDF|'>oN쇐H2wC+5ٮD:I#7MKψיd[&TAqSYh(_5mB`z[ "hfሃgin}YCVM"F4$.j_ľ"mx Ɵ[h.T5RZKFcܩ  T}er|Иymߏ_/gg[xEѩ<(J)>GAiMIK8E7GRE*6%k{O~zf󌵵9;Z&1+/})^o _|?ejX"0cf 2Vc۴=}ҖȬI Fd}t7a!ܢ^ے'"TFvHMI}&Oߒ.`"fqVϗ "s }ڱ)_ί\Ve ChHY3:]a< ҼFE4Y Aʑ1 XaC:S9Ɨ%"_~ **PfZF|'7}'rj?K2Y33E2] !iJUqoڽ!hC+W,taSr"ft%ST#zGS# oYSҝ!r:Q 9݉N̈Yx`w waՇhӝR,K1Sx@TVK2DBJF؛;5guVrՕg{q[??|K^yW.P@G. U_c N$P.%HKe5]@9` Rʳj x;g΀F9gڬpWa "{ ?e~QԿpERraZEK"͞9|.ȣYւq²n(?@#~(^tzCh ~V%&n oC{Gy4M%S.P.jPk /G~,ipۇ C6vBz=/fG+G@J1KܗHiRp}N~)Ӷgq~C>Mh;Ok^2/8(׵pcY_/e{3>Ӏ]R̤u@jf Dw2YLax|ؐ"ݡǀ=Rd17̂jZ$ R=8Rf}F/9pIdm.i{N,q#L)$d=AEܙñ 1%I@> X;!w>y*_P@,p{~^U j"l0{]u۴EmE` 5jBe]bob;%IDATE$ѶH{٘c[Ǫ Mnnm[i~'9YmĎurkc;uSkn vZ"}t0@>Ɨ&K_j=o{&u.+_Pwsᆃ6TA5o1}" ,?olI` F3v|e!*c'|mc*tM@tF(:UmdGMHZl{n'M,6X@4劼?1*iH ?i i_|}sOo 7"(ܐX;~/.훰 Xq(LH{IfYYx̪9aKk] :*\>z$e6FB&è lNT! 0TVx`]X䥋]r bcGWLY12\ɑȤHKGK8M~4)hqt[Cz0nh7ߌ˾ ``L*D@ Ę,`%klR7͸&sTtS1V?5|5t u(O -Mu> X^yk*ﻰ{9v ]T.$l:̃ÏtRqsnicoCf6/eQ5G__=q:j%d 78/ LkkV8qx~w// Шy55:yD?3,^107isUW]!-򴔴GMQpx>zQLY``y|f"hk2Z-Fò5};\|FEg,2mpGs" y(CF 5Q!zBÑTD=%/sd́!U[cRt,?| 0dP$lP&u޷C?W]/YPseG5z'?:p@Xk-+t1]hr| H,S)"U.#hH݈չb M#=H:wq\!hgi2 F$-[D꣜JVDJ0bnM~RĞG 7C|l-E `wx+>|;pJ4/Y e;^7~7e쳟] 4awܢ[`յUmRm-Hgы̯Hs4ӳ@C oj0BGAmxPZ" KV]A%5[TA0䎀 3Y?? ~%^_\B8eo>>X nJ(_P اa/?v[Z%A~v6:G M޸'bfL[t= A3<ə[ 8(72$@0wD^ߏ|xݷ}[ r eGUO7 D X6c"&tHJ3p6MK3P[ rtٶA==9+ m 8}P'Y"+4u,Rdn҄4bN+%92MGGE_?#;VBaK(rY9/|>/0O: _TE>Pf A]\(W#*f {-ddYqѲ4dHt{--#^>fb9@u~W dw4 :_~/~ww~bJ ["J "d_O2S9^6!z _̘4-NMֶ~zGa A>nTe3-d"SQ9/u~KC{ ~]89Fi>e΢6|ԊHhx׾xˏ(n fTP,]Kh럷Ed)֓ plAs,ѷ6B߿eiX?eE Z "#܅)>!nV+$| @ƅ瀕<9/|s?QOr| ,xC52~emkzG'Bc`KSD4K>H;0!7 ú'8]mIJ7ubJ;1CT` AIq e;;Z? | gQE@e ] _Wx};8}h}4'ur2;t#Za-hyat-{_~(歌Ҽ}@C 9,yNM.z{ϩU1i`V7+]'?o{Q mR mhY`!O>g Bd 33{`n쑤mOL> 9mYpe^c[HQ=GϤM٢}-s$cAC .ÐJ!#H㽿o_vmXVUP(r|_>Aw @k Q,#h{K򾚢!A6Epn!4ww&R?<`m|2C`.@ l,Ss? 1#IPy"kK$}܌{?C)=Ba(PxX|+_g~XW236D8+R^>wW dv0;uLsY{UՇ(X֏o| Df!lf\GZHj_3k:?gl]j*W՝d *_(<BIbYx~CXЉƚ du-C\$(ϓF,jX&`V>K:}1ޘTG'"z7&*I{VFԾݛ5@wPqtȖm`~ZS?'/}xp J O OrYz~/WgOČ55`\g5& bva~3vnTdh>Ly~16{"^:fVc@fU"}HD2Qr.2Ǜ~/>QQ(<5(Px }q_~~'>s쇪( w!q =~ 1蹖u  MiϘ]~>v:(Iѹ3B50M'AFֿ5PBGE ;43?|uŷrg_uAb>Br!Q^0AHi Sk1q6 >Ϭt(PAi|&##e_4&d7e0Ft25}f%3b[z?`fmd5l(dAFl|֒Cd/,MxO Cڗ.Ba, k]ǰ߈|DxN:dggkFi0c`J&QAL*u``%Cyfˆl m0[O?K{-ޯi*_("꯬P%@k /{{ވ5y:.sSjt;p Pgc!Nq LD-J*̤|.dX !`>yxo}BOopuQ@p `JOV?w~ hZ@C玍֔ر+",L/`?7IVf>5}湓] &wַ=|zd;_(\3(PF, |K^K/|c&wU4D{۟:;IA؏VB0йU,HFZDj/xO馛*_(\BP`W?}?ރaː:6w`UNu"` aI}4Z'+7&.*/=] =!YI>Yxo:~ĉϫtp B4M"Z)|CL3Mc61+ʁ zߪ5%{.g~9IЇ?'wUB:@95imMyKkOq` "cj~2iP/ fm* =f@|o}Ǐȑ#/_hp=h( |7wx|j"'|YeWrI}+f^QLv ܕ?L:D L }__E/3P(\Gex}?c+<XxVN7HRl;1&035Pg wo~xͷ~K  !;~,^!&㯔AG`Њ6/ eV`/ï?1;YB:G )H]U߈{?CBk ,vA& M-c7~;/J 7(sր0V8x ^#opWc b7`zl0cCe|-` glo;oŇ>b 7(nXY`^=_7EXJbƆaBz/ otp YM㯾ex˃ϟ~k:'@+6@& ̸sq~;Ƌ%ji*_(_yG_E/y2A BP؃(P( =r BP؃(P( =r BP؃(P( =r BP؃(P( =r BP؃(P( =&j*ZzťKCGpҥ|:.}.NN>o1OuFu| E9uK.=a >}q)oߟ?ԧp@l_pgk|2k{SN W  uΜ9ڗhΜ9O%W A9uN8"X#p}m}.\QQBjB:G>mmm{-'O{ P@pŋ{*Vr >බ?}t y }v :(l7#| [{/^,ѥ r k<ȶϧO〵2nn$P(\n_=~lZPp#Bv >7N:. .T7@A95K.m+P2@M ,((P]cs_%_wخO}j/PxJP@p c}s;l}3K.P(\n2v9Ofsp-BƧ?ǽz>AlmH 0cl?ql'sR@FA95J?qly*@FA9Baϣ'r BP؃(P(*nP(\Njz;W؋(P黃XQP@p ci<1lWoPP@p cƦO )>|j/PxJP@p c:5~*nP(\.Fn%nwz`pB՜?xv'NpàBǝwty䑫 ۹^, k 8r.… *lwtpp-Bɓ'v><Ο?}]ࡇzۮWpCB:]wݵxk/^ܖpԩn(P(\8uԶx"Ξ={}McgNXpB:m݆ӧOo=ΝV#l+q/p(PNpwo;qo=s^vB::msv|}.]ٳgix{޳9s Bqi?~ۭ~gϞ׿)oeV' ۞U(\(Pp=ŋۖӧOԩSOԧ>|#׼s:q^ ;r mر'Oۙaz߽m{@z-;bfŋqp5/4dGyIF{KpCB:m݆wZw)(`pn+Cc}}iaϠB:"=y3};WV7ўQ B:Vz~orW2˯BP(\xSj(} BcL׆~}_K} Q_~ _bˌ}P( OYl_3$_A\{ (`VqBP(Wr fs ڈÕ9B`+%e`('}=vCW_( ;+uhV/'@Qf,׬oKP(*.U-P@`c+hv[ SZ@9rK5~%_N@P(<5JJN1%|{FDK_P(-lYؚWN@P( }wϣW,_\FBPxj2e،e;n*QP(v|.gr YfBP( V@9O&@P(<9!!s]BP(^@P( G9BP(AP( D9BP(AP( D9BP(AP( D9BP(AP( D9BP(AP( D9BP(AP( /̆y%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+=tEXticc:copyrightCopyright 2007 Apple Inc., all rights reserved.f)#tEXticc:descriptionGeneric RGB Profile8$tEXticc:manufacturerGeneric RGB Profile=h>tEXticc:modelGeneric RGB ProfileoIENDB`leocad-25.09/tools/icon/64x64/000077500000000000000000000000001505543434300156515ustar00rootroot00000000000000leocad-25.09/tools/icon/64x64/apps/000077500000000000000000000000001505543434300166145ustar00rootroot00000000000000leocad-25.09/tools/icon/64x64/apps/leocad.png000066400000000000000000000126551505543434300205620ustar00rootroot00000000000000PNG  IHDR@@iqgAMA a cHRMz&u0`:pQ<bKGDIDATx͛]$u[5$ESdCɊ^#^x1t<$Wo5ȾzEvUR ϝ8WGj5vO>s;//l~9c9 AAYʄ"|?8_G>rPOC}g7/翟PJf#E UL+z2V5J?~_}~EuSWγ$f^[W֮u;~˗ߗ79ȹ9i|E}-sUmޛAp"?/Ξ;7sw^ XΎ* b"LDLELU$g Mܹ)Ct7 -屇 \{d?~3Ϝ|ŷm>~EGw괗w}b/RR;;'7UfScv7r*{~oj`4ه~- !r<8+ހ5u$fexݝ]ffěYP&̀cgsu0vbm=r֑/(lzp̙/ W: B%wB?}3_ Iàg4%RC3!lzWet |x 魍P,qp0IʔX8{SQl&rњs G3bA4^r?[ WV go7VU S3Ӕ)%9{qʊ_UN2PaN7ZC*'&gZb,.ʁ`6c| h Nw{fY0(4A Ad\q&.juI^X/GkCHWXF< qUI+(7]L<XBOU%& 93ɉl,LcL}f@e"D)A= K,`{~`\x_53o>Lw8pmDŝ 9LPaEb81ʉwg2Ӝ3uzf6+ML3̀<5C)DGM**܌pukK_ymZ6F{']\eզF)lJï_+qswnl0csr;pJlIeB*''J**KTg3a"N)1Vg( 8(TРR%wv~ {;xj vtg2hp WVlGk֡7*!0UgR0N3b!ԹSEMHDP@/B߅ UB6*M]A0ÓA1q#U[ 9le^8;΢'Q D2%rU3:@nI$ԉHUj0TkS5cgoWE)F#zC < UG˛_ئBCHh(r gF/K"ߎ˧2;}4"`ubњM{a #8jp4Lk q8dv&2;BFȠfo ȶ.dsu%'@lE^so]+|7uLLQ,}<9떓jVzB {>ƫ)/&Rn,K5|8h#kԀł{PڢF;˜KJcҽO>=N}4]eèuD"@ֹZθTNyLl-pT"LHhi & Eq Ӳ}rv#du3lu=ĚJ]:1CrpĽ!M˒Kd)h="{ R^nV[ש+;7´!sLasW>).5U=mundu^Oܑ*yFDnZunkyLE; rB "Q\!a~.#^%V"IQ9;u&m|037UѰOTsU9Nb^s84AeTH/1o`/ǚx .-d t|CD2o[}:ngnAo )vW:IA ݩjTUrN6e1ħ6-?܊Y֎gjUTX/<ሊx#,LW2 f;c⎥y R ĵz..zSyo*՘Aqj?ɉ Z?::Hʛ4۩]] WW:ΓҬ:~m.6ǩ-701tt4v?@$=]P>LaVo7laBcQ{ե/iȁmDG&?\yE;|9ێFLj\.d3ww?Rڒ%lSor`큾 \ DM/^%NnvwP۰^ @[6M xfq, B f5mE߄Xa"d84.r gJ"Tv\&C!Mlubu%}!퀰u:GU:b[X @[͢nV(%mQvqkh1my:@/pcሤ[Hy@_䂐79s#Y@ln7AcH'5o: .\uٚP1jfq]7NilӱP:@)]I^or&jK͕uhsGixkqZGiW]hfn熆lP&PSl\ h+ 6Q7YĜ]57M uH3Qi&Iw8aCW-޽ 4h7INXaI9HQUm^ @ uj)Հg☊5Y0t++lb_߫*{Ah'nh)z[kL@@`\z]%},yg"Uʕ!W.ʒŁ'Q\*Bѕ]uwzi7@ڣ0mώ'?jL2sD]Ed"{9ݔlnF̿!3 >?|B +szX =Qj7B@5B}t7 uG$gwʜr ^ WXnvGtk#LA^A (j!lI CgkWxJٓ8.")\RJxp;["TCXjrG]{s7Ui7;uDx>e6*ہ2ULi<誺S_g"urӕݐY0;wχ6[e OUQMЄ*|~Vraקȼf>9<7ʜSK)WO5 @;,'rϿ z6bkCt%._(g\rRتd^ATrNr7 s\P2Q|@u+<"}nw>59ߏwf*sר&*mN.eyS*gYdg2~{h=ݷO;?L^E$ĨN@ D/I`ɫ Y]ʔRrBիS'u޴hX)Oz|XS.sD) G|YUYUC15g?W_&jmIM`C| s;}Ƚ rLL\ }ь+f`)e4HA_5Eݗ۶|;,=g~b# ?~=fe=lY_ֵO5@;B}%߽};[׿_*w+sx綪8ߩ>ys_xv>'g:%tEXtdate:create2019-02-28T11:19:20+01:00%tEXtdate:modify2019-02-28T11:19:20+01:00O+IENDB`leocad-25.09/tools/icon/64x64/mimetypes/000077500000000000000000000000001505543434300176655ustar00rootroot00000000000000leocad-25.09/tools/icon/64x64/mimetypes/application-vnd.leocad.png000066400000000000000000000065551505543434300247240ustar00rootroot00000000000000PNG  IHDR@@iqgAMA a cHRMz%u0`:o_FbKGD pHYs   oIDATx]UvVUUwò؆eCLdM:]^E"6;J~lb$^"񇜗$KiW H^YPvc=<3=3=]uCUx</]uv=?Q\ "bXgW10 ڀuc1b700>ccc4 * QQV8pΝ;7^+ K}V\;0$IB$J%֮]KRa֭8pg}7n:18A!atObjja*-{?7j$?eL1 v;mD@hF|ڵHFJ%(ZKZs\g&i%c{m/'|ep]às>c?9ə.M,s:@af?8͹^'~,LbHV̜\N9}C*_z |_1_@;}Z"Sbg)Ύcub/~%0P(PJ8NC%B8h4P+O*g Nb .4UXO>OgW,tّ.6V9x#'8*mBq=PKT!nDeG:$.e<ΜG2::J_#6ck<"\e}a̬h&etks"̴ZZBL?}WמcncS*KX,a1gAJ s|)#os(ʉY8;9ALfb:n1 ;/)%I>B_ߥI;w#{5IW$ _YsWOɳ>g}}: k}afv&N qX%B_CLsv|SAXvM$e ѭp%|S.aKenz&.r>ysII]8krViNL2uay~H(VNI% V 8PV4mWh.-0/Tê"~T* &PKi*(_.#ssS,OV/jmǜg98b<=9Io΢'@+WJ^VE \h:9Gh|_Z |cPhVXEX*Q(g.֞^+7~E/D\J , bxfy (T*m,{LI Ap!ԥN8$:fK2+Y|%3,8nJg31A00b08ۙ;\j 3@u0-FF 2 g˯SRK%ڕvZEO^օZKi8xyv\!*I"L1v]nE 5QTp"Ġ.Ǽ%rE;@)/I a%mtuY.-*;U QOUz=#K|uH 8o`FV~Dwi=  +f?Ð粃=,k;Ɠ1 1M4& >fpv$<<@X&AS>rt+BEq@zr/%J@>!"p!#'hJB NUgPYs8Ŕ) C>)RIuQ >B/]5: T2|=7܉+xT ^Sf\ XR s$l/ FPqY|pX*1X,T#[?s-;'4fy1'mg*4cM4s)$֒8ŪŹtش(@6Sb`Yf1wM;FuvK!9G}f:t3? }##R2 D5EA9:J_g=:e EO=KWeccT워:K*M"-M]Z:K!FCSKZn[ leocad-25.09/tools/icon/scalable/mimetypes/000077500000000000000000000000001505543434300206405ustar00rootroot00000000000000leocad-25.09/tools/icon/scalable/mimetypes/application-vnd.leocad.svg000066400000000000000000000056101505543434300257010ustar00rootroot00000000000000 leocad-25.09/tools/setup/000077500000000000000000000000001505543434300152665ustar00rootroot00000000000000leocad-25.09/tools/setup/AppRun000066400000000000000000000021701505543434300164160ustar00rootroot00000000000000#!/bin/bash -e HERE="$(dirname "$(readlink -f "${0}")")" # Find the system certificates location # https://gitlab.com/probono/platformissues/blob/master/README.md#certificates possible_locations=( "/etc/ssl/certs/ca-certificates.crt" # Debian/Ubuntu/Gentoo etc. "/etc/pki/tls/certs/ca-bundle.crt" # Fedora/RHEL "/etc/ssl/ca-bundle.pem" # OpenSUSE "/etc/pki/tls/cacert.pem" # OpenELEC "/etc/ssl/certs" # SLES10/SLES11, https://golang.org/issue/12139 "/usr/share/ca-certs/.prebuilt-store/" # Clear Linux OS; https://github.com/knapsu/plex-media-player-appimage/issues/17#issuecomment-437710032 "/system/etc/security/cacerts" # Android "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem" # CentOS/RHEL 7 "/etc/ssl/cert.pem" # Alpine Linux ) for location in "\${possible_locations[@]}"; do if [ -r "\${location}" ]; then export SSL_CERT_FILE="\${location}" break fi done exec "${HERE}/usr/bin/leocad" "$@" leocad-25.09/tools/setup/appimage.sh000077500000000000000000000014701505543434300174120ustar00rootroot00000000000000qmake PREFIX=/usr -r make clean make -j4 sudo apt-get -y install checkinstall rm ./*.spec # Otherwise the next line fails sudo checkinstall --pkgname=app --pkgversion="1" --pkgrelease="1" --backup=no --fstrans=no --default --deldoc mkdir appdir ; cd appdir dpkg -x ../app_1-1_amd64.deb . ; find . cp ../qt/leocad.desktop . sed -i -e 's|\.svg||g' leocad.desktop # Workaround cp ../resources/leocad.png . mkdir usr/share/leocad cp ../library.bin usr/share/leocad/library.bin cd .. wget -c "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" chmod a+x linuxdeployqt*.AppImage unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH ./linuxdeployqt*.AppImage ./appdir/usr/bin/leocad -bundle-non-qt-libs ./linuxdeployqt*.AppImage ./appdir/usr/bin/leocad -appimage leocad-25.09/tools/setup/leocad.appdata.xml000066400000000000000000000024031505543434300206470ustar00rootroot00000000000000 org.leocad.LeoCAD CC0-1.0 GPL-2.0 LeoCAD

Design virtual models you can build with LEGO bricks

LeoCAD is a CAD program for creating virtual LEGO models. It's available for free under the GNU Public License v2 and works on the Windows, Linux and macOS Operating Systems.

leocad.desktop https://www.leocad.org/ https://github.com/leozide/leocad/issues LeoCAD.org https://www.leocad.org/towerbridge.png leocad.desktop leocad-25.09/tools/setup/leocad.nsi000066400000000000000000000112141505543434300172270ustar00rootroot00000000000000!include "MUI2.nsh" ; The name of the installer Name "LeoCAD" ; The file to write ;OutFile "leocad-setup.exe" ; Request application privileges for Windows Vista ;RequestExecutionLevel admin ; Build Unicode installer Unicode True ; The default installation directory InstallDir $PROGRAMFILES64\LeoCAD ; Registry key to check for directory (so if you install again, it will ; overwrite the old one automatically) InstallDirRegKey HKLM "Software\LeoCAD Software\LeoCAD" "InstallFolder" ; Icon "setup.ico" ; !define MUI_ICON "setup.ico" ; !define MUI_UNICON "setup.ico" SetCompressor /SOLID lzma ;Interface Settings !define MUI_HEADERIMAGE !define MUI_ABORTWARNING ;Pages !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !define MUI_FINISHPAGE_RUN "$INSTDIR\LeoCAD.exe" !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH !insertmacro MUI_LANGUAGE "English" ;Installer Sections Section "Application Files" SecLeoCAD SectionIn RO SetOutPath "$INSTDIR" File /r /x library.bin "appdir\*.*" ;Register file extension WriteRegStr HKCR ".lcd" "" "LeoCAD.Project" WriteRegStr HKCR ".lcd\ShellNew" "NullFile" "" WriteRegStr HKCR "LeoCAD.Project" "" "LeoCAD Project" WriteRegStr HKCR "LeoCAD.Project\DefaultIcon" "" "$INSTDIR\LeoCAD.exe,0" WriteRegStr HKCR "LeoCAD.Project\shell" "" "open" WriteRegStr HKCR "LeoCAD.Project\shell\open\command" "" '"$INSTDIR\LeoCAD.exe" "%1"' System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' IfFileExists "$INSTDIR\vc_redist.x64.exe" VcRedist64Exists PastVcRedist64Check VcRedist64Exists: ExecWait '"$INSTDIR\vc_redist.x64.exe" /quiet /norestart' PastVcRedist64Check: ;Store installation folder ;WriteRegStr HKLM "Software\LeoCAD Software\LeoCAD" "InstallFolder" $INSTDIR CreateShortCut "$SMPROGRAMS\LeoCAD.lnk" "$INSTDIR\LeoCAD.exe" ;Create uninstaller WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "DisplayName" "LeoCAD" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "DisplayVersion" $%VERSION% WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "Publisher" "LeoCAD.org" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "DisplayIcon" '"$INSTDIR\LeoCAD.exe"' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "URLUpdateInfo" "https://www.leocad.org" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "URLInfoAbout" "https://www.leocad.org" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "NoRepair" 1 !include "FileFunc.nsh" ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 IntFmt $0 "0x%08X" $0 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" "EstimatedSize" "$0" WriteUninstaller "$INSTDIR\Uninstall.exe" SectionEnd Section "Parts Library" SecLibrary SetOutPath "$INSTDIR" File "appdir\library.bin" SectionEnd ;-------------------------------- ;Descriptions ;Language strings LangString DESC_SecLeoCAD ${LANG_ENGLISH} "Application Files (required)" LangString DESC_SecLibrary ${LANG_ENGLISH} "Library of parts that represent those produced by the LEGO company and created by the LDraw community" ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecLeoCAD} $(DESC_SecLeoCAD) !insertmacro MUI_DESCRIPTION_TEXT ${SecLibrary} $(DESC_SecLibrary) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "Uninstall" Delete "$SMPROGRAMS\LeoCAD.lnk" Delete "$INSTDIR\Uninstall.exe" Delete "$INSTDIR\LeoCAD.exe" Delete "$INSTDIR\LeoCAD.hlp" Delete "$INSTDIR\LeoCAD.cnt" Delete "$INSTDIR\readme.txt" Delete "$INSTDIR\library.bin" Delete "$INSTDIR\povconsole32-sse2.exe" Delete "$INSTDIR\vc_redist.x64.exe" RMDir "$INSTDIR" DeleteRegKey HKCR ".lcd" DeleteRegKey HKCR "LeoCAD.Project" System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LeoCAD" DeleteRegKey HKLM "Software\LeoCAD Software\LeoCAD\InstallFolder" DeleteRegKey /ifempty HKCU "Software\LeoCAD Software\LeoCAD" SectionEnd leocad-25.09/tools/setup/setup.ico000066400000000000000000000020661505543434300171260ustar00rootroot00000000000000(& N( p{pzwpw p~w~wxwyw w   ( @{wpxwxwwpxxw~x ~pxxpxwpzxxpxzxxx www𙙙wwwp ww ww ww w w   p ??@??