qstopmotion-2.3.2-Source/README_QtCreator_Linux.txt000644 000000 000000 00000010742 12536560627 022207 0ustar00rootroot000000 000000 Building qStopMotion using Qt-Creator IDE on Linux Last Change: 2014-12-16 1. Preparation of the development environment ================================================================================ 1.1 Install necessary libraries with the package manager -------------------------------------------------------------------------------- * g++ (Version >= 4.4.3) * qt4 libraries (32 or 64 bit, Version >= 4.8.2) - libqt4, libqt4-dev, libqt4-dbg (qt4-core, qt4-gui, qt4-xml) - qt4-examples / qt4-demos - qt4-dev-tools - qt4-qmake - qt4-help, qt4-doc * CMake (Version >= 2.8.7) - The version 2.8.7 ist the first that can create working Debian packages - If the package in the package manager is an older version install CMake from the source * Mercurial Client (Version >= 2.2.2) * gstreamer (Version >= 0.10.36) - gstreamer - gstreamer-dev - gstreamer-dbg - gstreamer-plugins-base (videotestsrc, ffmpegcolorspace, videorate, videoscale) - gstreamer-plugins-base-dev - gstreamer-plugins-base-dbg - gstreamer-plugins-good (v4l2src, dv1394src, dvdemux, dvdec, jpegenc, multifilesink) - gstreamer-plugins-good-dbg - (gstreamer-plugins-ugly) - (gstreamer-plugins-ugly-dbg) - (gstreamer-plugins-bad) (dshowvideosrc) - (gstreamer-plugins-bad-dbg) - gstreamer-ffmpeg (ffdemux_dv, ffdec_dvvideo, ffdeinterlace) - gstreamer-ffmpeg-dev - gstreamer-ffmpeg-dbg * ffmpeg (Version >= 0.8.6) * libxml2, libxml2-dev, libxml-dbg * libv4l, libv4l-devel, v4l-utils, v4l-utils-dev * libgphoto2, libgphoto2-devel 1.2 Qt Creator for Linux -------------------------------------------------------------------------------- * Use the Qt Creator from the repositories of your distribution or * Download Qt Creator for Linux (32 or 64 bit, Version >= 2.5.0) from qt-project.org/downloads. * Set execute permissions to the binary installer. * Start the installer with root permissions. * Install the Qt Creator to /opt/qtcreator-2.5.0/ * Create a shortcut in the panel. 2. Access to the sources of qStopMotion ================================================================================ 2.1 Download the sources (last release of qStopMotion) -------------------------------------------------------------------------------- * Downoad qstopmotion--Source.zip or qstopmotion--Source.tar.Z from http://sourceforge.net/projects/qstopmotion/files/ 2.2 Anonymous read only access to the repository (latest developer version) -------------------------------------------------------------------------------- * hg clone http://hg.code.sf.net/p/qstopmotion/code qstopmotion 2.3 Developer access to the repository (read and write access) -------------------------------------------------------------------------------- 2.3.1 Create a Source Forge account * Create a Source Forge account on https://sourceforge.net/user/registration * Add your account to the qStopMotion developers on http://sourceforge.net/projects/qstopmotion 2.3.2 Create a .hgrc file * Create a .hgrc file in your home directory * Content of the file: [ui] username = Your Name [auth] qstopmotion.prefix = https://hg.code.sf.net/p/qstopmotion/code qstopmotion.username = qstopmotion.password = 2.3.3 Create a local repository * hg clone https://hg.code.sf.net/p/qstopmotion/code qstopmotion 3. Building qStopMotion ================================================================================ 3.1 Build -------------------------------------------------------------------------------- * Start Qt Creator using the shortcut. * -DCMAKE_BUILD_TYPE=Release * Open the CMakeLists.txt file as new project. * Build | Build Project qStopMotion * Locking for error and warning messages 3.2 Debugging -------------------------------------------------------------------------------- * Start Qt Creator using the shortcut. * -DCMAKE_BUILD_TYPE=Debug * Build | Build Project qStopMotion * Locking for error and warning messages * Open Options | Settings | Debugger * On the Cdb tab enable the CDB. Normaly the path to the debugger will find automatically. * Start qStopMotion in debugging mode. 4. Create source documentation ================================================================================ 4.1 Install Doxygen with the package manager. -------------------------------------------------------------------------------- * ... qstopmotion-2.3.2-Source/README_NMake_Windows.txt000755 000000 000000 00000020465 12751646113 021631 0ustar00rootroot000000 000000 Building qStopMotion using MS Windows SDK Last Change: 2016-05-10 1. Preparation of the development environment ================================================================================ 1.1 Install the Visual Studio 2013 -------------------------------------------------------------------------------- * Download the "Visual Studio 2013 Community Edition" * This package including the Visual Studio 2010 command line tools. * Install in the default installation directory (C:\Program Files\Microsoft Visual Studio 12.0). - Switch off all optional features - Start the IDE and search for updates * Add the binary directory to the path variable (C:\Program Files\Microsoft Visual Studio 12.0\VC\bin\). 1.2 Install the Windows SDK -------------------------------------------------------------------------------- * Download the "Windows Software Development Kit for Windows 8.1" * This package including the debugging tools for windows. * Install in the default installation directory (C:\Program Files\Windows Kits\v8.1). 1.3 Qt5 for Windows and Visual Studio -------------------------------------------------------------------------------- * Download Qt runtime 5.5.x for Windows 64-bit (VS 2013) from qt-project.com/downloads * Install in the Directory C:\Tools\Qt\... * Qt need write permissions to this directory during compilation and linking. * Add the binary directory to the path variable (e.g. C:\Tools\Qt\Qt5.5.1\bin\). * Set the environment variable 'Qt5_DIR' to 'C:\Tools\Qt\Qt5.5.1\5.5\msvc2013_64\' 1.4 CMake -------------------------------------------------------------------------------- * Download CMake >= 3.3.2 (32bit) from "http://www.cmake.org/cmake/resources/software.html" * Install in the default installation directory. * Add CMake to the system PATH for all users. * Create a start script for CMake (C:\Tools\cmakestart.bat) rem Set the Visual Studion 10 environment variables call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" rem Start CMake "C:\Program Files (x86)\CMake 2.8\bin\cmake-gui.exe" * Create a shortcut to the start script. 1.5 Mercurial SCM (Developers only) -------------------------------------------------------------------------------- * Download Mercurial or TortoiseHG with Mercurial from "http://mercurial.selenic.com/downloads" * Install in the default installation directory. 1.6 NSIS 2.46 -------------------------------------------------------------------------------- * Download NSIS from "http://nsis.sourceforge.net/Main_Page" * Install in the default installation directory. 2. Access to the sources of qStopMotion ================================================================================ 2.1 Download the sources (last release of qStopMotion) -------------------------------------------------------------------------------- * Downoad qstopmotion--Source.zip or qstopmotion--Source.tar.Z from http://sourceforge.net/projects/qstopmotion/files/ 2.2 Anonymous read only access to the repository (latest developer version) -------------------------------------------------------------------------------- * hg clone http://hg.code.sf.net/p/qstopmotion/code qstopmotion 2.3 Developer access to the repository (read and write access) -------------------------------------------------------------------------------- 2.3.1 Create a Source Forge account * Create a Source Forge account on https://sourceforge.net/user/registration * Add your account to the qStopMotion developers on http://sourceforge.net/projects/qstopmotion 2.3.2 Create a .hgrc file * Create a .hgrc file in your home directory * Content of the file: [ui] username = Your Name [auth] qstopmotion.prefix = https://hg.code.sf.net/p/qstopmotion/code qstopmotion.username = qstopmotion.password = 2.3.3 Create a local repository * hg clone https://hg.code.sf.net/p/qstopmotion/code qstopmotion 3. Building qStopMotion ================================================================================ 3.1 Add the ffmpeg encoder to the sources directory -------------------------------------------------------------------------------- * Download the latest static version from http://ffmpeg.zeranoe.com/builds/ * Unpack the 7z file to the qstopmotion directory * Rename the ffmpeg directory to 'ffmpeg' 3.2 Add the qtruntime to the sources directory -------------------------------------------------------------------------------- * Create a new directory qtruntime in the source directory * Copy QtCore4.dll, QtGui4.dll and QtXml.dll from Qt installation bin directory to the new qtruntime directory * Copy QtCored4.dll, QtGuid4.dll and QtXmld.dll from Qt installation bin directory to the new qtruntime directory * Copy the directory imageformats from Qt installation plugins directory to the new qtruntime directory 3.3 Create the NMake makefile -------------------------------------------------------------------------------- * Create a build directory * Start the CMake GUI using the shortcut to the start script. - Select the directory with the cmakelist.txt file as the source code directory. - Select a separate directory as the destination directory. - Set the 'Grouped' and 'Advanced' checkboxes. - To build the release version add a new string entry with the name 'CMAKE_BUILD_TYPE' and the value 'Release'. The default build type is 'Debug'. - Press the configure button. - Select the generator "NMake Makefiles". - Select the entry CPACK - CPACK_BINARY_NSIS. - Select the entry CPACK - CPACK_BINARY_ZIP. - Select the entry CPACK - CPACK_SOURCE_ZIP. - Press the configure button again. - Press the generate button. or * Start the "Visua Studio 2013 - Visual Studio Tools - VS2013 x64 Native Tools Command Prompt" - move to the build directory - cmake -G NMake Makefiles -D CMAKE_BUILD_TYPE:STRING=Release -D CPACK_BINARY_NSIS:BOOL=ON -D CPACK_BINARY_ZIP:BOOL=ON ../qstopmotion 3.4 Build the application -------------------------------------------------------------------------------- * Start the "Visua Studio 2013 - Visual Studio Tools - VS2013 x64 Native Tools Command Prompt" * Move to the build directory. * Call "nmake". * Locking for error and warning messages. 4. Installation ================================================================================ * Start the "Visua Studio 2013 - Visual Studio Tools - VS2013 x64 Native Tools Command Prompt" * call "nmake install". 5. Starting qStopMotion ================================================================================ * Select the video source. * Have fun. 6. Creating packages for Windows ================================================================================ 6.1 Create the installer for qStopMotion -------------------------------------------------------------------------------- * Start the "Visua Studio 2013 - Visual Studio Tools - VS2013 x64 Native Tools Command Prompt" * Move to the new created destination directory. * Call "nmake package". * The Windows installer with the name 'qstopmotion-x.y.z-win64.exe' will be created in the destination directory. * The portable application with the name 'qstopmotion-x.y.z-win64.zip' will be created in the destination directory. 6.2 Test the installer -------------------------------------------------------------------------------- * Copy the new installer to a temporary directory. * Start the installer. * Select the installation directory. * Start qStopMotion in the Windows 'Start' menu. 6.3 Test the portable application -------------------------------------------------------------------------------- * Unpack the zip file of the portable application to a temporary directory. * Move to the new directory and go to the 'bin' subdirectory. * Start the file 'qstopmotion.exe'. 6.4 Create the source package -------------------------------------------------------------------------------- * Start the "Visua Studio 2013 - Visual Studio Tools - VS2013 x64 Native Tools Command Prompt" * Move to the new created destination directory. * Call "nmake package_source" * A new zip package with the name 'qstopmotion-x.y.z-Source.zip' will be created in the destination directory qstopmotion-2.3.2-Source/README_QtCreator_Windows.txt000644 000000 000000 00000013674 12536560627 022551 0ustar00rootroot000000 000000 Building qStopMotion using Qt-Creator IDE on Windows with the Windows SDK as host Last Change: 2014-04-15 1. Preparation of the development environment ================================================================================ 1.1 Install the Windows SDK -------------------------------------------------------------------------------- * Download the "Windows SDK for Windows 7 and .NET Framework 4" - If you use a 32bit Windows system download GRMSDK_EN_DVD or the online installer - If you use a 64bit Windows system download GRMSDKX_EN_DVD or the online installer * This package including the Visual Studio 2010 command line tools and the debugging tools for windows. * Install in the default installation directory (C:\Program Files\Microsoft SDKs\Windows\v7.1). 1.2 Qt for Windows and Visual Studio -------------------------------------------------------------------------------- * Download Qt libraries 4.8.4 for Windows 32-bit (VS 2010) from qt-project.com/downloads * Install in the Directory C:\Tools\Qt\... * Qt need write permissions to this directory during compilation and linking. * Add the binary directory to the path variable (e.g. C:\Tools\Qt\4.8.4\bin\). 1.3 Download and install Qt-Creator for Windows -------------------------------------------------------------------------------- * Download Qt Creator 2.8.1 for Windows 32-bit (not the full SDK) from qt-project.org/downloads * Install in the Directory C:\Tools\Qt\... * The installation of the MinGW runtime development tools is not necessary. 1.4 CMake 2.8.12 -------------------------------------------------------------------------------- * Download CMake 2.8.12.x from "http://www.cmake.org/cmake/resources/software.html" * Add CMake to the system PATH for all users. * Install in the default installation directory. * Create a start script for CMake (C:\Tools\cmakestart.bat) rem Set the Visual Studion 10 environment variables call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" rem Start CMake "C:\Program Files (x86)\CMake 2.8\bin\cmake-gui.exe" * Create a shortcut to the start script. 1.5 NSIS 2.46 -------------------------------------------------------------------------------- * Download NSIS from "http://nsis.sourceforge.net/Main_Page" * Install in the default installation directory. 1.6 Mercurial SCM (Developers only) -------------------------------------------------------------------------------- * Download Mercurial or TortoiseHG with Mercurial from "http://mercurial.selenic.com/downloads" * Install in the default installation directory. 2. Access to the sources of qStopMotion ================================================================================ 2.1 Download the sources (last release of qStopMotion) -------------------------------------------------------------------------------- * Downoad qstopmotion--Source.zip or qstopmotion--Source.tar.Z from http://sourceforge.net/projects/qstopmotion/files/ 2.2 Anonymous read only access to the repository (latest developer version) -------------------------------------------------------------------------------- * hg clone http://hg.code.sf.net/p/qstopmotion/code qstopmotion 2.3 Developer access to the repository (read and write access) -------------------------------------------------------------------------------- 2.3.1 Create a Source Forge account * Create a Source Forge account on https://sourceforge.net/user/registration * Add your account to the qStopMotion developers on http://sourceforge.net/projects/qstopmotion 2.3.2 Create a .hgrc file * Create a .hgrc file in your home directory * Content of the file: [ui] username = Your Name [auth] qstopmotion.prefix = https://hg.code.sf.net/p/qstopmotion/code qstopmotion.username = qstopmotion.password = 2.3.3 Create a local repository * hg clone https://hg.code.sf.net/p/qstopmotion/code qstopmotion 3. Building qStopMotion ================================================================================ 3.1 Add the ffmpeg encoder to the sources directory -------------------------------------------------------------------------------- * Download the latest static version from http://ffmpeg.zeranoe.com/builds/ * Unpack the 7z file to the qstopmotion directory * Rename the ffmpeg directory to 'ffmpeg' 3.2 Add the qtruntime to the sources directory -------------------------------------------------------------------------------- * Create a new directory qtruntime in the source directory * Copy QtCore4.dll, QtGui4.dll and QtXml.dll from Qt installation bin directory to the new qtruntime directory * Copy QtCored4.dll, QtGuid4.dll and QtXmld.dll from Qt installation bin directory to the new qtruntime directory. * Copy the directory imageformats from Qt installation plugins directory to the new qtruntime directory. 3.3 Build -------------------------------------------------------------------------------- * Start Qt Creator. * Open the 'Options...' dialog in the 'Tools' menu and select 'Build & Run'. * In the tab 'Qt Versions' add a manual entry for the installed Qt version and press the 'Apply' button. * In the tab 'Kits' select the entry 'Manual - Desktop (default)' and select the 'Microsoft Visual C++ Compiler 10.0 (x86)' and the installed Qt version. * Open the CMakeLists.txt file as new project. * In the dialog of the CMake-Assistent press the 'Run CMake' button. * Ignore the CMake Warnings 'system runtime library file does not exist' messages. * If the 'Finisch' button is enabled press this button. * In the 'Build' menu select 'Build Project qStopMotion' * Locking for error and warning messages. 3.4 Debugging -------------------------------------------------------------------------------- * Start Qt Creator. * Build qStopMotion. * Start qStopMotion in debugging mode. qstopmotion-2.3.2-Source/AUTHORS000644 000000 000000 00000000203 12536560627 016405 0ustar00rootroot000000 000000 Ralf Lange Bjoern Erik Nilsen Fredrik Berg Kjoelstad qstopmotion-2.3.2-Source/README_Makefile_Linux.txt000644 000000 000000 00000017076 12536560627 022027 0ustar00rootroot000000 000000 Building qStopMotion using Unix makefile on Linux Last Change: 2014-12-16 1. Preparation of the development environment ================================================================================ 1.1 Install necessary libraries with the package manager -------------------------------------------------------------------------------- * g++ (Version >= 4.4.3) * qt4 libraries (32 or 64 bit, Version >= 4.8.2) - libqt4, libqt4-dev, libqt4-dbg (qt4-core, qt4-gui, qt4-xml) - qt4-examples / qt4-demos - qt4-dev-tools - qt4-qmake - qt4-help, qt4-doc * CMake (Version >= 2.8.7) - The version 2.8.7 ist the first that can create working Debian packages - If the package in the package manager is an older version install CMake from the source * Mercurial Client (Version >= 2.2.2) * gstreamer (Version >= 0.10.36) - gstreamer - gstreamer-dev - gstreamer-dbg - gstreamer-plugins-base (videotestsrc, ffmpegcolorspace, videorate, videoscale) - gstreamer-plugins-base-dev - gstreamer-plugins-base-dbg - gstreamer-plugins-good (v4l2src, dv1394src, dvdemux, dvdec, jpegenc, multifilesink) - gstreamer-plugins-good-dbg - (gstreamer-plugins-ugly) - (gstreamer-plugins-ugly-dbg) - (gstreamer-plugins-bad) (dshowvideosrc) - (gstreamer-plugins-bad-dbg) - gstreamer-ffmpeg (ffdemux_dv, ffdec_dvvideo, ffdeinterlace) - gstreamer-ffmpeg-dev - gstreamer-ffmpeg-dbg * ffmpeg (Version >= 0.8.6) * libxml2, libxml2-dev, libxml-dbg * libv4l, libv4l-devel, v4l-utils, v4l-utils-dev * libgphoto2, libgphoto2-devel 2. Access to the sources of qStopMotion ================================================================================ 2.1 Download the sources (last release of qStopMotion) -------------------------------------------------------------------------------- * Downoad qstopmotion--Source.zip or qstopmotion--Source.tar.Z from http://sourceforge.net/projects/qstopmotion/files/ 2.2 Anonymous read only access to the repository (latest developer version) -------------------------------------------------------------------------------- * hg clone http://hg.code.sf.net/p/qstopmotion/code qstopmotion 2.3 Developer access to the repository (read and write access) -------------------------------------------------------------------------------- 2.3.1 Create a Source Forge account * Create a Source Forge account on https://sourceforge.net/user/registration * Add your account to the qStopMotion developers on http://sourceforge.net/projects/qstopmotion 2.3.2 Create a .hgrc file * Create a .hgrc file in your home directory * Content of the file: [ui] username = Your Name [auth] qstopmotion.prefix = https://hg.code.sf.net/p/qstopmotion/code qstopmotion.username = qstopmotion.password = 2.3.3 Create a local repository * hg clone https://hg.code.sf.net/p/qstopmotion/code qstopmotion 3. Building qStopMotion ================================================================================ 3.1 Create the Makefile -------------------------------------------------------------------------------- * Create a build directory 'qstopmotion-build' parallel to the qstopmotion directory. * Start the CMake GUI * Select the qstopmotion directory as the source directory * Select the qstopmotion-build directory as the build directory * Press the 'Configure' button * Select 'Unix Makefile' as target platform * Press the 'Configure' button again * Press the 'Generate' button 3.2 Build -------------------------------------------------------------------------------- * Move to the qstopmotion-build directory. * Call "make" * Locking for error and warning messages 4. Installation ================================================================================ * Get super user permissions * Call "make install" 5. Starting qStopMotion ================================================================================ * Select the video source * Have fun. 6. Packaging ================================================================================ 6.1 Creating package for RPM -------------------------------------------------------------------------------- 6.1.1 Download and install ??? * Download installer from .... * Install with default options. 6.1.2 Create packaging script for qStopMotion * Start the CMake GUI * Select the qstopmotion directory as source locaton * Select a empthy directory as the build directory * Add Entry of type string: 'CPACK_GENERATOR' with the value 'RPM' * Press the 'Configure' button and select 'Unix Makefile' as generator * Press the 'Configure' button again * Press the 'Generate' button 6.1.3 Create the package for qStopMotion * Open a command line * Move to the build directory * make package * A new package with the name 'qstopmotion-x.x.x-Linux.rpm' will be created in the directory 6.1.4 Test the new package * Open the new created package with the software installation tool * Install qStopMotion * You will find the an new icon in the applications-multimedia menu 6.2 Creating package for DEB -------------------------------------------------------------------------------- 6.2.1 Download and install ??? * Download installer from .... * Install with default options. 6.2.2 Create packaging script for qStopMotion * Start the CMake GUI * Select the qstopmotion directory as source locaton * Select a empthy directory as the build directory * Add Entry of type string: 'CPACK_GENERATOR' with the value 'DEB' * Press the 'Configure' button and select 'Unix Makefile' as generator * Press the 'Configure' button again * Press the 'Generate' button 6.2.3 Create the package for qStopMotion * Open a command line and be a super user with 'su' * Move to the build directory * make package * A new package with the name 'qstopmotion-x.x.x-Linux.deb' will be created in the directory 6.2.4 Test the new package * Open the new created package with the software installation tool * Install qStopMotion * You will find the an new icon in the applications-multimedia menu 6.3 Creating package for Linux X11 -------------------------------------------------------------------------------- 6.3.1 Download and install ??? * Download installer from .... * Install with default options. 6.3.2 Create packaging script for qStopMotion * Start the CMake GUI * Select the qstopmotion directory as source locaton * Select a empthy directory as the build directory * Press the 'Configure' button and select 'Unix Makefile' as generator * Press the 'Configure' button again * Press the 'Generate' button 6.3.3 Create the package for qStopMotion * Open a command line and be a super user with 'su' * Move to the build directory * make package * A new package with the name 'qstopmotion-x.x.x-Linux.sh' will be created in the directory 6.3.4 Test the new package * Call the new shell file * Install qStopMotion 6.4 Creating source package -------------------------------------------------------------------------------- 6.4.1 Download and install ??? * Download installer from .... * Install with default options. 6.4.2 Create packaging script for qStopMotion * ... * ... 6.4.3 Create the package for qStopMotion * make package_source * ... 7. Create source documentation ================================================================================ 7.1 Download and install Doxygen -------------------------------------------------------------------------------- * Download installer from qstopmotion-2.3.2-Source/src/technical/grabber/grabbercontrolcapabilities.cpp000644 000000 000000 00000006544 12536560627 027563 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2013 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "grabbercontrolcapabilities.h" GrabberControlCapabilities::GrabberControlCapabilities() { ctrl_id = 0; ctrl_class = 0; minimum = 0L; maximum = 0L; step = 0L; defaultt = 0L; flags = control_none; } GrabberControlCapabilities::~GrabberControlCapabilities() { } bool GrabberControlCapabilities::isCapability() { if (getFlags() != GrabberControlCapabilities::control_none) { return true; } return false; } bool GrabberControlCapabilities::isAutomatic() { if (getFlags() == GrabberControlCapabilities::control_Auto) { return true; } return false; } unsigned int GrabberControlCapabilities::getControlId() { return ctrl_id; } void GrabberControlCapabilities::setControlId(unsigned int id) { ctrl_id = id; } unsigned int GrabberControlCapabilities::getControlClass() { return ctrl_class; } void GrabberControlCapabilities::setControlClass(unsigned int cl) { ctrl_class = cl; } unsigned int GrabberControlCapabilities::getControlType() { return ctrl_type; } void GrabberControlCapabilities::setControlType(unsigned int ct) { ctrl_type = ct; } long GrabberControlCapabilities::getMinimum() { return minimum; } void GrabberControlCapabilities::setMinimum(long mi) { minimum = mi; } long GrabberControlCapabilities::getMaximum() { return maximum; } void GrabberControlCapabilities::setMaximum(long ma) { maximum = ma; } long GrabberControlCapabilities::getStep() { return step; } void GrabberControlCapabilities::setStep(long st) { step = st; } long GrabberControlCapabilities::getDefault() { return defaultt; } void GrabberControlCapabilities::setDefault(long de) { defaultt = de; } long GrabberControlCapabilities::getFlags() { return flags; } void GrabberControlCapabilities::setFlags(long fl) { flags = fl; } qstopmotion-2.3.2-Source/src/technical/grabber/imagegrabberfacade.h000644 000000 000000 00000011735 12751646113 025374 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef IMAGEGRABBERFACADE_H #define IMAGEGRABBERFACADE_H #include #include #include #include #include "frontends/frontend.h" #include "technical/grabber/grabbercontroller.h" #include "technical/grabber/imagegrabber.h" #include "technical/grabber/imagegrabberdevice.h" #include "technical/grabber/imagegrabberthread.h" /** * Abstract class for the different video grabbers used by the SDLVideoView * widget. * * @author Bjoern Erik Nilsen, Fredrik Berg Kjoelstad, Ralf Lange */ class ImageGrabberFacade : public QObject { Q_OBJECT public: /** * Constructs and initializes the object. * @param filePath path to the output file grabbed from a device */ ImageGrabberFacade(Frontend *f); /** * Destructor */ ~ImageGrabberFacade(); /** * A new device is set to use as video grabber */ void newDeviceSet(); /** * Get the number of possible devices. * * @brief getDeviceCount * @return Number of devices. */ const int getDeviceCount(); /** * Get the possible video devices. * @return Vector with the devices. */ const QVector getDevices(); /** * Get one video devices. * @param deviceIndex The index of the device. * @return The video devices. */ ImageGrabberDevice *getDevice(int deviceIndex); /** * Get the possible video devices. * @return Vector with the device names. */ const QVector getDeviceNames(); /** * Get the possible resolution names * of the video device. * @param deviceIndex The index of the device. * @return Vector with the resolution names. */ const QVector getResolutionNames(int deviceIndex); /** * Get the video resolution object. * @param deviceIndex The index of the device. * @param resIndex Index of the new video resolution * @return video resolution object */ const GrabberResolution getResolution(int deviceIndex, int resIndex); /** * Checks if the grabber is initialized. * @return true if it is initialized, false otherwise */ bool isGrabberInitialized() const; /** * Checks if the grabber is inited. * @return true if it is inited, false otherwise */ bool isGrabberInited() const; /** * Initialization of the grabber. */ void initialization(); /** * Initializing the grabber. * @return true on success, false otherwise */ void init(); /** * Finalizing the grabber. * @return true on success, false otherwise */ void finalize(); /** * Get the live image from the camera * @return The live image. */ const QImage getLiveImage(); /** * Get the raw image from the camera * @return The raw image. */ const QImage getRawImage(); private: /** * Clear the device list */ void clearDevices(); protected: /** * Frontend of the application */ Frontend *frontend; bool isInitialized; bool isInited; QVector devices; ImageGrabberThread *grabberThread; // Linux grabbers ImageGrabber *gphotoGrabber; ImageGrabber *v4l2Grabber; // Windows grabbers ImageGrabber *mediaFoundationGrabber; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/mediafoundation/mfcontroller.h000755 000000 000000 00000045136 12654352322 027520 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef MEDIAFOUNDATION_MFCONTROLLER_H #define MEDIAFOUNDATION_MFCONTROLLER_H #include "technical/grabber/grabbercontroller.h" #include "technical/grabber/mediafoundation/mfgrabber.h" // Include files of the media foundation #include #include /** * Interface to the controller of a device using the * Microsoft Media Foundation API. * * @author Ralf Lange */ class MfController : public GrabberController { public: /** * Constructs and initializes the object. * @param caps The grabber controller capabilities. */ MfController(int caps); /** * Destructor */ ~MfController(); /** * Get the image grabber of the controller. * * @brief getImageGrabber * @return The image grabber or null. */ ImageGrabber* getImageGrabber(); /** * Initialize the grabber controller. * @param ig The image grabber of the controller. * @param igd The image grabber device of the controller. * @return True if initialization is successful. */ bool initialization(ImageGrabber* ig, ImageGrabberDevice* igd); /** * Set up the controller. * @return true on success, false otherwise */ bool setUp(); /** * Tear down the controller. * @return true on success, false otherwise */ bool tearDown(); /************************************************************************** ************************************************************************** * Camera capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness **************************************************************************/ /** * Has the camera a automatic brightness control capability? * @return True if the camera has a automatic brightness control apability. */ // bool isAutomaticBrightness(); /** * Get the current automatic brightness value of the device. * @return True if the automatic brightness is on. */ bool getAutomaticBrightness(); /** * Set the automatic brightness value of the device. * @param ae True if the automatic brightness will be switched on. */ void setAutomaticBrightness(bool ab); /** * Has the camera a brightness control capability? * @return True if the camera has a brightness control apability. */ // bool isBrightness(); /** * Get the maximum value of the brightness. * @return The maximum value of the brightness. */ // int getMaximumBrightness(); /** * Get the current brightness value of the device. * @return The current brightness value. */ int getBrightness(); /** * Set the brightness value of the device. * @param b The new brightness value */ void setBrightness(int b); /************************************************************************** * Contrast **************************************************************************/ /** * Has the camera a contrast control capability? * @return True if the camera has a contrast control apability. */ bool isContrast(); /** * Get the maximum value of the contrast. * @return The maximum value of the contrast. */ int getMaximumContrast(); /** * Get the current contrast value of the device. * @return The current contrast value. */ int getContrast(); /** * Set the contrast value of the device. * @param c The new contrast value */ void setContrast(int c); /************************************************************************** * Saturation **************************************************************************/ /** * Has the camera a saturation control capability? * @return True if the camera has a saturation control apability. */ bool isSaturation(); /** * Get the maximum value of the saturation. * @return The maximum value of the saturation. */ int getMaximumSaturation(); /** * Get the current saturation value of the device. * @return The current saturation value. */ int getSaturation(); /** * Set the saturation value of the device. * @param s The new saturation value */ void setSaturation(int s); /************************************************************************** * Hue **************************************************************************/ /** * Has the camera a hue control capability? * @return True if the camera has a hue control apability. */ bool isHue(); /** * Get the maximum value of the hue. * @return The maximum value of the hue. */ int getMaximumHue(); /** * Get the current hue value of the device. * @return The current hue value. */ int getHue(); /** * Set the hue value of the device. * @param h The new hue value */ void setHue(int h); /************************************************************************** * Gamma **************************************************************************/ /** * Has the camera a gamma control capability? * @return True if the camera has a gamma control apability. */ bool isGamma(); /** * Get the maximum value of the gamma. * @return The maximum value of the gamma. */ int getMaximumGamma(); /** * Get the current gamma value of the device. * @return The current gamma value. */ int getGamma(); /** * Set the gamma value of the device. * @param g The new gamma value */ void setGamma(int g); /************************************************************************** * Sharpness **************************************************************************/ /** * Has the camera a sharpness control capability? * @return True if the camera has a sharpness control apability. */ bool isSharpness(); /** * Get the maximum value of the sharpness. * @return The maximum value of the sharpness. */ int getMaximumSharpness(); /** * Get the current sharpness value of the device. * @return The current sharpness value. */ int getSharpness(); /** * Set the sharpness value of the device. * @param s The new sharpness value */ void setSharpness(int s); /************************************************************************** * Backlight Compensation **************************************************************************/ /** * Has the camera a backlight compensation control capability? * @return True if the camera has a backlight compensation control apability. */ bool isBacklight(); /** * Get the maximum value of the backlight compensation. * @return The maximum value of the backlight compensation. */ int getMaximumBacklight(); /** * Get the current backlight compensation value of the device. * @return The current backlight compensation value. */ int getBacklight(); /** * Set the backlight compensation value of the device. * @param b The new backlight compensation value */ void setBacklight(int b); /************************************************************************** * White Balance **************************************************************************/ /** * Has the camera a automatic white balance control capability? * @return True if the camera has a automatic white balance control apability. */ bool isAutomaticWhite(); /** * Get the current automatic white balance value of the device. * @return True if the automatic white balance is on. */ // bool getAutomaticWhite(); /** * Set the automatic white balance value of the device. * @param ae True if the automatic white balance will be switched on. */ // void setAutomaticWhite(bool ae); /** * Has the camera a white balance control capability? * @return True if the camera has a white balance control apability. */ bool isWhite(); /** * Get the maximum value of the white balance. * @return The maximum value of the white balance. */ int getMaximumWhite(); /** * Get the current white balance value of the device. * @return The current white balance value. */ int getWhite(); /** * Set the white balance value of the device. * @param w The new white balance value */ void setWhite(int w); /************************************************************************** * Gain **************************************************************************/ /** * Has the camera a gain control capability? * @return True if the camera has a gain control apability. */ // bool isGain(); /** * Get the maximum value of the gain. * @return The maximum value of the gain. */ // int getMaximumGain(); /** * Get the current gain value of the device. * @return The current gain value. */ int getGain(); /** * Set the gain value of the device. * @param g The new gain value */ void setGain(int g); /************************************************************************** * Color **************************************************************************/ /** * Has the camera a color control capability? * @return True if the camera has a color control apability. */ // bool isColor(); /** * Get the maximum value of the color. * @return The maximum value of the color. */ // int getMaximumColor(); /** * Get the current color value of the device. * @return The current color value. */ int getColor(); /** * Set the color value of the device. * @param c The new color value */ void setColor(int c); /************************************************************************** ************************************************************************** * Camera control capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Exposure **************************************************************************/ /** * Has the camera a automatic exposure control capability? * @return True if the camera has a automatic exposure control apability. */ bool isAutomaticExposure(); /** * Get the current automatic exposure value of the device. * @return True if the automatic exposure is on. */ bool getAutomaticExposure(); /** * Set the automatic exposure value of the device. * @param ae True if the automatic exposure will be switched on. */ void setAutomaticExposure(bool ae); /** * Has the camera a exposure control capability? * @return True if the camera has a exposure control apability. */ bool isExposure(); /** * Get the maximum value of the exposure. * @return The maximum value of the exposure. */ int getMaximumExposure(); /** * Get the current exposure value of the device. * @return The current exposure value. */ int getExposure(); /** * Set the exposure value of the device. * @param e The new exposure value */ void setExposure(int e); /************************************************************************** * Zoom **************************************************************************/ /** * Has the camera a automatic zoom control capability? * @return True if the camera has a automatic zoom control apability. */ bool isAutomaticZoom(); /** * Get the current automatic zoom value of the device. * @return True if the automatic zoom is on. */ bool getAutomaticZoom(); /** * Set the automatic zoom value of the device. * @param az True if the automatic zoom will be switched on. */ void setAutomaticZoom(bool az); /** * Has the camera a zoom control capability? * @return True if the camera has a zoom control apability. */ bool isZoom(); /** * Get the maximum value of the zoom. * @return The maximum value of the zoom. */ int getMaximumZoom(); /** * Get the current zoom value of the device. * @return The current zoom value. */ int getZoom(); /** * Set the zoom value of the device. * @param z The new zoom value */ void setZoom(int z); /************************************************************************** * Focus **************************************************************************/ /** * Has the camera a automatic focus control capability? * @return True if the camera has a automatic focus control apability. */ bool isAutomaticFocus(); /** * Get the current automatic focus value of the device. * @return True if the automatic focus is on. */ bool getAutomaticFocus(); /** * Set the automatic focus value of the device. * @param af True if the automatic focus will be switched on. */ void setAutomaticFocus(bool af); /** * Has the camera a focus control capability? * @return True if the camera has a focus control apability. */ bool isFocus(); /** * Get the maximum focus of the zoom. * @return The maximum focus of the zoom. */ int getMaximumFocus(); /** * Get the current focus value of the device. * @return The current focus value. */ int getFocus(); /** * Set the focus value of the device. * @param f The new focus value */ void setFocus(int f); /************************************************************************** * Pan **************************************************************************/ /** * Has the camera a pan control capability? * @return True if the camera has a pan control apability. */ bool isPan(); /** * Get the maximum value of the pan. * @return The maximum value of the pan. */ int getMaximumPan(); /** * Get the current pan value of the device. * @return The current pan value. */ int getPan(); /** * Set the pan value of the device. * @param p The new pan value */ void setPan(int p); /************************************************************************** * Tilt **************************************************************************/ /** * Has the camera a tilt control capability? * @return True if the camera has a tilt control apability. */ bool isTilt(); /** * Get the maximum value of the tilt. * @return The maximum value of the tilt. */ int getMaximumTilt(); /** * Get the current tilt value of the device. * @return The current tilt value. */ int getTilt(); /** * Set the tilt value of the device. * @param t The new tilt value */ void setTilt(int t); /************************************************************************** * Iris **************************************************************************/ /** * Get the current automatic iris value of the device. * @return True if the automatic iris is on. */ bool getAutomaticIris(); /** * Set the automatic iris value of the device. * @param ae True if the automatic iris will be switched on. */ void setAutomaticIris(bool ae); /** * Get the current iris value of the device. * @return The current iris value. */ int getIris(); /** * Set the iris value of the device. * @param e The new iris value */ void setIris(int e); /************************************************************************** * Roll **************************************************************************/ /** * Get the current automatic roll value of the device. * @return True if the automatic roll is on. */ bool getAutomaticRoll(); /** * Set the automatic roll value of the device. * @param ar True if the automatic roll will be switched on. */ void setAutomaticRoll(bool ar); /** * Get the current roll value of the device. * @return The current roll value. */ int getRoll(); /** * Set the roll value of the device. * @param r The new roll value */ void setRoll(int r); private: MfGrabber* grabber; ImageGrabberDevice* grabberDevice; IAMCameraControl* cameraControl; IAMVideoProcAmp* qualityControl; bool setControlCapabilities(); bool setQualityCapabilities(); }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/mediafoundation/mfcontroller.cpp000755 000000 000000 00000332022 12670474563 030056 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "mfcontroller.h" #include "mfutil.h" #include <QtCore/QtDebug> #define SLEEP_TIME 200 /************************************************************************** * Implementation of the grabber controller functions using the * Microsoft Media Foundation API. **************************************************************************/ MfController::MfController(int cap) : GrabberController(cap) { qDebug() << "MfController::Constructor --> Start"; grabber = NULL; grabberDevice = NULL; cameraControl = NULL; qualityControl = NULL; qDebug() << "MfController::Constructor --> End"; } MfController::~MfController() { qDebug() << "MfController::Destructor --> Start"; SafeRelease(&qualityControl); SafeRelease(&cameraControl); qDebug() << "MfController::Destructor --> End"; } ImageGrabber* MfController::getImageGrabber() { return grabber; } bool MfController::initialization(ImageGrabber* ig, ImageGrabberDevice* igd) { qDebug() << "MfController::init --> Start"; grabber = (MfGrabber*)ig; grabberDevice = igd; bool ret = false; IMFMediaSource* mediaSource = grabber->getSource(); if(NULL == mediaSource) { return false; } // unsigned int shift = sizeof(Parametr); HRESULT hr = mediaSource->QueryInterface(IID_PPV_ARGS(&qualityControl)); if(S_OK == hr) { if (setQualityCapabilities()) { ret = true; } SafeRelease(&qualityControl); } else { qDebug() << "MfController::init --> ERROR: Unable to access IAMCameraControl interface."; } hr = mediaSource->QueryInterface(IID_PPV_ARGS(&cameraControl)); if(S_OK == hr) { if (setControlCapabilities()) { ret = true; } SafeRelease(&cameraControl); } else { qDebug() << "MfController::init --> ERROR: Unable to access IAMCameraControl interface."; } qDebug() << "MfController::init --> End (Successful)"; return ret; } bool MfController::setUp() { qDebug() << "MfController::setUp --> Start"; bool ret = false; HRESULT hr; IMFMediaSource* mediaSource = grabber->getSource(); if(NULL == mediaSource) { return false; } // unsigned int shift = sizeof(Parametr); hr = mediaSource->QueryInterface(IID_PPV_ARGS(&qualityControl)); if(S_OK == hr) { ret = true; } else { qDebug() << "MfController::setUp --> ERROR: Unable to access IAMCameraControl interface."; } hr = mediaSource->QueryInterface(IID_PPV_ARGS(&cameraControl)); if(S_OK == hr) { ret = true; } else { qDebug() << "MfController::setUp --> ERROR: Unable to access IAMCameraControl interface."; } qDebug() << "MfController::setUp --> End"; return true; } bool MfController::tearDown() { qDebug() << "MfController::tearDown --> Start"; SafeRelease(&qualityControl); SafeRelease(&cameraControl); qDebug() << "MfController::tearDown --> End"; return true; } bool MfController::setControlCapabilities() { qDebug() << "MfController::setCameraCapabilities --> Start"; long min; long max; long step; long def; long flags; HRESULT hr; Sleep(SLEEP_TIME); hr = cameraControl->GetRange(CameraControl_Exposure, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setCameraCapabilities --> Exposure control supported."; getExposureCaps()->setMinimum(min); getExposureCaps()->setMaximum(max); getExposureCaps()->setStep(step); getExposureCaps()->setDefault(def); if (flags & CameraControl_Flags_Auto) { getExposureCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getExposureCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setCameraCapabilities --> Exposure control not supported."; } Sleep(SLEEP_TIME); hr = cameraControl->GetRange(CameraControl_Zoom, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setCameraCapabilities --> Zoom control supported."; getZoomCaps()->setMinimum(min); getZoomCaps()->setMaximum(max); getZoomCaps()->setStep(step); getZoomCaps()->setDefault(def); if (flags & CameraControl_Flags_Auto) { getZoomCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getZoomCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setCameraCapabilities --> Zoom control not supported."; } Sleep(SLEEP_TIME); hr = cameraControl->GetRange(CameraControl_Focus, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setCameraCapabilities --> Focus control supported."; getFocusCaps()->setMinimum(min); getFocusCaps()->setMaximum(max); getFocusCaps()->setStep(step); getFocusCaps()->setDefault(def); if (flags & CameraControl_Flags_Auto) { getFocusCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getFocusCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setCameraCapabilities --> Focus control not supported."; } Sleep(SLEEP_TIME); hr = cameraControl->GetRange(CameraControl_Pan, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setCameraCapabilities --> Pan control supported"; getPanCaps()->setMinimum(min); getPanCaps()->setMaximum(max); getPanCaps()->setStep(step); getPanCaps()->setDefault(def); getPanCaps()->setFlags(flags); } else { qDebug() << "MfController::setCameraCapabilities --> Pan control not supported"; } Sleep(SLEEP_TIME); hr = cameraControl->GetRange(CameraControl_Tilt, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setCameraCapabilities --> Tilt control supported"; getTiltCaps()->setMinimum(min); getTiltCaps()->setMaximum(max); getTiltCaps()->setStep(step); getTiltCaps()->setDefault(def); getTiltCaps()->setFlags(flags); } else { qDebug() << "MfController::setCameraCapabilities --> Tilt control not supported"; } Sleep(SLEEP_TIME); hr = cameraControl->GetRange(CameraControl_Iris, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setCameraCapabilities --> Iris control supported."; getIrisCaps()->setMinimum(min); getIrisCaps()->setMaximum(max); getIrisCaps()->setStep(step); getIrisCaps()->setDefault(def); if (flags & CameraControl_Flags_Auto) { getIrisCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getIrisCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setCameraCapabilities --> Iris control not supported."; } Sleep(SLEEP_TIME); hr = cameraControl->GetRange(CameraControl_Roll, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setCameraCapabilities --> Roll control supported."; getRollCaps()->setMinimum(min); getRollCaps()->setMaximum(max); getRollCaps()->setStep(step); getRollCaps()->setDefault(def); if (flags & CameraControl_Flags_Auto) { getRollCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getRollCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setCameraCapabilities --> Roll control not supported."; } qDebug() << "MfController::setCameraCapabilities --> End"; return true; } bool MfController::setQualityCapabilities() { qDebug() << "MfController::setQualityCapabilities --> Start"; long min; long max; long step; long def; long flags; HRESULT hr; Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_Brightness, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> Brightness control supported."; getBrightnessCaps()->setMinimum(min); getBrightnessCaps()->setMaximum(max); getBrightnessCaps()->setStep(step); getBrightnessCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getBrightnessCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getBrightnessCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> Brightness control not supported."; } Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_Contrast, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> Contrast control supported."; getContrastCaps()->setMinimum(min); getContrastCaps()->setMaximum(max); getContrastCaps()->setStep(step); getContrastCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getContrastCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getContrastCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> Contrast control not supported."; } Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_Saturation, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> Saturation control supported."; getSaturationCaps()->setMinimum(min); getSaturationCaps()->setMaximum(max); getSaturationCaps()->setStep(step); getSaturationCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getSaturationCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getSaturationCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> Saturation control not supported."; } Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_Hue, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> Hue control supported."; getHueCaps()->setMinimum(min); getHueCaps()->setMaximum(max); getHueCaps()->setStep(step); getHueCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getHueCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getHueCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> Hue control not supported."; } Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_Gamma, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> Gamma control supported."; getGammaCaps()->setMinimum(min); getGammaCaps()->setMaximum(max); getGammaCaps()->setStep(step); getGammaCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getGammaCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getGammaCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> Gamma control not supported."; } Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_Sharpness, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> Sharpness control supported."; getSharpnessCaps()->setMinimum(min); getSharpnessCaps()->setMaximum(max); getSharpnessCaps()->setStep(step); getSharpnessCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getSharpnessCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getSharpnessCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> Sharpness control not supported."; } Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_BacklightCompensation, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> Backlight Compensation control supported."; getBacklightCaps()->setMinimum(min); getBacklightCaps()->setMaximum(max); getBacklightCaps()->setStep(step); getBacklightCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getBacklightCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getBacklightCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> Backlight Compensation control not supported."; } Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_WhiteBalance, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> White Balance control supported."; getWhiteCaps()->setMinimum(min); getWhiteCaps()->setMaximum(max); getWhiteCaps()->setStep(step); getWhiteCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getWhiteCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getWhiteCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> White Balance control not supported."; } Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_Gain, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> Gain control supported."; getGainCaps()->setMinimum(min); getGainCaps()->setMaximum(max); getGainCaps()->setStep(step); getGainCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getGainCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getGainCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> Gain control not supported."; } Sleep(SLEEP_TIME); hr = qualityControl->GetRange(VideoProcAmp_ColorEnable, &min, &max, &step, &def, &flags); if (hr == S_OK) { qDebug() << "MfController::setQualityCapabilities --> Color Enable control supported."; getColorCaps()->setMinimum(min); getColorCaps()->setMaximum(max); getColorCaps()->setStep(step); getColorCaps()->setDefault(def); if (flags & VideoProcAmp_Flags_Auto) { getColorCaps()->setFlags(GrabberControlCapabilities::control_Auto); } else { getColorCaps()->setFlags(GrabberControlCapabilities::control_Manual); } } else { qDebug() << "MfController::setQualityCapabilities --> Color Enable control not supported."; } qDebug() << "MfController::setQualityCapabilities --> End"; return true; } /************************************************************************** ************************************************************************** * Camera quality capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * Values range from  10,000 to 10,000. **************************************************************************/ bool MfController::getAutomaticBrightness() { HRESULT hr = S_OK; long flags = 0L; long bright_value = 0L; hr = qualityControl->Get(VideoProcAmp_Brightness, &bright_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticBrightness --> ERROR: Unable to get Brightness property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticBrightness(bool ab) { HRESULT hr = S_OK; long flags = 0L; long bright_value = 0L; if (ab) { flags = VideoProcAmp_Flags_Auto; } else { bright_value = getBrightnessCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_Brightness, bright_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticBrightness --> ERROR: Unable to set Brightness property value to " << ab << ". (Error 0x" << hr << ")"; } } int MfController::getBrightness() { HRESULT hr = S_OK; long flags = 0L; long bright_value = 0L; hr = qualityControl->Get(VideoProcAmp_Brightness, &bright_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getBrightness --> ERROR: Unable to get Brightness property value. (Error 0x" << hr << ")"; return -1; } return (int)bright_value; } void MfController::setBrightness(int b) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long bright_value = b; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_Brightness, (long)bright_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setBrightness --> ERROR: Unable to set Brightness property value to " << bright_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Contrast * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * Values range from 0 to 10,000. **************************************************************************/ /* bool MfController::getAutomaticContrast() { HRESULT hr = S_OK; long flags = 0L; long contrast_value = 0L; hr = qualityControl->Get(VideoProcAmp_Contrast, &contrast_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticContrast --> ERROR: Unable to get Contrast property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticContrast(bool ac) { HRESULT hr = S_OK; long flags = 0L; long contrast_value = 0L; if (ac) { flags = VideoProcAmp_Flags_Auto; } else { contrast_value = getContrastCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_Contrast, contrast_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticContrast --> ERROR: Unable to set Contrast property value to " << ac << ". (Error 0x" << hr << ")"; } } */ int MfController::getContrast() { HRESULT hr = S_OK; long flags = 0L; long contrast_value = 0L; hr = qualityControl->Get(VideoProcAmp_Contrast, &contrast_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getContrast --> ERROR: Unable to get Contrast property value. (Error 0x" << hr << ")"; return -1; } return (int)contrast_value; } void MfController::setContrast(int c) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long contrast_value = c; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_Contrast, contrast_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setContrast --> ERROR: Unable to set Contrast property value to " << contrast_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Saturation * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * Values range from 0 to 10,000. **************************************************************************/ /* bool MfController::getAutomaticSaturation() { HRESULT hr = S_OK; long flags = 0L; long saturation_value = 0L; hr = qualityControl->Get(VideoProcAmp_Saturation, &saturation_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticSaturation --> ERROR: Unable to get Saturation property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticSaturation(bool as) { HRESULT hr = S_OK; long flags = 0L; long saturation_value = 0L; if (as) { flags = VideoProcAmp_Flags_Auto; } else { saturation_value = getSaturationCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_Saturation, saturation_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticSaturation --> ERROR: Unable to set Saturation property value to " << as << ". (Error 0x" << hr << ")"; } } */ int MfController::getSaturation() { HRESULT hr = S_OK; long flags = 0L; long saturation_value = 0L; hr = qualityControl->Get(VideoProcAmp_Saturation, &saturation_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getSaturation --> ERROR: Unable to get Saturation property value. (Error 0x" << hr << ")"; return -1; } return (int)saturation_value; } void MfController::setSaturation(int s) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long saturation_value = s; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_Saturation, saturation_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setSaturation --> ERROR: Unable to set Saturation property value to " << saturation_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Hue * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * Values range from  180,000 to 180,000. **************************************************************************/ /* bool MfController::getAutomaticHue() { HRESULT hr = S_OK; long flags = 0L; long hue_value; hr = qualityControl->Get(VideoProcAmp_Hue, &hue_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticHue --> ERROR: Unable to get Hue property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticHue(bool ah) { HRESULT hr = S_OK; long flags = 0L; long hue_value = 0L; if (ah) { flags = VideoProcAmp_Flags_Auto; } else { hue_value = getHueCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_Hue, hue_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticHue --> ERROR: Unable to set Hue property value to " << ah << ". (Error 0x" << hr << ")"; } } */ int MfController::getHue() { HRESULT hr = S_OK; long flags = 0L; long hue_value = 0L; hr = qualityControl->Get(VideoProcAmp_Hue, &hue_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getHue --> ERROR: Unable to get Hue property value. (Error 0x" << hr << ")"; return -1; } return (int)hue_value; } void MfController::setHue(int h) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long hue_value = h; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_Hue, hue_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setHue --> ERROR: Unable to set Hue property value to " << hue_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Gamma * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * Values range from 1 to 500. **************************************************************************/ /* bool MfController::getAutomaticGamma() { HRESULT hr = S_OK; long flags = 0L; long gamma_value = 0L; hr = qualityControl->Get(VideoProcAmp_Gamma, &gamma_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticGamma --> ERROR: Unable to get Gamma property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticGamma(bool ag) { HRESULT hr = S_OK; long flags = 0L; long gamma_value = 0L; if (ag) { flags = VideoProcAmp_Flags_Auto; } else { gamma_value = getGammaCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_Gamma, gamma_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticGamma --> ERROR: Unable to set Gamma property value to " << ag << ". (Error 0x" << hr << ")"; } } */ int MfController::getGamma() { HRESULT hr = S_OK; long flags = 0L; long gamma_value = 0L; hr = qualityControl->Get(VideoProcAmp_Gamma, &gamma_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getGamma --> ERROR: Unable to get Gamma property value. (Error 0x" << hr << ")"; return -1; } return (int)gamma_value; } void MfController::setGamma(int g) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long gamma_value = g; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_Gamma, gamma_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setGamma --> ERROR: Unable to set Gamma property value to " << gamma_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Sharpness * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * Values range from 0 to 100. **************************************************************************/ /* bool MfController::getAutomaticSharpness() { HRESULT hr = S_OK; long flags = 0L; long sharpness_value = 0L; hr = qualityControl->Get(VideoProcAmp_Sharpness, &sharpness_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticSharpness --> ERROR: Unable to get Sharpness property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticSharpness(bool as) { HRESULT hr = S_OK; long flags = 0L; long sharpness_value = 0L; if (as) { flags = VideoProcAmp_Flags_Auto; } else { sharpness_value = getSharpnessCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_Sharpness, sharpness_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticSharpness --> ERROR: Unable to set Sharpness property value to " << as << ". (Error 0x" << hr << ")"; } } */ int MfController::getSharpness() { HRESULT hr = S_OK; long flags = 0L; long sharpness_value = 0L; hr = qualityControl->Get(VideoProcAmp_Sharpness, &sharpness_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getSharpness --> ERROR: Unable to get Sharpness property value. (Error 0x" << hr << ")"; return -1; } return (int)sharpness_value; } void MfController::setSharpness(int s) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long sharpness_value = s; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_Sharpness, sharpness_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setSharpness --> ERROR: Unable to set Sharpness property value to " << sharpness_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Backlight Compensation * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * Possible values are 0 (off) and 1 (on). **************************************************************************/ /* bool MfController::getAutomaticBacklight() { HRESULT hr = S_OK; long flags = 0L; long backlight_value = 0L; hr = qualityControl->Get(VideoProcAmp_BacklightCompensation, &backlight_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticBacklight --> ERROR: Unable to get BacklightCompensation property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticBacklight(bool ab) { HRESULT hr = S_OK; long flags = 0L; long backlight_value = 0L; if (ab) { flags = VideoProcAmp_Flags_Auto; } else { backlight_value = getBacklightCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_BacklightCompensation, backlight_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticBacklight --> ERROR: Unable to set BacklightCompensation property value to " << ab << ". (Error 0x" << hr << ")"; } } */ int MfController::getBacklight() { HRESULT hr = S_OK; long flags = 0L; long backlight_value = 0L; hr = qualityControl->Get(VideoProcAmp_BacklightCompensation, &backlight_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getBacklight --> ERROR: Unable to get BacklightCompensation property value. (Error 0x" << hr << ")"; return -1; } return (int)backlight_value; } void MfController::setBacklight(int b) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long backlight_value = b; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_BacklightCompensation, backlight_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setBacklight --> ERROR: Unable to set BacklightCompensation property value to " << backlight_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * White Balance * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * The range of values depends on the device. **************************************************************************/ /* bool MfController::getAutomaticWhite() { HRESULT hr = S_OK; long flags = 0L; long white_value = 0L; hr = qualityControl->Get(VideoProcAmp_WhiteBalance, &white_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticWhite --> ERROR: Unable to get WhiteBalance property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticWhite(bool aw) { HRESULT hr = S_OK; long flags = 0L; long white_value = 0L; if (aw) { flags = VideoProcAmp_Flags_Auto; } else { white_value = getWhiteCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_WhiteBalance, white_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticWhite --> ERROR: Unable to set WhiteBalance property value to " << aw << ". (Error 0x" << hr << ")"; } } */ int MfController::getWhite() { HRESULT hr = S_OK; long flags = 0L; long white_value = 0L; hr = qualityControl->Get(VideoProcAmp_WhiteBalance, &white_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getWhite --> ERROR: Unable to get WhiteBalance property value. (Error 0x" << hr << ")"; return -1; } return (int)white_value; } void MfController::setWhite(int w) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long white_value = w; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_WhiteBalance, white_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setWhite --> ERROR: Unable to set WhiteBalance property value to " << white_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Gain * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * The range of values depends on the device. **************************************************************************/ /* bool MfController::getAutomaticGain() { HRESULT hr = S_OK; long flags = 0L; long gain_value = 0L; hr = qualityControl->Get(VideoProcAmp_Gain, &gain_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticGain --> ERROR: Unable to get Gain property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticGain(bool ag) { HRESULT hr = S_OK; long flags = 0L; long gain_value = 0L; if (ag) { flags = VideoProcAmp_Flags_Auto; } else { gain_value = getGainCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_Gain, gain_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticGain --> ERROR: Unable to set Gain property value to " << ag << ". (Error 0x" << hr << ")"; } } */ int MfController::getGain() { HRESULT hr = S_OK; long flags = 0L; long gain_value = 0L; hr = qualityControl->Get(VideoProcAmp_Gain, &gain_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getGain --> ERROR: Unable to get Gain property value. (Error 0x" << hr << ")"; return -1; } return (int)gain_value; } void MfController::setGain(int g) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long gain_value = g; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_Gain, gain_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setGain --> ERROR: Unable to set Gain property value to " << gain_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Color Enable * * http://msdn.microsoft.com/library/windows/desktop/dd407328.aspx: * The possible values are 0 (off) and 1 (on). **************************************************************************/ /* bool MfController::getAutomaticColor() { HRESULT hr = S_OK; long flags = 0L; long color_value = 0L; hr = qualityControl->Get(VideoProcAmp_ColorEnable, &color_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticColor --> ERROR: Unable to get ColorEnable property value. (Error 0x" << hr << ")"; return false; } if (flags & VideoProcAmp_Flags_Auto) { return true; } return false; } void MfController::setAutomaticColor(bool ac) { HRESULT hr = S_OK; long flags = 0L; long color_value = 0L; if (ac) { flags = VideoProcAmp_Flags_Auto; } else { color_value = getColorCaps()->getDefault(); flags = VideoProcAmp_Flags_Manual; } hr = qualityControl->Set(VideoProcAmp_ColorEnable, color_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticColor --> ERROR: Unable to set ColorEnable property value to " << ac << ". (Error 0x" << hr << ")"; } } */ int MfController::getColor() { HRESULT hr = S_OK; long flags = 0L; long color_value = 0L; hr = qualityControl->Get(VideoProcAmp_ColorEnable, &color_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getColor --> ERROR: Unable to get ColorEnable property value. (Error 0x" << hr << ")"; return -1; } return (int)color_value; } void MfController::setColor(int c) { HRESULT hr = S_OK; long flags = VideoProcAmp_Flags_Manual; long color_value = c; if (qualityControl == NULL) { return; } hr = qualityControl->Set(VideoProcAmp_ColorEnable, color_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setColor --> ERROR: Unable to set ColorEnable property value to " << color_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** ************************************************************************** * Camera control capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Exposure * * msdn.microsoft.com/de-de/library/aa925325.aspx: * The value range from -x to +y, for example: -3 = 1/8s, -2 = 1/4s, -1 = 1/2s, 0 = 1s, 1 = 2s, 2 = 4s, ... **************************************************************************/ bool MfController::getAutomaticExposure() { HRESULT hr = S_OK; long flags = 0L; long exposure_value = 0L; hr = cameraControl->Get(CameraControl_Exposure, &exposure_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticExposure --> ERROR: Unable to get Exposure property value. (Error 0x" << hr << ")"; return false; } if (flags & CameraControl_Flags_Auto) { return true; } return false; } void MfController::setAutomaticExposure(bool ae) { HRESULT hr = S_OK; long flags = 0L; long exposure_value = 0L; if (ae) { flags = CameraControl_Flags_Auto; } else { exposure_value = getExposureCaps()->getDefault(); flags = CameraControl_Flags_Manual; } hr = cameraControl->Set(CameraControl_Exposure, exposure_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticExposure --> ERROR: Unable to set Exposure property value to " << ae << ". (Error 0x" << hr << ")"; } } int MfController::getExposure() { HRESULT hr = S_OK; long flags = 0L; long exposure_value = 0L; hr = cameraControl->Get(CameraControl_Exposure, &exposure_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getExposure --> ERROR: Unable to get Exposure property value. (Error 0x" << hr << ")"; return -1; } return (int)exposure_value; } void MfController::setExposure(int e) { HRESULT hr = 0; long flags = CameraControl_Flags_Manual; long exposure_value = e; if (cameraControl == NULL) { return; } hr = cameraControl->Set(CameraControl_Exposure, exposure_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setExposure --> ERROR: Unable to set Exposure property value to " << exposure_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Zoom * * msdn.microsoft.com/de-de/library/aa925325.aspx: * The value range from 10 to 600, and the default is spezific to the device. **************************************************************************/ bool MfController::getAutomaticZoom() { HRESULT hr = S_OK; long flags = 0L; long zoom_value = 0L; hr = cameraControl->Get(CameraControl_Zoom, &zoom_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticZoom --> ERROR: Unable to get Zoom property value. (Error 0x" << hr << ")"; return false; } if (flags & CameraControl_Flags_Auto) { return true; } return false; } void MfController::setAutomaticZoom(bool az) { HRESULT hr = S_OK; long flags = 0L; long zoom_value = 0L; if (az) { flags = CameraControl_Flags_Auto; } else { zoom_value = getZoomCaps()->getDefault(); flags = CameraControl_Flags_Manual; } hr = cameraControl->Set(CameraControl_Zoom, zoom_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticZoom --> ERROR: Unable to set Zoom property value to " << az << ". (Error 0x" << hr << ")"; } } int MfController::getZoom() { HRESULT hr = S_OK; long flags = 0; long zoom_value = 0L; hr = cameraControl->Get(CameraControl_Zoom, &zoom_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getZoom --> ERROR: Unable to get Zoom property value. (Error 0x" << hr << ")"; return -1; } return (int)zoom_value; } void MfController::setZoom(int z) { HRESULT hr = S_OK; long flags = CameraControl_Flags_Manual; long zoom_value = z; if (cameraControl == NULL) { return; } hr = cameraControl->Set(CameraControl_Zoom, zoom_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setZoom --> ERROR: Unable to set Zoom property value to " << zoom_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Focus * * msdn.microsoft.com/de-de/library/aa925325.aspx: * The range and default value are spezific to the device. **************************************************************************/ bool MfController::getAutomaticFocus() { HRESULT hr = S_OK; long flags = 0L; long focus_value = 0L; hr = cameraControl->Get(CameraControl_Focus, &focus_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticFocus --> ERROR: Unable to get Focus property value. (Error 0x" << hr << ")"; return false; } if (flags & CameraControl_Flags_Auto) { return true; } return false; } void MfController::setAutomaticFocus(bool af) { HRESULT hr = S_OK; long flags = 0L; long focus_value = 0L; if (af) { flags = CameraControl_Flags_Auto; } else { focus_value = getFocusCaps()->getDefault(); flags = CameraControl_Flags_Manual; } hr = cameraControl->Set(CameraControl_Focus, focus_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticFocus --> ERROR: Unable to set Focus property value to " << af << ". (Error 0x" << hr << ")"; } } int MfController::getFocus() { HRESULT hr = S_OK; long flags = 0L; long focus_value = 0L; hr = cameraControl->Get(CameraControl_Focus, &focus_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getFocus --> ERROR: Unable to get Focus property value. (Error 0x" << hr << ")"; return -1; } return (int)focus_value; } void MfController::setFocus(int f) { HRESULT hr = S_OK; long flags = CameraControl_Flags_Manual; long focus_value = f; if (cameraControl == NULL) { return; } hr = cameraControl->Set(CameraControl_Focus, focus_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setFocus --> ERROR: Unable to set Focus property value to " << focus_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Pan * * msdn.microsoft.com/de-de/library/aa925325.aspx: * The value range from -180 to +180, and the default is zero. **************************************************************************/ /* bool MfController::getAutomaticPan() { HRESULT hr = S_OK; long flags = 0L; long pan_value = 0L; hr = cameraControl->Get(CameraControl_Pan, &pan_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticPan --> ERROR: Unable to get Pan property value. (Error 0x" << hr << ")"; return false; } if (flags & CameraControl_Flags_Auto) { return true; } return false; } void MfController::setAutomaticPan(bool ap) { HRESULT hr = S_OK; long flags = 0L; long pan_value = 0L; if (ap) { flags = CameraControl_Flags_Auto; } else { pan_value = getPanCaps()->getDefault(); flags = CameraControl_Flags_Manual; } hr = cameraControl->Set(CameraControl_Pan, pan_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticPan --> ERROR: Unable to set Pan property value to " << ap << ". (Error 0x" << hr << ")"; } } */ int MfController::getPan() { HRESULT hr = S_OK; long flags = 0L; long pan_value = 0L; hr = cameraControl->Get(CameraControl_Pan, &pan_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getPan --> ERROR: Unable to get Pan property value. (Error 0x" << hr << ")"; return -1; } return (int)pan_value; } void MfController::setPan(int p) { HRESULT hr = S_OK; long flags = CameraControl_Flags_Manual; long pan_value = p; if (cameraControl == NULL) { return; } hr = cameraControl->Set(CameraControl_Pan, pan_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setPan --> ERROR: Unable to set Pan property value to " << pan_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Tilt * * msdn.microsoft.com/de-de/library/aa925325.aspx: * The value range from -180 to +180, and the default is zero. **************************************************************************/ /* bool MfController::getAutomaticTilt() { HRESULT hr = S_OK; long flags = 0L; long tilt_value = 0L; hr = cameraControl->Get(CameraControl_Tilt, &tilt_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticTilt --> ERROR: Unable to get Tilt property value. (Error 0x" << hr << ")"; return false; } if (flags & CameraControl_Flags_Auto) { return true; } return false; } void MfController::setAutomaticTilt(bool at) { HRESULT hr = S_OK; long flags = 0L; long tilt_value = 0L; if (at) { flags = CameraControl_Flags_Auto; } else { tilt_value = getTiltCaps()->getDefault(); flags = CameraControl_Flags_Manual; } hr = cameraControl->Set(CameraControl_Tilt, tilt_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticTilt --> ERROR: Unable to set Tilt property value to " << at << ". (Error 0x" << hr << ")"; } } */ int MfController::getTilt() { HRESULT hr = S_OK; long flags = 0L; long tilt_value = 0L; hr = cameraControl->Get(CameraControl_Tilt, &tilt_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getTilt --> ERROR: Unable to get Tilt property value. (Error 0x" << hr << ")"; return -1; } return (int)tilt_value; } void MfController::setTilt(int t) { HRESULT hr = S_OK; long flags = CameraControl_Flags_Manual; long tilt_value = t; if (cameraControl == NULL) { return; } hr = cameraControl->Set(CameraControl_Tilt, tilt_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setTilt --> ERROR: Unable to set Zoom property value to " << tilt_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Iris * * msdn.microsoft.com/de-de/library/aa925325.aspx: * The value range in units of fstop * 10. **************************************************************************/ bool MfController::getAutomaticIris() { HRESULT hr = S_OK; long flags = 0L; long iris_value = 0L; hr = cameraControl->Get(CameraControl_Iris, &iris_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticIris --> ERROR: Unable to get Iris property value. (Error 0x" << hr << ")"; return false; } if (flags & CameraControl_Flags_Auto) { return true; } return false; } void MfController::setAutomaticIris(bool ai) { HRESULT hr = S_OK; long flags = 0L; long iris_value = 0L; if (ai) { flags = CameraControl_Flags_Auto; } else { iris_value = getZoomCaps()->getDefault(); flags = CameraControl_Flags_Manual; } hr = cameraControl->Set(CameraControl_Iris, iris_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticIris --> ERROR: Unable to set Iris property value to " << ai << ". (Error 0x" << hr << ")"; } } int MfController::getIris() { HRESULT hr = S_OK; long flags = 0L; long iris_value = 0L; hr = cameraControl->Get(CameraControl_Iris, &iris_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getIris --> ERROR: Unable to get Iris property value. (Error 0x" << hr << ")"; return -1; } return (int)iris_value; } void MfController::setIris(int i) { HRESULT hr = S_OK; long flags = CameraControl_Flags_Manual; long iris_value = i; if (cameraControl == NULL) { return; } hr = cameraControl->Set(CameraControl_Iris, (long)iris_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setIris --> ERROR: Unable to set Iris property value to " << iris_value << ". (Error 0x" << hr << ")"; } } /************************************************************************** * Roll * * msdn.microsoft.com/de-de/library/aa925325.aspx: * The value range from -180 to +180, and the default is zero. **************************************************************************/ bool MfController::getAutomaticRoll() { HRESULT hr = S_OK; long flags = 0L; long roll_value = 0L; hr = cameraControl->Get(CameraControl_Roll, &roll_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getAutomaticRoll --> ERROR: Unable to get Roll property value. (Error 0x" << hr << ")"; return false; } if (flags & CameraControl_Flags_Auto) { return true; } return false; } void MfController::setAutomaticRoll(bool ar) { HRESULT hr = S_OK; long flags = 0L; long roll_value = 0L; if (ar) { flags = CameraControl_Flags_Auto; } else { roll_value = getRollCaps()->getDefault(); flags = CameraControl_Flags_Manual; } hr = cameraControl->Set(CameraControl_Roll, roll_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setAutomaticRoll --> ERROR: Unable to set Roll property value to " << ar << ". (Error 0x" << hr << ")"; } } int MfController::getRoll() { HRESULT hr = S_OK; long flags = 0L; long roll_value = 0L; hr = cameraControl->Get(CameraControl_Roll, &roll_value, &flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::getRoll --> ERROR: Unable to get Roll property value. (Error 0x" << hr << ")"; return -1; } return (int)roll_value; } void MfController::setRoll(int r) { HRESULT hr = S_OK; long flags = CameraControl_Flags_Manual; long roll_value = r; if (cameraControl == NULL) { return; } hr = cameraControl->Set(CameraControl_Roll, roll_value, flags); Sleep(SLEEP_TIME); if (hr != S_OK) { qDebug() << "MfController::setRoll --> ERROR: Unable to set Roll property value to " << roll_value << ". (Error 0x" << hr << ")"; } } qstopmotion-2.3.2-Source/src/technical/grabber/mediafoundation/mfutil.cpp000755 000000 000000 00000032611 12654352322 026637 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "mfutil.h" #include #include void LogUINT32AsUINT64(const PROPVARIANT& var) { UINT32 uHigh = 0, uLow = 0; Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &uHigh, &uLow); qDebug() << uHigh << " x " << uLow; } float OffsetToFloat(const MFOffset& offset) { return offset.value + (static_cast(offset.fract) / 65536.0f); } HRESULT LogVideoArea(const PROPVARIANT& var) { if (var.caub.cElems < sizeof(MFVideoArea)) { return MF_E_BUFFERTOOSMALL; } MFVideoArea *pArea = (MFVideoArea*)var.caub.pElems; qDebug() << "(" << OffsetToFloat(pArea->OffsetX) << "," << OffsetToFloat(pArea->OffsetY) << ") (" << pArea->Area.cx << "," << pArea->Area.cy << ")"; return S_OK; } // Handle certain known special cases. HRESULT SpecialCaseAttributeValue(GUID guid, const PROPVARIANT& var) { if ((guid == MF_MT_FRAME_RATE) || (guid == MF_MT_FRAME_RATE_RANGE_MAX) || (guid == MF_MT_FRAME_RATE_RANGE_MIN) || (guid == MF_MT_FRAME_SIZE) || (guid == MF_MT_PIXEL_ASPECT_RATIO)) { // Attributes that contain two packed 32-bit values. LogUINT32AsUINT64(var); } else if ((guid == MF_MT_GEOMETRIC_APERTURE) || (guid == MF_MT_MINIMUM_DISPLAY_APERTURE) || (guid == MF_MT_PAN_SCAN_APERTURE)) { // Attributes that an MFVideoArea structure. return LogVideoArea(var); } else { return S_FALSE; } return S_OK; } HRESULT LogAttributeValueByIndex(IMFAttributes *pAttr, DWORD index) { QString GuidName; QString GuidValName; GUID guid = { 0 }; PROPVARIANT var; PropVariantInit(&var); HRESULT hr = pAttr->GetItemByIndex(index, &guid, &var); if (FAILED(hr)) { goto done; } GuidName = GetGUIDNameConst(guid); hr = SpecialCaseAttributeValue(guid, var); if (FAILED(hr)) { goto done; } if (hr == S_FALSE) { switch (var.vt) { case VT_UI4: qDebug() << "Item: " << GuidName << " Value: " << var.ulVal; break; case VT_UI8: qDebug() << "Item: " << GuidName << " Value: " << "!!var.uhVal!!"; break; case VT_R8: qDebug() << "Item: " << GuidName << " Value: " << var.dblVal; break; case VT_CLSID: GuidValName = GetGUIDNameConst(*var.puuid); qDebug() << "Item: " << GuidName << " Value: " << GuidValName; break; case VT_LPWSTR: qDebug() << "Item: " << GuidName << " Value: " << var.pwszVal; break; case VT_VECTOR | VT_UI1: qDebug() << "Item: " << GuidName << " Value: " << "!!byte array!!"; break; case VT_UNKNOWN: qDebug() << "Item: " << GuidName << " Value: " << "IUnknown"; break; default: qDebug() << "Item: " << GuidName << " Value: " << "!!Unexpected attribute type (vt = " << var.vt << ")!!"; break; } } done: PropVariantClear(&var); return hr; } HRESULT LogMediaType(IMFMediaType *pType) { UINT32 count = 0; HRESULT hr = pType->GetCount(&count); if (FAILED(hr)) { return hr; } if (count == 0) { qDebug() << "Empty media type."; } for (UINT32 i = 0; i < count; i++) { hr = LogAttributeValueByIndex(pType, i); if (FAILED(hr)) { break; } } return hr; } QString GetGUIDNameConst(const GUID& guid) { IF_EQUAL_RETURN(guid, MF_MT_MAJOR_TYPE); IF_EQUAL_RETURN(guid, MF_MT_MAJOR_TYPE); IF_EQUAL_RETURN(guid, MF_MT_SUBTYPE); IF_EQUAL_RETURN(guid, MF_MT_ALL_SAMPLES_INDEPENDENT); IF_EQUAL_RETURN(guid, MF_MT_FIXED_SIZE_SAMPLES); IF_EQUAL_RETURN(guid, MF_MT_COMPRESSED); IF_EQUAL_RETURN(guid, MF_MT_SAMPLE_SIZE); IF_EQUAL_RETURN(guid, MF_MT_WRAPPED_TYPE); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_NUM_CHANNELS); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_SAMPLES_PER_SECOND); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_AVG_BYTES_PER_SECOND); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_BLOCK_ALIGNMENT); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_BITS_PER_SAMPLE); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_VALID_BITS_PER_SAMPLE); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_SAMPLES_PER_BLOCK); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_CHANNEL_MASK); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_FOLDDOWN_MATRIX); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_PEAKREF); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_PEAKTARGET); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_AVGREF); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_AVGTARGET); IF_EQUAL_RETURN(guid, MF_MT_AUDIO_PREFER_WAVEFORMATEX); IF_EQUAL_RETURN(guid, MF_MT_AAC_PAYLOAD_TYPE); IF_EQUAL_RETURN(guid, MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION); IF_EQUAL_RETURN(guid, MF_MT_FRAME_SIZE); IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE); IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE_RANGE_MAX); IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE_RANGE_MIN); IF_EQUAL_RETURN(guid, MF_MT_PIXEL_ASPECT_RATIO); IF_EQUAL_RETURN(guid, MF_MT_DRM_FLAGS); IF_EQUAL_RETURN(guid, MF_MT_PAD_CONTROL_FLAGS); IF_EQUAL_RETURN(guid, MF_MT_SOURCE_CONTENT_HINT); IF_EQUAL_RETURN(guid, MF_MT_VIDEO_CHROMA_SITING); IF_EQUAL_RETURN(guid, MF_MT_INTERLACE_MODE); IF_EQUAL_RETURN(guid, MF_MT_TRANSFER_FUNCTION); IF_EQUAL_RETURN(guid, MF_MT_VIDEO_PRIMARIES); IF_EQUAL_RETURN(guid, MF_MT_CUSTOM_VIDEO_PRIMARIES); IF_EQUAL_RETURN(guid, MF_MT_YUV_MATRIX); IF_EQUAL_RETURN(guid, MF_MT_VIDEO_LIGHTING); IF_EQUAL_RETURN(guid, MF_MT_VIDEO_NOMINAL_RANGE); IF_EQUAL_RETURN(guid, MF_MT_GEOMETRIC_APERTURE); IF_EQUAL_RETURN(guid, MF_MT_MINIMUM_DISPLAY_APERTURE); IF_EQUAL_RETURN(guid, MF_MT_PAN_SCAN_APERTURE); IF_EQUAL_RETURN(guid, MF_MT_PAN_SCAN_ENABLED); IF_EQUAL_RETURN(guid, MF_MT_AVG_BITRATE); IF_EQUAL_RETURN(guid, MF_MT_AVG_BIT_ERROR_RATE); IF_EQUAL_RETURN(guid, MF_MT_MAX_KEYFRAME_SPACING); IF_EQUAL_RETURN(guid, MF_MT_DEFAULT_STRIDE); IF_EQUAL_RETURN(guid, MF_MT_PALETTE); IF_EQUAL_RETURN(guid, MF_MT_USER_DATA); IF_EQUAL_RETURN(guid, MF_MT_AM_FORMAT_TYPE); IF_EQUAL_RETURN(guid, MF_MT_MPEG_START_TIME_CODE); IF_EQUAL_RETURN(guid, MF_MT_MPEG2_PROFILE); IF_EQUAL_RETURN(guid, MF_MT_MPEG2_LEVEL); IF_EQUAL_RETURN(guid, MF_MT_MPEG2_FLAGS); IF_EQUAL_RETURN(guid, MF_MT_MPEG_SEQUENCE_HEADER); IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_SRC_PACK_0); IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_CTRL_PACK_0); IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_SRC_PACK_1); IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_CTRL_PACK_1); IF_EQUAL_RETURN(guid, MF_MT_DV_VAUX_SRC_PACK); IF_EQUAL_RETURN(guid, MF_MT_DV_VAUX_CTRL_PACK); IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_HEADER); IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_FORMAT); IF_EQUAL_RETURN(guid, MF_MT_IMAGE_LOSS_TOLERANT); IF_EQUAL_RETURN(guid, MF_MT_MPEG4_SAMPLE_DESCRIPTION); IF_EQUAL_RETURN(guid, MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY); IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_4CC); IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_WAVE_FORMAT_TAG); // Media types IF_EQUAL_RETURN(guid, MFMediaType_Audio); IF_EQUAL_RETURN(guid, MFMediaType_Video); IF_EQUAL_RETURN(guid, MFMediaType_Protected); IF_EQUAL_RETURN(guid, MFMediaType_SAMI); IF_EQUAL_RETURN(guid, MFMediaType_Script); IF_EQUAL_RETURN(guid, MFMediaType_Image); IF_EQUAL_RETURN(guid, MFMediaType_HTML); IF_EQUAL_RETURN(guid, MFMediaType_Binary); IF_EQUAL_RETURN(guid, MFMediaType_FileTransfer); IF_EQUAL_RETURN(guid, MFVideoFormat_AI44); // FCC('AI44') IF_EQUAL_RETURN(guid, MFVideoFormat_ARGB32); // D3DFMT_A8R8G8B8 IF_EQUAL_RETURN(guid, MFVideoFormat_AYUV); // FCC('AYUV') IF_EQUAL_RETURN(guid, MFVideoFormat_DV25); // FCC('dv25') IF_EQUAL_RETURN(guid, MFVideoFormat_DV50); // FCC('dv50') IF_EQUAL_RETURN(guid, MFVideoFormat_DVH1); // FCC('dvh1') IF_EQUAL_RETURN(guid, MFVideoFormat_DVSD); // FCC('dvsd') IF_EQUAL_RETURN(guid, MFVideoFormat_DVSL); // FCC('dvsl') IF_EQUAL_RETURN(guid, MFVideoFormat_H264); // FCC('H264') IF_EQUAL_RETURN(guid, MFVideoFormat_I420); // FCC('I420') IF_EQUAL_RETURN(guid, MFVideoFormat_IYUV); // FCC('IYUV') IF_EQUAL_RETURN(guid, MFVideoFormat_M4S2); // FCC('M4S2') IF_EQUAL_RETURN(guid, MFVideoFormat_MJPG); IF_EQUAL_RETURN(guid, MFVideoFormat_MP43); // FCC('MP43') IF_EQUAL_RETURN(guid, MFVideoFormat_MP4S); // FCC('MP4S') IF_EQUAL_RETURN(guid, MFVideoFormat_MP4V); // FCC('MP4V') IF_EQUAL_RETURN(guid, MFVideoFormat_MPG1); // FCC('MPG1') IF_EQUAL_RETURN(guid, MFVideoFormat_MSS1); // FCC('MSS1') IF_EQUAL_RETURN(guid, MFVideoFormat_MSS2); // FCC('MSS2') IF_EQUAL_RETURN(guid, MFVideoFormat_NV11); // FCC('NV11') IF_EQUAL_RETURN(guid, MFVideoFormat_NV12); // FCC('NV12') IF_EQUAL_RETURN(guid, MFVideoFormat_P010); // FCC('P010') IF_EQUAL_RETURN(guid, MFVideoFormat_P016); // FCC('P016') IF_EQUAL_RETURN(guid, MFVideoFormat_P210); // FCC('P210') IF_EQUAL_RETURN(guid, MFVideoFormat_P216); // FCC('P216') IF_EQUAL_RETURN(guid, MFVideoFormat_RGB24); // D3DFMT_R8G8B8 IF_EQUAL_RETURN(guid, MFVideoFormat_RGB32); // D3DFMT_X8R8G8B8 IF_EQUAL_RETURN(guid, MFVideoFormat_RGB555); // D3DFMT_X1R5G5B5 IF_EQUAL_RETURN(guid, MFVideoFormat_RGB565); // D3DFMT_R5G6B5 IF_EQUAL_RETURN(guid, MFVideoFormat_RGB8); IF_EQUAL_RETURN(guid, MFVideoFormat_UYVY); // FCC('UYVY') IF_EQUAL_RETURN(guid, MFVideoFormat_v210); // FCC('v210') IF_EQUAL_RETURN(guid, MFVideoFormat_v410); // FCC('v410') IF_EQUAL_RETURN(guid, MFVideoFormat_WMV1); // FCC('WMV1') IF_EQUAL_RETURN(guid, MFVideoFormat_WMV2); // FCC('WMV2') IF_EQUAL_RETURN(guid, MFVideoFormat_WMV3); // FCC('WMV3') IF_EQUAL_RETURN(guid, MFVideoFormat_WVC1); // FCC('WVC1') IF_EQUAL_RETURN(guid, MFVideoFormat_Y210); // FCC('Y210') IF_EQUAL_RETURN(guid, MFVideoFormat_Y216); // FCC('Y216') IF_EQUAL_RETURN(guid, MFVideoFormat_Y410); // FCC('Y410') IF_EQUAL_RETURN(guid, MFVideoFormat_Y416); // FCC('Y416') IF_EQUAL_RETURN(guid, MFVideoFormat_Y41P); IF_EQUAL_RETURN(guid, MFVideoFormat_Y41T); IF_EQUAL_RETURN(guid, MFVideoFormat_YUY2); // FCC('YUY2') IF_EQUAL_RETURN(guid, MFVideoFormat_YV12); // FCC('YV12') IF_EQUAL_RETURN(guid, MFVideoFormat_YVYU); IF_EQUAL_RETURN(guid, MFAudioFormat_PCM); // WAVE_FORMAT_PCM IF_EQUAL_RETURN(guid, MFAudioFormat_Float); // WAVE_FORMAT_IEEE_FLOAT IF_EQUAL_RETURN(guid, MFAudioFormat_DTS); // WAVE_FORMAT_DTS IF_EQUAL_RETURN(guid, MFAudioFormat_Dolby_AC3_SPDIF); // WAVE_FORMAT_DOLBY_AC3_SPDIF IF_EQUAL_RETURN(guid, MFAudioFormat_DRM); // WAVE_FORMAT_DRM IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV8); // WAVE_FORMAT_WMAUDIO2 IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV9); // WAVE_FORMAT_WMAUDIO3 IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudio_Lossless); // WAVE_FORMAT_WMAUDIO_LOSSLESS IF_EQUAL_RETURN(guid, MFAudioFormat_WMASPDIF); // WAVE_FORMAT_WMASPDIF IF_EQUAL_RETURN(guid, MFAudioFormat_MSP1); // WAVE_FORMAT_WMAVOICE9 IF_EQUAL_RETURN(guid, MFAudioFormat_MP3); // WAVE_FORMAT_MPEGLAYER3 IF_EQUAL_RETURN(guid, MFAudioFormat_MPEG); // WAVE_FORMAT_MPEG IF_EQUAL_RETURN(guid, MFAudioFormat_AAC); // WAVE_FORMAT_MPEG_HEAAC IF_EQUAL_RETURN(guid, MFAudioFormat_ADTS); // WAVE_FORMAT_MPEG_ADTS_AAC return NULL; } qstopmotion-2.3.2-Source/src/technical/grabber/mediafoundation/mfgrabber.cpp000755 000000 000000 00000060706 12670474563 027306 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "mfgrabber.h" #include "mfcontroller.h" #include "mfutil.h" #include "technical/grabber/imageconverter.h" #include "technical/preferencestool.h" #include "technical/util.h" #include #include #include // #include // Include files of the media foundation // #include "mfidl.h" // #include #include #define APP_SINK_MAX_BUFFERS 2 /************************************************************************** * Implementation of the image grabber functions using the * Microsoft Media Foundation API. **************************************************************************/ MfGrabber::MfGrabber(Frontend *f) : ImageGrabber(f) { qDebug() << "MfGrabber::Constructor --> Start"; HRESULT hr; mediaSource = NULL; sourceReader = NULL; frameData = NULL; frameLength = 0; width = -1; height = -1; stride = -1; hr = MFStartup(MF_VERSION); if (!SUCCEEDED(hr)) { // Media foundation can't be started qFatal("MfGrabber::Constructor --> Error: Cannot start the media foundation!"); } qDebug() << "MfGrabber::Constructor --> End"; } MfGrabber::~MfGrabber() { qDebug() << "MfGrabber::Destructor --> Start"; HRESULT hr; hr = MFShutdown(); if (!SUCCEEDED(hr)) { // Media foundation can't be shuted down qFatal("MfGrabber::Destructor --> Error: Cannot shut down the media foundation!"); } qDebug() << "MfGrabber::Destructor --> End"; } IMFMediaSource* MfGrabber::getSource() { return mediaSource; } bool MfGrabber::initialization(QVector &devices) { qDebug() << "MfGrabber::initialization --> Start"; PreferencesTool *pref = frontend->getPreferences(); int value; HRESULT hr = S_OK; IMFAttributes* pAttributes = NULL; IMFActivate** ppDevices = NULL; UINT32 deviceCount = 0; ImageGrabberDevice* device = NULL; MfController* deviceController = NULL; qDebug() << "MfGrabber::initialization --> Check devices of mfwvideosrc"; // Initializes the COM library on the current thread and identifies // the concurrency model as single-thread apartment (STA). // CoInitialize(NULL); CoInitializeEx(NULL, COINIT_MULTITHREADED); //--------------------------------------------------------------------- // Search all possible devices //--------------------------------------------------------------------- hr = MFCreateAttributes(&pAttributes, 2); if (!SUCCEEDED(hr)) { qDebug() << "MfGrabber::initialization --> Error: cannot create video input device attributes"; return false; } hr = pAttributes->SetGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID ); if (!SUCCEEDED(hr)) { qDebug() << "MfGrabber::initialization --> Error: cannot set video input device attributes"; return false; } hr = MFEnumDeviceSources(pAttributes, &ppDevices, &deviceCount); if (!SUCCEEDED(hr)) { qDebug() << "MfGrabber::initialization --> Error: cannot enumerate video input devices"; return false; } if(deviceCount > 0) { for(UINT32 i = 0; i < deviceCount; i++) { device = new ImageGrabberDevice(); device->setDeviceIndex(i); hr = readDeviceInfo(ppDevices[i], device); if (SUCCEEDED(hr)) { // Add the new device to the device list devices.append(device); // Add the Controller to the new device if (pref->getIntegerPreference("preferences", "mediafoundationcontroller", value) == false) { value = false; } if ((int)true == value) { deviceController = new MfController(0); device->setController(deviceController); // Initalize the device controller deviceController->initialization(this, device); } } else { // Delete the new device delete device; device = NULL; } SafeRelease(&mediaSource); // vds_Devices.push_back(vd); SafeRelease(&ppDevices[i]); } CoTaskMemFree(ppDevices); ppDevices = NULL; deviceCount = 0; } else { qDebug() << "MfGrabber::initialization --> Warning: no video input devices"; hr = -1; } qDebug() << "MfGrabber::initialization --> device count: " << devices.size(); if (0 == devices.size()) { qDebug() << "MfGrabber::initialization --> End (false)"; return false; } qDebug() << "MfGrabber::initialization --> End (true)"; return true; } bool MfGrabber::setUp() { qDebug() << "MfGrabber::setUp --> Start"; int videoSource = frontend->getProject()->getVideoSource(); ImageGrabberDevice* videoDevice = frontend->getDevice(videoSource); int deviceIndex = videoDevice->getDeviceIndex(); HRESULT hr = S_OK; IMFAttributes* devAttr = NULL; IMFActivate** camDevices = NULL; UINT32 camCount = 0; IMFMediaType* mediaType = NULL; IMFMediaType* newMediaType = NULL; DWORD dwMediaTypeIndex = 0; UINT32 typeWidth; UINT32 typeHeight; GUID typeMajorType; GUID typeSubType; int resIndex = -1; hr = MFCreateAttributes(&devAttr, 1); if (!SUCCEEDED(hr)) { return false; } hr = devAttr->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID); if (!SUCCEEDED(hr)) { SafeRelease(&devAttr); return false; } hr = MFEnumDeviceSources(devAttr, &camDevices, &camCount); if (!SUCCEEDED(hr)) { qDebug() << "MfGrabber::setUp --> Cannot create the video capture device"; SafeRelease(&devAttr); return false; } SafeRelease(&devAttr); if (deviceIndex > int(camCount)) { return false; } hr = camDevices[deviceIndex]->ActivateObject(__uuidof(IMFMediaSource), (void**)&mediaSource); if (!SUCCEEDED(hr)) { return false; } hr = MFCreateSourceReaderFromMediaSource(mediaSource, NULL, &sourceReader); if (!SUCCEEDED(hr)) { SafeRelease(&mediaSource); return false; } hr = MFCreateMediaType(&newMediaType); if (!SUCCEEDED(hr)) { SafeRelease(&sourceReader); SafeRelease(&mediaSource); return false; } //----------------------------- // Find usable MediaType //----------------------------- resIndex = frontend->getProject()->getResolution(); GrabberResolution resolution = frontend->getResolution(resIndex); while (SUCCEEDED(hr)) { hr = sourceReader->GetNativeMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, dwMediaTypeIndex, &mediaType); if (hr == MF_E_NO_MORE_TYPES) { hr = S_OK; break; } if (!SUCCEEDED(hr)) { SafeRelease(&sourceReader); SafeRelease(&mediaSource); return false; } mediaType->GetGUID(MF_MT_MAJOR_TYPE, &typeMajorType); mediaType->GetGUID(MF_MT_SUBTYPE, &typeSubType); hr = MFGetAttributeSize(mediaType, MF_MT_FRAME_SIZE, &typeWidth, &typeHeight); if (FAILED(hr)) { SafeRelease(&mediaType); SafeRelease(&sourceReader); SafeRelease(&mediaSource); return false; } if ((resolution.getWidth() == typeWidth) && (resolution.getHeight() == typeHeight)) { switch (resolution.getFormat()) { case GrabberResolution::bgr24Format: if (typeSubType == MFVideoFormat_RGB24) { mediaType->CopyAllItems(newMediaType); } break; case GrabberResolution::ayuvFormat: if (typeSubType == MFVideoFormat_AYUV) { mediaType->CopyAllItems(newMediaType); } break; case GrabberResolution::yuv2Format: if (typeSubType == MFVideoFormat_YUY2) { mediaType->CopyAllItems(newMediaType); } break; case GrabberResolution::uyvyFormat: if (typeSubType == MFVideoFormat_UYVY) { mediaType->CopyAllItems(newMediaType); } break; case GrabberResolution::yv12Format: if (typeSubType == MFVideoFormat_YV12) { mediaType->CopyAllItems(newMediaType); } break; case GrabberResolution::yuv420mFormat: if (typeSubType == MFVideoFormat_I420) { mediaType->CopyAllItems(newMediaType); } break; case GrabberResolution::nv12Format: if (typeSubType == MFVideoFormat_NV12) { mediaType->CopyAllItems(newMediaType); } break; case GrabberResolution::mjpegFormat: if (typeSubType == MFVideoFormat_MJPG) { mediaType->CopyAllItems(newMediaType); } break; } } QString majorTypeString = GetGUIDNameConst(typeMajorType); QString subTypeString = GetGUIDNameConst(typeSubType); LONG typeStride = (LONG)MFGetAttributeUINT32(mediaType, MF_MT_DEFAULT_STRIDE, 1); qDebug() << "MfGrabber::setUp --> Media Type (" << dwMediaTypeIndex << "): " << majorTypeString << " - " << subTypeString << " Size: " << typeWidth << "x" << typeHeight << " Stride: " << typeStride; LogMediaType(mediaType); SafeRelease(&mediaType); dwMediaTypeIndex++; } //------------------------------ // Use the found media type //------------------------------ hr = sourceReader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, newMediaType); if (!SUCCEEDED(hr)) { SafeRelease(&newMediaType); SafeRelease(&sourceReader); SafeRelease(&mediaSource); return false; } SafeRelease(&newMediaType); hr = sourceReader->GetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, &mediaType); if (!SUCCEEDED(hr)) { SafeRelease(&sourceReader); SafeRelease(&mediaSource); return false; } hr = mediaType->GetGUID(MF_MT_MAJOR_TYPE, &majorType); if (!SUCCEEDED(hr)) { SafeRelease(&mediaType); SafeRelease(&sourceReader); SafeRelease(&mediaSource); return false; } hr = mediaType->GetGUID(MF_MT_SUBTYPE, &subType); if (!SUCCEEDED(hr)) { SafeRelease(&mediaType); SafeRelease(&sourceReader); SafeRelease(&mediaSource); return false; } hr = MFGetAttributeSize(mediaType, MF_MT_FRAME_SIZE, &width, &height); if (FAILED(hr)) { SafeRelease(&mediaType); SafeRelease(&sourceReader); SafeRelease(&mediaSource); return false; } stride = (LONG)MFGetAttributeUINT32(mediaType, MF_MT_DEFAULT_STRIDE, 1); QString majorTypeString = GetGUIDNameConst(majorType); QString subTypeString = GetGUIDNameConst(subType); qDebug() << "MfGrabber::setUp --> Current Media Type: " << majorTypeString << " - " << subTypeString << " Size: " << width << "x" << height << " Stride: " << stride; LogMediaType(mediaType); if (subType == MFVideoFormat_RGB24) { return true; } if (subType == MFVideoFormat_AYUV) { return true; } if (subType == MFVideoFormat_YUY2) { return true; } if (subType == MFVideoFormat_I420) { return true; } if (subType == MFVideoFormat_MJPG) { return true; } SafeRelease(&mediaType); SafeRelease(&sourceReader); SafeRelease(&mediaSource); qDebug() << "MfGrabber::setUp --> End"; return false; } bool MfGrabber::grab() { return true; } const QImage MfGrabber::getImage() { QImage image; const BYTE* data = NULL; int Tries = 10; while (image.isNull() && --Tries) { getRawFrame(image); } if (firstImage) { firstImage = false; } return image; } const QImage MfGrabber::getLiveImage() { // liveImage.load(filePath); liveImage = getImage(); return liveImage; } const QImage MfGrabber::getRawImage() { // rawImage.load(filePath); rawImage = getImage(); return rawImage; } bool MfGrabber::tearDown() { qDebug() << "MfGrabber::tearDown --> Start"; SafeRelease(&sourceReader); SafeRelease(&mediaSource); qDebug() << "MfGrabber::tearDown --> End"; return true; } HRESULT MfGrabber::readDeviceInfo(IMFActivate *pActivate, ImageGrabberDevice *device) { qDebug() << "MfGrabber::readDeviceInfo --> Start"; HRESULT hr = S_OK; if (pActivate) { LPWSTR FriendlyName = NULL; UINT32 cchLength; hr = pActivate->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &FriendlyName, &cchLength); if (!SUCCEEDED(hr)) { // Error reading friendly name return hr; } device->setDeviceId(QString::fromUtf16((const ushort*)FriendlyName)); device->setDeviceName(QString::fromUtf16((const ushort*)FriendlyName) + " (MMF)"); device->setDeviceSource(ImageGrabberDevice::mediaFoundationSource); hr = pActivate->ActivateObject(__uuidof(IMFMediaSource), (void**)&mediaSource ); if (!SUCCEEDED(hr)) { // Error activating the source if(FriendlyName) { CoTaskMemFree(FriendlyName); } return hr; } enumerateCaptureFormats(mediaSource, device); // SafeRelease(&mediaSource); // Frees allocated memory if(FriendlyName) { CoTaskMemFree(FriendlyName); } } qDebug() << "MfGrabber::readDeviceInfo --> End"; return hr; } HRESULT MfGrabber::enumerateCaptureFormats(IMFMediaSource *pSource, ImageGrabberDevice *device) { qDebug() << "MfGrabber::enumerateCaptureFormats --> Start"; HRESULT hr = S_OK; IMFPresentationDescriptor* pPD = NULL; IMFStreamDescriptor* pSD = NULL; IMFMediaTypeHandler* pHandler = NULL; IMFMediaType* pType = NULL; BOOL fSelected; DWORD cTypes = 0; hr = pSource->CreatePresentationDescriptor(&pPD); if (FAILED(hr)) { goto done; } hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD); if (FAILED(hr)) { goto done; } hr = pSD->GetMediaTypeHandler(&pHandler); if (FAILED(hr)) { goto done; } hr = pHandler->GetMediaTypeCount(&cTypes); if (FAILED(hr)) { goto done; } for (DWORD i = 0; i < cTypes; i++) { PROPVARIANT val; unsigned int outputWidth = 0; unsigned int outputHeight = 0; unsigned int outputFormat = 0; QString GUID_name; UINT32 uHigh = 0; UINT32 uLow = 0; PropVariantInit(&val); hr = pHandler->GetMediaTypeByIndex(i, &pType); if (FAILED(hr)) { goto done; } // LogMediaType(pType); // MediaType MT = FormatReader::Read(pType); hr = pType->GetItem(MF_MT_FRAME_SIZE, &val); if (FAILED(hr)) { goto done; } // LogUINT32AsUINT64New(val, uHigh, uLow); Unpack2UINT32AsUINT64(val.uhVal.QuadPart, &uHigh, &uLow); outputWidth = uHigh; outputHeight = uLow; hr = PropVariantClear(&val); // Read the Videoundertyp-GUID hr = pType->GetItem(MF_MT_SUBTYPE, &val); if (FAILED(hr)) { goto done; } // GUID is in val.puuid GUID_name = GetGUIDNameConst(*val.puuid); if (*val.puuid == MFVideoFormat_RGB24) { outputFormat = GrabberResolution::bgr24Format; } else if (*val.puuid == MFVideoFormat_AYUV) { outputFormat = GrabberResolution::ayuvFormat; } else if (*val.puuid == MFVideoFormat_YUY2) { outputFormat = GrabberResolution::yuv2Format; } else if (*val.puuid == MFVideoFormat_UYVY) { outputFormat = GrabberResolution::uyvyFormat; } else if (*val.puuid == MFVideoFormat_YV12) { outputFormat = GrabberResolution::yv12Format; } else if (*val.puuid == MFVideoFormat_I420) { outputFormat = GrabberResolution::yuv420mFormat; } else if (*val.puuid == MFVideoFormat_NV12) { outputFormat = GrabberResolution::nv12Format; } else if (*val.puuid == MFVideoFormat_MJPG) { outputFormat = GrabberResolution::mjpegFormat; } else { qDebug() << "MfGrabber::enumerateCaptureFormats --> Not supported format (" << i << "): " << outputWidth << " x " << outputHeight << " [" << GUID_name << "]"; outputFormat = GrabberResolution::unknownFormat; } device->addResolution(GrabberResolution(outputWidth, outputHeight, outputFormat, false)); hr = PropVariantClear(&val); SafeRelease(&pType); } done: SafeRelease(&pPD); SafeRelease(&pSD); SafeRelease(&pHandler); SafeRelease(&pType); qDebug() << "MfGrabber::enumerateCaptureFormats --> End"; return hr; } HRESULT MfGrabber::SetDeviceFormat(IMFMediaSource *pSource, DWORD dwFormatIndex) { qDebug() << "MfGrabber::SetDeviceFormat --> Start"; IMFPresentationDescriptor* pPD = NULL; IMFStreamDescriptor* pSD = NULL; IMFMediaTypeHandler* pHandler = NULL; IMFMediaType* pType = NULL; HRESULT hr = pSource->CreatePresentationDescriptor(&pPD); if (FAILED(hr)) { goto done; } BOOL fSelected; hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD); if (FAILED(hr)) { goto done; } hr = pSD->GetMediaTypeHandler(&pHandler); if (FAILED(hr)) { goto done; } hr = pHandler->GetMediaTypeByIndex(dwFormatIndex, &pType); if (FAILED(hr)) { goto done; } hr = pHandler->SetCurrentMediaType(pType); done: SafeRelease(&pPD); SafeRelease(&pSD); SafeRelease(&pHandler); SafeRelease(&pType); qDebug() << "MfGrabber::SetDeviceFormat --> End"; return hr; } void MfGrabber::getRawFrame(QImage &image) { qDebug() << "MfGrabber::getRawFrame --> Start"; HRESULT hr = S_OK; IMFMediaBuffer* buffer = NULL; IMFSample* sample = NULL; DWORD dwFlags = 0x00000000U; BYTE* pixels = NULL; DWORD nPixels = 0; int imageLoaded = 0; hr = sourceReader->ReadSample((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, NULL, &dwFlags, NULL, &sample); if (FAILED(hr) || (sample == NULL) || ((dwFlags & MF_SOURCE_READERF_ENDOFSTREAM) != 0)) { goto done; } hr = sample->ConvertToContiguousBuffer(&buffer); if (FAILED(hr)) { goto done; } hr = buffer->Lock(&pixels, NULL, &nPixels); if (FAILED(hr)) { goto done; } // Prepare the buffer to convert to QImage::Format_ARGB32 if (nPixels < 1) { goto unlock; } if (frameSize != QSize(width, height)) { frameSize = QSize(width, height); safeDeleteArray(frameData); frameData = new uchar[width * height * 4]; // New frame data for ARGB 8bit } if (subType == MFVideoFormat_RGB24) { // Read a image in RGB24 format ==> TextureFormat::Format_RGB_8 convert_bgr24_to_xbgr32_buffer(pixels, frameData, width, height, nPixels, stride); } if (subType == MFVideoFormat_AYUV) { // Read a image in AYUV (AYCbCr BT.601) // 4:4:4 Format, 32 Bits per Pixel convert_ayuv_to_abgr32_buffer(pixels, frameData, width, height, nPixels, stride); } if (subType == MFVideoFormat_YUY2) { // Read a image in YUY2 (YCbY2) format ==> TextureFormat::Format_YUY2 // 4:2:2 Format, 16 Bits per Pixel convert_yuy2_to_xbgr32_buffer(pixels, frameData, width, height, nPixels, stride); } if (subType == MFVideoFormat_UYVY) { // Read a image in UYVY (CbYCrY) // 4:2:2 Format, 16 Bits per Pixel convert_uyvy_to_xbgr32_buffer(pixels, frameData, width, height, nPixels, stride); } if (subType == MFVideoFormat_YV12) { // Read a image in YV12 (YCr12) // 4:2:0 Format, 12 Bits per Pixel convert_yv12_to_xbgr32_buffer(pixels, frameData, width, height, nPixels, stride); } if (subType == MFVideoFormat_I420) { // Read a image in I420 (YCr12) // 4:2:0 Format, 12 Bits per Pixel convert_yuv420m_to_xbgr32_buffer(pixels, frameData, width, height, nPixels, stride); } if (subType == MFVideoFormat_NV12) { // Read a image in NV12 (NCr12) // 4:2:0 Format, 12 Bits per Pixel convert_nv12_to_xbgr32_buffer(pixels, frameData, width, height, nPixels, stride); } if (subType == MFVideoFormat_MJPG) { // Read a image in MJPG format const int bufSize = nPixels + JPEG_DHT_LENGTH; unsigned char* jpegBuf1 = new unsigned char[bufSize]; // Convert to JPEG and use load function if (mjpegToJpeg(pixels, jpegBuf1, nPixels) == 0) { image.loadFromData(jpegBuf1, nPixels + JPEG_DHT_LENGTH); imageLoaded = 1; } else { qDebug() << "V4L2Grabber::getImage --> Error: Can not convert mjpeg to jpeg"; } delete jpegBuf1; } // MFVideoFormat_RGB32 ==> TextureFormat::Format_RGBA_8 // MFVideoFormat_ARGB32 if (imageLoaded == 0) { image = QImage(QSize(width, height), QImage::Format_ARGB32); BYTE* dst = const_cast(image.constBits()); const BYTE* src = const_cast(frameData); const BYTE* const srcEnd = src + width * height * 4; while (src < srcEnd) { *dst++ = *src++; } } unlock: buffer->Unlock(); done: SafeRelease(&buffer); SafeRelease(&sample); qDebug() << "MfGrabber::getRawFrame --> End"; } qstopmotion-2.3.2-Source/src/technical/grabber/mediafoundation/mfgrabber.h000755 000000 000000 00000007656 13011043104 026725 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef MEDIAFROUNDATION_MFGRABBER_H #define MEDIAFROUNDATION_MFGRABBER_H #include "technical/grabber/imagegrabber.h" #include "technical/grabber/imagegrabberdevice.h" // Include files of the media foundation #include #include #include #include /** * Video grabber class useing the Microsoft Media Foundation API. * * @author Ralf Lange */ class MfGrabber : public ImageGrabber { Q_OBJECT public: /** * Initializes the member variables. * @param filePath path to the output file grabbed from a device */ MfGrabber(Frontend *f); /** * Destructor */ ~MfGrabber(); /** * Initialization of the Command line grabber * @param devices The vector of initialized devices. * @return true on success, false otherwise */ bool initialization(QVector &devices); /** * Starts the grabber if it is marked to be run in deamon mode. * @return true on success, false otherwise */ bool setUp(); /** * Get the live image from the camera */ const QImage getLiveImage(); /** * Get the raw image from the camera */ const QImage getRawImage(); /** * Grabs one picture from the device. * @return true on success, false otherwise */ bool grab(); /** * Shut downs the grabber process either if it is run in deamon * mode or "single grab" mode. * @return true on success, false otherwise */ bool tearDown(); IMFMediaSource* getSource(); private: HRESULT readDeviceInfo(IMFActivate *pActivate, ImageGrabberDevice *device); HRESULT enumerateCaptureFormats(IMFMediaSource *pSource, ImageGrabberDevice *device); HRESULT SetDeviceFormat(IMFMediaSource *pSource, DWORD dwFormatIndex); void getRawFrame(QImage &image); /** * Get the actual image from the media foundation interface. */ const QImage getImage(); int activeSource; bool isInitSuccess; bool firstImage; QImage liveImage; QImage rawImage; IMFMediaSource* mediaSource; IMFSourceReader* sourceReader; uchar* frameData; int frameLength; QSize frameSize; QImage lastFrame; UINT32 width; UINT32 height; LONG stride; GUID majorType; GUID subType; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/mediafoundation/mfutil.h000755 000000 000000 00000005353 12654352322 026307 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef MEDIAFROUNDATION_MFUTIL_H #define MEDIAFROUNDATION_MFUTIL_H #include #include template inline void safeDelete(T& a) { if (a) delete a; a = 0; } template inline void safeDeleteArray(T& a) { if (a) delete [] a; a = 0; } template inline void safeRenew(T& a, T obj) { if (a) delete a; a = obj; } template void SafeRelease(T** ppT) { if (*ppT != NULL) { (*ppT)->Release(); *ppT = NULL; } } // The following code enables you to view the contents of a media type while // debugging. // void LogUINT32AsUINT64(const PROPVARIANT& var); // float OffsetToFloat(const MFOffset& offset); // HRESULT LogVideoArea(const PROPVARIANT& var); // Handle certain known special cases. // HRESULT SpecialCaseAttributeValue(GUID guid, const PROPVARIANT& var); // HRESULT LogAttributeValueByIndex(IMFAttributes *pAttr, DWORD index); HRESULT LogMediaType(IMFMediaType *pType); #ifndef IF_EQUAL_RETURN #define IF_EQUAL_RETURN(param, val) if(val == param) return QString(#val) #endif QString GetGUIDNameConst(const GUID& guid); #endif // MEDIAFROUNDATION_MFUTIL_H qstopmotion-2.3.2-Source/src/technical/grabber/imageconverter.cpp000755 000000 000000 00000101005 12670474563 025207 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "imageconverter.h" #include // memset /****************************************************************************** * Destination Format is abgr32 * * Memory layout abgr32: * +----+----+----+----+ +----+----+----+----+ * | B0 | G0 | R0 | A0 | | B1 | G1 | R1 | A1 | * +----+----+----+----+ +----+----+----+----+ * ******************************************************************************/ /****************************************************************************** * Convert RGB 24bit to XBGR 32bit ******************************************************************************/ /* * Memory layout rgb24: * +----+----+----+ +----+----+----+ * | R0 | G0 | B0 | | R1 | G1 | B1 | * +----+----+----+ +----+----+----+ */ int convert_rgb24_to_xbgr32_buffer(unsigned char *rgb24, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int in = 0; unsigned int inEnd; unsigned int out = 0; bool upsideDown = (stride < 0); int r; int g; int b; if (!upsideDown) { for (in = 0; in < bufferLength; in += 3) { r = rgb24[in + 0]; g = rgb24[in + 1]; b = rgb24[in + 2]; xbgr32[out++] = b; // B xbgr32[out++] = g; // G xbgr32[out++] = r; // R xbgr32[out++] = 0xffU; // A } } else { stride = -stride; if (stride != (width * 3)) { return 0; } for (int scanLine = height - 1; scanLine >= 0; --scanLine) { in = scanLine * stride; inEnd = in + width * 3; for (; in < inEnd; in += 3) { r = rgb24[in + 0]; g = rgb24[in + 1]; b = rgb24[in + 2]; xbgr32[out++] = b; // B xbgr32[out++] = g; // G xbgr32[out++] = r; // R xbgr32[out++] = 0xffU; // A } } } return 0; } /****************************************************************************** * Convert BGR 24bit to XBGR 32bit ******************************************************************************/ /* * Memory layout bgr24: * +----+----+----+ +----+----+----+ * | B0 | G0 | R0 | | B1 | G1 | R1 | * +----+----+----+ +----+----+----+ */ int convert_bgr24_to_xbgr32_buffer(unsigned char *bgr24, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int in = 0; unsigned int inEnd; unsigned int out = 0; bool upsideDown = (stride < 0); int r; int g; int b; if (!upsideDown) { for (in = 0; in < bufferLength; in += 3) { b = bgr24[in + 0]; g = bgr24[in + 1]; r = bgr24[in + 2]; xbgr32[out++] = b; // B xbgr32[out++] = g; // G xbgr32[out++] = r; // R xbgr32[out++] = 0xffU; // A } } else { stride = -stride; if (stride != (width * 3)) { return 0; } for (int scanLine = height - 1; scanLine >= 0; --scanLine) { in = scanLine * stride; inEnd = in + width * 3; for (; in < inEnd; in += 3) { b = bgr24[in + 0]; g = bgr24[in + 1]; r = bgr24[in + 2]; xbgr32[out++] = b; // B xbgr32[out++] = g; // G xbgr32[out++] = r; // R xbgr32[out++] = 0xffU; // A } } } return 0; } /****************************************************************************** * Convert YUV to XBGR 32bit ******************************************************************************/ /* * Converting YUV to RGB for Full Range * * Calculation matrix: * - - - - - - * | R | | 1.000 0.000 1.400 | | (y - 0) | * | G | = | 1.000 -0.343 -0.711 | * | (u - 128) | * | B | | 1.000 1.765 0.000 | | (v - 128) | * - - - - - - * * Ranges: * Y [ 0...255] * U/V [ 0...255] * R/G/B [ 0...255] */ static const int FrPrecision = 32768; static const int FrCoefficientY = (int)( 1.000 * FrPrecision + 0.5); static const int FrCoefficientRV = (int)( 1.400 * FrPrecision + 0.5); static const int FrCoefficientGU = (int)(-0.343 * FrPrecision + 0.5); static const int FrCoefficientGV = (int)(-0.711 * FrPrecision + 0.5); static const int FrCoefficientBU = (int)( 1.765 * FrPrecision + 0.5); void convert_yuv_to_rgb_FR_pixel(int y, int u, int v, int& r, int& g, int& b) { r = (int)(FrCoefficientY * y + FrCoefficientRV * (v - 128)); g = (int)(FrCoefficientY * y + FrCoefficientGU * (u - 128) + FrCoefficientGV * (v - 128)); b = (int)(FrCoefficientY * y + FrCoefficientBU * (u - 128)); r = (r + FrPrecision / 2) / FrPrecision; g = (g + FrPrecision / 2) / FrPrecision; b = (b + FrPrecision / 2) / FrPrecision; if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; if (r < 0) r = 0; if (g < 0) g = 0; if (b < 0) b = 0; } /* * Converting YUV to RGB for SDTV * * Calculation matrix: * - - - - - - * | R | | 1.164 0.000 1.596 | | (y - 16) | * | G | = | 1.164 -0.392 -0.813 | * | (u - 128) | * | B | | 1.164 2.017 0.000 | | (v - 128) | * - - - - - - * * Ranges: * Y [16...235] * u/v [16...240] * R/G/B [ 0...255] */ static const int SdtvPrecision = 32768; static const int SdtvCoefficientY = (int)( 1.164 * SdtvPrecision + 0.5); static const int SdtvCoefficientRV = (int)( 1.596 * SdtvPrecision + 0.5); static const int SdtvCoefficientGU = (int)(-0.391 * SdtvPrecision + 0.5); static const int SdtvCoefficientGV = (int)(-0.813 * SdtvPrecision + 0.5); static const int SdtvCoefficientBU = (int)( 2.018 * SdtvPrecision + 0.5); void convert_yuv_to_rgb_SDTV_pixel(int y, int u, int v, int& r, int& g, int& b) { r = (int)(SdtvCoefficientY * (y - 16) + SdtvCoefficientRV * (v - 128)); g = (int)(SdtvCoefficientY * (y - 16) + SdtvCoefficientGU * (u - 128) + SdtvCoefficientGV * (v - 128)); b = (int)(SdtvCoefficientY * (y - 16) + SdtvCoefficientBU * (u - 128)); r = (r + SdtvPrecision / 2) / SdtvPrecision; g = (g + SdtvPrecision / 2) / SdtvPrecision; b = (b + SdtvPrecision / 2) / SdtvPrecision; if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; if (r < 0) r = 0; if (g < 0) g = 0; if (b < 0) b = 0; } /* * Converting YUV to RGB for HDTV * * Calculation matrix: * - - - - - - * | R | | 1.164 0.000 1.793 | | (y - 16) | * | G | = | 1.164 -0.213 -0.533 | * | (u - 128) | * | B | | 1.164 2.112 0.000 | | (v - 128) | * - - - - - - * * Ranges: * Y [16...235] * u/v [16...240] * R/G/B [ 0...255] */ static const int HdtvPrecision = 32768; static const int HdtvCoefficientY = (int)( 1.164 * HdtvPrecision + 0.5); static const int HdtvCoefficientRV = (int)( 1.793 * HdtvPrecision + 0.5); static const int HdtvCoefficientGU = (int)(-0.213 * HdtvPrecision + 0.5); static const int HdtvCoefficientGV = (int)(-0.533 * HdtvPrecision + 0.5); static const int HdtvCoefficientBU = (int)( 2.112 * HdtvPrecision + 0.5); void convert_yuv_to_rgb_HDTV_pixel(int y, int u, int v, int& r, int& g, int& b) { r = (int)(HdtvCoefficientY * (y - 16) + HdtvCoefficientRV * (v - 128)); g = (int)(HdtvCoefficientY * (y - 16) + HdtvCoefficientGU * (u - 128) + HdtvCoefficientGV * (v - 128)); b = (int)(HdtvCoefficientY * (y - 16) + HdtvCoefficientBU * (u - 128)); r = (r + HdtvPrecision / 2) / HdtvPrecision; g = (g + HdtvPrecision / 2) / HdtvPrecision; b = (b + HdtvPrecision / 2) / HdtvPrecision; if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; if (r < 0) r = 0; if (g < 0) g = 0; if (b < 0) b = 0; } /* * Memory layout ayuv: * +----+----+----+----+ +----+----+----+----+ * | V0 | U0 | Y0 | A0 | | V1 | U1 | Y1 | A1 | * +----+----+----+----+ +----+----+----+----+ */ int convert_ayuv_to_abgr32_buffer(unsigned char *ayuv, unsigned char *abgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int in = 0; unsigned int out = 0; int v; int u; int y; int a; int r; int g; int b; bool upsideDown = (stride < 0); if (!upsideDown) { for (in = 0; in < width * height * 2; in += 4) { v = ayuv[in + 0]; u = ayuv[in + 1]; y = ayuv[in + 2]; a = ayuv[in + 3]; convert_yuv_to_rgb_SDTV_pixel(y, u, v, r, g, b); abgr32[out++] = b; // B abgr32[out++] = g; // G abgr32[out++] = r; // R abgr32[out++] = 0xffU; // A } } else { // Not supported return -1; } return 0; } /* * Memory layout yuv2: * +----+----+----+----+ +----+----+----+----+ * | Y0 | U0 | Y1 | V0 | | Y2 | U1 | Y3 | V1 | * +----+----+----+----+ +----+----+----+----+ */ int convert_yuy2_to_xbgr32_buffer(unsigned char *yuy2, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int in = 0; unsigned int out = 0; int y0; int u; int y1; int v; int r; int g; int b; bool upsideDown = (stride < 0); if (!upsideDown) { for (in = 0; in < width * height * 2; in += 4) { y0 = yuy2[in + 0]; u = yuy2[in + 1]; y1 = yuy2[in + 2]; v = yuy2[in + 3]; convert_yuv_to_rgb_SDTV_pixel(y0, u, v, r, g, b); xbgr32[out++] = b; // B xbgr32[out++] = g; // G xbgr32[out++] = r; // R xbgr32[out++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y1, u, v, r, g, b); xbgr32[out++] = b; // B xbgr32[out++] = g; // G xbgr32[out++] = r; // R xbgr32[out++] = 0xffU; // A } } else { // Not supported return -1; } return 0; } /* * Memory layout uyvy: * +----+----+----+----+ +----+----+----+----+ * | U0 | Y0 | V0 | Y1 | | U1 | Y2 | V1 | Y3 | * +----+----+----+----+ +----+----+----+----+ */ int convert_uyvy_to_xbgr32_buffer(unsigned char *uyvy, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int in = 0; unsigned int out = 0; int y0; int u; int y1; int v; int r; int g; int b; bool upsideDown = (stride < 0); if (!upsideDown) { for (in = 0; in < width * height * 2; in += 4) { u = uyvy[in + 0]; y0 = uyvy[in + 1]; v = uyvy[in + 2]; y1 = uyvy[in + 3]; convert_yuv_to_rgb_SDTV_pixel(y0, u, v, r, g, b); xbgr32[out++] = b; // B xbgr32[out++] = g; // G xbgr32[out++] = r; // R xbgr32[out++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y1, u, v, r, g, b); xbgr32[out++] = b; // B xbgr32[out++] = g; // G xbgr32[out++] = r; // R xbgr32[out++] = 0xffU; // A } } else { // Not supported return -1; } return 0; } /* * Memory layout yv12: * +-----+-----+-----+-----+ * | Y00 | Y01 | Y02 | Y03 | * +-----+-----+-----+-----+ * | Y10 | Y11 | Y12 | Y13 | * +-----+-----+-----+-----+ * | Y20 | Y21 | Y22 | Y23 | * +-----+-----+-----+-----+ * | Y30 | Y31 | Y32 | Y33 | * +-----+-----+-----+-----+ * | V00 | V01 | * +-----+-----+ * | V10 | V11 | * +-----+-----+ * | U00 | U01 | * +-----+-----+ * | U10 | U11 | * +-----+-----+-----+-----+ */ int convert_yv12_to_xbgr32_buffer(unsigned char *yv12, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int yPos1, yPos2; unsigned int uPos; unsigned int vPos; int y0, y1, y2, y3; int u; int v; int r; int g; int b; int outPos1; int outPos2; bool upsideDown = (stride < 0); if (!upsideDown) { for (unsigned int h = 0; h < height; h = h + 2) { for (unsigned int w = 0; w < width; w = w + 2) { yPos1 = h * width + w; yPos2 = (h + 1) * width + w; vPos = (height * width) + ((h / 2) * (width / 2) + (w / 2)); uPos = vPos + (height * width / 4); outPos1 = (h * width + w) * 4; outPos2 = ((h + 1) * width + w) * 4; y0 = yv12[yPos1]; y1 = yv12[yPos1+1]; y2 = yv12[yPos2]; y3 = yv12[yPos2+1]; u = yv12[uPos]; v = yv12[vPos]; convert_yuv_to_rgb_SDTV_pixel(y0, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y1, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y2, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y3, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A } } } else { // Not supported return -1; } return 0; } /* * Memory layout yuv420: * +----+----+----+----+----+----+----+----+ * | Y0 | Y1 | Y2 | Y3 | * +----+----+----+----+ * | * | * | * +----+----+----+----+----+----+----+----+ * | U0 | U1 | * +----+----+ * | * | * | * +----+----+----+----+----+----+----+----+ * | V0 | V1 | * +----+----+ * | * | * | * +----+----+----+----+----+----+----+----+ */ int convert_yuv420m_to_xbgr32_buffer(unsigned char *yuv420m, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int yPos1, yPos2; unsigned int uPos; unsigned int vPos; int y0, y1, y2, y3; int u; int v; int r; int g; int b; int outPos1; int outPos2; bool upsideDown = (stride < 0); if (!upsideDown) { for (unsigned int h = 0; h < height; h = h + 2) { for (unsigned int w = 0; w < width; w = w + 2) { yPos1 = h * width + w; yPos2 = (h + 1) * width + w; uPos = (height * width) + ((h / 2) * (width / 2) + (w / 2)); vPos = uPos + (height * width / 4); outPos1 = (h * width + w) * 4; outPos2 = ((h + 1) * width + w) * 4; y0 = yuv420m[yPos1]; y1 = yuv420m[yPos1+1]; y2 = yuv420m[yPos2]; y3 = yuv420m[yPos2+1]; u = yuv420m[uPos]; v = yuv420m[vPos]; convert_yuv_to_rgb_SDTV_pixel(y0, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y1, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y2, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y3, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A } } } else { // Not supported return -1; } return 0; } /* * Memory layout yu12: * +-----+-----+-----+-----+ * | Y00 | Y01 | Y02 | Y03 | * +-----+-----+-----+-----+ * | Y10 | Y11 | Y12 | Y13 | * +-----+-----+-----+-----+ * | Y20 | Y21 | Y22 | Y23 | * +-----+-----+-----+-----+ * | Y30 | Y31 | Y32 | Y33 | * +-----+-----+-----+-----+ * | U00 | U01 | * +-----+-----+ * | U10 | U11 | * +-----+-----+ * | V00 | V01 | * +-----+-----+ * | V10 | V11 | * +-----+-----+-----+-----+ */ int convert_yu12_to_xbgr32_buffer(unsigned char *yu12, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int yPos1, yPos2; unsigned int uPos; unsigned int vPos; int y0, y1, y2, y3; int u; int v; int r; int g; int b; int outPos1; int outPos2; bool upsideDown = (stride < 0); if (!upsideDown) { for (unsigned int h = 0; h < height; h = h + 2) { for (unsigned int w = 0; w < width; w = w + 2) { yPos1 = h * width + w; yPos2 = (h + 1) * width + w; vPos = (height * width) + ((h / 2) * (width / 2) + (w / 2)); uPos = vPos + (height * width / 4); outPos1 = (h * width + w) * 4; outPos2 = ((h + 1) * width + w) * 4; y0 = yu12[yPos1]; y1 = yu12[yPos1+1]; y2 = yu12[yPos2]; y3 = yu12[yPos2+1]; v = yu12[uPos]; u = yu12[vPos]; convert_yuv_to_rgb_SDTV_pixel(y0, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y1, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y2, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y3, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A } } } else { // Not supported return -1; } return 0; } /* * Memory layout yvu420: * +----+----+----+----+----+----+----+----+ * | Y0 | Y1 | Y2 | Y3 | * +----+----+----+----+ * | * | * | * +----+----+----+----+----+----+----+----+ * | V0 | V1 | * +----+----+ * | * | * | * +----+----+----+----+----+----+----+----+ * | U0 | U1 | * +----+----+ * | * | * | * +----+----+----+----+----+----+----+----+ */ int convert_yvu420m_to_xbgr32_buffer(unsigned char *yvu420m, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int yPos1, yPos2; unsigned int uPos; unsigned int vPos; int y0, y1, y2, y3; int u; int v; int r; int g; int b; int outPos1; int outPos2; bool upsideDown = (stride < 0); if (!upsideDown) { for (unsigned int h = 0; h < height; h = h + 2) { for (unsigned int w = 0; w < width; w = w + 2) { yPos1 = h * width + w; yPos2 = (h + 1) * width + w; uPos = (height * width) + ((h / 2) * (width / 2) + (w / 2)); vPos = uPos + (height * width / 4); outPos1 = (h * width + w) * 4; outPos2 = ((h + 1) * width + w) * 4; y0 = yvu420m[yPos1]; y1 = yvu420m[yPos1+1]; y2 = yvu420m[yPos2]; y3 = yvu420m[yPos2+1]; v = yvu420m[vPos]; u = yvu420m[uPos]; convert_yuv_to_rgb_SDTV_pixel(y0, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y1, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y2, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y3, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A } } } else { // Not supported return -1; } return 0; } /* * Memory layout nv12: * +----+----+----+----+----+----+----+----+ * | Y0 | Y1 | Y2 | Y3 | * +----+----+----+----+ * | * | * | * +----+----+----+----+----+----+----+----+ * | U0 | V0 | U1 | V1 | * +----+----+----+----+ * | * | * | * +----+----+----+----+----+----+----+----+ */ int convert_nv12_to_xbgr32_buffer(unsigned char *nv12, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride) { unsigned int yPos1, yPos2; unsigned int uPos; unsigned int vPos; int y0, y1, y2, y3; int u; int v; int r; int g; int b; int outPos1; int outPos2; bool upsideDown = (stride < 0); if (!upsideDown) { for (unsigned int h = 0; h < height; h = h + 2) { for (unsigned int w = 0; w < width; w = w + 2) { yPos1 = h * width + w; yPos2 = (h + 1) * width + w; uPos = (height * width) + ((h / 2) * (width / 2) + w); vPos = uPos + 1; outPos1 = (h * width + w) * 4; outPos2 = ((h + 1) * width + w) * 4; y0 = nv12[yPos1]; y1 = nv12[yPos1+1]; y2 = nv12[yPos2]; y3 = nv12[yPos2+1]; u = nv12[uPos]; v = nv12[vPos]; convert_yuv_to_rgb_SDTV_pixel(y0, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y1, u, v, r, g, b); xbgr32[outPos1++] = b; // B xbgr32[outPos1++] = g; // G xbgr32[outPos1++] = r; // R xbgr32[outPos1++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y2, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A convert_yuv_to_rgb_SDTV_pixel(y3, u, v, r, g, b); xbgr32[outPos2++] = b; // B xbgr32[outPos2++] = g; // G xbgr32[outPos2++] = r; // R xbgr32[outPos2++] = 0xffU; // A } } } else { // Not supported return -1; } return 0; } /****************************************************************************** * Convert RGB 8bit to YUV ******************************************************************************/ int convert_rgb_to_yuv_pixel(int r8, int g8, int b8) { unsigned int pixel_32 = 0; unsigned char *pixel = (unsigned char *)&pixel_32; int y2, u2, v2; y2 = (int)( 0.299 * (r8 - 128) + 0.587 * (g8 - 128) + 0.114 * (b8 - 128) + 128); u2 = (int)(- 0.147 * (r8 - 128) - 0.289 * (g8 - 128) + 0.436 * (b8 - 128) + 128); v2 = (int)( 0.615 * (r8 - 128) - 0.515 * (g8 - 128) - 0.100 * (b8 - 128) + 128); if (y2 > 255) y2 = 255; if (u2 > 255) u2 = 255; if (v2 > 255) v2 = 255; if (y2 < 0) y2 = 0; if (u2 < 0) u2 = 0; if (v2 < 0) v2 = 0; pixel[0] = y2; pixel[1] = u2; pixel[2] = v2; return pixel_32; } int convert_rgb24_to_yuy2_buffer(unsigned char *rgb24, unsigned char *yuy2, unsigned int width, unsigned int height) { unsigned int in, out = 0; unsigned int pixel_32; int y0, u0, v0, y1, u1, v1; for(in = 0; in < width * height * 3; in += 6) { pixel_32 = convert_rgb_to_yuv_pixel(rgb24[in], rgb24[in + 1], rgb24[in + 2]); y0 = (pixel_32 & 0x000000ff); u0 = (pixel_32 & 0x0000ff00) >> 8; v0 = (pixel_32 & 0x00ff0000) >> 16; pixel_32 = convert_rgb_to_yuv_pixel(rgb24[in + 3], rgb24[in + 4], rgb24[in + 5]); y1 = (pixel_32 & 0x000000ff); u1 = (pixel_32 & 0x0000ff00) >> 8; v1 = (pixel_32 & 0x00ff0000) >> 16; yuy2[out++] = y0; yuy2[out++] = (u0 + u1) / 2; yuy2[out++] = y1; yuy2[out++] = (v0 + v1) / 2; } return 0; } /****************************************************************************** * Convert Motion-JPEG to JPEG ******************************************************************************/ unsigned char jpeg_dht[JPEG_DHT_LENGTH] = { 0xff, 0xc4, 0x01, 0xa2, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; int mjpegToJpeg(unsigned char *inFrame, unsigned char *outFrame, unsigned int bufSize) { unsigned int j = 0, has_dht = 0; outFrame[0] = inFrame[0]; outFrame[1] = inFrame[1]; if((inFrame[0] != 0xff) && (inFrame[1] != 0xd8)) { // printf("Not a JPEG nor MJPEG file \nExiting.\n"); return -1; } unsigned int pos = 2, size = 0; // move into the image's table while (has_dht == 0) { if (inFrame[pos] != 0xff) { // printf("This isn't a valid JPEG file.\n"); return -1; } if (inFrame[pos+1] == 0xc4) { has_dht = 1; } else if (inFrame[pos+1] == 0xda) // Add the huffman tables here... { has_dht = 0; break; } // Skip to the next marker size = (inFrame[pos+2] << 8) + inFrame[pos+3]; for (j = 0; j < size + 2; j++) { outFrame[pos + j] = inFrame[pos + j]; } pos = pos + size + 2; } j = 0; if (has_dht == 0) { for ( ; j < 420 ; j++) { outFrame[pos + j] = jpeg_dht[j]; } for ( ; pos < bufSize ; pos++) { outFrame[pos + 420] = inFrame[pos]; } } else { for ( ; pos < bufSize ; pos++) { outFrame[pos] = inFrame[pos]; } } return 0; } qstopmotion-2.3.2-Source/src/technical/grabber/imagegrabber.h000644 000000 000000 00000011113 12654352322 024234 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef IMAGEGRABBER_H #define IMAGEGRABBER_H #include #include #include #include #include "frontends/frontend.h" #include "technical/grabber/imagegrabberdevice.h" class ImageGrabberDevice; /** * Abstract class for the different video grabbers used by the SDLVideoView * widget. * * @author Bjoern Erik Nilsen, Fredrik Berg Kjoelstad, Ralf Lange */ class ImageGrabber : public QObject { Q_OBJECT public: /** * Enum with all possible image output formats */ enum imageFormat { jpegFormat, // JPEG format tiffFormat, // TIFF format bmpFormat // BMP format }; /** * Enum with all possible image sizes */ enum imageSize { defaultSize, // Source size qvgaSize, // 320x240 (QVGA) vgaSize, // 640x480 (VGA) svgaSize, // 800x600 (SVGA) paldSize, // 704x576 (PAL D) hdreadySize, // 1280x720 (HD Ready) fullhdSize // 1900x1080 (Full HD) }; /** * Enum with all possible image adjustments */ enum imageAdjustment { leftUp, // Left up corner centerUp, // Center up rightUp, // Right up corner leftMiddle, // Left middle centerMiddle, // Center middle rightMiddle, // Right middle leftDown, // Left down corner centerDown, // Center down rightDown // Right down corner }; /** * Constructs and initializes the object. * @param filePath path to the output file grabbed from a device */ ImageGrabber(Frontend *f); /** * Destructor */ ~ImageGrabber(); /** * Initialization of the Command line grabber */ virtual bool initialization(QVector &devices) = 0; /** * Abstract function for initializing the grabber. * @return true on success, false otherwise */ virtual bool setUp() = 0; /** * Abstract function for shutting down the grabber. * @return true on success, false otherwise */ virtual bool tearDown() = 0; /** * Abstract function for initializing the grabber. * @return true on success, false otherwise */ void finalize(); /** * Abstract function for grabbing an image. * @return true on success, false otherwise */ virtual bool grab() = 0; /** * Abstract function to get the live image from the camera * @return The live image. */ virtual const QImage getLiveImage() = 0; /** * Abstract function to get the raw image from the camera * @return The raw image. */ virtual const QImage getRawImage() = 0; protected: /** * Frontend of the application */ Frontend *frontend; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/grabbercontroller.h000644 000000 000000 00000052201 12654352322 025340 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef GRABBERCONTROLLER_H #define GRABBERCONTROLLER_H #include #include #include "technical/grabber/grabbercontrolcapabilities.h" #include "technical/grabber/grabberresolution.h" #include "technical/grabber/imagegrabberdevice.h" #include "technical/grabber/imagegrabber.h" class ImageGrabber; class ImageGrabberDevice; /** * Interface to the controller of a device. * * @author Ralf Lange */ class GrabberController { public: /** * Device controller capabilities */ enum grabberControllerFlags { controller_none, controller_Auto, controller_Manual, controller_Relative, controller_Absolute, controller_Continuous }; /** * Constructs and initializes the object. * @param caps The grabber controller capabilities. */ GrabberController(int caps); /** * Destructor */ virtual ~GrabberController(); /** * Get the image grabber of the controller. * * @brief getImageGrabber * @return The image grabber or null. */ virtual ImageGrabber* getImageGrabber() = 0; /** * Initialize the grabber controller. * @param ig The image grabber of the controller. * @param igd The image grabber device of the controller. * @return True if initialization is successful. */ virtual bool initialization(ImageGrabber* ig, ImageGrabberDevice* igd) = 0; /** * Set up the controller. * @return true on success, false otherwise */ virtual bool setUp() = 0; /** * Tear down the controller. * @return true on success, false otherwise */ virtual bool tearDown() = 0; /** * Get the capabilities of the controller. * @return The capabilities of the controller. */ int getControllerCapabilities(); /************************************************************************** ************************************************************************** * Camera quality capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness **************************************************************************/ /** * Get the capabilities of the brightness control. * @return The brightness control capabilities. */ GrabberControlCapabilities *getBrightnessCaps(); /** * Get the current automatic brightness value of the device. * @return True if the automatic brightness is on. */ virtual bool getAutomaticBrightness(); /** * Set the automatic brightness value of the device. * @param ab True if the automatic brightness will be switched on. */ virtual void setAutomaticBrightness(bool ab); /** * Get the current brightness value of the device. * @return The current brightness value. */ virtual int getBrightness(); /** * Set the brightness value of the device. * @param b The new brightness value */ virtual void setBrightness(int b); /************************************************************************** * Contrast **************************************************************************/ /** * Get the capabilities of the contrast control. * @return The contrast control capabilities. */ GrabberControlCapabilities *getContrastCaps(); /** * Get the current automatic contrast value of the device. * @return True if the automatic contrast is on. */ virtual bool getAutomaticContrast(); /** * Set the automatic contrast value of the device. * @param ac True if the automatic contrast will be switched on. */ virtual void setAutomaticContrast(bool ac); /** * Get the current contrast value of the device. * @return The current contrast value. */ virtual int getContrast(); /** * Set the contrast value of the device. * @param c The new contrast value */ virtual void setContrast(int c); /************************************************************************** * Saturation **************************************************************************/ /** * Get the capabilities of the saturation control. * @return The saturation control capabilities. */ GrabberControlCapabilities *getSaturationCaps(); /** * Get the current automatic saturation value of the device. * @return True if the automatic saturation is on. */ virtual bool getAutomaticSaturation(); /** * Set the automatic saturation value of the device. * @param as True if the automatic saturation will be switched on. */ virtual void setAutomaticSaturation(bool as); /** * Get the current saturation value of the device. * @return The current saturation value. */ virtual int getSaturation(); /** * Set the saturation value of the device. * @param s The new saturation value */ virtual void setSaturation(int s); /************************************************************************** * Hue **************************************************************************/ /** * Get the capabilities of the hue control. * @return The hue control capabilities. */ GrabberControlCapabilities *getHueCaps(); /** * Get the current automatic hue value of the device. * @return True if the automatic hue is on. */ virtual bool getAutomaticHue(); /** * Set the automatic hue value of the device. * @param ah True if the automatic hue will be switched on. */ virtual void setAutomaticHue(bool ah); /** * Get the current hue value of the device. * @return The current hue value. */ virtual int getHue(); /** * Set the hue value of the device. * @param h The new hue value */ virtual void setHue(int h); /************************************************************************** * Gamma **************************************************************************/ /** * Get the capabilities of the gamma control. * @return The gamma control capabilities. */ GrabberControlCapabilities *getGammaCaps(); /** * Get the current automatic gamma value of the device. * @return True if the automatic gamma is on. */ virtual bool getAutomaticGamma(); /** * Set the automatic gamma value of the device. * @param ag True if the automatic gamma will be switched on. */ virtual void setAutomaticGamma(bool ag); /** * Get the current gamma value of the device. * @return The current gamma value. */ virtual int getGamma(); /** * Set the gamma value of the device. * @param g The new gamma value */ virtual void setGamma(int g); /************************************************************************** * Sharpness **************************************************************************/ /** * Get the capabilities of the sharpness control. * @return The sharpness control capabilities. */ GrabberControlCapabilities *getSharpnessCaps(); /** * Get the current automatic sharpness value of the device. * @return True if the automatic sharpness is on. */ virtual bool getAutomaticSharpness(); /** * Set the automatic sharpness value of the device. * @param as True if the automatic sharpness will be switched on. */ virtual void setAutomaticSharpness(bool as); /** * Get the current sharpness value of the device. * @return The current sharpness value. */ virtual int getSharpness(); /** * Set the sharpness value of the device. * @param s The new sharpness value */ virtual void setSharpness(int s); /************************************************************************** * Backlight Compensation **************************************************************************/ /** * Get the capabilities of the backlight control. * @return The backlight control capabilities. */ GrabberControlCapabilities *getBacklightCaps(); /** * Get the current automatic backlight value of the device. * @return True if the automatic backlight is on. */ virtual bool getAutomaticBacklight(); /** * Set the automatic backlight value of the device. * @param ab True if the automatic backlight will be switched on. */ virtual void setAutomaticBacklight(bool ab); /** * Get the current backlight compensation value of the device. * @return The current backlight compensation value. */ virtual int getBacklight(); /** * Set the backlight compensation value of the device. * @param b The new backlight compensation value */ virtual void setBacklight(int b); /************************************************************************** * White Balance **************************************************************************/ /** * Get the capabilities of the white control. * @return The white control capabilities. */ GrabberControlCapabilities *getWhiteCaps(); /** * Get the current automatic white balance value of the device. * @return True if the automatic white balance is on. */ virtual bool getAutomaticWhite(); /** * Set the automatic white balance value of the device. * @param aw True if the automatic white balance will be switched on. */ virtual void setAutomaticWhite(bool aw); /** * Get the current white balance value of the device. * @return The current white balance value. */ virtual int getWhite(); /** * Set the white balance value of the device. * @param w The new white balance value */ virtual void setWhite(int w); /************************************************************************** * Gain **************************************************************************/ /** * Get the capabilities of the gain control. * @return The gain control capabilities. */ GrabberControlCapabilities *getGainCaps(); /** * Get the current automatic gain value of the device. * @return True if the automatic gain is on. */ virtual bool getAutomaticGain(); /** * Set the automatic gain value of the device. * @param ag True if the automatic gain will be switched on. */ virtual void setAutomaticGain(bool ag); /** * Get the current gain value of the device. * @return The current gain value. */ virtual int getGain(); /** * Set the gain value of the device. * @param g The new gain value */ virtual void setGain(int g); /************************************************************************** * Color Enable **************************************************************************/ /** * Get the capabilities of the color enable control. * @return The color enable control capabilities. */ GrabberControlCapabilities *getColorCaps(); /** * Get the current automatic color enable value of the device. * @return True if the automatic color enable is on. */ virtual bool getAutomaticColor(); /** * Set the automatic color enable value of the device. * @param ac True if the automatic color enable will be switched on. */ virtual void setAutomaticColor(bool ac); /** * Get the current color enable value of the device. * @return The current color enable value. */ virtual int getColor(); /** * Set the color enable value of the device. * @param c The new color enable value */ virtual void setColor(int c); /************************************************************************** ************************************************************************** * Camera control capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Exposure **************************************************************************/ /** * Get the capabilities of the exposure control. * @return The exposure control capabilities. */ GrabberControlCapabilities *getExposureCaps(); /** * Get the current automatic exposure value of the device. * @return True if the automatic exposure is on. */ virtual bool getAutomaticExposure(); /** * Set the automatic exposure value of the device. * @param ae True if the automatic exposure will be switched on. */ virtual void setAutomaticExposure(bool ae); /** * Get the current exposure value of the device. * @return The current exposure value. */ virtual int getExposure(); /** * Set the exposure value of the device. * @param e The new exposure value */ virtual void setExposure(int e); /************************************************************************** * Zoom **************************************************************************/ /** * Get the capabilities of the zoom control. * @return The zoom control capabilities. */ GrabberControlCapabilities *getZoomCaps(); /** * Get the current automatic zoom value of the device. * @return True if the automatic zoom is on. */ virtual bool getAutomaticZoom(); /** * Set the automatic zoom value of the device. * @param az True if the automatic zoom will be switched on. */ virtual void setAutomaticZoom(bool az); /** * Get the current zoom value of the device. * @return The current zoom value. */ virtual int getZoom(); /** * Set the zoom value of the device. * @param z The new zoom value */ virtual void setZoom(int z); /************************************************************************** * Focus **************************************************************************/ /** * Get the capabilities of the focus control. * @return The focus control capabilities. */ GrabberControlCapabilities *getFocusCaps(); /** * Get the current automatic focus value of the device. * @return True if the automatic focus is on. */ virtual bool getAutomaticFocus(); /** * Set the automatic focus value of the device. * @param af True if the automatic focus will be switched on. */ virtual void setAutomaticFocus(bool af); /** * Get the current focus value of the device. * @return The current focus value. */ virtual int getFocus(); /** * Set the focus value of the device. * @param f The new focus value */ virtual void setFocus(int f); /************************************************************************** * Pan **************************************************************************/ /** * Get the capabilities of the pan control. * @return The pan control capabilities. */ GrabberControlCapabilities *getPanCaps(); /** * Get the current automatic pan value of the device. * @return True if the automatic pan is on. */ virtual bool getAutomaticPan(); /** * Set the automatic pan value of the device. * @param ap True if the automatic pan will be switched on. */ virtual void setAutomaticPan(bool ap); /** * Get the current pan value of the device. * @return The current pan value. */ virtual int getPan(); /** * Set the pan value of the device. * @param p The new pan value */ virtual void setPan(int p); /************************************************************************** * Tilt **************************************************************************/ /** * Get the capabilities of the tilt control. * @return The tilt control capabilities. */ GrabberControlCapabilities *getTiltCaps(); /** * Get the current automatic tilt value of the device. * @return True if the automatic tilt is on. */ virtual bool getAutomaticTilt(); /** * Set the automatic tilt value of the device. * @param at True if the automatic tilt will be switched on. */ virtual void setAutomaticTilt(bool at); /** * Get the current tilt value of the device. * @return The current tilt value. */ virtual int getTilt(); /** * Set the tilt value of the device. * @param t The new tilt value */ virtual void setTilt(int t); /************************************************************************** * Iris **************************************************************************/ /** * Get the capabilities of the iris control. * @return The iris control capabilities. */ GrabberControlCapabilities *getIrisCaps(); /** * Get the current automatic iris value of the device. * @return True if the automatic iris is on. */ virtual bool getAutomaticIris(); /** * Set the automatic iris value of the device. * @param ai True if the automatic iris will be switched on. */ virtual void setAutomaticIris(bool ai); /** * Get the current iris value of the device. * @return The current iris value. */ virtual int getIris(); /** * Set the iris value of the device. * @param i The new iris value */ virtual void setIris(int i); /************************************************************************** * Roll **************************************************************************/ /** * Get the capabilities of the roll control. * @return The roll control capabilities. */ GrabberControlCapabilities *getRollCaps(); /** * Get the current automatic roll value of the device. * @return True if the automatic roll is on. */ virtual bool getAutomaticRoll(); /** * Set the automatic roll value of the device. * @param ar True if the automatic roll will be switched on. */ virtual void setAutomaticRoll(bool ar); /** * Get the current roll value of the device. * @return The current roll value. */ virtual int getRoll(); /** * Set the roll value of the device. * @param r The new roll value */ virtual void setRoll(int r); private: int controllerCap; // Video capabilities GrabberControlCapabilities brightnessCapabilities; GrabberControlCapabilities contrastCapabilities; GrabberControlCapabilities saturationCapabilities; GrabberControlCapabilities hueCapabilities; GrabberControlCapabilities gammaCapabilities; GrabberControlCapabilities sharpnessCapabilities; GrabberControlCapabilities backlightCapabilities; GrabberControlCapabilities whiteCapabilities; GrabberControlCapabilities gainCapabilities; GrabberControlCapabilities colorCapabilities; // Camera control capabilities GrabberControlCapabilities exposureCapabilities; GrabberControlCapabilities zoomCapabilities; GrabberControlCapabilities focusCapabilities; GrabberControlCapabilities panCapabilities; GrabberControlCapabilities tiltCapabilities; GrabberControlCapabilities irisCapabilities; GrabberControlCapabilities rollCapabilities; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/grabbercontrolcapabilities.h000644 000000 000000 00000011274 12536560627 027224 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2013 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef GRABBERCONTROLCAPABILITIES_H #define GRABBERCONTROLCAPABILITIES_H /** * Capabilities of a control of a device. * * @author Ralf Lange */ class GrabberControlCapabilities { public: /** * Device controller capabilities */ enum grabberControlFlags { control_none, control_Auto, control_Manual, control_Relative, control_Absolute }; /** * Constructs and initializes the object. */ GrabberControlCapabilities(); /** * Destructor */ ~GrabberControlCapabilities(); /** * Has the camera this control capability? * @return True if the camera has this control apability. */ bool isCapability(); /** * Has the capability a automatic control? * @return True if the capability has a automatic control. */ bool isAutomatic(); /** * Get the id of the control * @return The id of the control. */ unsigned int getControlId(); /** * Set the id of the control * @param i The new id of the control. */ void setControlId(unsigned int cl); /** * Get the class of the control * @return The class of the control. */ unsigned int getControlClass(); /** * Set the class of the control * @param i The new class of the control. */ void setControlClass(unsigned int id); /** * Get the type of the control * @return The type of the control. */ unsigned int getControlType(); /** * Set the type of the control * @param i The new type of the control. */ void setControlType(unsigned int type); /** * Get the minimum value of the control * @return The minimum value of the control. */ long getMinimum(); /** * Set the minimum value of the control * @param mi The new minimum value of the control. */ void setMinimum(long mi); /** * Get the maximum value of the control * @return The maximum value of the control. */ long getMaximum(); /** * Set the maximum value of the control * @param ma The new maximum value of the control. */ void setMaximum(long ma); /** * Get the step value of the control * @return The step value of the control. */ long getStep(); /** * Set the step value of the control * @param st The new step value of the control. */ void setStep(long st); /** * Get the default value of the control * @return The default value of the control. */ long getDefault(); /** * Set the default value of the control * @param fl The new default value of the control. */ void setDefault(long de); /** * Get the flags value of the control * @return The flags value of the control. */ long getFlags(); /** * Set the flags value of the control * @param fl The new flags value of the control. */ void setFlags(long fl); private: unsigned int ctrl_id; unsigned int ctrl_class; unsigned int ctrl_type; long minimum; long maximum; long step; long defaultt; long flags; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/grabberresolution.cpp000644 000000 000000 00000007533 12662601115 025717 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2014-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "grabberresolution.h" GrabberResolution::GrabberResolution() { width = 0; height = 0; active = false; } GrabberResolution::GrabberResolution(unsigned int w, unsigned int h, unsigned int f, bool a) { width = w; height = h; format = f; active = a; } GrabberResolution::~GrabberResolution() { } unsigned int GrabberResolution::getWidth() { return width; } void GrabberResolution::setWidth(unsigned int w) { width = w; } unsigned int GrabberResolution::getHeight() { return height; } void GrabberResolution::setHeight(unsigned int h) { height = h; } unsigned int GrabberResolution::getFormat() { return format; } void GrabberResolution::setFormat(unsigned int f) { format = f; } bool GrabberResolution::isActive() { return active; } const QString GrabberResolution::getName() { QString formatName; switch(format) { case GrabberResolution::rgb24Format: formatName.append("RGB24"); break; case GrabberResolution::bgr24Format: formatName.append("BGR24"); break; case GrabberResolution::ayuvFormat: formatName.append("AYUV"); break; case GrabberResolution::yuv2Format: formatName.append("YUV2"); break; case GrabberResolution::uyvyFormat: formatName.append("UYUY"); break; case GrabberResolution::yu12Format: formatName.append("YU12"); break; case GrabberResolution::yuv420mFormat: formatName.append("YUV420"); break; case GrabberResolution::yv12Format: formatName.append("YV12"); break; case GrabberResolution::yvu420mFormat: formatName.append("YVU420"); break; case GrabberResolution::nv12Format: formatName.append("NV12"); break; case GrabberResolution::mjpegFormat: formatName.append("MJPG"); break; case GrabberResolution::unknownFormat: default: formatName.append("????"); break; } QString name = QString("%1%2%3%4%5") .arg(width) .arg(QLatin1String(" x ")) .arg(height) .arg(QLatin1String(" - ")) .arg(formatName); return name; } qstopmotion-2.3.2-Source/src/technical/grabber/imageconverter.h000755 000000 000000 00000021763 12670474563 024670 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef IMAGECONVERTER_H #define IMAGECONVERTER_H /****************************************************************************** * Convert RGB 24bit to XBGR 32bit ******************************************************************************/ int convert_rgb24_to_xbgr32_buffer(unsigned char *rgb24, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /****************************************************************************** * Convert BGR 24bit to XBGR 32bit ******************************************************************************/ int convert_bgr24_to_xbgr32_buffer(unsigned char *bgr24, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /****************************************************************************** * Convert YUV to XBGR 32bit ******************************************************************************/ /** * Convert one pixel off YUV to RGB 8bit for full range. * * @brief convert_yuv_to_rgb_FR_pixel * @param y * @param u * @param v * @param r * @param g * @param b * @return */ void convert_yuv_to_rgb_FR_pixel(int y, int u, int v, int& r, int& g, int& b); /** * Convert one pixel off YUV to RGB 8bit for SDTV. * * @brief convert_yuv_to_rgb8_SDTV_pixel * @param y * @param u * @param v * @param r * @param g * @param b * @return */ void convert_yuv_to_rgb_SDTV_pixel(int y, int u, int v, int& r, int& g, int& b); /** * Convert one pixel off YUV to RGB 8bit for HDTV. * * @brief convert_yuv_to_rgb8_HDTV_pixel * @param y * @param u * @param v * @param r * @param g * @param b * @return */ int convert_yuv_to_rgb8_HDTV_pixel(int y, int u, int v); /** * Convert a buffer with YUV 4:4:4 (Microsoft AYUV) pixels to ABGR 32bit. * * @brief convert_ayuv_to_abgr32_buffer * @param ayuv * @param abgr32 * @param width * @param height * @param bufferLength * @param stride * @return */ int convert_ayuv_to_abgr32_buffer(unsigned char *ayuv, unsigned char *abgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /** * Convert a buffer with YUV 4:2:2 (Microsoft YUY2) pixels to XBGR 32bit. * * @brief convert_yuy2_to_xbgr32_buffer * @param yuy2 * @param xbgr32 * @param width * @param height * @param bufferLength * @param stride * @return */ int convert_yuy2_to_xbgr32_buffer(unsigned char *yuy2, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /** * Convert a buffer with YUV 4:2:2 (Microsoft UYVY) pixels to XBGR 32bit. * * @brief convert_uyvy_to_xbgr32_buffer * @param uyvy * @param xbgr32 * @param width * @param height * @param bufferLength * @param stride * @return */ int convert_uyvy_to_xbgr32_buffer(unsigned char *uyvy, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /** * Convert a buffer with YUV 4:2:0 (Microsoft YV12) pixels to XBGR 32bit. * * @brief convert_yv12_to_xbgr32_buffer * @param yv12 * @param xbgr32 * @param width * @param height * @param bufferLength * @param stride * @return */ int convert_yu12_to_xbgr32_buffer(unsigned char *yu12, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /** * Convert a buffer with YUV 4:2:0 (Microsoft I420) pixels to XBGR 32bit. * * @brief convert_yuv420m_to_xbgr32_buffer * @param i420 * @param xbgr32 * @param width * @param height * @param bufferLength * @param stride * @return */ int convert_yuv420m_to_xbgr32_buffer(unsigned char *yuv420m, unsigned char *rgb32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /** * Convert a buffer with YUV 4:2:0 (Microsoft YV12) pixels to XBGR 32bit. * * @brief convert_yv12_to_xbgr32_buffer * @param yv12 * @param xbgr32 * @param width * @param height * @param bufferLength * @param stride * @return */ int convert_yv12_to_xbgr32_buffer(unsigned char *yv12, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /** * Convert a buffer with YVU 4:2:0 (Microsoft ???) pixels to XBGR 32bit. * * @brief convert_yvu420m_to_xbgr32_buffer * @param i420 * @param xbgr32 * @param width * @param height * @param bufferLength * @param stride * @return */ int convert_yvu420m_to_xbgr32_buffer(unsigned char *yvu420m, unsigned char *rgb32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /** * Convert a buffer with YUV 4:2:0 (Microsoft NV12) pixels to XBGR 32bit. * * @brief convert_nv12_to_xbgr32_buffer * @param nv12 * @param xbgr32 * @param width * @param height * @param bufferLength * @param stride * @return */ int convert_nv12_to_xbgr32_buffer(unsigned char *nv12, unsigned char *xbgr32, unsigned int width, unsigned int height, unsigned long bufferLength, long stride); /****************************************************************************** * Convert RGB 24bit to YUV ******************************************************************************/ int convert_rgb_to_yuv_pixel(int r8, int g8, int b8); int convert_rgb24_to_yuy2_buffer(unsigned char *rgb24, unsigned char *yuy2, unsigned int width, unsigned int height); /****************************************************************************** * Convert Motion-JPEG to JPEG ******************************************************************************/ #define JPEG_DHT_LENGTH 0x1A4 int mjpegToJpeg(unsigned char *inFrame, unsigned char *outFrame, unsigned int bufSize); #endif // IMAGECONVERTER_H qstopmotion-2.3.2-Source/src/technical/grabber/imagegrabberfacade.cpp000644 000000 000000 00000022744 12751646113 025731 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "imagegrabberfacade.h" #include #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) #include "technical/grabber/mediafoundation/mfgrabber.h" #endif #ifdef Q_OS_LINUX #include "technical/grabber/gphoto2/gpgrabber.h" #include "technical/grabber/video4linux2/v4l2grabber.h" #endif #include "technical/preferencestool.h" ImageGrabberFacade::ImageGrabberFacade(Frontend *f) { qDebug() << "ImageGrabberFacade::Constructor --> Start"; frontend = f; grabberThread = NULL; isInitialized = false; isInited = false; gphotoGrabber = NULL; v4l2Grabber = NULL; mediaFoundationGrabber = NULL; qDebug() << "ImageGrabberFacade::Constructor --> End"; } ImageGrabberFacade::~ImageGrabberFacade() { qDebug() << "ImageGrabberFacade::Destructor --> Start"; clearDevices(); if (gphotoGrabber != NULL) { delete gphotoGrabber; gphotoGrabber = NULL; } if (v4l2Grabber != NULL) { delete v4l2Grabber; v4l2Grabber = NULL; } if (mediaFoundationGrabber != NULL) { delete mediaFoundationGrabber; mediaFoundationGrabber = NULL; } qDebug() << "ImageGrabberFacade::Destructor --> End"; } void ImageGrabberFacade::newDeviceSet() { // Create a new instance of the device // Initialize the grabber controller of the device } void ImageGrabberFacade::clearDevices() { qDebug() << "ImageGrabberFacade::clearDevices --> Start"; unsigned int deviceSize = devices.size(); for (unsigned int deviceIndex = 0; deviceIndex < deviceSize; ++deviceIndex) { delete devices[deviceIndex]; devices[deviceIndex] = NULL; } devices.clear(); qDebug() << "ImageGrabberFacade::clearDevices --> End"; } void ImageGrabberFacade::initialization() { qDebug() << "ImageGrabberFacade::initialization --> Start"; PreferencesTool *pref = frontend->getPreferences(); int value; clearDevices(); #ifdef Q_OS_LINUX // video4linux2 device if (pref->getIntegerPreference("preferences", "v4l2grabber", value) == false) { value = true; } if ((int)true == value) { v4l2Grabber = new V4L2Grabber(frontend); if (v4l2Grabber->initialization(devices)) { isInitialized = true; } } #endif #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Microsoft Media Foundation device if (pref->getIntegerPreference("preferences", "mediafoundationgrabber", value) == false) { value = true; } if ((int)true == value) { mediaFoundationGrabber = new MfGrabber(frontend); if (mediaFoundationGrabber->initialization(devices)) { isInitialized = true; } } #endif #ifdef Q_OS_LINUX // gphoto2 device if (pref->getIntegerPreference("preferences", "gphoto2grabber", value) == false) { value = false; } if ((int)true == value) { gphotoGrabber = new GphotoGrabber(frontend); if (gphotoGrabber->initialization(devices)) { isInitialized = true; } } #endif qDebug() << "ImageGrabberFacade::initialization --> End"; } void ImageGrabberFacade::init() { qDebug() << "ImageGrabberFacade::init --> Start"; if (0 == getDeviceCount()) { frontend->showWarning(tr("Check image sources"), tr("No usable video image source found. Please\n" "connect on video device on the computer.")); return; } int videoSource = frontend->getProject()->getVideoSource(); ImageGrabberDevice *videoDevice = getDevice(videoSource); switch (videoDevice->getDeviceSource()) { case ImageGrabberDevice::video4Linux2Source: isInited = v4l2Grabber->setUp(); break; case ImageGrabberDevice::gphoto2Source: isInited = gphotoGrabber->setUp(); break; case ImageGrabberDevice::mediaFoundationSource: isInited = mediaFoundationGrabber->setUp(); break; default: break; } if (!isGrabberInited()) { frontend->showWarning(tr("Check image grabber"), tr("Image grabber initialization failed. This may happen \n" "if you try to grab from an invalid device. Please\n" "select another device on the recording tool tab.")); return; } qDebug() << "ImageGrabberFacade::init --> End"; } void ImageGrabberFacade::finalize() { qDebug() << "ImageGrabberFacade::finalize --> Start"; int videoSource = frontend->getProject()->getVideoSource(); ImageGrabberDevice *videoDevice = getDevice(videoSource); isInitialized = false; isInited = false; switch (videoDevice->getDeviceSource()) { case ImageGrabberDevice::video4Linux2Source: v4l2Grabber->tearDown(); break; case ImageGrabberDevice::gphoto2Source: gphotoGrabber->tearDown(); break; case ImageGrabberDevice::mediaFoundationSource: mediaFoundationGrabber->tearDown(); break; default: break; } qDebug() << "ImageGrabberFacade::finalize --> End"; } const int ImageGrabberFacade::getDeviceCount() { return devices.count(); } const QVector ImageGrabberFacade::getDevices() { return devices; } ImageGrabberDevice* ImageGrabberFacade::getDevice(int deviceIndex) { return devices[deviceIndex]; } const QVector ImageGrabberFacade::getDeviceNames() { QVector deviceNames; for (int deviceIndex = 0 ; deviceIndex < devices.size() ; deviceIndex++) { deviceNames.append(devices[deviceIndex]->getDeviceName()); } return deviceNames; } const QVector ImageGrabberFacade::getResolutionNames(int deviceIndex) { QVector resNames; ImageGrabberDevice* device = devices[deviceIndex]; QVector resolutions = device->getResolutions(); int resSize = resolutions.size(); for (int resIndex = 0 ; resIndex < resSize ; resIndex++) { resNames.append(resolutions[resIndex].getName()); } return resNames; } const GrabberResolution ImageGrabberFacade::getResolution(int deviceIndex, int resIndex) { ImageGrabberDevice* device = devices[deviceIndex]; QVector resolutions = device->getResolutions(); int resSize = resolutions.size(); return resolutions[resIndex]; } bool ImageGrabberFacade::isGrabberInitialized() const { return isInitialized; } bool ImageGrabberFacade::isGrabberInited() const { return isInited; } const QImage ImageGrabberFacade::getLiveImage() { QImage liveImage; int videoSource = frontend->getProject()->getVideoSource(); ImageGrabberDevice *videoDevice = getDevice(videoSource); switch (videoDevice->getDeviceSource()) { case ImageGrabberDevice::video4Linux2Source: liveImage = v4l2Grabber->getLiveImage(); break; case ImageGrabberDevice::gphoto2Source: liveImage = gphotoGrabber->getLiveImage(); break; case ImageGrabberDevice::mediaFoundationSource: liveImage = mediaFoundationGrabber->getLiveImage(); break; default: break; } return liveImage; } const QImage ImageGrabberFacade::getRawImage() { QImage rawImage; int videoSource = frontend->getProject()->getVideoSource(); ImageGrabberDevice *videoDevice = getDevice(videoSource); switch (videoDevice->getDeviceSource()) { case ImageGrabberDevice::video4Linux2Source: rawImage = v4l2Grabber->getRawImage(); break; case ImageGrabberDevice::gphoto2Source: rawImage = gphotoGrabber->getRawImage(); break; case ImageGrabberDevice::mediaFoundationSource: rawImage = mediaFoundationGrabber->getRawImage(); break; default: break; } return rawImage; } qstopmotion-2.3.2-Source/src/technical/grabber/imagegrabberthread.h000644 000000 000000 00000005272 12654352322 025435 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef IMAGEGRABBERTHREAD_H #define IMAGEGRABBERTHREAD_H #include #include "technical/grabber/imagegrabber.h" /** * Thread used for polling an external program to update the camera. Only * used for polling, not for when the camera is running in deamon mode. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ImageGrabberThread : public QThread { public: /** * Constructs and initializes the object. * @param frameView the frame view to be used for displaying images * @param g the grabber to use be used for grabbing images */ ImageGrabberThread(ImageGrabber *g); /** * Displays the images grabbed with the registered grabber. These * are displayed one after one and it looks like we are streaming * live from the camera. */ void run(); /** * Checks if last grabbing was successfull. * @return true if last grabbing was success, false otherwise */ bool wasGrabbingSuccess(); private: ImageGrabber *grabber; bool wasGrabSuccess; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/imagegrabberthread.cpp000644 000000 000000 00000004164 12654352322 025767 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "imagegrabberthread.h" ImageGrabberThread::ImageGrabberThread(ImageGrabber *g) { grabber = g; wasGrabSuccess = true; } void ImageGrabberThread::run() { //Don't want the frameview to update unless the grabbing worked. while (true) { wasGrabSuccess = grabber->grab(); if (!wasGrabSuccess) { break; } // frameView->redraw(); } } bool ImageGrabberThread::wasGrabbingSuccess() { return wasGrabSuccess; } qstopmotion-2.3.2-Source/src/technical/grabber/imagegrabber.cpp000644 000000 000000 00000004236 12654352322 024577 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "imagegrabber.h" #include ImageGrabber::ImageGrabber(Frontend *f) { qDebug() << "ImageGrabber::Constructor --> Start"; frontend = f; qDebug() << "ImageGrabber::Constructor --> End"; } ImageGrabber::~ImageGrabber() { qDebug() << "ImageGrabber::Destructor --> Start (Empty)"; // qDebug() << "ImageGrabber::Destructor --> End"); } void ImageGrabber::finalize() { qDebug() << "ImageGrabber::finalize --> Start (Empty)"; // qDebug() << "ImageGrabber::finalize --> End"; } qstopmotion-2.3.2-Source/src/technical/grabber/grabberresolution.h000644 000000 000000 00000010340 12662601115 025352 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2014-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef GRABBERRESOLUTION_H #define GRABBERRESOLUTION_H #include /** * Resolution of a device. * * @author Ralf Lange */ class GrabberResolution { public: /** * Enum with all possible image output formats */ enum resolutionFormat { unknownFormat, // Not supported format rgb24Format, // RGB24 format bgr24Format, // BGR24 format xbgr32Format, // XBGR32 format abgr32Format, // ABGR32 format ayuvFormat, // AYUV format yuv2Format, // YUV2 format uyvyFormat, // UYVY format nv12Format, // NV12 format yu12Format, // YU12 format (= YUV420 format) yuv420mFormat, // YUV420 planar (= I420 format) yv12Format, // YV12 format (= YVU420 format) yvu420mFormat, // YVU420 planar mjpegFormat // MJPEG format }; /** * Default constructs and initializes the object. */ GrabberResolution(); /** * Constructs and initializes the object. * @param w The width of the resolution. * @param h The height of the resolution. * @param f The image format of the resolution. * @param a Is the resolution active. */ GrabberResolution(unsigned int w, unsigned int h, unsigned int f, bool a); /** * Destructor */ ~GrabberResolution(); /** * Get the width value of the resolution * @return The width value of the resolution. */ unsigned int getWidth(); /** * Set the width value of the resolution * @param w The new width value of the resolution. */ void setWidth(unsigned int w); /** * Get the height value of the resolution * @return The height value of the resolution. */ unsigned int getHeight(); /** * Set the height value of the resolution * @param h The new height value of the resolution. */ void setHeight(unsigned int h); /** * Get the image format of the resolution * @return The image format of the resolution. */ unsigned int getFormat(); /** * Set the image format of the resolution * @param f The new image format of the resolution. */ void setFormat(unsigned int f); /** * Is the resolution active? * @return True if active. */ bool isActive(); /** * Get the name of the resolution. * @return The id of the resolution. */ const QString getName(); private: unsigned int width; unsigned int height; unsigned int format; bool active; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/imagegrabberdevice.h000644 000000 000000 00000015366 12751646113 025434 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2011-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef IMAGEGRABBERDEVICE_H #define IMAGEGRABBERDEVICE_H #include #include #include #include "frontends/frontend.h" #include "technical/grabber/grabbercontroller.h" #include "technical/grabber/grabberresolution.h" class GrabberController; /** * Class containing all the informations of a device. * * @author Ralf Lange */ class ImageGrabberDevice { public: /** * All possible video sources. */ enum imageGrabberSources { noSource, // 0 video4Linux2Source, // 1 gphoto2Source, // 2 mediaFoundationSource // 3 }; /** * Video device capabilities */ enum imageGrabberDeviceCapabilities { video_x_none, // 0 video_x_raw_rgb, // 1 video_x_raw_yuv, // 2 video_x_dv // 3 }; /** * Default constructor of the object. */ ImageGrabberDevice(); /** * Constructs and initializes the object. * @param index The index of the device. * @param id The id of the device. * @param name The name of the device. * @param source The source of the device. * @param cap The capability of the device. */ ImageGrabberDevice(const int index, const QString id, const QString name, imageGrabberSources source, imageGrabberDeviceCapabilities cap); /** * Destructor */ ~ImageGrabberDevice(); /** * Get the index of the device. * @return The index of the device. */ const int getDeviceIndex(); /** * Set the index of the device. * @param index The new index of the device. */ void setDeviceIndex(const int index); /** * Get the id of the device. * @return The id of the device. */ const QString getDeviceId(); /** * Set the id of the device. * @param id The new id of the device. */ void setDeviceId(const QString id); /** * Get the name of the device. * @return The name of the device. */ const QString getDeviceName(); /** * Set the name of the device. * @param name The new name of the device. */ void setDeviceName(const QString name); /** * Get the source of the device. * @return The source of the device. */ imageGrabberSources getDeviceSource(); /** * Set the source of the device. * @param source The new source of the device. */ void setDeviceSource(imageGrabberSources source); /** * Get the capability of the device. * @return The capability of the device. */ imageGrabberDeviceCapabilities getDeviceCapability(); /** * Set the capability of the device. * @param cap The new capability of the device. */ void setDeviceCapability(imageGrabberDeviceCapabilities cap); /************************************************************************** ************************************************************************** * Camera resolution ************************************************************************** **************************************************************************/ /** * Add a resolution to the controller. * @param r The new grabber resolution. */ void addResolution(GrabberResolution r); /** * Get the possible resolutions of the controller. * @return The resolutions of the controller. */ QVector getResolutions(); /** * Set the resolution changeable flag of the device. * False means that the resolution of the device can't be changed by the application. * @brief setResolutionChangeable * @param rc The new resolution changeable flag. */ void setResolutionChangeable(bool rc); /** * Ist the resolution changeable by the application? * @brief isResolutionChangeable * @return True is yes. */ bool isResolutionChangeable(); /************************************************************************** ************************************************************************** * Camera controller ************************************************************************** **************************************************************************/ /** * Has the grabber a controller interface? * @return True if there is a controller interface. */ bool isController() const; /** * Get the controller of the grabber. * @return The controller of the grabber. */ GrabberController *getController(); /** * Set the controller of the grabber. * @param The controller of the grabber. */ void setController(GrabberController *c); private: int deviceIndex; QString deviceId; QString deviceName; imageGrabberSources deviceSource; imageGrabberDeviceCapabilities deviceCap; QVector resolutions; bool resolutionChangeable; GrabberController *controller; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/windowsuvccontroller.cpp000644 000000 000000 00000024467 12536560630 026516 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2012 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "windowsuvccontroller.h" #include /************************************************************************** * Implementation of the Windows UVC controller functions. **************************************************************************/ WindowsUvcController::WindowsUvcController(int cap) : GrabberController(cap) { qDebug("WindowsUvcController::Constructor --> Start (Empty)"); // qDebug("WindowsUvcController::Constructor --> End"); } WindowsUvcController::~WindowsUvcController() { qDebug("WindowsUvcController::Destructor --> Start (Empty)"); // qDebug("WindowsUvcController::Destructor --> End"); } /* ImageGrabberDevice* WindowsUvcController::getDevice() { return device; } int WindowsUvcController::getControllerCapabilities() { return controllerCap; } */ /************************************************************************** ************************************************************************** * Camera resolution ************************************************************************** **************************************************************************/ /* int MfController::getActiveResolution() { return -1; } void MfController::setActiveResolution(int ac) { } */ /************************************************************************** ************************************************************************** * Camera capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness **************************************************************************/ /* bool WindowsUvcController::isBrightness() { return false; } int WindowsUvcController::getMaximumBrightness() { return 0; } int WindowsUvcController::getBrightness() { return 0; } void WindowsUvcController::setBrightness(int b) { Q_ASSERT( 1 ); } */ /************************************************************************** * Contrast **************************************************************************/ /* bool WindowsUvcController::isContrast() { return false; } int WindowsUvcController::getMaximumContrast() { return 0; } int WindowsUvcController::getContrast() { return 0; } void WindowsUvcController::setContrast(int c) { Q_ASSERT( 1 ); } */ /************************************************************************** * Saturation **************************************************************************/ /* bool WindowsUvcController::isSaturation() { return false; } int WindowsUvcController::getMaximumSaturation() { return 0; } int WindowsUvcController::getSaturation() { return 0; } void WindowsUvcController::setSaturation(int s) { Q_ASSERT( 1 ); } */ /************************************************************************** * Hue **************************************************************************/ /* bool WindowsUvcController::isHue() { return false; } int WindowsUvcController::getMaximumHue() { return 0; } int WindowsUvcController::getHue() { return 0; } void WindowsUvcController::setHue(int h) { Q_ASSERT( 1 ); } */ /************************************************************************** * Gamma **************************************************************************/ /* bool WindowsUvcController::isGamma() { return false; } int WindowsUvcController::getMaximumGamma() { return 0; } int WindowsUvcController::getGamma() { return 0; } void WindowsUvcController::setGamma(int g) { Q_ASSERT( 1 ); } */ /************************************************************************** * Sharpness **************************************************************************/ /* bool WindowsUvcController::isSharpness() { return false; } int WindowsUvcController::getMaximumSharpness() { return 0; } int WindowsUvcController::getSharpness() { return 0; } void WindowsUvcController::setSharpness(int s) { Q_ASSERT( 1 ); } */ /************************************************************************** * Backlight Compensation **************************************************************************/ /* bool WindowsUvcController::isBacklight() { return false; } int WindowsUvcController::getMaximumBacklight() { return 0; } int WindowsUvcController::getBacklight() { return 0; } void WindowsUvcController::setBacklight(int b) { Q_ASSERT( 1 ); } */ /************************************************************************** * Exposure **************************************************************************/ /* bool WindowsUvcController::isAutomaticExposure() { return false; } bool WindowsUvcController::getAutomaticExposure() { return false; } void WindowsUvcController::setAutomaticExposure(bool ae) { Q_ASSERT( 1 ); } bool WindowsUvcController::isExposure() { return false; } int WindowsUvcController::getMaximumExposure() { return 0; } int WindowsUvcController::getExposure() { return 0; } void WindowsUvcController::setExposure(int e) { Q_ASSERT( 1 ); } */ /************************************************************************** * White Balance **************************************************************************/ /* bool WindowsUvcController::isAutomaticWhite() { return false; } bool WindowsUvcController::getAutomaticWhite() { return false; } void WindowsUvcController::setAutomaticWhite(bool aw) { Q_ASSERT( 1 ); } bool WindowsUvcController::isWhite() { return false; } int WindowsUvcController::getMaximumWhite() { return 0; } int WindowsUvcController::getWhite() { return 0; } void WindowsUvcController::setWhite(int w) { Q_ASSERT( 1 ); } */ /************************************************************************** * Zoom **************************************************************************/ /* bool WindowsUvcController::isAutomaticZoom() { return false; } bool WindowsUvcController::getAutomaticZoom() { return false; } void WindowsUvcController::setAutomaticZoom(bool az) { Q_ASSERT( 1 ); } bool WindowsUvcController::isZoom() { return false; } int WindowsUvcController::getMaximumZoom() { return 0; } int WindowsUvcController::getZoom() { return 0; } void WindowsUvcController::setZoom(int z) { Q_ASSERT( 1 ); } */ /************************************************************************** * Focus **************************************************************************/ /* bool WindowsUvcController::isAutomaticFocus() { return false; } bool WindowsUvcController::getAutomaticFocus() { return false; } void WindowsUvcController::setAutomaticFocus(bool af) { Q_ASSERT( 1 ); } bool WindowsUvcController::isFocus() { return false; } int WindowsUvcController::getMaximumFocus() { return 0; } int WindowsUvcController::getFocus() { return 0; } void WindowsUvcController::setFocus(int f) { Q_ASSERT( 1 ); } */ /************************************************************************** * Pan **************************************************************************/ /* bool GrabberController::isPan() { return false; } int GrabberController::getMaximumPan() { return 0; } int GrabberController::getPan() { return 0; } void GrabberController::setPan(int p) { Q_ASSERT( 1 ); } */ /************************************************************************** * Tilt **************************************************************************/ /* bool GrabberController::isTilt() { return false; } int GrabberController::getMaximumTilt() { return 0; } int GrabberController::getTilt() { return 0; } void GrabberController::setTilt(int t) { Q_ASSERT( 1 ); } */ /************************************************************************** * Iris **************************************************************************/ /* GrabberControlCapabilities *GrabberController::getIrisCaps() { return &irisCapabilities; } bool GrabberController::getAutomaticIris() { return false; } void GrabberController::setAutomaticIris(bool ai) { Q_ASSERT( 1 ); } int GrabberController::getIris() { return 0; } void GrabberController::setIris(int i) { Q_ASSERT( 1 ); } */ /************************************************************************** * Roll **************************************************************************/ /* GrabberControlCapabilities *GrabberController::getRollCaps() { return &rollCapabilities; } bool GrabberController::getAutomaticRoll() { return false; } void GrabberController::setAutomaticRoll(bool ar) { Q_ASSERT( 1 ); } int GrabberController::getRoll() { return 0; } void GrabberController::setRoll(int r) { Q_ASSERT( 1 ); } */ qstopmotion-2.3.2-Source/src/technical/grabber/windowsuvccontroller.h000644 000000 000000 00000040755 12536560630 026161 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2012 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef WINDOWSUVCCONTROLLER_H #define WINDOWSUVCCONTROLLER_H #include "technical/grabber/grabbercontroller.h" #include #include /** * Controller of Windows UVC devices. * * @author Ralf Lange */ class WindowsUvcController : public GrabberController { public: /** * Constructs and initializes the object. * @param d The image grabber device of the controller. * @param caps The grabber controller capabilities. */ WindowsUvcController(int caps); /** * Destructor */ ~WindowsUvcController(); /** * Get the device of the controller. * @return The device of the controller. */ // ImageGrabberDevice* getDevice(); /** * Get the capabilities of the controller. * @return The capabilities of the controller. */ // int getControllerCapabilities(); /************************************************************************** ************************************************************************** * Camera resolution ************************************************************************** **************************************************************************/ /** * Get the active resolution of the controller. * @return The index of the active resolution. */ // int getActiveResolution(); /** * Set the active resolution of the controller. * @param ac The index of the new active resolution. */ // void setActiveResolution(int ac); /************************************************************************** ************************************************************************** * Camera capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness **************************************************************************/ /** * Has the camera a brightness control capability? * @return True if the camera has a brightness control apability. */ // bool isBrightness(); /** * Get the maximum value of the brightness. * @return The maximum value of the brightness. */ // int getMaximumBrightness(); /** * Get the current brightness value of the device. * @return The current brightness value. */ // int getBrightness(); /** * Set the brightness value of the device. * @param b The new brightness value */ // void setBrightness(int b); /************************************************************************** * Contrast **************************************************************************/ /** * Has the camera a contrast control capability? * @return True if the camera has a contrast control apability. */ // bool isContrast(); /** * Get the maximum value of the contrast. * @return The maximum value of the contrast. */ // int getMaximumContrast(); /** * Get the current contrast value of the device. * @return The current contrast value. */ // int getContrast(); /** * Set the contrast value of the device. * @param c The new contrast value */ // void setContrast(int c); /************************************************************************** * Saturation **************************************************************************/ /** * Has the camera a saturation control capability? * @return True if the camera has a saturation control apability. */ // bool isSaturation(); /** * Get the maximum value of the saturation. * @return The maximum value of the saturation. */ // int getMaximumSaturation(); /** * Get the current saturation value of the device. * @return The current saturation value. */ // int getSaturation(); /** * Set the saturation value of the device. * @param s The new saturation value */ // void setSaturation(int s); /************************************************************************** * Hue **************************************************************************/ /** * Has the camera a hue control capability? * @return True if the camera has a hue control apability. */ // bool isHue(); /** * Get the maximum value of the hue. * @return The maximum value of the hue. */ // int getMaximumHue(); /** * Get the current hue value of the device. * @return The current hue value. */ // int getHue(); /** * Set the hue value of the device. * @param h The new hue value */ // void setHue(int h); /************************************************************************** * Gamma **************************************************************************/ /** * Has the camera a gamma control capability? * @return True if the camera has a gamma control apability. */ // bool isGamma(); /** * Get the maximum value of the gamma. * @return The maximum value of the gamma. */ // int getMaximumGamma(); /** * Get the current gamma value of the device. * @return The current gamma value. */ // int getGamma(); /** * Set the gamma value of the device. * @param g The new gamma value */ // void setGamma(int g); /************************************************************************** * Sharpness **************************************************************************/ /** * Has the camera a sharpness control capability? * @return True if the camera has a sharpness control apability. */ // bool isSharpness(); /** * Get the maximum value of the sharpness. * @return The maximum value of the sharpness. */ // int getMaximumSharpness(); /** * Get the current sharpness value of the device. * @return The current sharpness value. */ // int getSharpness(); /** * Set the sharpness value of the device. * @param s The new sharpness value */ // void setSharpness(int s); /************************************************************************** * Backlight Compensation **************************************************************************/ /** * Has the camera a backlight compensation control capability? * @return True if the camera has a backlight compensation control apability. */ // bool isBacklight(); /** * Get the maximum value of the backlight compensation. * @return The maximum value of the backlight compensation. */ // int getMaximumBacklight(); /** * Get the current backlight compensation value of the device. * @return The current backlight compensation value. */ // int getBacklight(); /** * Set the backlight compensation value of the device. * @param b The new backlight compensation value */ // void setBacklight(int b); /************************************************************************** * Exposure **************************************************************************/ /** * Has the camera a automatic exposure control capability? * @return True if the camera has a automatic exposure control apability. */ // bool isAutomaticExposure(); /** * Get the current automatic exposure value of the device. * @return True if the automatic exposure is on. */ // bool getAutomaticExposure(); /** * Set the automatic exposure value of the device. * @param ae True if the automatic exposure will be switched on. */ // void setAutomaticExposure(bool ae); /** * Has the camera a exposure control capability? * @return True if the camera has a exposure control apability. */ // bool isExposure(); /** * Get the maximum value of the exposure. * @return The maximum value of the exposure. */ // int getMaximumExposure(); /** * Get the current exposure value of the device. * @return The current exposure value. */ // int getExposure(); /** * Set the exposure value of the device. * @param e The new exposure value */ // void setExposure(int e); /************************************************************************** * White Balance **************************************************************************/ /** * Has the camera a automatic white balance control capability? * @return True if the camera has a automatic white balance control apability. */ // bool isAutomaticWhite(); /** * Get the current automatic white balance value of the device. * @return True if the automatic white balance is on. */ // bool getAutomaticWhite(); /** * Set the automatic white balance value of the device. * @param ae True if the automatic white balance will be switched on. */ // void setAutomaticWhite(bool ae); /** * Has the camera a white balance control capability? * @return True if the camera has a white balance control apability. */ // bool isWhite(); /** * Get the maximum value of the white balance. * @return The maximum value of the white balance. */ // int getMaximumWhite(); /** * Get the current white balance value of the device. * @return The current white balance value. */ // int getWhite(); /** * Set the white balance value of the device. * @param w The new white balance value */ // void setWhite(int w); /************************************************************************** * Zoom **************************************************************************/ /** * Has the camera a automatic zoom control capability? * @return True if the camera has a automatic zoom control apability. */ // bool isAutomaticZoom(); /** * Get the current automatic zoom value of the device. * @return True if the automatic zoom is on. */ // bool getAutomaticZoom(); /** * Set the automatic zoom value of the device. * @param az True if the automatic zoom will be switched on. */ // void setAutomaticZoom(bool az); /** * Has the camera a zoom control capability? * @return True if the camera has a zoom control apability. */ // bool isZoom(); /** * Get the maximum value of the zoom. * @return The maximum value of the zoom. */ // int getMaximumZoom(); /** * Get the current zoom value of the device. * @return The current zoom value. */ // int getZoom(); /** * Set the zoom value of the device. * @param z The new zoom value */ // void setZoom(int z); /************************************************************************** * Focus **************************************************************************/ /** * Has the camera a automatic focus control capability? * @return True if the camera has a automatic focus control apability. */ // bool isAutomaticFocus(); /** * Get the current automatic focus value of the device. * @return True if the automatic focus is on. */ // bool getAutomaticFocus(); /** * Set the automatic focus value of the device. * @param af True if the automatic focus will be switched on. */ // void setAutomaticFocus(bool af); /** * Has the camera a focus control capability? * @return True if the camera has a focus control apability. */ // bool isFocus(); /** * Get the maximum focus of the zoom. * @return The maximum focus of the zoom. */ // int getMaximumFocus(); /** * Get the current focus value of the device. * @return The current focus value. */ // int getFocus(); /** * Set the focus value of the device. * @param f The new focus value */ // void setFocus(int f); /************************************************************************** * Pan **************************************************************************/ /** * Has the camera a pan control capability? * @return True if the camera has a pan control apability. */ // bool isPan(); /** * Get the maximum value of the pan. * @return The maximum value of the pan. */ // int getMaximumPan(); /** * Get the current pan value of the device. * @return The current pan value. */ // int getPan(); /** * Set the pan value of the device. * @param p The new pan value */ // void setPan(int p); /************************************************************************** * Tilt **************************************************************************/ /** * Has the camera a tilt control capability? * @return True if the camera has a tilt control apability. */ // bool isTilt(); /** * Get the maximum value of the tilt. * @return The maximum value of the tilt. */ // int getMaximumTilt(); /** * Get the current tilt value of the device. * @return The current tilt value. */ // int getTilt(); /** * Set the tilt value of the device. * @param t The new tilt value */ // void setTilt(int t); /************************************************************************** * Iris **************************************************************************/ /** * Get the current automatic iris value of the device. * @return True if the automatic iris is on. */ // bool getAutomaticIris(); /** * Set the automatic iris value of the device. * @param ae True if the automatic iris will be switched on. */ // void setAutomaticIris(bool ae); /** * Get the current iris value of the device. * @return The current iris value. */ // int getIris(); /** * Set the iris value of the device. * @param e The new iris value */ // void setIris(int e); /************************************************************************** * Roll **************************************************************************/ /** * Get the current automatic roll value of the device. * @return True if the automatic roll is on. */ // bool getAutomaticRoll(); /** * Set the automatic roll value of the device. * @param ar True if the automatic roll will be switched on. */ // void setAutomaticRoll(bool ar); /** * Get the current roll value of the device. * @return The current roll value. */ // int getRoll(); /** * Set the roll value of the device. * @param r The new roll value */ // void setRoll(int r); private: }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/grabbercontroller.cpp000644 000000 000000 00000027476 12654352322 025713 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "grabbercontroller.h" #include /************************************************************************** * Default implementation of the grabber controller functions. **************************************************************************/ GrabberController::GrabberController(int cap) { qDebug() << "GrabberController::Constructor --> Start"; controllerCap = cap; qDebug() << "GrabberController::Constructor --> End"; } GrabberController::~GrabberController() { qDebug() << "GrabberController::Destructor --> Start (Empty)"; // qDebug() << "GrabberController::Destructor --> End"; } int GrabberController::getControllerCapabilities() { return controllerCap; } /************************************************************************** ************************************************************************** * Camera quality capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness **************************************************************************/ GrabberControlCapabilities *GrabberController::getBrightnessCaps() { return &brightnessCapabilities; } bool GrabberController::getAutomaticBrightness() { return false; } void GrabberController::setAutomaticBrightness(bool /*ab*/) { Q_ASSERT( 1 ); } int GrabberController::getBrightness() { return 0; } void GrabberController::setBrightness(int /*b*/) { Q_ASSERT( 1 ); } /************************************************************************** * Contrast **************************************************************************/ GrabberControlCapabilities *GrabberController::getContrastCaps() { return &contrastCapabilities; } bool GrabberController::getAutomaticContrast() { return false; } void GrabberController::setAutomaticContrast(bool /*ac*/) { Q_ASSERT( 1 ); } int GrabberController::getContrast() { return 0; } void GrabberController::setContrast(int /*c*/) { Q_ASSERT( 1 ); } /************************************************************************** * Saturation **************************************************************************/ GrabberControlCapabilities *GrabberController::getSaturationCaps() { return &saturationCapabilities; } bool GrabberController::getAutomaticSaturation() { return false; } void GrabberController::setAutomaticSaturation(bool /*as*/) { Q_ASSERT( 1 ); } int GrabberController::getSaturation() { return 0; } void GrabberController::setSaturation(int /*s*/) { Q_ASSERT( 1 ); } /************************************************************************** * Hue **************************************************************************/ GrabberControlCapabilities *GrabberController::getHueCaps() { return &hueCapabilities; } bool GrabberController::getAutomaticHue() { return false; } void GrabberController::setAutomaticHue(bool /*ah*/) { Q_ASSERT( 1 ); } int GrabberController::getHue() { return 0; } void GrabberController::setHue(int /*h*/) { Q_ASSERT( 1 ); } /************************************************************************** * Gamma **************************************************************************/ GrabberControlCapabilities *GrabberController::getGammaCaps() { return &gammaCapabilities; } bool GrabberController::getAutomaticGamma() { return false; } void GrabberController::setAutomaticGamma(bool /*ag*/) { Q_ASSERT( 1 ); } int GrabberController::getGamma() { return 0; } void GrabberController::setGamma(int /*g*/) { Q_ASSERT( 1 ); } /************************************************************************** * Sharpness **************************************************************************/ GrabberControlCapabilities *GrabberController::getSharpnessCaps() { return &sharpnessCapabilities; } bool GrabberController::getAutomaticSharpness() { return false; } void GrabberController::setAutomaticSharpness(bool /*as*/) { Q_ASSERT( 1 ); } int GrabberController::getSharpness() { return 0; } void GrabberController::setSharpness(int /*s*/) { Q_ASSERT( 1 ); } /************************************************************************** * Backlight Compensation **************************************************************************/ GrabberControlCapabilities *GrabberController::getBacklightCaps() { return &backlightCapabilities; } bool GrabberController::getAutomaticBacklight() { return false; } void GrabberController::setAutomaticBacklight(bool /*ab*/) { Q_ASSERT( 1 ); } int GrabberController::getBacklight() { return 0; } void GrabberController::setBacklight(int /*b*/) { Q_ASSERT( 1 ); } /************************************************************************** * White Balance **************************************************************************/ GrabberControlCapabilities *GrabberController::getWhiteCaps() { return &whiteCapabilities; } bool GrabberController::getAutomaticWhite() { return false; } void GrabberController::setAutomaticWhite(bool /*aw*/) { Q_ASSERT( 1 ); } int GrabberController::getWhite() { return 0; } void GrabberController::setWhite(int /*w*/) { Q_ASSERT( 1 ); } /************************************************************************** * Gain **************************************************************************/ GrabberControlCapabilities *GrabberController::getGainCaps() { return &gainCapabilities; } bool GrabberController::getAutomaticGain() { return false; } void GrabberController::setAutomaticGain(bool /*ag*/) { Q_ASSERT( 1 ); } int GrabberController::getGain() { return 0; } void GrabberController::setGain(int /*g*/) { Q_ASSERT( 1 ); } /************************************************************************** * Color Enable **************************************************************************/ GrabberControlCapabilities *GrabberController::getColorCaps() { return &colorCapabilities; } bool GrabberController::getAutomaticColor() { return false; } void GrabberController::setAutomaticColor(bool /*ac*/) { Q_ASSERT( 1 ); } int GrabberController::getColor() { return 0; } void GrabberController::setColor(int /*c*/) { Q_ASSERT( 1 ); } /************************************************************************** ************************************************************************** * Camera control capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Exposure **************************************************************************/ GrabberControlCapabilities *GrabberController::getExposureCaps() { return &exposureCapabilities; } bool GrabberController::getAutomaticExposure() { return false; } void GrabberController::setAutomaticExposure(bool /*ae*/) { Q_ASSERT( 1 ); } int GrabberController::getExposure() { return 0; } void GrabberController::setExposure(int /*e*/) { Q_ASSERT( 1 ); } /************************************************************************** * Zoom **************************************************************************/ GrabberControlCapabilities *GrabberController::getZoomCaps() { return &zoomCapabilities; } bool GrabberController::getAutomaticZoom() { return false; } void GrabberController::setAutomaticZoom(bool /*az*/) { Q_ASSERT( 1 ); } int GrabberController::getZoom() { return 0; } void GrabberController::setZoom(int /*z*/) { Q_ASSERT( 1 ); } /************************************************************************** * Focus **************************************************************************/ GrabberControlCapabilities *GrabberController::getFocusCaps() { return &focusCapabilities; } bool GrabberController::getAutomaticFocus() { return false; } void GrabberController::setAutomaticFocus(bool /*af*/) { Q_ASSERT( 1 ); } int GrabberController::getFocus() { return 0; } void GrabberController::setFocus(int /*f*/) { Q_ASSERT( 1 ); } /************************************************************************** * Pan **************************************************************************/ GrabberControlCapabilities *GrabberController::getPanCaps() { return &panCapabilities; } bool GrabberController::getAutomaticPan() { return false; } void GrabberController::setAutomaticPan(bool /*ap*/) { Q_ASSERT( 1 ); } int GrabberController::getPan() { return 0; } void GrabberController::setPan(int /*p*/) { Q_ASSERT( 1 ); } /************************************************************************** * Tilt **************************************************************************/ GrabberControlCapabilities *GrabberController::getTiltCaps() { return &tiltCapabilities; } bool GrabberController::getAutomaticTilt() { return false; } void GrabberController::setAutomaticTilt(bool /*at*/) { Q_ASSERT( 1 ); } int GrabberController::getTilt() { return 0; } void GrabberController::setTilt(int /*t*/) { Q_ASSERT( 1 ); } /************************************************************************** * Iris **************************************************************************/ GrabberControlCapabilities *GrabberController::getIrisCaps() { return &irisCapabilities; } bool GrabberController::getAutomaticIris() { return false; } void GrabberController::setAutomaticIris(bool /*ai*/) { Q_ASSERT( 1 ); } int GrabberController::getIris() { return 0; } void GrabberController::setIris(int /*i*/) { Q_ASSERT( 1 ); } /************************************************************************** * Roll **************************************************************************/ GrabberControlCapabilities *GrabberController::getRollCaps() { return &rollCapabilities; } bool GrabberController::getAutomaticRoll() { return false; } void GrabberController::setAutomaticRoll(bool /*ar*/) { Q_ASSERT( 1 ); } int GrabberController::getRoll() { return 0; } void GrabberController::setRoll(int /*r*/) { Q_ASSERT( 1 ); } qstopmotion-2.3.2-Source/src/technical/grabber/gphoto2/gpgrabber.h000644 000000 000000 00000010160 13011043104 025122 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef GPHOTOGRABBER_H #define GPHOTOGRABBER_H // Include files of the gphoto library #include #include "technical/grabber/imagegrabber.h" /** * Base class for the different gphoto grabbers. * * @author Ralf Lange */ class GphotoGrabber : public ImageGrabber { Q_OBJECT public: /** * Initializes the member variables. * @param filePath path to the output file grabbed from a device */ GphotoGrabber(Frontend *f); /** * Destructor */ ~GphotoGrabber(); /** * Initialization of the Command line grabber. * @param devices The vector of initialized devices. * @return true on success, false otherwise. */ bool initialization(QVector &devices); /** * Starts the grabber if it is marked to be run in deamon mode. * @return true on success, false otherwise */ bool setUp(); /** * Get the live image from the camera */ const QImage getLiveImage(); /** * Get the raw image from the camera */ const QImage getRawImage(); /** * Grabs one picture from the device. * @return true on success, false otherwise */ bool grab(); /** * Shut downs the grabber process either if it is run in deamon * mode or "single grab" mode. * @return true on success, false otherwise */ virtual bool tearDown(); Camera* getCamera(); GPContext* getContext(); private: void openCamera(); void closeCamera(); static int lookupWidget(CameraWidget *widget, const char *key, CameraWidget* *child); static void errorDumper(GPLogLevel level, const char *domain, const char *format, va_list args, void *data); bool canonEnableCapture(Camera *gphotoCamera, GPContext *gphotoContext, CameraWidget *gphotoConfig); void populateWithConfigs(CameraWidget *gphotoConfig); void readImageSettings(ImageGrabberDevice *device); QString filePath; Camera *gphotoCamera; GPContext *gphotoContext; int gphotoErrorId; int activeSource; bool isInitSuccess; bool firstImage; QImage liveImage; QImage rawImage; bool canCaptureImage; bool canCaptureAudio; bool canCaptureVideo; bool canCapturePreview; bool canConfigure; QString manufacturer; QString model; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/gphoto2/gpgrabber.cpp000644 000000 000000 00000104065 12751646113 025510 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "gpgrabber.h" #include #include #include // #include #include #include "gpcontroller.h" #include "technical/grabber/imagegrabberdevice.h" #include "technical/util.h" // Include files of the gphoto library #include #include #include #include #include #include GphotoGrabber::GphotoGrabber(Frontend *f) : ImageGrabber(f) { qDebug() << "GphotoGrabber::Constructor --> Start"; gphotoCamera = NULL; gphotoContext = NULL; canCaptureImage = false; canCaptureAudio = false; canCaptureVideo = false; canCapturePreview = false; canConfigure = false; QString rootDir; rootDir.append(frontend->getUserDirName()); rootDir.append("/"); rootDir.append("capturedfile.jpg"); filePath.append(rootDir); gphotoContext = gp_context_new(); gphotoErrorId = gp_log_add_func(GP_LOG_ERROR, (GPLogFunc)errorDumper, NULL); openCamera(); // Read the summary of the camera int ret; CameraText sum; ret = gp_camera_get_summary(gphotoCamera, &sum, gphotoContext); if (ret != GP_OK) { qDebug() << "GphotoGrabber::Constructor --> Error gp_camera_get_summary: " << gp_result_as_string(ret); } else { QStringList sumList = QString(sum.text).split('\n'); for (int i = 0; i < sumList.size(); i++) { qDebug() << "GphotoGrabber::Constructor --> Summary: " << sumList.at(i); } manufacturer.append(sumList.at(0).split(' ').at(1)); model.append(sumList.at(1).split(' ').at(1)); } // Read the manual of the camera CameraText manual; ret = gp_camera_get_manual(gphotoCamera, &manual, gphotoContext); if (ret != GP_OK) { qDebug() << "GphotoGrabber::Constructor --> Error gp_camera_get_manual: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::Constructor --> Manual: " << QString(manual.text); } // Read the about of the camera driver CameraText about; ret = gp_camera_get_about(gphotoCamera, &about, gphotoContext); if (ret != GP_OK) { qDebug() << "GphotoGrabber::Constructor --> Error gp_camera_get_about: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::Constructor --> About: " << QString(about.text); } qDebug() << "GphotoGrabber::Constructor --> End"; } GphotoGrabber::~GphotoGrabber() { qDebug() << "GphotoGrabber::Destructor --> Start (Empty)"; closeCamera(); qDebug() << "GphotoGrabber::Destructor --> End"; } Camera* GphotoGrabber::getCamera() { return gphotoCamera; } GPContext* GphotoGrabber::getContext() { return gphotoContext; } bool GphotoGrabber::initialization(QVector &devices) { qDebug() << "GphotoGrabber::initialization --> Start"; GphotoController *deviceController = NULL; PreferencesTool *pref = frontend->getPreferences(); CameraWidget *gphotoConfig = NULL; CameraAbilities abilities; int ret; bool returnValue = true; int value; if (!isInitSuccess) { qDebug() << "GphotoGrabber::initialization --> End (Error)"; return false; } ImageGrabberDevice *device = NULL; qDebug() << "GphotoGrabber::initialization --> Add gphoto2 device"; device = new ImageGrabberDevice(0, "", QString("%1 %2").arg(manufacturer).arg(model), ImageGrabberDevice::gphoto2Source, ImageGrabberDevice::video_x_none); devices.append(device); readImageSettings(device); // Create grabber controller if (pref->getIntegerPreference("preferences", "gphoto2controller", value) == false) { value = false; } if ((int)true == value) { deviceController = new GphotoController(0); if (deviceController->initialization(this, device)) { device->setController(deviceController); } else { delete deviceController; deviceController = NULL; } } isInitSuccess = true; ret = gp_camera_get_config(gphotoCamera, &gphotoConfig, gphotoContext); if (ret < GP_OK) { qDebug() << "GphotoGrabber::initialization --> Error End camera_get_config failed: " << gp_result_as_string(ret); returnValue = false; goto out2; } if (manufacturer.compare("canon", Qt::CaseInsensitive) == 0) { if (false == canonEnableCapture(gphotoCamera, gphotoContext, gphotoConfig)) { returnValue = false; goto out; } populateWithConfigs(gphotoConfig); } // Abilities qDebug() << "GphotoGrabber::initialization --> Checking camera abilities"; ret = gp_camera_get_abilities (gphotoCamera, &abilities); if (ret != GP_OK) { qDebug() << "GphotoGrabber::initialization --> Error End gp_camera_get_abilities: " << gp_result_as_string(ret); returnValue = false; goto out; } if (ret >= GP_OK) { // rewrite model qDebug() << "GphotoGrabber::initialization --> Abilities.model: " << QString(abilities.model); switch (abilities.status) { case GP_DRIVER_STATUS_PRODUCTION: qDebug() << "GphotoGrabber::initialization --> Abilities.driver_status: production"; break; case GP_DRIVER_STATUS_TESTING: qDebug() << "GphotoGrabber::initialization --> Abilities.driver_status: testing"; break; case GP_DRIVER_STATUS_EXPERIMENTAL: qDebug() << "GphotoGrabber::initialization --> Abilities.driver_status: experimental"; break; case GP_DRIVER_STATUS_DEPRECATED: qDebug() << "GphotoGrabber::initialization --> Abilities.driver_status: deprecated"; break; default: qDebug() << "GphotoGrabber::initialization --> Abilities.driver_status: unknown"; } qDebug() << "GphotoGrabber::initialization --> Abilities.library: " << abilities.library; qDebug() << "GphotoGrabber::initialization --> Abilities.operations: " << abilities.operations; if ((abilities.operations & GP_OPERATION_CAPTURE_IMAGE) > 0 ) { canCaptureImage = true; qDebug() << "GphotoGrabber::initialization --> Camera can capture images!"; } if ((abilities.operations & GP_OPERATION_CAPTURE_VIDEO) > 0) { canCaptureAudio = true; qDebug() << "GphotoGrabber::initialization --> Camera can capture videos!"; } if ((abilities.operations & GP_OPERATION_CAPTURE_AUDIO) > 0) { canCaptureVideo = true; qDebug() << "GphotoGrabber::initialization --> Camera can capture audio!"; } if ((abilities.operations & GP_OPERATION_CAPTURE_PREVIEW) > 0) { canCapturePreview = true; qDebug() << "GphotoGrabber::initialization --> Camera can capture preview images!"; } if ((abilities.operations & GP_OPERATION_CONFIG) > 0) { canConfigure = true; qDebug() << "GphotoGrabber::initialization --> Camera can be captured!"; } } out: gp_widget_free(gphotoConfig); out2: qDebug() << "GphotoGrabber::initialization --> device count: " << devices.size(); qDebug() << "GphotoGrabber::initialization --> End (" << returnValue << ")"; return returnValue; } bool GphotoGrabber::setUp() { qDebug() << "GphotoGrabber::setUp --> Start"; if (!isInitSuccess) { qDebug() << "GphotoGrabber::setUp --> End (Error)"; return false; } openCamera(); qDebug() << "GphotoGrabber::setUp --> End"; return true; } bool GphotoGrabber::tearDown() { qDebug() << "GphotoGrabber::tearDown --> Start"; closeCamera(); qDebug() << "GphotoGrabber::tearDown --> End"; return true; } bool GphotoGrabber::grab() { return true; } const QImage GphotoGrabber::getLiveImage() { qDebug() << "GphotoGrabber::getLiveImage --> Start"; CameraFile *cf; unsigned long size = 0; const char *data = NULL; int ret; if (false == canCapturePreview) { return getRawImage(); } openCamera(); ret = gp_file_new(&cf); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getLiveImage --> Error End gp_file_new: " << gp_result_as_string(ret); return QImage(); } ret = gp_camera_capture_preview(gphotoCamera, cf, gphotoContext); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getLiveImage --> Error End gp_camera_capture_preview: " << gp_result_as_string(ret); liveImage = QImage(); goto LiveError; } // setImage(cf, a); ret = gp_file_get_data_and_size(cf, &data, &size); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getLiveImage --> Error: gp_file_get_data_and_size: " << gp_result_as_string(ret); liveImage = QImage(); goto LiveError; } if (size == 0 ) { liveImage = QImage(); goto LiveError; } liveImage.loadFromData(QByteArray(data, size)); LiveError: ret = gp_file_free(cf); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getLiveImage --> Error: gp_file_free: " << gp_result_as_string(ret); } while(1) { CameraEventType type; void* eventData; ret = gp_camera_wait_for_event(gphotoCamera, 100, &type, &eventData, gphotoContext); if (GP_EVENT_TIMEOUT == type) { break; } else { if (GP_EVENT_CAPTURE_COMPLETE == type) { qDebug() << "GphotoGrabber::getLiveImage --> Event: Capture completed!"; } else { if (GP_EVENT_UNKNOWN != type) { qDebug() << "GphotoGrabber::getLiveImage --> Unexpected event: " << (int)type; } } } } qDebug() << "GphotoGrabber::getLiveImage --> End"; return liveImage; } const QImage GphotoGrabber::getRawImage() { qDebug() << "GphotoGrabber::getRawImage --> Start"; CameraFilePath cfp; CameraFile *cf; unsigned long size = 0; const char *data = NULL; int ret; int fdesc; // file descriptor // NOP: This gets overridden in the library to /capt0000.jpg strcpy(cfp.folder, "/"); strcpy(cfp.name, "foo.jpg"); // Taking Image ret = gp_camera_capture(gphotoCamera, GP_CAPTURE_IMAGE, &cfp, gphotoContext ); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getRawImage --> Error: gp_camera_capture: " << gp_result_as_string(ret); return QImage(); } qDebug() << "GphotoGrabber::getRawImage --> Captured file: " << cfp.folder << "/" << cfp.name; // Download image from camera to imageFilename ret = gp_file_new(&cf); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getRawImage --> Error: gp_file_new_from_fd: " << gp_result_as_string(ret); close(fdesc); return QImage(); } ret = gp_camera_file_get(gphotoCamera, cfp.folder, cfp.name, GP_FILE_TYPE_NORMAL, cf, gphotoContext); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getRawImage --> Error: gp_camera_file_get: " << gp_result_as_string(ret); rawImage = QImage(); goto RawError; } ret = gp_file_get_data_and_size(cf, &data, &size); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getRawImage --> Error: gp_file_get_data_and_size: " << gp_result_as_string(ret); rawImage = QImage(); goto RawError; } if (size == 0 ) { rawImage = QImage(); goto RawError; } // rawImage.load(QString(imageFilename)); rawImage.loadFromData(QByteArray(data, size)); // Delete image on camera ret = gp_camera_file_delete(gphotoCamera, cfp.folder, cfp.name, gphotoContext); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getRawImage --> Error: gp_camera_file_delete: " << gp_result_as_string(ret); rawImage = QImage(); goto RawError; } RawError: ret = gp_file_free(cf); if (ret != GP_OK) { qDebug() << "GphotoGrabber::getRawImage --> Error: gp_file_free: " << gp_result_as_string(ret); } while(1) { CameraEventType type; void* eventData; ret = gp_camera_wait_for_event(gphotoCamera, 100, &type, &eventData, gphotoContext); if (GP_EVENT_TIMEOUT == type) { break; } else { if (GP_EVENT_CAPTURE_COMPLETE == type) { qDebug() << "GphotoGrabber::getRawImage --> Event: Capture completed!"; } else { if (GP_EVENT_UNKNOWN != type) { qDebug() << "GphotoGrabber::getRawImage --> Unexpected event: " << (int)type; } } } } // This was a test! // this->tearDown(); // this->setUp(); qDebug() << "GphotoGrabber::getRawImage --> End"; return rawImage; } void GphotoGrabber::openCamera() { qDebug() << "GphotoGrabber::openCamera --> Start"; int ret; if (NULL != gphotoCamera) { qDebug() << "GphotoGrabber::openCamera --> End (Nothing to do!)"; return; } gp_camera_new(&gphotoCamera); qDebug() << "GphotoGrabber::openCamera --> Camera init. Takes a second or three..."; ret = gp_camera_init(gphotoCamera, gphotoContext); if (ret != GP_OK) { qDebug() << "GphotoGrabber::openCamera --> Error during camera initialization: " << gp_result_as_string(ret); isInitSuccess = false; return; } isInitSuccess = true; // canonEnableCapture(gphotoCamera, TRUE, gphotoContext); qDebug() << "GphotoGrabber::openCamera --> End"; } void GphotoGrabber::closeCamera() { qDebug() << "GphotoGrabber::closeCamera --> Start"; int ret; if (NULL == gphotoCamera) { qDebug() << "GphotoGrabber::closeCamera --> End (Nothing to do!)"; return; } ret = gp_camera_exit(gphotoCamera, gphotoContext); if (ret != GP_OK) { qDebug() << "GphotoGrabber::closeCamera --> Error End gp_camera_exit: " << gp_result_as_string(ret); } ret = gp_camera_free(gphotoCamera); if (ret != GP_OK) { qDebug() << "GphotoGrabber::closeCamera --> Error End gp_camera_exit: " << gp_result_as_string(ret); } gphotoCamera = NULL; qDebug() << "GphotoGrabber::closeCamera --> End"; } void GphotoGrabber::readImageSettings(ImageGrabberDevice *device) { qDebug() << "GphotoGrabber::readImageSettings --> Start"; int ret; CameraWidget* widget_root = NULL; CameraWidget* widget_main = NULL; CameraWidget* widget_imgsettings = NULL; CameraWidget* widget_imgsetting = NULL; int widgetCount = 0; const char* info = NULL; const char* name = NULL; const char* label = NULL; CameraWidgetType type; float min, max, increment; int choiceCount = 0; int choiceIndex = 0; const char* choice = NULL; char* value; ret = gp_camera_get_config(this->getCamera(), &widget_root, this->getContext()); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_camera_get_config: " << gp_result_as_string(ret); } ret = gp_widget_get_child_by_name(widget_root, "main", &widget_main); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_child_by_name(main): " << gp_result_as_string(ret); } ret = gp_widget_get_child_by_name(widget_main, "imgsettings", &widget_imgsettings); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_child_by_name(capturesettings): " << gp_result_as_string(ret); } ret = gp_widget_count_children(widget_imgsettings); if (ret < GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_count_children: " << gp_result_as_string(ret); } widgetCount = ret; for (int widgetIndex = 0; widgetIndex < widgetCount; widgetIndex++) { ret = gp_widget_get_child(widget_imgsettings, widgetIndex, &widget_imgsetting); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_child: " << gp_result_as_string(ret); } else { ret = gp_widget_get_info(widget_imgsetting, &info); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_info: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_info: " << info; } ret = gp_widget_get_name(widget_imgsetting, &name); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_name: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_name: " << name; } ret = gp_widget_get_label(widget_imgsetting, &label); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_label: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_label: " << label; } ret = gp_widget_get_type(widget_imgsetting, &type); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_type: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_type: " << type; } switch (type) { case GP_WIDGET_RANGE: ret = gp_widget_get_range(widget_imgsetting, &min, &max, &increment); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_range: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_range: min: " << min << " max: " << max << " increment: " << increment; } break; case GP_WIDGET_RADIO: ret = gp_widget_count_choices(widget_imgsetting); if (ret < GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_count_choices: " << gp_result_as_string(ret); } else { choiceCount = ret; qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_count_choices: count: " << choiceCount; for (choiceIndex = 0; choiceIndex < choiceCount; choiceIndex++) { ret = gp_widget_get_choice(widget_imgsetting, choiceIndex, &choice); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_choice: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_choice: " << choice; } } } break; default: ret = gp_widget_get_value(widget_imgsetting, &value); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_value: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_value: " << value; } break; } // gp_widget_free(widget_imgsetting); } } /** * Get the active resolution of the controller. * @return The index of the active resolution. */ // virtual int getActiveResolution(); /** * Set the active resolution of the controller. * @param ac The index of the new active resolution. */ // virtual void setActiveResolution(int ac); // Importand image settings widgets: // Image size: main/imgsetting/imagesize ret = gp_widget_get_child_by_name(widget_imgsettings, "imagesize", &widget_imgsetting); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_child: " << gp_result_as_string(ret); } else { const char* pos; char widthStr[10]; unsigned int outputWidth = 0; char hightStr[10]; unsigned int outputHeight = 0; const char* value = NULL; int readonly = 0; // Read the actual selected resolution ret = gp_widget_get_value(widget_imgsetting, &value); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_value: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_value: " << value; } // Read the number of possible resolutions ret = gp_widget_count_choices(widget_imgsetting); if (ret < GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_count_choices: " << gp_result_as_string(ret); } else { choiceCount = ret; qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_count_choices: count: " << choiceCount; // Read all possible resolutions for (choiceIndex = 0; choiceIndex < choiceCount; choiceIndex++) { ret = gp_widget_get_choice(widget_imgsetting, choiceIndex, &choice); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_choice: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_choice: " << choice; } // value/choice format: WWWWxHHHH pos = strchr(choice, 'x'); strncpy(widthStr, choice, pos-choice); outputWidth = atoi(widthStr); strncpy(hightStr, pos+1, strlen(choice)-(pos-choice)); outputHeight = atoi(hightStr); device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::unknownFormat, false)); } if (strcmp(value, choice) == 0) { // This is the active choice // frontend->getProject()->setResolution(choiceIndex); } } ret = gp_widget_get_readonly(widget_imgsetting, &readonly); if (ret != GP_OK) { qDebug() << "GphotoGrabber::readImageSettings --> Error gp_widget_get_readonly: " << gp_result_as_string(ret); } else { qDebug() << "GphotoGrabber::readImageSettings --> gp_widget_get_readonly: " << readonly; if (0 == readonly) { device->setResolutionChangeable(false); } } // gp_widget_free(widget_imgsetting); } // gp_widget_free(widget_imgsettings); // gp_widget_free(widget_main); gp_widget_free(widget_root); qDebug() << "GphotoGrabber::readImageSettings --> End"; } int GphotoGrabber::lookupWidget(CameraWidget *widget, const char *key, CameraWidget* *child) { qDebug() << "GphotoGrabber::lookupWidget --> Start"; int ret; CameraWidget *ch; int childrenCount = gp_widget_count_children(widget); if (childrenCount < GP_OK) { return childrenCount; } for (int c = 0 ; c < childrenCount ; c++) { const char *name; ret = gp_widget_get_child(widget, c, &ch); if (ret < GP_OK) { return ret; } ret = gp_widget_get_name(ch, &name); if (ret < GP_OK) { return ret; } qDebug() << "GphotoGrabber::lookupWidget --> Children (" << c << "): Name: " << name; } ret = gp_widget_get_child_by_name(widget, key, child); if (ret < GP_OK) { ret = gp_widget_get_child_by_label(widget, key, child); } qDebug() << "GphotoGrabber::lookupWidget --> End"; return ret; } /** * Reports all gphoto2 messages to the message view. * * @brief GphotoGrabber::errorDumper * @param level * @param domain * @param format * @param args * @param data */ void GphotoGrabber::errorDumper(GPLogLevel level, const char *domain, const char *format, va_list args, void *data) { char temp[1024]; if (args != NULL) { vsprintf(temp, format, args); qDebug() << "GphotoGrabber::errorDumper --> Domain: " << domain << "Error: " << temp; } else { qDebug() << "GphotoGrabber::errorDumper --> Domain: " << domain << "Error: " << format; } } /** * This enables/disables the specific canon capture mode. * * For non canons this is not required, and will just return * with an error (but without negative effects). */ bool GphotoGrabber::canonEnableCapture(Camera *gphotoCamera, GPContext *gphotoContext, CameraWidget *gphotoConfig) { int onoff = 1; CameraWidgetType type; CameraWidget *child; int ret; ret = lookupWidget(gphotoConfig, "capture", &child); if (ret < GP_OK) { // fprintf (stderr, "lookup widget failed: %d\n", ret); qDebug() << "GphotoGrabber::setUp --> Error End - lookup widget failed: " << gp_result_as_string(ret); return false; } ret = gp_widget_get_type(child, &type); if (ret < GP_OK) { // fprintf (stderr, "widget get type failed: %d\n", ret); qDebug() << "GphotoGrabber::setUp --> Error End - widget get type failed: " << gp_result_as_string(ret); return false; } switch (type) { case GP_WIDGET_TOGGLE: break; default: // fprintf (stderr, "widget has bad type %d\n", type); qDebug() << "GphotoGrabber::setUp --> Error End - widget has bad type"; ret = GP_ERROR_BAD_PARAMETERS; return false; } /* Now set the toggle to the wanted value */ ret = gp_widget_set_value(child, &onoff); if (ret < GP_OK) { // fprintf (stderr, "toggling Canon capture to %d failed with %d\n", onoff, ret); qDebug() << "GphotoGrabber::setUp --> Error End - toggling Canon capture failed: " << gp_result_as_string(ret); return false; } // OK ret = gp_camera_set_config(gphotoCamera, gphotoConfig, gphotoContext); if (ret < GP_OK) { // fprintf (stderr, "camera_set_config failed: %d\n", ret); qDebug() << "GphotoGrabber::setUp --> Error End - camera_set_config: " << gp_result_as_string(ret); return false; } } void GphotoGrabber::populateWithConfigs(CameraWidget *gphotoConfig) { qDebug() << "GphotoGrabber::populateWithConfigs --> Start"; int i; int count; int childrenTotal; const char *namePointer; const char *valuePointer; CameraWidget *child; CameraWidgetType widgetType; QString name; QString value; int date; int ret; ret = gp_widget_get_type(gphotoConfig, &widgetType); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_type: " << gp_result_as_string(ret); } switch (widgetType) { case GP_WIDGET_RADIO: ret = gp_widget_get_name(gphotoConfig, &namePointer); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_name: " << gp_result_as_string(ret); } ret = gp_widget_get_value(gphotoConfig, &valuePointer); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_value: " << gp_result_as_string(ret); } if (valuePointer == NULL) break; count = gp_widget_count_choices(gphotoConfig); name.clear(); name.append(namePointer); value.clear(); value.append(valuePointer); // sdialog.addItem(n,v); qDebug() << "GphotoGrabber::populateWithConfigs --> GP_WIDGET_RADIO --> Name: " << name << " --> Value: " << value; /* string sname = string(name); string sval = string(val); printf("%s=%s\n", name, val); if ( sname == "iso" ) iso = val; if ( sname == "aperture" ) aperture = val; if ( sname == "shutterspeed" ) shutter = val; if ( sname == "capturetarget" ) target = val; */ break; case GP_WIDGET_TEXT: ret = gp_widget_get_name(gphotoConfig, &namePointer); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_name: " << gp_result_as_string(ret); } ret = gp_widget_get_value(gphotoConfig, &valuePointer); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_value: " << gp_result_as_string(ret); } //QString log; //logMessage(log.sprintf("%s=%s", name, val)); name.clear(); name.append(namePointer); value.clear(); value.append(valuePointer); // sdialog.addItem(n,v); qDebug() << "GphotoGrabber::populateWithConfigs --> GP_WIDGET_TEXT --> Name: " << name << " --> Value: " << value; /* string sname = string(name); string sval = string(val); printf("%s=%s\n", name, val); if ( sname == "batterylevel" ) battery = sval; if ( sname == "ownername" ) ownername = sval; if ( sname == "serialnumber" ) serialnumber = sval; if ( sname == "model" ) model = sval; if ( sname == "ptpversion" ) ptpversion = sval; */ break; case GP_WIDGET_RANGE: ret = gp_widget_get_name(gphotoConfig, &namePointer); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_name: " << gp_result_as_string(ret); } name.clear(); name.append(namePointer); qDebug() << "GphotoGrabber::populateWithConfigs --> GP_WIDGET_RANGE --> Name: " << name; break; case GP_WIDGET_TOGGLE: ret = gp_widget_get_name(gphotoConfig, &namePointer); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_name: " << gp_result_as_string(ret); } name.clear(); name.append(namePointer); qDebug() << "GphotoGrabber::populateWithConfigs --> GP_WIDGET_TOGGLE --> Name: " << name; break; case GP_WIDGET_DATE: ret = gp_widget_get_name(gphotoConfig, &namePointer); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_name: " << gp_result_as_string(ret); } ret = gp_widget_get_value(gphotoConfig, &date); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_value: " << gp_result_as_string(ret); } name.clear(); name.append(namePointer); qDebug() << "GphotoGrabber::populateWithConfigs --> GP_WIDGET_RADIO --> Name: " << name << " --> Date: " << date; break; case GP_WIDGET_WINDOW: case GP_WIDGET_SECTION: qDebug() << "GphotoGrabber::populateWithConfigs --> GP_WIDGET_WINDOW / GP_WIDGET_SECTION"; childrenTotal = gp_widget_count_children(gphotoConfig); if (childrenTotal < GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_count_children: " << gp_result_as_string(ret); } for (i = 0; i < childrenTotal; i ++) { ret = gp_widget_get_child(gphotoConfig, i, &child); if (ret != GP_OK) { qDebug() << "GphotoGrabber::populateWithConfigs --> Error gp_widget_get_child: " << gp_result_as_string(ret); } populateWithConfigs(child); } break; default: qDebug() << "GphotoGrabber::populateWithConfigs --> default!!!"; break; } qDebug() << "GphotoGrabber::populateWithConfigs --> End"; } qstopmotion-2.3.2-Source/src/technical/grabber/gphoto2/gpcontroller.cpp000644 000000 000000 00000060251 12714076256 026271 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "gpcontroller.h" #include /************************************************************************** * Implementation of the grabber controller functions using the * gphoto2 library. **************************************************************************/ GphotoController::GphotoController(int cap) : GrabberController(cap) { qDebug() << "GphotoController::Constructor --> Start"; grabber = NULL; grabberDevice = NULL; qDebug() << "GphotoController::Constructor --> End"; } GphotoController::~GphotoController() { qDebug() << "GphotoController::Destructor --> Start (Empty)"; qDebug() << "GphotoController::Destructor --> End"; } ImageGrabber* GphotoController::getImageGrabber() { return grabber; } bool GphotoController::initialization(ImageGrabber* ig, ImageGrabberDevice* igd) { qDebug() << "GphotoController::init --> Start"; grabber = (GphotoGrabber*)ig; grabberDevice = igd; if (false == setCapabilities()) { qDebug() << "GphotoController::init --> End (Not Successful)"; return false; } qDebug() << "GphotoController::init --> End"; return true; } bool GphotoController::setCapabilities() { qDebug() << "GphotoController::setCapabilities --> Start"; int ret; GrabberControlCapabilities *caps = NULL; int flags = 0; // Enumerating device capabilities // Use 'gphoto2 --list-config' to see the widget tree of the connected cameras CameraWidget* widget_root = NULL; CameraWidget* widget_main = NULL; CameraWidget* widget_actions = NULL; CameraWidget* widget_action = NULL; int widgetCount = 0; ret = gp_camera_get_config(grabber->getCamera(), &widget_root, grabber->getContext()); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_camera_get_config: " << gp_result_as_string(ret); } ret = gp_widget_get_child_by_name(widget_root, "main", &widget_main); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_get_child_by_name(main): " << gp_result_as_string(ret); } ret = gp_widget_get_child_by_name(widget_main, "actions", &widget_actions); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_get_child_by_name(actions): " << gp_result_as_string(ret); } ret = gp_widget_count_children(widget_actions); if (ret < GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_count_children: " << gp_result_as_string(ret); } widgetCount = ret; for (int widgetIndex = 0; widgetIndex < widgetCount; widgetIndex++) { ret = gp_widget_get_child(widget_actions, widgetIndex, &widget_action); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_get_child: " << gp_result_as_string(ret); } else { const char* info = NULL; const char* name = NULL; const char* label = NULL; CameraWidgetType type; float min, max, increment; int choiceCount = 0; const char* choice = NULL; char* value; ret = gp_widget_get_info(widget_action, &info); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_get_info: " << gp_result_as_string(ret); } else { qDebug() << "GphotoController::setCapabilities --> gp_widget_get_info: " << info; } ret = gp_widget_get_name(widget_action, &name); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_get_name: " << gp_result_as_string(ret); } else { qDebug() << "GphotoController::setCapabilities --> gp_widget_get_name: " << name; } ret = gp_widget_get_label(widget_action, &label); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_get_label: " << gp_result_as_string(ret); } else { qDebug() << "GphotoController::setCapabilities --> gp_widget_get_label: " << label; } ret = gp_widget_get_type(widget_action, &type); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_get_type: " << gp_result_as_string(ret); } else { qDebug() << "GphotoController::setCapabilities --> gp_widget_get_type: " << type; } switch (type) { case GP_WIDGET_RANGE: ret = gp_widget_get_range(widget_action, &min, &max, &increment); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_get_range: " << gp_result_as_string(ret); } else { qDebug() << "GphotoController::setCapabilities --> gp_widget_get_range: min: " << min << " max: " << max << " increment: " << increment; } break; case GP_WIDGET_RADIO: ret = gp_widget_count_choices(widget_action); if (ret < GP_OK) { qDebug() << "GphotoController::init --> Error gp_widget_count_choices: " << gp_result_as_string(ret); } else { choiceCount = ret; qDebug() << "GphotoController::init --> gp_widget_count_choices: count: " << choiceCount; for (int choiceIndex = 0; choiceIndex < choiceCount; choiceIndex++) { ret = gp_widget_get_choice(widget_action, choiceIndex, &choice); if (ret != GP_OK) { qDebug() << "GphotoController::init --> Error gp_widget_get_choice: " << gp_result_as_string(ret); } else { qDebug() << "GphotoController::init --> gp_widget_get_choice: " << choice; } } } ret = gp_widget_get_value(widget_action, &value); if (ret != GP_OK) { qDebug() << "GphotoController::init --> Error gp_widget_get_value: " << gp_result_as_string(ret); } else { qDebug() << "GphotoController::init --> gp_widget_get_value: " << value; } break; } // gp_widget_free(widget_action); } } // Iportant action widgets: // Manual Focus: main/actions/manualfocusdrive ret = gp_widget_get_child_by_name(widget_actions, "manualfocusdrive", &widget_action); if (ret != GP_OK) { qDebug() << "GphotoController::setCapabilities --> Error gp_widget_get_child: " << gp_result_as_string(ret); } else { caps = getFocusCaps(); flags = GrabberController::controller_Absolute; getControlData(caps, flags); // gp_widget_free(widget_action); } // Auto Focus: main/actions/autofocusdrive // gp_widget_free(widget_actions); // gp_widget_free(widget_main); gp_widget_free(widget_root); qDebug() << "GphotoController::setCapabilities --> End"; return true; } bool GphotoController::setUp() { qDebug() << "GphotoController::setUp --> Start (Empty)"; return true; } bool GphotoController::tearDown() { qDebug() << "GphotoController::tearDown --> Start (Empty)"; return true; } void GphotoController::getControlData(GrabberControlCapabilities *caps, long flags) { qDebug() << "GphotoController::getControlData --> Start"; /* caps->setControlId(queryctrl.id); caps->setControlType(queryctrl.type); caps->setFlags(flags); switch (queryctrl.type) { case V4L2_CTRL_TYPE_MENU: // enumerate_menu (); break; case V4L2_CTRL_TYPE_INTEGER: caps->setMinimum(queryctrl.minimum); caps->setMaximum(queryctrl.maximum); caps->setStep(queryctrl.step); caps->setDefault(queryctrl.default_value); caps->setFlags(GrabberControlCapabilities::control_Manual); break; // case V4L2_CTRL_TYPE_INTEGER_MENU: // Not defined on Debian systems case V4L2_CTRL_TYPE_INTEGER64: case V4L2_CTRL_TYPE_BOOLEAN: case V4L2_CTRL_TYPE_BUTTON: case V4L2_CTRL_TYPE_CTRL_CLASS: case V4L2_CTRL_TYPE_STRING: // case V4L2_CTRL_TYPE_BITMASK: // Not defined on Debian systems default: qDebug() << "GphotoController::getControlData --> Not supported control type"; break; } */ qDebug() << "GphotoController::getControlData --> End"; } void GphotoController::getControlFlag(GrabberControlCapabilities *caps) { /* int ret = 0; struct v4l2_control ctrl; ctrl.id = queryctrl.id; ctrl.value = 0; ret = xioctl(fd, VIDIOC_G_CTRL, &ctrl); if (ret != 0) { return; } if (ctrl.value == 1) { caps->setFlags(GrabberControlCapabilities::control_Auto); } else { caps->setFlags(GrabberControlCapabilities::control_Manual); } */ return; } /* * sets the value for control id */ int GphotoController::setCtrlValue(GrabberControlCapabilities *caps, int value) { qDebug() << "GphotoController::setCtrlValue --> Start"; int ret = 0; /* if (caps->getControlClass() == V4L2_CTRL_CLASS_USER) { // using VIDIOC_G_CTRL for user class controls struct v4l2_control ctrl; ctrl.id = caps->getControlId(); ctrl.value = value; ret = xioctl(fd, VIDIOC_S_CTRL, &ctrl); } else { // using VIDIOC_G_EXT_CTRLS on single controls struct v4l2_ext_controls ctrls = {0}; struct v4l2_ext_control ctrl = {0}; ctrl.id = caps->getControlId(); switch (caps->getControlType()) { // case V4L2_CTRL_TYPE_STRING: // ctrl.size = control->value; // ctrl.string = control->string; // break; case V4L2_CTRL_TYPE_INTEGER64: ctrl.value64 = (long)value; break; default: ctrl.value = value; break; } ctrls.ctrl_class = caps->getControlClass(); ctrls.count = 1; ctrls.controls = &ctrl; ret = xioctl(fd, VIDIOC_S_EXT_CTRLS, &ctrls); if (ret) { qDebug() << "GphotoController::setCtrlValue --> control id: " << ctrl.id << " failed to set (error " << ret << ")"; } } // update real value // get_ctrl(hdevice, control_list, id, NULL); */ qDebug() << "GphotoController::setCtrlValue --> End"; return (ret); } /* * Gets the value for control id * and updates control flags and widgets */ int GphotoController::getCtrlValue(GrabberControlCapabilities *caps, int &value) { qDebug() << "GphotoController::setCtrlValue --> Start"; int ret = 0; /* if (caps->getControlClass() == V4L2_CTRL_CLASS_USER) { // using VIDIOC_G_CTRL for user class controls struct v4l2_control ctrl; ctrl.id = caps->getControlId(); ctrl.value = 0; ret = xioctl(fd, VIDIOC_G_CTRL, &ctrl); if (ret) { qDebug() << "GphotoController::setCtrlValue --> control id: " << ctrl.id << " failed to get value (error " << ret << ")"; } else { value = ctrl.value; } } else { // using VIDIOC_G_EXT_CTRLS on single controls struct v4l2_ext_controls ctrls = {0}; struct v4l2_ext_control ctrl = {0}; ctrl.id = caps->getControlId(); // ctrl.size = 0; // if(control->control.type == V4L2_CTRL_TYPE_STRING) // { // ctrl.size = control->control.maximum + 1; // ctrl.string = control->string; // } ctrls.ctrl_class = caps->getControlClass(); ctrls.count = 1; ctrls.controls = &ctrl; ret = xioctl(fd, VIDIOC_G_EXT_CTRLS, &ctrls); if (ret) { qDebug() << "GphotoController::setCtrlValue --> control id: " << ctrl.id << " failed to get value (error " << ret << ")"; } else { switch(caps->getControlType()) { // case V4L2_CTRL_TYPE_STRING: // //string gets set on VIDIOC_G_EXT_CTRLS // //add the maximum size to value // control->value = ctrl.size; // break; case V4L2_CTRL_TYPE_INTEGER64: value = (int)ctrl.value64; break; default: value = ctrl.value; // printf("control %i [0x%08x] = %i\n", i, clist[i].id, clist[i].value); break; } } } // update_ctrl_flags(control_list, id); // update_widget_state(control_list, all_data); */ qDebug() << "GphotoController::setCtrlValue --> End"; return (ret); } /************************************************************************** ************************************************************************** * Camera quality capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness **************************************************************************/ /* bool GphotoController::getAutomaticBrightness() { return false; } void GphotoController::setAutomaticBrightness(bool ab) { Q_ASSERT( 1 ); } int GphotoController::getBrightness() { return 0; } void GphotoController::setBrightness(int b) { qDebug() << "GphotoController::setBrightness --> Start"); setCtrlValue(getBrightnessCaps(), b); qDebug() << "GphotoController::setBrightness --> End"); } */ /************************************************************************** * Contrast **************************************************************************/ /* bool GphotoController::getAutomaticContrast() { return false; } void GphotoController::setAutomaticContrast(bool ac) { Q_ASSERT( 1 ); } int GphotoController::getContrast() { return 0; } void GphotoController::setContrast(int c) { qDebug() << "GphotoController::setContrast --> Start"); setCtrlValue(getContrastCaps(), c); qDebug() << "GphotoController::setContrast --> End"); } */ /************************************************************************** * Saturation **************************************************************************/ /* bool GphotoController::getAutomaticSaturation() { return false; } void GphotoController::setAutomaticSaturation(bool as) { Q_ASSERT( 1 ); } int GphotoController::getSaturation() { return 0; } void GphotoController::setSaturation(int s) { qDebug() << "GphotoController::setSaturation --> Start"); setCtrlValue(getSaturationCaps(), s); qDebug() << "GphotoController::setSaturation --> End"); } */ /************************************************************************** * Hue **************************************************************************/ /* bool GphotoController::getAutomaticHue() { return false; } void GphotoController::setAutomaticHue(bool ah) { Q_ASSERT( 1 ); } int GphotoController::getHue() { return 0; } void GphotoController::setHue(int h) { qDebug() << "GphotoController::setHue --> Start"); setCtrlValue(getHueCaps(), h); qDebug() << "GphotoController::setHue --> End"); } */ /************************************************************************** * Gamma **************************************************************************/ /* bool GphotoController::getAutomaticGamma() { return false; } void GphotoController::setAutomaticGamma(bool ag) { Q_ASSERT( 1 ); } int GphotoController::getGamma() { return 0; } void GphotoController::setGamma(int g) { qDebug() << "GphotoController::setGamma --> Start"; setCtrlValue(getGammaCaps(), g); qDebug() << "GphotoController::setGamma --> End"; } */ /************************************************************************** * Sharpness **************************************************************************/ /* bool GphotoController::getAutomaticSharpness() { return false; } void GphotoController::setAutomaticSharpness(bool as) { Q_ASSERT( 1 ); } int GphotoController::getSharpness() { return 0; } void GphotoController::setSharpness(int s) { qDebug() << "GphotoController::setSharpness --> Start"; setCtrlValue(getSharpnessCaps(), s); qDebug() << "GphotoController::setSharpness --> End"; } */ /************************************************************************** * Backlight Compensation **************************************************************************/ /* bool GphotoController::getAutomaticBacklight() { return false; } void GphotoController::setAutomaticBacklight(bool ab) { Q_ASSERT( 1 ); } int GphotoController::getBacklight() { return 0; } void GphotoController::setBacklight(int b) { qDebug() << "GphotoController::setBacklight --> Start"; setCtrlValue(getBacklightCaps(), b); qDebug() << "GphotoController::setBacklight --> End"; } */ /************************************************************************** * White Balance **************************************************************************/ /* bool GphotoController::getAutomaticWhite() { return false; } void GphotoController::setAutomaticWhite(bool aw) { Q_ASSERT( 1 ); } int GphotoController::getWhite() { return 0; } void GphotoController::setWhite(int w) { qDebug() << "GphotoController::setWhite --> Start"; setCtrlValue(getWhiteCaps(), w); qDebug() << "GphotoController::setWhite --> End"; } */ /************************************************************************** * Gain **************************************************************************/ /* bool GphotoController::getAutomaticGain() { return false; } void GphotoController::setAutomaticGain(bool ag) { Q_ASSERT( 1 ); } int GphotoController::getGain() { return 0; } void GphotoController::setGain(int g) { qDebug() << "GphotoController::setGain --> Start"; setCtrlValue(getGainCaps(), g); qDebug() << "GphotoController::setGain --> End"; } */ /************************************************************************** * Color Enable **************************************************************************/ /* bool GphotoController::getAutomaticColor() { return false; } void GphotoController::setAutomaticColor(bool ac) { Q_ASSERT( 1 ); } int GphotoController::getColor() { return 0; } void GphotoController::setColor(int c) { qDebug() << "GphotoController::setColor --> Start"; setCtrlValue(getColorCaps(), c); qDebug() << "GphotoController::setColor --> End"; } */ /************************************************************************** ************************************************************************** * Camera control capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Exposure **************************************************************************/ /* bool GphotoController::getAutomaticExposure() { return false; } void GphotoController::setAutomaticExposure(bool ae) { Q_ASSERT( 1 ); } int GphotoController::getExposure() { return 0; } void GphotoController::setExposure(int e) { qDebug() << "GphotoController::setExposure --> Start"; setCtrlValue(getExposureCaps(), e); qDebug() << "GphotoController::setExposure --> End"; } */ /************************************************************************** * Zoom **************************************************************************/ /* bool GphotoController::getAutomaticZoom() { return false; } void GphotoController::setAutomaticZoom(bool az) { Q_ASSERT( 1 ); } */ int GphotoController::getZoom() { int value = 0; getCtrlValue(getZoomCaps(), value); return value; } void GphotoController::setZoom(int z) { qDebug() << "GphotoController::setZoom --> Start"; setCtrlValue(getZoomCaps(), z); setCtrlValue(getZoomCaps(), z); qDebug() << "GphotoController::setZoom --> End"; } /************************************************************************** * Focus **************************************************************************/ /* bool GphotoController::getAutomaticFocus() { return false; } void GphotoController::setAutomaticFocus(bool af) { Q_ASSERT( 1 ); } int GphotoController::getFocus() { return 0; } void GphotoController::setFocus(int f) { qDebug() << "GphotoController::setFocus --> Start"; setCtrlValue(getFocusCaps(), f); qDebug() << "GphotoController::setFocus --> End"; } */ /************************************************************************** * Pan **************************************************************************/ /* bool GphotoController::getAutomaticPan() { return false; } void GphotoController::setAutomaticPan(bool ap) { Q_ASSERT( 1 ); } int GphotoController::getPan() { return 0; } void GphotoController::setPan(int p) { Q_ASSERT( 1 ); } */ /************************************************************************** * Tilt **************************************************************************/ /* bool GphotoController::getAutomaticTilt() { return false; } void GphotoController::setAutomaticTilt(bool at) { Q_ASSERT( 1 ); } int GphotoController::getTilt() { return 0; } void GphotoController::setTilt(int t) { Q_ASSERT( 1 ); } */ /************************************************************************** * Iris **************************************************************************/ /* bool GphotoController::getAutomaticIris() { return false; } void GphotoController::setAutomaticIris(bool ae) { Q_ASSERT( 1 ); } bool GphotoController::isIris() { return false; } void GphotoController::setIris(int e) { Q_ASSERT( 1 ); } */ /************************************************************************** * Roll **************************************************************************/ /* bool GphotoController::getAutomaticRoll() { return false; } void GphotoController::setAutomaticRoll(bool ar) { Q_ASSERT( 1 ); } bool GphotoController::isRoll() { return false; } void GphotoController::setRoll(int e) { Q_ASSERT( 1 ); } */ qstopmotion-2.3.2-Source/src/technical/grabber/gphoto2/gpcontroller.h000644 000000 000000 00000042207 12714076256 025737 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef GPHOTO_GPCONTROLLER_H #define GPHOTO_GPCONTROLLER_H // Include files of the gphoto library #include #include "technical/grabber/grabbercontroller.h" #include "technical/grabber/gphoto2/gpgrabber.h" // set ioctl retries to 4 - linux uvc as increased timeout from 1000 to 3000 ms #define IOCTL_RETRY 4 /** * Interface to the controller of a device. * * @author Ralf Lange */ class GphotoController : public GrabberController { public: // static struct uvc_xu_control_mapping xu_mappings[]; /** * Constructs and initializes the object. * @param caps The grabber controller capabilities. */ GphotoController(int caps); /** * Destructor */ ~GphotoController(); /** * Get the image grabber of the controller. * * @brief getImageGrabber * @return The image grabber or null. */ ImageGrabber* getImageGrabber(); /** * Initialize the grabber controller. * @param ig The image grabber of the controller. * @param igd The image grabber device of the controller. * @return True if initialization is successful. */ bool initialization(ImageGrabber* ig, ImageGrabberDevice* igd); /** * Set up the controller. * @return true on success, false otherwise */ bool setUp(); /** * Tear down the controller. * @return true on success, false otherwise */ bool tearDown(); /************************************************************************** ************************************************************************** * Camera quality capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness **************************************************************************/ /** * Get the current automatic brightness value of the device. * @return True if the automatic brightness is on. */ // bool getAutomaticBrightness(); /** * Set the automatic brightness value of the device. * @param ab True if the automatic brightness will be switched on. */ // void setAutomaticBrightness(bool ab); /** * Get the current brightness value of the device. * @return The current brightness value. */ // int getBrightness(); /** * Set the brightness value of the device. * @param b The new brightness value */ // void setBrightness(int b); /************************************************************************** * Contrast **************************************************************************/ /** * Get the current automatic contrast value of the device. * @return True if the automatic contrast is on. */ // bool getAutomaticContrast(); /** * Set the automatic contrast value of the device. * @param ac True if the automatic contrast will be switched on. */ // void setAutomaticContrast(bool ac); /** * Get the current contrast value of the device. * @return The current contrast value. */ // int getContrast(); /** * Set the contrast value of the device. * @param c The new contrast value */ // void setContrast(int c); /************************************************************************** * Saturation **************************************************************************/ /** * Get the current automatic saturation value of the device. * @return True if the automatic saturation is on. */ // bool getAutomaticSaturation(); /** * Set the automatic saturation value of the device. * @param as True if the automatic saturation will be switched on. */ // void setAutomaticSaturation(bool as); /** * Get the current saturation value of the device. * @return The current saturation value. */ // int getSaturation(); /** * Set the saturation value of the device. * @param s The new saturation value */ // void setSaturation(int s); /************************************************************************** * Hue **************************************************************************/ /** * Get the current automatic hue value of the device. * @return True if the automatic hue is on. */ // bool getAutomaticHue(); /** * Set the automatic hue value of the device. * @param ah True if the automatic hue will be switched on. */ // void setAutomaticHue(bool ah); /** * Get the current hue value of the device. * @return The current hue value. */ // int getHue(); /** * Set the hue value of the device. * @param h The new hue value */ // void setHue(int h); /************************************************************************** * Gamma **************************************************************************/ /** * Get the current automatic gamma value of the device. * @return True if the automatic gamma is on. */ // bool getAutomaticGamma(); /** * Set the automatic gamma value of the device. * @param ag True if the automatic gamma will be switched on. */ // void setAutomaticGamma(bool ag); /** * Get the current gamma value of the device. * @return The current gamma value. */ // int getGamma(); /** * Set the gamma value of the device. * @param g The new gamma value */ // void setGamma(int g); /************************************************************************** * Sharpness **************************************************************************/ /** * Get the current automatic sharpness value of the device. * @return True if the automatic sharpness is on. */ // bool getAutomaticSharpness(); /** * Set the automatic sharpness value of the device. * @param as True if the automatic sharpness will be switched on. */ // void setAutomaticSharpness(bool as); /** * Get the current sharpness value of the device. * @return The current sharpness value. */ // int getSharpness(); /** * Set the sharpness value of the device. * @param s The new sharpness value */ // void setSharpness(int s); /************************************************************************** * Backlight Compensation **************************************************************************/ /** * Get the current automatic backlight compensation value of the device. * @return True if the automatic backlight compensation is on. */ // bool getAutomaticBacklight(); /** * Set the automatic backlight compensation value of the device. * @param ab True if the automatic backlight compensation will be switched on. */ // void setAutomaticBacklight(bool ab); /** * Get the current backlight compensation value of the device. * @return The current backlight compensation value. */ // int getBacklight(); /** * Set the backlight compensation value of the device. * @param b The new backlight compensation value */ // void setBacklight(int b); /************************************************************************** * White Balance **************************************************************************/ /** * Get the current automatic white balance value of the device. * @return True if the automatic white balance is on. */ // bool getAutomaticWhite(); /** * Set the automatic white balance value of the device. * @param ae True if the automatic white balance will be switched on. */ // void setAutomaticWhite(bool ae); /** * Get the current white balance value of the device. * @return The current white balance value. */ // int getWhite(); /** * Set the white balance value of the device. * @param w The new white balance value */ // void setWhite(int w); /************************************************************************** * Gain **************************************************************************/ /** * Get the current automatic gain value of the device. * @return True if the automatic gain is on. */ // bool getAutomaticGain(); /** * Set the automatic gain value of the device. * @param ag True if the automatic gain will be switched on. */ // void setAutomaticGain(bool ag); /** * Get the current gain value of the device. * @return The current gain value. */ // int getGain(); /** * Set the gain value of the device. * @param g The new gain value */ // void setGain(int g); /************************************************************************** * Color Enable **************************************************************************/ /** * Get the current automatic color enable value of the device. * @return True if the automatic color enable is on. */ // bool getAutomaticColor(); /** * Set the automatic color enable value of the device. * @param ac True if the automatic color enable will be switched on. */ // void setAutomaticColor(bool ac); /** * Get the current color enable value of the device. * @return The current color enable value. */ // int getColor(); /** * Set the color enable value of the device. * @param c The new color enable value */ // void setColor(int c); /************************************************************************** ************************************************************************** * Camera control capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Exposure **************************************************************************/ /** * Get the current automatic exposure value of the device. * @return True if the automatic exposure is on. */ // bool getAutomaticExposure(); /** * Set the automatic exposure value of the device. * @param ae True if the automatic exposure will be switched on. */ // void setAutomaticExposure(bool ae); /** * Get the current exposure value of the device. * @return The current exposure value. */ // int getExposure(); /** * Set the exposure value of the device. * @param e The new exposure value */ // void setExposure(int e); /************************************************************************** * Zoom **************************************************************************/ /** * Get the current automatic zoom value of the device. * @return True if the automatic zoom is on. */ // bool getAutomaticZoom(); /** * Set the automatic zoom value of the device. * @param az True if the automatic zoom will be switched on. */ // void setAutomaticZoom(bool az); /** * Get the current zoom value of the device. * @return The current zoom value. */ int getZoom(); /** * Set the zoom value of the device. * @param z The new zoom value */ void setZoom(int z); /************************************************************************** * Focus **************************************************************************/ /** * Get the current automatic focus value of the device. * @return True if the automatic focus is on. */ // bool getAutomaticFocus(); /** * Set the automatic focus value of the device. * @param af True if the automatic focus will be switched on. */ // void setAutomaticFocus(bool af); /** * Get the current focus value of the device. * @return The current focus value. */ // int getFocus(); /** * Set the focus value of the device. * @param f The new focus value */ // void setFocus(int f); /************************************************************************** * Pan **************************************************************************/ /** * Get the current automatic pan value of the device. * @return True if the automatic pan is on. */ // bool getAutomaticPan(); /** * Set the automatic pan value of the device. * @param ap True if the automatic pan will be switched on. */ // void setAutomaticPan(bool ap); /** * Get the current pan value of the device. * @return The current pan value. */ // int getPan(); /** * Set the pan value of the device. * @param p The new pan value */ // void setPan(int p); /************************************************************************** * Tilt **************************************************************************/ /** * Get the current automatic tilt value of the device. * @return True if the automatic tilt is on. */ // bool getAutomaticTilt(); /** * Set the automatic tilt value of the device. * @param at True if the automatic tilt will be switched on. */ // void setAutomaticTilt(bool at); /** * Get the current tilt value of the device. * @return The current tilt value. */ // int getTilt(); /** * Set the tilt value of the device. * @param t The new tilt value */ // void setTilt(int t); /************************************************************************** * Iris **************************************************************************/ /** * Get the current automatic iris value of the device. * @return True if the automatic iris is on. */ // bool getAutomaticIris(); /** * Set the automatic iris value of the device. * @param ae True if the automatic iris will be switched on. */ // void setAutomaticIris(bool ae); /** * Get the current iris value of the device. * @return The current iris value. */ // int getIris(); /** * Set the iris value of the device. * @param e The new iris value */ // void setIris(int e); /************************************************************************** * Roll **************************************************************************/ /** * Get the current automatic roll value of the device. * @return True if the automatic roll is on. */ // bool getAutomaticRoll(); /** * Set the automatic roll value of the device. * @param ar True if the automatic roll will be switched on. */ // void setAutomaticRoll(bool ar); /** * Get the current roll value of the device. * @return The current roll value. */ // int getRoll(); /** * Set the roll value of the device. * @param r The new roll value */ // void setRoll(int r); private: GphotoGrabber* grabber; ImageGrabberDevice* grabberDevice; void getControlData(GrabberControlCapabilities *caps, long flags = GrabberController::controller_none); void getControlFlag(GrabberControlCapabilities *caps); int setCtrlValue(GrabberControlCapabilities *caps, int value); int getCtrlValue(GrabberControlCapabilities *caps, int &value); bool setCapabilities(); }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/video4linux2/v4l2grabber.cpp000644 000000 000000 00000057361 12714076256 026655 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "v4l2grabber.h" #include #include #include // #include #include #include #include #include #include "v4l2controller.h" #include "technical/util.h" #include "technical/grabber/imageconverter.h" V4L2Grabber::V4L2Grabber(Frontend *f) : ImageGrabber(f) { qDebug() << "V4L2Grabber::Constructor --> Start"; fd = -1; errno = -1; dst_buf = NULL; frameData = NULL; qDebug() << "V4L2Grabber::Constructor --> End"; } V4L2Grabber::~V4L2Grabber() { qDebug() << "V4L2Grabber::Destructor --> Start"; if (fd >= 0) { // Close the device file // close(fd); v4l2_close(fd); fd = -1; } qDebug() << "V4L2Grabber::Destructor --> End"; } bool V4L2Grabber::initialization(QVector &devices) { qDebug() << "V4L2Grabber::initialization --> Start"; PreferencesTool *pref = frontend->getPreferences(); int value; int deviceCount = 0; // Enumerate over all /dev/videoN (N = 0...x, x big enought) for (int i = 0; i < 10; i++) { QString deviceName = QString("%1%2") .arg(QLatin1String("/dev/video")) .arg(i); ImageGrabberDevice* device = NULL; V4L2Controller* deviceController = NULL; bool ret; // fd = open(deviceName.toAscii(), O_RDONLY); fd = v4l2_open(deviceName.toLatin1(), O_RDWR | O_NONBLOCK, 0); if(fd < 0){ qDebug() << "V4L2Grabber::initialization --> Error: Can't open device >" << deviceName << "<"; continue; } device = new ImageGrabberDevice(); device->setDeviceIndex(i); ret = readDeviceInfo(fd, device); if (ret) { // Add the new device to the device list devices.append(device); deviceCount++; // Add the Controller to the new device if (pref->getIntegerPreference("preferences", "v4l2controller", value) == false) { value = false; } if ((int)true == value) { deviceController = new V4L2Controller(0); device->setController(deviceController); // Initalize the device controller deviceController->initialization(this, device); } } else { // Delete the new device delete device; device = NULL; } // close(fd); v4l2_close(fd); fd = -1; } qDebug() << "V4L2Grabber::initialization --> device count: " << devices.size(); if (0 == deviceCount) { qDebug() << "V4L2Grabber::initialization --> End (false)"; return false; } qDebug() << "V4L2Grabber::initialization --> End (true)"; return true; } bool V4L2Grabber::setUp() { qDebug() << "V4L2Grabber::setUp --> Start"; int videoSource = frontend->getProject()->getVideoSource(); ImageGrabberDevice* videoDevice = frontend->getDevice(videoSource); int deviceIndex = videoDevice->getDeviceIndex(); QString deviceName = QString("%1%2") .arg(QLatin1String("/dev/video")) .arg(deviceIndex); int resIndex = frontend->getProject()->getResolution(); GrabberResolution resolution = frontend->getResolution(resIndex); struct v4l2_requestbuffers req; enum v4l2_buf_type type; unsigned int pixelFormat; width = resolution.getWidth(); height = resolution.getHeight(); switch (resolution.getFormat()) { case GrabberResolution::rgb24Format: pixelFormat = V4L2_PIX_FMT_RGB24; break; case GrabberResolution::bgr24Format: pixelFormat = V4L2_PIX_FMT_BGR24; break; #ifdef V4L2_PIX_FMT_XBGR32 case GrabberResolution::xbgr32Format: pixelFormat = V4L2_PIX_FMT_XBGR32; break; #endif #ifdef V4L2_PIX_FMT_ABGR32 case GrabberResolution::abgr32Format: pixelFormat = V4L2_PIX_FMT_ABGR32; break; #endif case GrabberResolution::yuv2Format: pixelFormat = V4L2_PIX_FMT_YUYV; break; case GrabberResolution::uyvyFormat: pixelFormat = V4L2_PIX_FMT_UYVY; break; case GrabberResolution::yu12Format: pixelFormat = V4L2_PIX_FMT_YUV420; break; #ifdef V4L2_PIX_FMT_YUV420M case GrabberResolution::yuv420mFormat: pixelFormat = V4L2_PIX_FMT_YUV420M; break; #endif case GrabberResolution::yv12Format: pixelFormat = V4L2_PIX_FMT_YVU420; break; #ifdef V4L2_PIX_FMT_YVU420M case GrabberResolution::yvu420mFormat: pixelFormat = V4L2_PIX_FMT_YVU420M; break; #endif #ifdef V4L2_PIX_FMT_NV12M case GrabberResolution::nv12Format: pixelFormat = V4L2_PIX_FMT_NV12M; break; #endif case GrabberResolution::mjpegFormat: pixelFormat = V4L2_PIX_FMT_MJPEG; break; default: goto Error; } //----------------------------- // Open video device //----------------------------- // fd = open(deviceName.toAscii(), O_RDONLY); fd = v4l2_open(deviceName.toLatin1(), O_RDWR | O_NONBLOCK, 0); if(fd < 0){ qDebug() << "V4L2Grabber::setUp --> Error: Can't open device >" << deviceName << "<"; return false; } //----------------------------- // Find usable MediaType //----------------------------- memset(&format, 0, sizeof format); format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; format.fmt.pix.width = width; format.fmt.pix.height = height; format.fmt.pix.field = V4L2_FIELD_ANY; format.fmt.pix.pixelformat = pixelFormat; if (xioctl(fd, VIDIOC_S_FMT, &format) < 0) { qDebug() << "V4L2Grabber::setUp --> Error: Can't set capture format"; goto Error; } if (format.fmt.pix.pixelformat != pixelFormat) { qDebug() << "V4L2Grabber::setUp --> Error: Libv4l didn't accept RGB24 format. Can't proceed."; goto Error; } if ((format.fmt.pix.width != width) || (format.fmt.pix.height != height)) { width = format.fmt.pix.width; height = format.fmt.pix.height; qDebug() << "V4L2Grabber::setUp --> Warning: driver is sending image at " << width << "x" << height; } //----------------------------- // Create image buffer //----------------------------- dst_buf = (unsigned char*)malloc(format.fmt.pix.sizeimage); frameData = new unsigned char[width * height * 4]; // New frame data for ARGB 8bit memset(&req, 0, sizeof req); req.count = N_BUFFERS; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; if (xioctl(fd, VIDIOC_REQBUFS, &req) < 0) { qDebug() << "V4L2Grabber::setUp --> Error: Unable to allocate buffers"; goto Error; } for (unsigned int i = 0; i < N_BUFFERS; i++) { memset(&buf, 0, sizeof buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; if (xioctl(fd, VIDIOC_QUERYBUF, &buf) < 0) { qDebug() << "V4L2Grabber::setUp --> Error: Unable to query buffer"; goto Error; } buffers[i].length = buf.length; // buffers[i].start = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); buffers[i].start = (void*)v4l2_mmap(0, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if (buffers[i].start == MAP_FAILED) { qDebug() << "V4L2Grabber::setUp --> Error: Unable to map buffer (" << strerror(errno) << ")"; // Error see mmap man page goto Error; } } for (unsigned int i = 0; i < N_BUFFERS; ++i) { memset(&buf, 0, sizeof buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; if (xioctl(fd, VIDIOC_QBUF, &buf) < 0) { qDebug() << "V4L2Grabber::setUp --> Error: Unable to query buffer"; goto Error; } } type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (xioctl(fd, VIDIOC_STREAMON, &type) < 0) { qDebug() << "V4L2Grabber::setUp --> Error: Unable to switch streaming on"; goto Error; } qDebug() << "V4L2Grabber::setUp --> End"; return true; Error: if (dst_buf != NULL) { free(dst_buf); dst_buf = NULL; } if (fd > -1) { // close(fd); v4l2_close(fd); fd = -1; } return false; } bool V4L2Grabber::grab() { return true; } const QImage V4L2Grabber::getImage() { int ret = 0; int imageFormat = QImage::Format_ARGB32; QImage image; int imageLoaded = 0; // qDebug() << "V4L2Grabber::getImage --> Start"; // Dequeue a buffer. memset(&buf, 0, sizeof(struct v4l2_buffer)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; ret = xioctl(fd, VIDIOC_DQBUF, &buf); if (ret < 0) { qDebug() << "V4L2Grabber::getImage --> Error: Unable to dequeue buffer (" << errno << ")"; return image; } unsigned char* pixels = NULL; unsigned int nBytes = 0; // Save the image. if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_RGB24) { // Read a image in RGB24 format ==> TextureFormat::Format_RGB_8 // 8:8:8 Format, 24 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); if (convert_rgb24_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L) != 0) { qDebug() << "V4L2Grabber::getImage --> Error: Can not convert rgb to xbgr"; } } if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_BGR24) { // Read a image in BGR24 format ==> TextureFormat::Format_BGR_8 // 8:8:8 Format, 24 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); if (convert_bgr24_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L) != 0) { qDebug() << "V4L2Grabber::getImage --> Error: Can not convert bgr to xbgr"; } } // if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_xxx) { // Read a image in AYUV (AYCbCr BT.601) // 4:4:4 Format, 32 Bits per Pixel // nBytes = buf.bytesused; // pixels = (unsigned char*)malloc(nBytes); // memcpy(pixels, buffers[buf.index].start, nBytes); // convert_ayuv_to_abgr32_buffer(pixels, frameData, width, height, nBytes, 0L); // } if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV) { // Read a image in YUY2 (YCbY2) format ==> TextureFormat::Format_YUY2 // 4:2:2 Format, 16 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); convert_yuy2_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L); } if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_UYVY) { // Read a image in UYVY (CbYCrY) // 4:2:2 Format, 16 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); convert_uyvy_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L); } if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420) { // Read a image in YUV 4:2:0 (YCr12, YU12) // 4:2:0 Format, 12 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); convert_yu12_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L); } #ifdef V4L2_PIX_FMT_YUV420M if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420M) { // Read a image in YV12 (YCr12) // 4:2:0 Format, 12 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); convert_yuv420m_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L); } #endif if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_YVU420) { // Read a image in YVU 4:2:0 (YCr12, YU12) // 4:2:0 Format, 12 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); convert_yv12_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L); } #ifdef V4L2_PIX_FMT_YVU420M if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_YVU420M) { // Read a image in YV12 (YCr12) // 4:2:0 Format, 12 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); convert_yvu420m_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L); } #endif #ifdef V4L2_PIX_FMT_NV12M if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_NV12M) { // Read a image in NV12 (NCr12) // 4:2:0 Format, 12 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); convert_nv12_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L); } #endif if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_NV12) { // Read a image in NV12 (NCr12) // 4:2:0 Format, 12 Bits per Pixel nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); convert_nv12_to_xbgr32_buffer(pixels, frameData, width, height, nBytes, 0L); } if (format.fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG) { // Read a image in MJPG format nBytes = buf.bytesused; pixels = (unsigned char*)malloc(nBytes); memcpy(pixels, buffers[buf.index].start, nBytes); unsigned char jpegBuf1[nBytes + JPEG_DHT_LENGTH]; if (mjpegToJpeg(pixels, jpegBuf1, nBytes) == 0) { image.loadFromData(jpegBuf1, nBytes + JPEG_DHT_LENGTH); imageLoaded = 1; } else { qDebug() << "V4L2Grabber::getImage --> Error: Can not convert mjpeg to jpeg"; } } // Requeue the buffer. ret = xioctl(fd, VIDIOC_QBUF, &buf); if (ret < 0) { qDebug() << "V4L2Grabber::getImage --> Error: Unable to requeue buffer (" << errno << ")"; return image; } if (imageLoaded == 0) { // Create image image = QImage(QSize(width, height), (QImage::Format)imageFormat); // unsigned char* dst = const_cast(image.bits()); // Up to Qt 4.6.x unsigned char* dst = const_cast(image.constBits()); // From Qt 4.7 const unsigned char* src = const_cast(frameData); const unsigned char* const srcEnd = src + width * height * 4; while (src < srcEnd) { *dst++ = *src++; } imageLoaded = 1; } if (firstImage) { firstImage = false; } // qDebug() << "V4L2Grabber::getImage --> End"; return image; } const QImage V4L2Grabber::getLiveImage() { // liveImage.load(filePath); liveImage = getImage(); return liveImage; } const QImage V4L2Grabber::getRawImage() { // rawImage.load(filePath); rawImage = getImage(); return rawImage; } bool V4L2Grabber::tearDown() { enum v4l2_buf_type type; qDebug() << "V4L2Grabber::tearDown --> Start"; type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (xioctl(fd, VIDIOC_STREAMOFF, &type) < 0) { qDebug() << "V4L2Grabber::tearDown --> Error: Unable to switch streaming off"; // goto Error; } for (unsigned int i = 0; i < N_BUFFERS; ++i) { // munmap(buffers[i].start, buffers[i].length); v4l2_munmap(buffers[i].start, buffers[i].length); } if (frameData != NULL) { delete frameData; frameData = NULL; } if (dst_buf != NULL) { free(dst_buf); dst_buf = NULL; } if (fd > -1) { // close(fd); v4l2_close(fd); fd = -1; } qDebug() << "V4L2Grabber::tearDown --> End"; return true; } int V4L2Grabber::getFd() { return fd; } bool V4L2Grabber::readDeviceInfo(int fd, ImageGrabberDevice *device) { qDebug() << "V4L2Grabber::readDeviceInfo --> Start"; struct v4l2_capability video_cap; // include/linux/videodev.h if(xioctl(fd, VIDIOC_QUERYCAP, &video_cap) == -1) { qDebug() << "V4L2Grabber::initialization --> Error: Can't get capabilities"; return false; } qDebug() << "V4L2Grabber::initialization --> Driver:" << (char*)(video_cap.driver); qDebug() << "V4L2Grabber::initialization --> Name:" << (char*)(video_cap.card); device->setDeviceId(QLatin1String((const char*)video_cap.card)); device->setDeviceName(QLatin1String((const char*)video_cap.card) + " (V4L2)"); device->setDeviceSource(ImageGrabberDevice::video4Linux2Source); enumerateCaptureFormats(fd, device); qDebug() << "V4L2Grabber::readDeviceInfo --> End"; return true; } bool V4L2Grabber::enumerateCaptureFormats(int fd, ImageGrabberDevice *device) { qDebug() << "V4L2Grabber::enumerateCaptureFormats --> Start"; enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; struct v4l2_fmtdesc fmt; struct v4l2_frmsizeenum frmsize; // struct v4l2_frmivalenum frmival; unsigned int outputWidth; unsigned int outputHeight; fmt.index = 0; fmt.type = type; while (xioctl(fd, VIDIOC_ENUM_FMT, &fmt) >= 0) { qDebug() << "GrabberV4L2Controller::enumerateCaptureFormats --> Format Description: " << (char*)(fmt.description); frmsize.pixel_format = fmt.pixelformat; frmsize.index = 0; while (xioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize) >= 0) { switch (frmsize.type) { case V4L2_FRMSIZE_TYPE_DISCRETE: outputWidth = frmsize.discrete.width; outputHeight = frmsize.discrete.height; break; case V4L2_FRMSIZE_TYPE_STEPWISE: outputWidth = frmsize.stepwise.max_width; outputHeight = frmsize.stepwise.max_height; break; case V4L2_FRMSIZE_TYPE_CONTINUOUS: continue; break; default: continue; break; } switch(frmsize.pixel_format) { case V4L2_PIX_FMT_RGB24: // Depth: 24, Description: RGB 24bit device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::rgb24Format, false)); break; case V4L2_PIX_FMT_BGR24: // Depth: 24, Description: BGR 24bit device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::bgr24Format, false)); break; #ifdef V4L2_PIX_FMT_XBGR32 case V4L2_PIX_FMT_XBGR32: // Depth: 24, Description: BGR 32bit device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::xbgr32Format, false)); break; #endif #ifdef V4L2_PIX_FMT_ABGR32 case V4L2_PIX_FMT_ABGR32: // Depth: 24, Description: BGR 32bit device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::abgr32Format, false)); break; #endif case V4L2_PIX_FMT_YUYV: // Depth: 9, Description: YUV 4:1:0 device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::yuv2Format, false)); break; case V4L2_PIX_FMT_UYVY: // Depth: 16, Description: YUV 4:2:2 device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::uyvyFormat, false)); break; case V4L2_PIX_FMT_YVU420: device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::yv12Format, false)); break; #ifdef V4L2_PIX_FMT_YVU420M case V4L2_PIX_FMT_YVU420M: device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::yvu420mFormat, false)); break; #endif case V4L2_PIX_FMT_YUV420: device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::yu12Format, false)); break; #ifdef V4L2_PIX_FMT_YUV420M case V4L2_PIX_FMT_YUV420M: device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::yuv420mFormat, false)); break; #endif #ifdef V4L2_PIX_FMT_NV12M case V4L2_PIX_FMT_NV12M: device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::nv12Format, false)); break; #endif case V4L2_PIX_FMT_MJPEG: device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::mjpegFormat, false)); break; default: device->addResolution(GrabberResolution(outputWidth, outputHeight, GrabberResolution::unknownFormat, false)); break; } frmsize.index++; } // qDebug() << "GrabberV4L2Controller::enumerateCaptureFormats --> Private Control: " << (char*)(queryctrl.name); fmt.index++; } qDebug() << "V4L2Grabber::enumerateCaptureFormats --> End"; return true; } int V4L2Grabber::xioctl(int fd, int IOCTL_X, void *arg) { // qDebug() << "V4L2Grabber::xioctl --> Start"; int ret = 0; int tries = IOCTL_RETRY; do { ret = v4l2_ioctl(fd, IOCTL_X, arg); } while (ret && tries-- && ((errno == EINTR) || (errno == EAGAIN) || (errno == ETIMEDOUT))); if (ret && (tries <= 0)) { qDebug() << "V4L2Grabber::xioctl --> ioctl (" << IOCTL_X << ") retried " << IOCTL_RETRY << " times - giving up: " << strerror(errno) << ")"; } // qDebug() << "V4L2Grabber::xioctl --> End"; return (ret); } qstopmotion-2.3.2-Source/src/technical/grabber/video4linux2/v4l2grabber.h000644 000000 000000 00000010160 13011043104 026255 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef V4L2GRABBER_H #define V4L2GRABBER_H #include "technical/grabber/imagegrabber.h" #include "technical/grabber/imagegrabberdevice.h" // Include files of v4l2 #include #define N_BUFFERS 2 /** * Video grabbers using the Video4Linux2 library. * * @author Ralf Lange */ class V4L2Grabber : public ImageGrabber { Q_OBJECT public: /** * Initializes the member variables. * @param filePath path to the output file grabbed from a device */ V4L2Grabber(Frontend *f); /** * Destructor */ ~V4L2Grabber(); /** * Initialization of the Command line grabber * @param devices The vector of initialized devices. * @return true on success, false otherwise */ bool initialization(QVector &devices); /** * Starts the grabber if it is marked to be run in deamon mode. * @return true on success, false otherwise */ bool setUp(); /** * Get the live image from the camera */ const QImage getLiveImage(); /** * Get the raw image from the camera */ const QImage getRawImage(); /** * Grabs one picture from the device. * @return true on success, false otherwise */ bool grab(); /** * Shut downs the grabber process either if it is run in deamon * mode or "single grab" mode. * @return true on success, false otherwise */ bool tearDown(); /** * @brief getFd * @return The file descriptor of the open device. */ int getFd(); private: bool readDeviceInfo(int fd, ImageGrabberDevice *device); bool enumerateCaptureFormats(int fd, ImageGrabberDevice *device); // bool SetDeviceFormat(int fd, int dwFormatIndex); /** * ioctl with a number of retries in the case of failure * @param fd Device descriptor * @param IOCTL_X ioctl reference * @param arg Pointer to ioctl data * @return ioctl result */ int xioctl(int fd, int IOCTL_X, void *arg); /** * Get the actual image from the v4l2 interface. */ const QImage getImage(); private: struct buffer { void *start; size_t length; }; int activeSource; bool isInitSuccess; bool firstImage; /** * V4L2 file handle */ int fd; unsigned int width; unsigned int height; struct v4l2_format format; unsigned char* dst_buf; unsigned char* frameData; v4l2_buffer buf; struct buffer buffers[N_BUFFERS]; QImage liveImage; QImage rawImage; }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/video4linux2/v4l2controller.h000644 000000 000000 00000043051 12654352322 027062 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef VIDEO4LINUX2_V4L2CONTROLLER_H #define VIDEO4LINUX2_V4L2CONTROLLER_H #include "technical/grabber/grabbercontroller.h" #include "technical/grabber/video4linux2/v4l2grabber.h" // Include files of v4l2 #include class ImageGrabberDevice; // set ioctl retries to 4 - linux uvc as increased timeout from 1000 to 3000 ms #define IOCTL_RETRY 4 /** * Interface to the controller of a device. * * @author Ralf Lange */ class V4L2Controller : public GrabberController { public: /** * Constructs and initializes the object. * @param caps The grabber controller capabilities. */ V4L2Controller(int caps); /** * Destructor */ ~V4L2Controller(); /** * Get the image grabber of the controller. * * @brief getImageGrabber * @return The image grabber or null. */ ImageGrabber* getImageGrabber(); /** * Initialize the grabber controller. * @param ig The image grabber of the controller. * @param igd The image grabber device of the controller. * @return True if initialization is successful. */ bool initialization(ImageGrabber* ig, ImageGrabberDevice* igd); /** * Set up the controller. * @return true on success, false otherwise */ bool setUp(); /** * Tear down the controller. * @return true on success, false otherwise */ bool tearDown(); /************************************************************************** ************************************************************************** * Camera quality capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness **************************************************************************/ /** * Get the current automatic brightness value of the device. * @return True if the automatic brightness is on. */ // bool getAutomaticBrightness(); /** * Set the automatic brightness value of the device. * @param ab True if the automatic brightness will be switched on. */ // void setAutomaticBrightness(bool ab); /** * Get the current brightness value of the device. * @return The current brightness value. */ int getBrightness(); /** * Set the brightness value of the device. * @param b The new brightness value */ void setBrightness(int b); /************************************************************************** * Contrast **************************************************************************/ /** * Get the current automatic contrast value of the device. * @return True if the automatic contrast is on. */ // bool getAutomaticContrast(); /** * Set the automatic contrast value of the device. * @param ac True if the automatic contrast will be switched on. */ // void setAutomaticContrast(bool ac); /** * Get the current contrast value of the device. * @return The current contrast value. */ int getContrast(); /** * Set the contrast value of the device. * @param c The new contrast value */ void setContrast(int c); /************************************************************************** * Saturation **************************************************************************/ /** * Get the current automatic saturation value of the device. * @return True if the automatic saturation is on. */ // bool getAutomaticSaturation(); /** * Set the automatic saturation value of the device. * @param as True if the automatic saturation will be switched on. */ // void setAutomaticSaturation(bool as); /** * Get the current saturation value of the device. * @return The current saturation value. */ int getSaturation(); /** * Set the saturation value of the device. * @param s The new saturation value */ void setSaturation(int s); /************************************************************************** * Hue **************************************************************************/ /** * Get the current automatic hue value of the device. * @return True if the automatic hue is on. */ // bool getAutomaticHue(); /** * Set the automatic hue value of the device. * @param ah True if the automatic hue will be switched on. */ // void setAutomaticHue(bool ah); /** * Get the current hue value of the device. * @return The current hue value. */ int getHue(); /** * Set the hue value of the device. * @param h The new hue value */ void setHue(int h); /************************************************************************** * Gamma **************************************************************************/ /** * Get the current automatic gamma value of the device. * @return True if the automatic gamma is on. */ // bool getAutomaticGamma(); /** * Set the automatic gamma value of the device. * @param ag True if the automatic gamma will be switched on. */ // void setAutomaticGamma(bool ag); /** * Get the current gamma value of the device. * @return The current gamma value. */ int getGamma(); /** * Set the gamma value of the device. * @param g The new gamma value */ void setGamma(int g); /************************************************************************** * Sharpness **************************************************************************/ /** * Get the current automatic sharpness value of the device. * @return True if the automatic sharpness is on. */ // bool getAutomaticSharpness(); /** * Set the automatic sharpness value of the device. * @param as True if the automatic sharpness will be switched on. */ // void setAutomaticSharpness(bool as); /** * Get the current sharpness value of the device. * @return The current sharpness value. */ int getSharpness(); /** * Set the sharpness value of the device. * @param s The new sharpness value */ void setSharpness(int s); /************************************************************************** * Backlight Compensation **************************************************************************/ /** * Get the current automatic backlight compensation value of the device. * @return True if the automatic backlight compensation is on. */ // bool getAutomaticBacklight(); /** * Set the automatic backlight compensation value of the device. * @param ab True if the automatic backlight compensation will be switched on. */ // void setAutomaticBacklight(bool ab); /** * Get the current backlight compensation value of the device. * @return The current backlight compensation value. */ int getBacklight(); /** * Set the backlight compensation value of the device. * @param b The new backlight compensation value */ void setBacklight(int b); /************************************************************************** * White Balance **************************************************************************/ /** * Get the current automatic white balance value of the device. * @return True if the automatic white balance is on. */ // bool getAutomaticWhite(); /** * Set the automatic white balance value of the device. * @param ae True if the automatic white balance will be switched on. */ // void setAutomaticWhite(bool ae); /** * Get the current white balance value of the device. * @return The current white balance value. */ int getWhite(); /** * Set the white balance value of the device. * @param w The new white balance value */ void setWhite(int w); /************************************************************************** * Gain **************************************************************************/ /** * Get the current automatic gain value of the device. * @return True if the automatic gain is on. */ // bool getAutomaticGain(); /** * Set the automatic gain value of the device. * @param ag True if the automatic gain will be switched on. */ // void setAutomaticGain(bool ag); /** * Get the current gain value of the device. * @return The current gain value. */ int getGain(); /** * Set the gain value of the device. * @param g The new gain value */ void setGain(int g); /************************************************************************** * Color Enable **************************************************************************/ /** * Get the current automatic color enable value of the device. * @return True if the automatic color enable is on. */ // bool getAutomaticColor(); /** * Set the automatic color enable value of the device. * @param ac True if the automatic color enable will be switched on. */ // void setAutomaticColor(bool ac); /** * Get the current color enable value of the device. * @return The current color enable value. */ int getColor(); /** * Set the color enable value of the device. * @param c The new color enable value */ void setColor(int c); /************************************************************************** ************************************************************************** * Camera control capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Exposure **************************************************************************/ /** * Get the current automatic exposure value of the device. * @return True if the automatic exposure is on. */ // bool getAutomaticExposure(); /** * Set the automatic exposure value of the device. * @param ae True if the automatic exposure will be switched on. */ // void setAutomaticExposure(bool ae); /** * Get the current exposure value of the device. * @return The current exposure value. */ int getExposure(); /** * Set the exposure value of the device. * @param e The new exposure value */ void setExposure(int e); /************************************************************************** * Zoom **************************************************************************/ /** * Get the current automatic zoom value of the device. * @return True if the automatic zoom is on. */ // bool getAutomaticZoom(); /** * Set the automatic zoom value of the device. * @param az True if the automatic zoom will be switched on. */ // void setAutomaticZoom(bool az); /** * Get the current zoom value of the device. * @return The current zoom value. */ int getZoom(); /** * Set the zoom value of the device. * @param z The new zoom value */ void setZoom(int z); /************************************************************************** * Focus **************************************************************************/ /** * Get the current automatic focus value of the device. * @return True if the automatic focus is on. */ // bool getAutomaticFocus(); /** * Set the automatic focus value of the device. * @param af True if the automatic focus will be switched on. */ // void setAutomaticFocus(bool af); /** * Get the current focus value of the device. * @return The current focus value. */ int getFocus(); /** * Set the focus value of the device. * @param f The new focus value */ void setFocus(int f); /************************************************************************** * Pan **************************************************************************/ /** * Get the current automatic pan value of the device. * @return True if the automatic pan is on. */ // bool getAutomaticPan(); /** * Set the automatic pan value of the device. * @param ap True if the automatic pan will be switched on. */ // void setAutomaticPan(bool ap); /** * Get the current pan value of the device. * @return The current pan value. */ // int getPan(); /** * Set the pan value of the device. * @param p The new pan value */ // void setPan(int p); /************************************************************************** * Tilt **************************************************************************/ /** * Get the current automatic tilt value of the device. * @return True if the automatic tilt is on. */ // bool getAutomaticTilt(); /** * Set the automatic tilt value of the device. * @param at True if the automatic tilt will be switched on. */ // void setAutomaticTilt(bool at); /** * Get the current tilt value of the device. * @return The current tilt value. */ // int getTilt(); /** * Set the tilt value of the device. * @param t The new tilt value */ // void setTilt(int t); /************************************************************************** * Iris **************************************************************************/ /** * Get the current automatic iris value of the device. * @return True if the automatic iris is on. */ // bool getAutomaticIris(); /** * Set the automatic iris value of the device. * @param ae True if the automatic iris will be switched on. */ // void setAutomaticIris(bool ae); /** * Get the current iris value of the device. * @return The current iris value. */ // int getIris(); /** * Set the iris value of the device. * @param e The new iris value */ // void setIris(int e); /************************************************************************** * Roll **************************************************************************/ /** * Get the current automatic roll value of the device. * @return True if the automatic roll is on. */ // bool getAutomaticRoll(); /** * Set the automatic roll value of the device. * @param ar True if the automatic roll will be switched on. */ // void setAutomaticRoll(bool ar); /** * Get the current roll value of the device. * @return The current roll value. */ // int getRoll(); /** * Set the roll value of the device. * @param r The new roll value */ // void setRoll(int r); private: V4L2Grabber* grabber; ImageGrabberDevice* grabberDevice; int fd; struct v4l2_queryctrl queryctrl; struct v4l2_querymenu querymenu; int query_ioctl(int hdevice, int current_ctrl, struct v4l2_queryctrl *ctrl); /** * ioctl with a number of retries in the case of failure * @param fd Device descriptor * @param IOCTL_X ioctl reference * @param arg Pointer to ioctl data * @return ioctl result */ int xioctl(int fd, int IOCTL_X, void *arg); void enumerate_menu(); void getControlData(GrabberControlCapabilities *caps, long flags = GrabberController::controller_none); void getControlFlag(GrabberControlCapabilities *caps); bool setBaseCapabilities(); bool setPrivateCapabilities(); int setCtrlValue(GrabberControlCapabilities *caps, int value); int getCtrlValue(GrabberControlCapabilities *caps, int &value); }; #endif qstopmotion-2.3.2-Source/src/technical/grabber/video4linux2/v4l2controller.cpp000644 000000 000000 00000110553 12714076256 027425 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2012-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ****************************************************************************** * Base on the following sources * ****************************************************************************** * guvcview http://guvcview.sourceforge.net * * * * Paulo Assis * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * ******************************************************************************/ #include "technical/grabber/imagegrabberdevice.h" #include "v4l2controller.h" #include #include #include #include /************************************************************************** * Default implementation of the grabber controller functions. **************************************************************************/ V4L2Controller::V4L2Controller(int cap) : GrabberController(cap) { qDebug() << "V4L2Controller::Constructor --> Start"; // errno = -1; grabber = NULL; grabberDevice = NULL; qDebug() << "V4L2Controller::Constructor --> End"; } V4L2Controller::~V4L2Controller() { qDebug() << "V4L2Controller::Destructor --> Start (Empty)"; // qDebug() << "V4L2Controller::Destructor --> End"; } ImageGrabber* V4L2Controller::getImageGrabber() { return grabber; } bool V4L2Controller::initialization(ImageGrabber* ig, ImageGrabberDevice* igd) { qDebug() << "V4L2Controller::initialization --> Start"; grabber = (V4L2Grabber*)ig; grabberDevice = igd; qDebug() << "V4L2Controller::initialization --> Open the device ..."; // fd = v4l2_open(grabberDevice->getDeviceId().toAscii(), O_RDWR | O_NONBLOCK, 0); fd = grabber->getFd(); if (fd < 0) { qDebug() << "V4L2Controller::initialization --> No open grabber!"; v4l2_close(fd); return false; } // fd = open(grabberDevice->getDeviceId().toAscii(), O_RDWR | O_NONBLOCK); // if (fd < 0) { // qDebug() << "V4L2Controller::initialization --> Error opening standard interface for " << grabberDevice->getDeviceId(); // close(fd); // return false; // } // Enumerating device capabilities memset (&queryctrl, 0, sizeof (queryctrl)); if (setBaseCapabilities() == false) { qDebug() << "V4L2Controller::initialization --> Cannot enumerate base device capabilities (" << errno << ")"; return false; } if (setPrivateCapabilities() == false) { qDebug() << "V4L2Controller::initialization --> Cannot enumerate private device capabilities (" << errno << ")"; return false; } qDebug() << "V4L2Controller::initialization --> End (Successful)"; return true; } bool V4L2Controller::setUp() { qDebug() << "V4L2Controller::setUp --> Start (Empty)"; return true; } bool V4L2Controller::tearDown() { qDebug() << "V4L2Controller::tearDown --> Start (Empty)"; return true; } /* * don't use xioctl for control query when using V4L2_CTRL_FLAG_NEXT_CTRL */ int V4L2Controller::query_ioctl(int hdevice, int current_ctrl, struct v4l2_queryctrl *ctrl) { int ret = 0; int tries = 4; do { if(ret) ctrl->id = current_ctrl | V4L2_CTRL_FLAG_NEXT_CTRL; ret = v4l2_ioctl(hdevice, VIDIOC_QUERYCTRL, ctrl); } while (ret && tries-- && ((errno == EIO || errno == EPIPE || errno == ETIMEDOUT))); return(ret); } int V4L2Controller::xioctl(int fd, int IOCTL_X, void *arg) { // qDebug() << "V4L2Controller::xioctl --> Start"); int ret = 0; int tries = IOCTL_RETRY; do { ret = v4l2_ioctl(fd, IOCTL_X, arg); } while (ret && tries-- && ((errno == EINTR) || (errno == EAGAIN) || (errno == ETIMEDOUT))); if (ret && (tries <= 0)) { qDebug() << "V4L2Controller::xioctl --> v4l2_ioctl (" << IOCTL_X << ") retried " << IOCTL_RETRY << " times - giving up: " << strerror(errno) << ")"; } // qDebug() << "V4L2Controller::xioctl --> End"); return (ret); } void V4L2Controller::enumerate_menu () { qDebug() << "V4L2Controller::enumerate_menu --> Start"; qDebug() << "V4L2Controller::enumerate_menu --> Menu items:"; memset (&querymenu, 0, sizeof (querymenu)); querymenu.id = queryctrl.id; for (querymenu.index = queryctrl.minimum; querymenu.index <= queryctrl.maximum; querymenu.index++) { if (0 == v4l2_ioctl (fd, VIDIOC_QUERYMENU, &querymenu)) { qDebug() << "V4L2Controller::enumerate_menu --> Item: " << (char*)(querymenu.name); } } qDebug() << "V4L2Controller::enumerate_menu --> End"; } void V4L2Controller::getControlData(GrabberControlCapabilities *caps, long flags) { qDebug() << "V4L2Controller::getControlData --> Start"; caps->setControlId(queryctrl.id); caps->setControlType(queryctrl.type); caps->setFlags(flags); switch (queryctrl.type) { case V4L2_CTRL_TYPE_MENU: // enumerate_menu (); break; case V4L2_CTRL_TYPE_INTEGER: caps->setMinimum(queryctrl.minimum); caps->setMaximum(queryctrl.maximum); caps->setStep(queryctrl.step); caps->setDefault(queryctrl.default_value); caps->setFlags(GrabberControlCapabilities::control_Manual); break; // case V4L2_CTRL_TYPE_INTEGER_MENU: // Not defined on Debian systems case V4L2_CTRL_TYPE_INTEGER64: case V4L2_CTRL_TYPE_BOOLEAN: case V4L2_CTRL_TYPE_BUTTON: case V4L2_CTRL_TYPE_CTRL_CLASS: case V4L2_CTRL_TYPE_STRING: // case V4L2_CTRL_TYPE_BITMASK: // Not defined on Debian systems default: qDebug() << "V4L2Controller::getControlData --> Not supported control type"; break; } qDebug() << "V4L2Controller::getControlData --> End"; } void V4L2Controller::getControlFlag(GrabberControlCapabilities *caps) { int ret = 0; struct v4l2_control ctrl; ctrl.id = queryctrl.id; ctrl.value = 0; ret = v4l2_ioctl(fd, VIDIOC_G_CTRL, &ctrl); if (ret != 0) { return; } if (ctrl.value == 1) { caps->setFlags(GrabberControlCapabilities::control_Auto); } else { caps->setFlags(GrabberControlCapabilities::control_Manual); } return; } bool V4L2Controller::setBaseCapabilities() { qDebug() << "V4L2Controller::setBaseCapabilities --> Start"; int ret = 0; int currentctrl = 0; GrabberControlCapabilities *caps = NULL; int flags = 0; queryctrl.id = 0 | V4L2_CTRL_FLAG_NEXT_CTRL; ret = query_ioctl(fd, currentctrl, &queryctrl); if (ret == 0) { // The driver supports the V4L2_CTRL_FLAG_NEXT_CTRL flag qDebug() << "V4L2Controller::setBaseCapabilities --> Start V4L2_CTRL_FLAG_NEXT_CTRL"; queryctrl.id = 0 | V4L2_CTRL_FLAG_NEXT_CTRL; currentctrl = 0; while ((ret = query_ioctl(fd, currentctrl, &queryctrl)), ret ? errno != EINVAL : 1) { // Prevent infinite loop for buggy V4L2_CTRL_FLAG_NEXT_CTRL implementations if(ret && queryctrl.id <= currentctrl) { qDebug() << "buggy V4L2_CTRL_FLAG_NEXT_CTRL flag implementation (workaround enabled)"; // increment the control id manually currentctrl++; queryctrl.id = currentctrl; goto next_control; } else if ((queryctrl.id == V4L2_CTRL_FLAG_NEXT_CTRL) || (!ret && queryctrl.id == currentctrl)) { qDebug() << "buggy V4L2_CTRL_FLAG_NEXT_CTRL flag implementation (failed enumeration for id=" << queryctrl.id; // stop control enumeration break; } currentctrl = queryctrl.id; if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) { qDebug() << "V4L2Controller::setBaseCapabilities --> Disabling control " << queryctrl.id; goto next_control; } qDebug() << "V4L2Controller::setBaseCapabilities --> Base Control: " << (char*)(queryctrl.name); if (queryctrl.type == V4L2_CTRL_TYPE_MENU) { // This is a menu control enumerate_menu (); } caps = NULL; flags = GrabberControlCapabilities::control_none; switch (queryctrl.id) { case V4L2_CID_BRIGHTNESS: caps = getBrightnessCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_AUTOBRIGHTNESS: getControlFlag(getBrightnessCaps()); break; case V4L2_CID_CONTRAST: caps = getContrastCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_SATURATION: caps = getSaturationCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_HUE: caps = getHueCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_HUE_AUTO: getControlFlag(getHueCaps()); break; case V4L2_CID_GAMMA: caps = getGammaCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_SHARPNESS: caps = getSharpnessCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_BACKLIGHT_COMPENSATION: caps = getBacklightCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_WHITE_BALANCE_TEMPERATURE: caps = getWhiteCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_AUTO_WHITE_BALANCE: getControlFlag(getWhiteCaps()); break; case V4L2_CID_GAIN: caps = getGainCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_AUTOGAIN: getControlFlag(getGainCaps()); break; case V4L2_CID_COLOR_KILLER: caps = getColorCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_EXPOSURE: caps = getExposureCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_EXPOSURE_ABSOLUTE: // "Exposure (Absolute)" caps = getExposureCaps(); flags = GrabberController::controller_Absolute; getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_EXPOSURE_AUTO: // "Exposure, Auto" getControlFlag(getExposureCaps()); break; case V4L2_CID_ZOOM_ABSOLUTE: // "Zool, Absolute" caps = getZoomCaps(); flags = GrabberController::controller_Absolute; getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_ZOOM_RELATIVE: // "Zool, Relative" caps = getZoomCaps(); flags = GrabberController::controller_Relative; getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_ZOOM_CONTINUOUS: // "Zool, Continuous" caps = getZoomCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_FOCUS_ABSOLUTE: // "Focus (absolute)" // case V4L2_CID_FOCUS_LOGITECH: // "Focus (absolute)" caps = getFocusCaps(); flags = GrabberController::controller_Absolute; getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_FOCUS_RELATIVE: // "Focus (relative)" caps = getFocusCaps(); flags = GrabberController::controller_Relative; getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_FOCUS_AUTO: // "Focus, Auto" getControlFlag(getExposureCaps()); break; case V4L2_CID_PAN_ABSOLUTE: caps = getPanCaps(); flags = GrabberController::controller_Absolute; getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_PAN_RELATIVE: caps = getPanCaps(); flags = GrabberController::controller_Relative; getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_TILT_ABSOLUTE: caps = getTiltCaps(); flags = GrabberController::controller_Absolute; getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; case V4L2_CID_TILT_RELATIVE: caps = getTiltCaps(); flags = GrabberController::controller_Relative; getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_ID2CLASS(caps->getControlId())); break; default: qDebug() << "V4L2Controller::setBaseCapabilities --> Not Supported Base Control: " << (char*)(queryctrl.name) << " (" << queryctrl.id << ")" << (queryctrl.id & 0xFFFF0000); } next_control: queryctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL; } qDebug() << "V4L2Controller::setBaseCapabilities --> End V4L2_CTRL_FLAG_NEXT_CTRL"; return true; } // The driver not supports the V4L2_CTRL_FLAG_NEXT_CTRL flag qDebug() << "V4L2Controller::setBaseCapabilities --> Start V4L2_CID_BASE"; for (currentctrl = V4L2_CID_BASE; currentctrl < V4L2_CID_LASTP1; currentctrl++) { queryctrl.id = currentctrl; ret = v4l2_ioctl(fd, VIDIOC_QUERYCTRL, &queryctrl); if (ret) { continue; } if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) { continue; } qDebug() << "V4L2Controller::setBaseCapabilities --> Base Control: " << (char*)(queryctrl.name); if (queryctrl.type == V4L2_CTRL_TYPE_MENU) { // This is a menu control enumerate_menu (); } caps = NULL; flags = GrabberControlCapabilities::control_none; switch (queryctrl.id) { case V4L2_CID_BRIGHTNESS: caps = getBrightnessCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_AUTOBRIGHTNESS: getControlFlag(getBrightnessCaps()); break; case V4L2_CID_CONTRAST: caps = getContrastCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_SATURATION: caps = getSaturationCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_HUE: caps = getHueCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_HUE_AUTO: getControlFlag(getHueCaps()); break; case V4L2_CID_GAMMA: caps = getGammaCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_SHARPNESS: caps = getSharpnessCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_BACKLIGHT_COMPENSATION: caps = getBacklightCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_WHITE_BALANCE_TEMPERATURE: caps = getWhiteCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_AUTO_WHITE_BALANCE: getControlFlag(getWhiteCaps()); break; case V4L2_CID_GAIN: caps = getGainCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_AUTOGAIN: getControlFlag(getGainCaps()); break; case V4L2_CID_COLOR_KILLER: caps = getColorCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_EXPOSURE: // "Exposure (Absolute)" caps = getExposureCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; default: qDebug() << "V4L2Controller::setBaseCapabilities --> Not Supported Base Control: " << (char*)(queryctrl.name) << " (" << queryctrl.id << ")" << (queryctrl.id & 0xFFFF0000); } } qDebug() << "V4L2Controller::setBaseCapabilities --> End V4L2_CID_BASE"; qDebug() << "V4L2Controller::setBaseCapabilities --> End"; return true; } bool V4L2Controller::setPrivateCapabilities() { qDebug() << "V4L2Controller::setPrivateCapabilities --> Start"; int ret = 0; for (queryctrl.id = V4L2_CID_PRIVATE_BASE; ; queryctrl.id++) { ret = v4l2_ioctl(fd, VIDIOC_QUERYCTRL, &queryctrl); if(ret) { break; } if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) { continue; } qDebug() << "V4L2Controller::setPrivateCapabilities --> Private Control: " << (char*)(queryctrl.name); /* caps = NULL; flags = GrabberControlCapabilities::control_none; switch (queryctrl.id) { case V4L2_CID_ZOOM: caps = getZoomCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_FOCUS: caps = getFocusCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_PAN: caps = getPanCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_TILT: caps = getTiltCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_ITIS: caps = getIrisCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; case V4L2_CID_ROLL: caps = getRollCaps(); getControlData(caps, flags); caps->setControlClass(V4L2_CTRL_CLASS_USER); break; default: qDebug() << "V4L2Controller::setPrivateCapabilities --> Not Supported Private Control: " << (char*)(queryctrl.name); } */ if (queryctrl.type == V4L2_CTRL_TYPE_MENU) { enumerate_menu (); } } qDebug() << "V4L2Controller::setPrivateCapabilities --> End"; return true; } /* * sets the value for control id */ int V4L2Controller::setCtrlValue(GrabberControlCapabilities *caps, int value) { qDebug() << "V4L2Controller::setCtrlValue --> Start"; int ret = 0; if (caps->getControlClass() == V4L2_CTRL_CLASS_USER) { // using VIDIOC_G_CTRL for user class controls struct v4l2_control ctrl; ctrl.id = caps->getControlId(); ctrl.value = value; ret = xioctl(fd, VIDIOC_S_CTRL, &ctrl); } else { // using VIDIOC_G_EXT_CTRLS on single controls struct v4l2_ext_controls ctrls = {0}; struct v4l2_ext_control ctrl = {0}; ctrl.id = caps->getControlId(); switch (caps->getControlType()) { // case V4L2_CTRL_TYPE_STRING: // ctrl.size = control->value; // ctrl.string = control->string; // break; case V4L2_CTRL_TYPE_INTEGER64: ctrl.value64 = (long)value; break; default: ctrl.value = value; break; } ctrls.ctrl_class = caps->getControlClass(); ctrls.count = 1; ctrls.controls = &ctrl; ret = xioctl(fd, VIDIOC_S_EXT_CTRLS, &ctrls); if (ret) { qDebug() << "V4L2Controller::setCtrlValue --> control id: " << ctrl.id << " failed to set (error " << ret << ")"; } } // update real value // get_ctrl(hdevice, control_list, id, NULL); qDebug() << "V4L2Controller::setCtrlValue --> End"; return (ret); } /* * Gets the value for control id * and updates control flags and widgets */ int V4L2Controller::getCtrlValue(GrabberControlCapabilities *caps, int &value) { qDebug() << "V4L2Controller::setCtrlValue --> Start"; int ret = 0; if (caps->getControlClass() == V4L2_CTRL_CLASS_USER) { // using VIDIOC_G_CTRL for user class controls struct v4l2_control ctrl; ctrl.id = caps->getControlId(); ctrl.value = 0; ret = v4l2_ioctl(fd, VIDIOC_G_CTRL, &ctrl); if (ret) { qDebug() << "V4L2Controller::setCtrlValue --> control id: " << ctrl.id << " failed to get value (error " << ret << ")"; } else { value = ctrl.value; } } else { // using VIDIOC_G_EXT_CTRLS on single controls struct v4l2_ext_controls ctrls = {0}; struct v4l2_ext_control ctrl = {0}; ctrl.id = caps->getControlId(); // ctrl.size = 0; // if(control->control.type == V4L2_CTRL_TYPE_STRING) // { // ctrl.size = control->control.maximum + 1; // ctrl.string = control->string; // } ctrls.ctrl_class = caps->getControlClass(); ctrls.count = 1; ctrls.controls = &ctrl; ret = v4l2_ioctl(fd, VIDIOC_G_EXT_CTRLS, &ctrls); if (ret) { qDebug() << "V4L2Controller::setCtrlValue --> control id: " << ctrl.id << " failed to get value (error " << ret << ")"; } else { switch(caps->getControlType()) { // case V4L2_CTRL_TYPE_STRING: // //string gets set on VIDIOC_G_EXT_CTRLS // //add the maximum size to value // control->value = ctrl.size; // break; case V4L2_CTRL_TYPE_INTEGER64: value = (int)ctrl.value64; break; default: value = ctrl.value; // printf("control %i [0x%08x] = %i\n", i, clist[i].id, clist[i].value); break; } } } // update_ctrl_flags(control_list, id); // update_widget_state(control_list, all_data); qDebug() << "V4L2Controller::setCtrlValue --> End"; return (ret); } /************************************************************************** ************************************************************************** * Camera quality capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Brightness **************************************************************************/ /* bool V4L2Controller::getAutomaticBrightness() { return false; } void V4L2Controller::setAutomaticBrightness(bool ab) { Q_ASSERT( 1 ); } */ int V4L2Controller::getBrightness() { return 0; } void V4L2Controller::setBrightness(int b) { qDebug() << "V4L2Controller::setBrightness --> Start"; setCtrlValue(getBrightnessCaps(), b); qDebug() << "V4L2Controller::setBrightness --> End"; } /************************************************************************** * Contrast **************************************************************************/ /* bool V4L2Controller::getAutomaticContrast() { return false; } void V4L2Controller::setAutomaticContrast(bool ac) { Q_ASSERT( 1 ); } */ int V4L2Controller::getContrast() { return 0; } void V4L2Controller::setContrast(int c) { qDebug() << "V4L2Controller::setContrast --> Start"; setCtrlValue(getContrastCaps(), c); qDebug() << "V4L2Controller::setContrast --> End"; } /************************************************************************** * Saturation **************************************************************************/ /* bool V4L2Controller::getAutomaticSaturation() { return false; } void V4L2Controller::setAutomaticSaturation(bool as) { Q_ASSERT( 1 ); } */ int V4L2Controller::getSaturation() { return 0; } void V4L2Controller::setSaturation(int s) { qDebug() << "V4L2Controller::setSaturation --> Start"; setCtrlValue(getSaturationCaps(), s); qDebug() << "V4L2Controller::setSaturation --> End"; } /************************************************************************** * Hue **************************************************************************/ /* bool V4L2Controller::getAutomaticHue() { return false; } void V4L2Controller::setAutomaticHue(bool ah) { Q_ASSERT( 1 ); } */ int V4L2Controller::getHue() { return 0; } void V4L2Controller::setHue(int h) { qDebug() << "V4L2Controller::setHue --> Start"; setCtrlValue(getHueCaps(), h); qDebug() << "V4L2Controller::setHue --> End"; } /************************************************************************** * Gamma **************************************************************************/ /* bool V4L2Controller::getAutomaticGamma() { return false; } void V4L2Controller::setAutomaticGamma(bool ag) { Q_ASSERT( 1 ); } */ int V4L2Controller::getGamma() { return 0; } void V4L2Controller::setGamma(int g) { qDebug() << "V4L2Controller::setGamma --> Start"; setCtrlValue(getGammaCaps(), g); qDebug() << "V4L2Controller::setGamma --> End"; } /************************************************************************** * Sharpness **************************************************************************/ /* bool V4L2Controller::getAutomaticSharpness() { return false; } void V4L2Controller::setAutomaticSharpness(bool as) { Q_ASSERT( 1 ); } */ int V4L2Controller::getSharpness() { return 0; } void V4L2Controller::setSharpness(int s) { qDebug() << "V4L2Controller::setSharpness --> Start"; setCtrlValue(getSharpnessCaps(), s); qDebug() << "V4L2Controller::setSharpness --> End"; } /************************************************************************** * Backlight Compensation **************************************************************************/ /* bool V4L2Controller::getAutomaticBacklight() { return false; } void V4L2Controller::setAutomaticBacklight(bool ab) { Q_ASSERT( 1 ); } */ int V4L2Controller::getBacklight() { return 0; } void V4L2Controller::setBacklight(int b) { qDebug() << "V4L2Controller::setBacklight --> Start"; setCtrlValue(getBacklightCaps(), b); qDebug() << "V4L2Controller::setBacklight --> End"; } /************************************************************************** * White Balance **************************************************************************/ /* bool V4L2Controller::getAutomaticWhite() { return false; } void V4L2Controller::setAutomaticWhite(bool aw) { Q_ASSERT( 1 ); } */ int V4L2Controller::getWhite() { return 0; } void V4L2Controller::setWhite(int w) { qDebug() << "V4L2Controller::setWhite --> Start"; setCtrlValue(getWhiteCaps(), w); qDebug() << "V4L2Controller::setWhite --> End"; } /************************************************************************** * Gain **************************************************************************/ /* bool V4L2Controller::getAutomaticGain() { return false; } void V4L2Controller::setAutomaticGain(bool ag) { Q_ASSERT( 1 ); } */ int V4L2Controller::getGain() { return 0; } void V4L2Controller::setGain(int g) { qDebug() << "V4L2Controller::setGain --> Start"; setCtrlValue(getGainCaps(), g); qDebug() << "V4L2Controller::setGain --> End"; } /************************************************************************** * Color Enable **************************************************************************/ /* bool V4L2Controller::getAutomaticColor() { return false; } void V4L2Controller::setAutomaticColor(bool ac) { Q_ASSERT( 1 ); } */ int V4L2Controller::getColor() { return 0; } void V4L2Controller::setColor(int c) { qDebug() << "V4L2Controller::setColor --> Start"; setCtrlValue(getColorCaps(), c); qDebug() << "V4L2Controller::setColor --> End"; } /************************************************************************** ************************************************************************** * Camera control capabilities ************************************************************************** **************************************************************************/ /************************************************************************** * Exposure **************************************************************************/ /* bool V4L2Controller::getAutomaticExposure() { return false; } void V4L2Controller::setAutomaticExposure(bool ae) { Q_ASSERT( 1 ); } */ int V4L2Controller::getExposure() { return 0; } void V4L2Controller::setExposure(int e) { qDebug() << "V4L2Controller::setExposure --> Start"; setCtrlValue(getExposureCaps(), e); qDebug() << "V4L2Controller::setExposure --> End"; } /************************************************************************** * Zoom **************************************************************************/ /* bool V4L2Controller::getAutomaticZoom() { return false; } void V4L2Controller::setAutomaticZoom(bool az) { Q_ASSERT( 1 ); } */ int V4L2Controller::getZoom() { int value = 0; getCtrlValue(getZoomCaps(), value); return value; } void V4L2Controller::setZoom(int z) { qDebug() << "V4L2Controller::setZoom --> Start"; setCtrlValue(getZoomCaps(), z); setCtrlValue(getZoomCaps(), z); qDebug() << "V4L2Controller::setZoom --> End"; } /************************************************************************** * Focus **************************************************************************/ /* bool V4L2Controller::getAutomaticFocus() { return false; } void V4L2Controller::setAutomaticFocus(bool af) { Q_ASSERT( 1 ); } */ int V4L2Controller::getFocus() { return 0; } void V4L2Controller::setFocus(int f) { qDebug() << "V4L2Controller::setFocus --> Start"; setCtrlValue(getFocusCaps(), f); qDebug() << "V4L2Controller::setFocus --> End"; } /************************************************************************** * Pan **************************************************************************/ /* bool V4L2Controller::getAutomaticPan() { return false; } void V4L2Controller::setAutomaticPan(bool ap) { Q_ASSERT( 1 ); } int V4L2Controller::getPan() { return 0; } void V4L2Controller::setPan(int p) { Q_ASSERT( 1 ); } */ /************************************************************************** * Tilt **************************************************************************/ /* bool V4L2Controller::getAutomaticTilt() { return false; } void V4L2Controller::setAutomaticTilt(bool at) { Q_ASSERT( 1 ); } int V4L2Controller::getTilt() { return 0; } void V4L2Controller::setTilt(int t) { Q_ASSERT( 1 ); } */ /************************************************************************** * Iris **************************************************************************/ /* bool V4L2Controller::getAutomaticIris() { return false; } void V4L2Controller::setAutomaticIris(bool ae) { Q_ASSERT( 1 ); } bool V4L2Controller::isIris() { return false; } void V4L2Controller::setIris(int e) { Q_ASSERT( 1 ); } */ /************************************************************************** * Roll **************************************************************************/ /* bool V4L2Controller::getAutomaticRoll() { return false; } void V4L2Controller::setAutomaticRoll(bool ar) { Q_ASSERT( 1 ); } bool V4L2Controller::isRoll() { return false; } void V4L2Controller::setRoll(int e) { Q_ASSERT( 1 ); } */ qstopmotion-2.3.2-Source/src/technical/grabber/imagegrabberdevice.cpp000644 000000 000000 00000012523 12714076256 025763 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2011-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "imagegrabberdevice.h" #include ImageGrabberDevice::ImageGrabberDevice() { qDebug() << "ImageGrabberDevice::Constructor(Default) --> Start"; deviceId.clear(); deviceName.clear(); deviceSource = ImageGrabberDevice::noSource; deviceCap = ImageGrabberDevice::video_x_none; resolutions.clear(); controller = NULL; qDebug() << "ImageGrabberDevice::Constructor(Default) --> End"; } ImageGrabberDevice::ImageGrabberDevice(const int index, const QString id, const QString name, imageGrabberSources source, imageGrabberDeviceCapabilities cap) { qDebug() << "ImageGrabberDevice::Constructor --> Start"; deviceIndex = index; deviceId.clear(); deviceId.append(id); deviceName.clear(); deviceName.append(name); deviceSource = source; deviceCap = cap; controller = NULL; resolutionChangeable = true; qDebug() << "ImageGrabberDevice::Constructor --> End"; } ImageGrabberDevice::~ImageGrabberDevice() { qDebug() << "ImageGrabberDevice::Destructor --> Start"; if (controller != NULL) { delete controller; controller = NULL; } qDebug() << "ImageGrabberDevice::Destructor --> End"; } const int ImageGrabberDevice::getDeviceIndex() { return deviceIndex; } void ImageGrabberDevice::setDeviceIndex(const int index) { deviceIndex = index; } const QString ImageGrabberDevice::getDeviceId() { return deviceId; } void ImageGrabberDevice::setDeviceId(const QString id) { deviceId.append(id); } const QString ImageGrabberDevice::getDeviceName() { return deviceName; } void ImageGrabberDevice::setDeviceName(const QString name) { deviceName.append(name); } ImageGrabberDevice::imageGrabberSources ImageGrabberDevice::getDeviceSource() { return deviceSource; } void ImageGrabberDevice::setDeviceSource(ImageGrabberDevice::imageGrabberSources source) { deviceSource = source; } ImageGrabberDevice::imageGrabberDeviceCapabilities ImageGrabberDevice::getDeviceCapability() { return deviceCap; } void ImageGrabberDevice::setDeviceCapability(ImageGrabberDevice::imageGrabberDeviceCapabilities cap) { deviceCap = cap; } /************************************************************************** ************************************************************************** * Camera resolution ************************************************************************** **************************************************************************/ void ImageGrabberDevice::addResolution(GrabberResolution r) { for (int i = 0; i < resolutions.size(); i++) { if ((r.getWidth() == resolutions[i].getWidth()) && (r.getHeight() == resolutions[i].getHeight()) && (r.getFormat() == resolutions[i].getFormat())) { return; } } resolutions.append(r); } QVector ImageGrabberDevice::getResolutions() { return resolutions; } void ImageGrabberDevice::setResolutionChangeable(bool rc) { resolutionChangeable = rc; } bool ImageGrabberDevice::isResolutionChangeable() { return resolutionChangeable; } /************************************************************************** ************************************************************************** * Camera controller ************************************************************************** **************************************************************************/ bool ImageGrabberDevice::isController() const { if (controller != NULL) { return true; } return false; } GrabberController* ImageGrabberDevice::getController() { return controller; } void ImageGrabberDevice::setController(GrabberController *c) { controller = c; } qstopmotion-2.3.2-Source/src/technical/externalchangemonitor.cpp000644 000000 000000 00000020312 12654352322 025155 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "externalchangemonitor.h" #include #include #include #include #include "domain/domainfacade.h" #include "technical/preferencestool.h" #include "technical/util.h" /** * Class to monitor the changes to the file system and notify the application. */ ExternalChangeMonitor::ExternalChangeMonitor(Frontend *f, QObject *parent) : QObject(parent) { qDebug() << "ExternalChangeMonitor::Constructor --> Start"; fileSystemWatcher = NULL; frontend = f; qDebug() << "ExternalChangeMonitor::Constructor --> End"; } ExternalChangeMonitor::~ExternalChangeMonitor() { qDebug() << "ExternalChangeMonitor::Destructor --> Start"; // If the monitoring is running, stop it stopMonitoring(); directoryList.clear(); fileList.clear(); qDebug() << "ExternalChangeMonitor::Destructor --> End"; } void ExternalChangeMonitor::addDirectory(const QString &directory) { qDebug() << "ExternalChangeMonitor::addDirectory --> Start"; Q_ASSERT(!directory.isEmpty()); // Is the directory always in the list? Q_ASSERT(!directoryList.contains(directory)); // Stop monitoring stopMonitoring(); qDebug() << "ExternalChangeMonitor::addDirectory --> Registering directory for changelistening:" << directory; directoryList.append(directory); // Start monitoring with new directory startMonitoring(); qDebug() << "ExternalChangeMonitor::addDirectory --> End"; } void ExternalChangeMonitor::removeDirectory(const QString &directory) { qDebug() << "ExternalChangeMonitor::removeDirectory --> Start"; Q_ASSERT(!directory.isEmpty()); Q_ASSERT(!directoryList.isEmpty()); // Is the directory in the list? Q_ASSERT(directoryList.contains(directory)); // Stop monitoring stopMonitoring(); qDebug() << "ExternalChangeMonitor::removeDirectory --> Removing directory:" << directory; Q_ASSERT(directoryList.removeOne(directory)); // Start monitoring without the directory startMonitoring(); qDebug() << "ExternalChangeMonitor::removeDirectory --> End"; } void ExternalChangeMonitor::removeAllDirectories() { qDebug() << "ExternalChangeMonitor::removeAllDirectories --> Start"; Q_ASSERT(!directoryList.isEmpty()); // Stop monitoring stopMonitoring(); // Remove all directories from the list directoryList.clear(); // Start monitoring without the directories startMonitoring(); qDebug() << "ExternalChangeMonitor::removeAllDirectories --> End"; } void ExternalChangeMonitor::addFile(const QString &file) { qDebug() << "ExternalChangeMonitor::addFile --> Start"; Q_ASSERT(!file.isEmpty()); if (fileList.contains(file)) { // The file is always in the list! qDebug() << "ExternalChangeMonitor::addFile --> End (File exist)"; return; } // Stop monitoring stopMonitoring(); qDebug() << "ExternalChangeMonitor::addFile --> Registering file for changelistening:" << file; fileList.append(file); // Start monitoring with new file startMonitoring(); qDebug() << "ExternalChangeMonitor::addFile --> End"; } void ExternalChangeMonitor::removeFile(const QString &file) { qDebug() << "ExternalChangeMonitor::removeFile --> Start"; Q_ASSERT(!file.isEmpty()); Q_ASSERT(!fileList.isEmpty()); // Is the file in the list? Q_ASSERT(fileList.contains(file)); // Stop monitoring stopMonitoring(); qDebug() << "ExternalChangeMonitor::removeFile --> Removing file:" << file; Q_ASSERT(fileList.removeOne(file)); // Start monitoring without the file startMonitoring(); qDebug() << "ExternalChangeMonitor::removeFile --> End"; } void ExternalChangeMonitor::removeAllFiles() { qDebug() << "ExternalChangeMonitor::removeAllFiles --> Start"; Q_ASSERT(!fileList.isEmpty()); // Stop monitoring stopMonitoring(); // Remove all files from the file list fileList.clear(); // Start monitoring without the file startMonitoring(); qDebug() << "ExternalChangeMonitor::removeAllFiles --> End"; } void ExternalChangeMonitor::startMonitoring() { qDebug() << "ExternalChangeMonitor::startMonitoring --> Start"; Q_ASSERT(NULL == fileSystemWatcher); if ((0 == directoryList.length()) && (0 == fileList.length())) { // Nothing to monitor qDebug() << "ExternalChangeMonitor::startMonitoring --> End (Nothing)"; return; } fileSystemWatcher = new QFileSystemWatcher; connect(fileSystemWatcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChangedEvents(const QString &))); connect(fileSystemWatcher, SIGNAL(fileChanged(const QString &)), this, SLOT(fileChangedEvents(const QString &))); foreach(QString directory, directoryList) { QString osDirectory(Util::convertPathToOsSpecific(directory)); fileSystemWatcher->addPath(osDirectory); } foreach(QString file, fileList) { QString osFile(Util::convertPathToOsSpecific(file)); fileSystemWatcher->addPath(osFile); } qDebug() << "ExternalChangeMonitor::startMonitoring --> End"; } void ExternalChangeMonitor::stopMonitoring() { qDebug() << "ExternalChangeMonitor::stopMonitoring --> Start"; if (NULL == fileSystemWatcher) { qDebug() << "ExternalChangeMonitor::stopMonitoring --> End (Nothing)"; // Nothing to do return; } delete fileSystemWatcher; fileSystemWatcher = NULL; qDebug() << "ExternalChangeMonitor::stopMonitoring --> End"; } void ExternalChangeMonitor::directoryChangedEvents(const QString &dir) { qDebug() << "ExternalChangeMonitor::directoryChangedEvents --> Start [" << dir << "]"; frontend->showInformation("Not implemented", "ExternalChangeMonitor::directoryChangedEvents."); qDebug() << "ExternalChangeMonitor::directoryChangedEvents --> End"; } void ExternalChangeMonitor::fileChangedEvents(const QString &file) { qDebug() << "ExternalChangeMonitor::fileChangedEvents --> Start [" << file << "]"; int modSceneIndex; int modTakeIndex; int modExposureIndex; if (!frontend->getProject()->getModifyedExposure(Util::convertPathFromOsSpecific(file), modSceneIndex, modTakeIndex, modExposureIndex)) { // Exposure not found! qDebug() << "ExternalChangeMonitor::fileChangedEvents --> End (Error)"; return; } frontend->getView()->notifyModifyExposure(modSceneIndex, modTakeIndex, modExposureIndex); qDebug() << "ExternalChangeMonitor::fileChangedEvents --> End"; } qstopmotion-2.3.2-Source/src/technical/util.h000644 000000 000000 00000004767 12536560630 021221 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UTIL_H #define UTIL_H #include class Util { public: /** * Check the existence of the command on the OS. * @param command The command to search for. * @return The path to the command with Qt specific separators or an empty string. */ static const QString checkCommand(const QString &command); /** * Converts Qt specific separators to the OS specific separator. * @param path The Qt specific path string. * @return The OS specific path string. */ static const QString convertPathToOsSpecific(const QString &path); /** * Converts separators from the OS specific separator to Qt specific separator. * @param path The OS specific path string. * @return The Qt specific path string. */ static const QString convertPathFromOsSpecific(const QString &path); }; #endif qstopmotion-2.3.2-Source/src/technical/preferenceselement.cpp000644 000000 000000 00000011644 12654352322 024440 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "preferenceselement.h" #include #include #include #include #include "technical/grabber/imagegrabber.h" #include "technical/videoencoder/videoencoder.h" PreferencesElement::PreferencesElement(const QString &n, QDomElement &d) { elementName.clear(); elementName.append(n); elementDom = d; } PreferencesElement::~PreferencesElement() { } const QString PreferencesElement::getName() { return elementName; } bool PreferencesElement::setStringPreference(const QString &key, const QString &attribute) { QDomElement element = findPreferencesNode(key); if (element.isNull()) { element = createElement(key); elementDom.appendChild(element); } else { // Remove all existing text nodes QDomNode node = element.firstChild(); while (!node.isNull()) { if (node.isText()) element.removeChild(node); node = node.nextSibling(); } } QDomText newText = createTextNode(attribute); element.appendChild(newText); return true; } bool PreferencesElement::getStringPreference(const QString &key, QString &value) { QDomElement node = findPreferencesNode(key); if (!node.isNull()) { value.clear(); value.append(node.text()); return true; } return false; } bool PreferencesElement::setIntegerPreference(const QString &key, const int attribute) { QDomElement element = findPreferencesNode(key); if (element.isNull()) { element = createElement(key); elementDom.appendChild(element); } else { // Remove all existing text nodes QDomNode node = element.firstChild(); while (!node.isNull()) { if (node.isText()) element.removeChild(node); node = node.nextSibling(); } } QDomText newText = createTextNode(QString("%1").arg(attribute)); element.appendChild(newText); return true; } bool PreferencesElement::getIntegerPreference(const QString &key, int &value) { QDomElement node = findPreferencesNode(key); if (!node.isNull()) { QString tmp = node.text(); value = tmp.toInt(); return true; } return false; } void PreferencesElement::removePreference(const QString &key) { QDomElement keyNode = findPreferencesNode(key); if (!keyNode.isNull()) { QDomElement parent = keyNode.parentNode().toElement(); parent.removeChild(keyNode); } } QDomElement PreferencesElement::findPreferencesNode(const QString &key) { //Search through the preferences for the element with a key which //equals the key parameter. QDomElement element = elementDom.firstChildElement(); while (!element.isNull()) { QString elementName = element.nodeName(); if (elementName.compare(key) == 0) break; element = element.nextSiblingElement(); } return element; } QDomElement PreferencesElement::createElement(const QString &key) { QDomNode parent = elementDom.parentNode(); while (!parent.isDocument()) { parent = parent.parentNode(); } return parent.toDocument().createElement(key); } QDomText PreferencesElement::createTextNode(const QString &attribute) { QDomNode parent = elementDom.parentNode(); while (!parent.isDocument()) { parent = parent.parentNode(); } return parent.toDocument().createTextNode(attribute); } qstopmotion-2.3.2-Source/src/technical/util.cpp000644 000000 000000 00000010376 12654352322 021543 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "technical/util.h" #include #include const QString Util::checkCommand(const QString &command) { Q_ASSERT(!command.isEmpty()); #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version QString tmp(QString("%1%2") .arg(QLatin1String("where ")) .arg(command)); #else // Linux and Apple OS X version QString tmp(QString("%1%2") .arg(QLatin1String("which ")) .arg(command)); #endif QProcess which; which.start(tmp); if (!which.waitForStarted()) return QString(); if (!which.waitForFinished()) return QString(); QString line(which.readAll()); if (!line.isEmpty()) { if (line.endsWith("\n")) { #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version (remove CR and LF) return Util::convertPathFromOsSpecific(line.left(line.length()-2)); #else // Linux and Apple OS X version (remove LF) return Util::convertPathFromOsSpecific(line.left(line.length()-1)); #endif } return Util::convertPathFromOsSpecific(line); } return QString(); } const QString Util::convertPathToOsSpecific(const QString &path) { #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version QString newPath(""); QStringList sections = path.split('/'); int sectionsSize = sections.length(); for (int index = 0 ; index < sectionsSize ; index++) { newPath.append(sections.at(index)); if (index < (sectionsSize -1)) { newPath.append("\\"); } } QString newPath2(""); for (int index = 0 ; index < newPath.length() ; index++) { QChar unicodeChar = newPath[index]; int intChar = unicodeChar.unicode(); if (intChar >= 128) { newPath2.append(QString("&#%1;").arg(intChar)); } else { newPath2.append(unicodeChar); } } return newPath; #else // Linux and Apple OS X version // do nothing return path; #endif } const QString Util::convertPathFromOsSpecific(const QString &path) { #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version QString newPath(""); QStringList sections = path.split('\\'); int sectionsSize = sections.length(); for (int index = 0 ; index < sectionsSize ; index++) { newPath.append(sections.at(index)); if (index < (sectionsSize -1)) { newPath.append("/"); } } return newPath; #else // Linux and Apple OS X version // do nothing return path; #endif } qstopmotion-2.3.2-Source/src/technical/preferencestool.cpp000644 000000 000000 00000041277 13011063365 023763 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "preferencestool.h" #include #include #include #include #include #include #include "technical/grabber/imagegrabber.h" #include "technical/videoencoder/videoencoder.h" const QString PreferencesTool::applicationShowName = QLatin1String("qStopMotion"); const QString PreferencesTool::applicationName = QLatin1String("qstopmotion"); const QString PreferencesTool::applicationVersion = QLatin1String("2.3.2"); const QString PreferencesTool::applicationYear = QLatin1String("2016"); const QString PreferencesTool::preferencesVersion = QLatin1String("0.9"); const QString PreferencesTool::preferencesSuffix = QLatin1String("qsmp"); const QString PreferencesTool::preferencesName = QLatin1String("preferences"); const QString PreferencesTool::projectSuffix = QLatin1String("qsmd"); const QString PreferencesTool::archiveSuffix = QLatin1String("qsma"); const QString PreferencesTool::backupSuffix = QLatin1String("old"); const QString PreferencesTool::imageDirectory = QLatin1String("images"); const QString PreferencesTool::soundDirectory = QLatin1String("sounds"); const QString PreferencesTool::tempDirectory = QLatin1String("tmp"); const QString PreferencesTool::applicationDirectory = QLatin1String(".qstopmotion"); const QString PreferencesTool::manualDirectory = QLatin1String("manual"); const QString PreferencesTool::translationsDirectory = QLatin1String("translations"); const QString PreferencesTool::graphicsDirectory = QLatin1String("graphics"); const QString PreferencesTool::iconsDirectory = QLatin1String("icons"); const QString PreferencesTool::picturesDirectory = QLatin1String("pictures"); const QString PreferencesTool::historyFileName = QLatin1String(".history"); const QString PreferencesTool::jpegSuffix = QLatin1String("jpg"); const QString PreferencesTool::tiffSuffix = QLatin1String("tif"); const QString PreferencesTool::bmpSuffix = QLatin1String("bmp"); PreferencesTool::PreferencesTool(Frontend *f) { frontend = f; //Create the xml tree QDomImplementation domImpl; QDomDocumentType dtd = domImpl.createDocumentType("smil", "-//W3C//DTD SMIL 2.0//EN", "http://www.w3.org/2001/SMIL20/SMIL20.dtd"); doc = new QDomDocument(dtd); } PreferencesTool::~PreferencesTool() { PreferencesElement *element; cleanTree(); if (doc != NULL) { delete(doc); doc = NULL; } for (int elementIndex = 0 ; elementIndex < elements.count() ; elementIndex++) { element = elements[elementIndex]; delete(element); elements[elementIndex] = NULL; } } bool PreferencesTool::setPreferencesFile(const QString &filePath, const QString &newVersion) { qDebug() << "PreferencesTool::setPreferencesFile --> Start"; QDomElement element; PreferencesElement *prefElement; QString currentVersion; QString errorStr; int errorLine; int errorColumn; //Deepcopies the path preferencesFile.clear(); preferencesFile.append(filePath); QFile file(filePath); if (!file.exists()) { goto FileCorrupt; } cleanTree(); //Parse the xml file as an xml tree if (!file.open(QIODevice::ReadOnly)) frontend->showWarning(tr("DOM Parser"), QString(tr("Couldn't open XML file:\n%1")).arg(filePath)); if (!doc->setContent(&file, true, &errorStr, &errorLine, &errorColumn)) { file.close(); frontend->showWarning(tr("DOM Parser"), QString(tr("Parse error at line %1, column %2:\n%3\n%4")) .arg(errorLine) .arg(errorColumn) .arg(errorStr) .arg(filePath)); } file.close(); rootElement = doc->documentElement(); element = rootElement.firstChildElement(); while (!element.isNull()) { if (element.nodeName().compare("version") == 0) { versionElement = element; element = element.nextSiblingElement(); continue; } if (element.nodeName().compare("projects") == 0) { projectsElement = element; element = element.nextSiblingElement(); continue; } // No special element, add to preferences element vector prefElement = new PreferencesElement(element.nodeName(), element); elements.append(prefElement); element = element.nextSiblingElement(); } if (versionElement.isNull()) { qWarning() << "PreferencesTool::setPreferencesFile --> Error while parsing preferences file"; goto FileCorrupt; } else { currentVersion = versionElement.text(); } //There are no version in the file if (currentVersion.isNull()) { goto FileCorrupt; } if (currentVersion.compare(newVersion) != 0) { //The version in the file is wrong version.clear(); version.append(currentVersion); goto FileCorrupt; } if (findPreferencesElement("preferences") == NULL) { qWarning() << "PreferencesTool::setPreferencesFile --> Error while parsing preferences file"; goto FileCorrupt; } return true; FileCorrupt: cleanTree(); // If there are no file, no version or if the version is wrong a new preferences // file are made. QDomNode xmlNode = doc->createProcessingInstruction("xml", "version=\"1.0\" encoding=\"ISO-8859-1\""); doc->insertBefore(xmlNode, doc->firstChild()); rootElement = doc->createElement("root"); // rootElement.setAttribute("xmlns", "http://www.w3.org/2001/SMIL20/Language"); rootElement.setAttribute("xml:lang", "en"); rootElement.setAttribute("title", "preferences"); doc->appendChild(rootElement); versionElement = doc->createElement("version"); rootElement.appendChild(versionElement); // versionElement.setAttribute("version", version); QDomText versionText = doc->createTextNode(version); versionElement.appendChild(versionText); // preferencesElement = doc->createElement("preferences"); // rootElement.appendChild(preferencesElement); projectsElement = doc->createElement("projects"); rootElement.appendChild(projectsElement); flushPreferences(); qDebug() << "PreferencesTool::setPreferencesFile --> End"; return false; } void PreferencesTool::setVersion(const QString &version) { checkInitialized(); QDomText versionText = doc->createTextNode(version); versionElement.appendChild(versionText); flushPreferences(); } const QString PreferencesTool::getVersion() { return version; } bool PreferencesTool::setStringPreference(const QString &name, const QString &key, const QString &attribute, bool flushLater) { checkInitialized(); PreferencesElement *element = findPreferencesElement(name); if (element == NULL) { QDomElement elementDom = doc->createElement(name); rootElement.appendChild(elementDom); element = new PreferencesElement(name, elementDom); elements.append(element); } else { element->setStringPreference(key, attribute); } if (!flushLater) { flushPreferences(); } return true; } bool PreferencesTool::getStringPreference(const QString &name, const QString &key, QString &value) { checkInitialized(); PreferencesElement *element = findPreferencesElement(name); if (element != NULL) { return element->getStringPreference(key, value); } return false; } bool PreferencesTool::setIntegerPreference(const QString &name, const QString &key, const int attribute, bool flushLater) { checkInitialized(); PreferencesElement *element = findPreferencesElement(name); if (element == NULL) { QDomElement elementDom = doc->createElement(name); rootElement.appendChild(elementDom); element = new PreferencesElement(name, elementDom); elements.append(element); } else { element->setIntegerPreference(key, attribute); } if (!flushLater) { flushPreferences(); } return true; } bool PreferencesTool::getIntegerPreference(const QString &name, const QString &key, int &value) { checkInitialized(); PreferencesElement *element = findPreferencesElement(name); if (element != NULL) { return element->getIntegerPreference(key, value); } return false; } void PreferencesTool::removePreference(const QString &name, const QString &key) { checkInitialized(); PreferencesElement *element = findPreferencesElement(name); if (element != NULL) { element->removePreference(key); flushPreferences(); } } PreferencesElement* PreferencesTool::findPreferencesElement(const QString &name) { // Search through the preference elements for the element with name which // equals the name parameter. PreferencesElement* element; for (int elementIndex = 0 ; elementIndex < elements.count() ; elementIndex++) { element = elements[elementIndex]; if (element->getName().compare(name) == 0) { return element; } } return NULL; } void PreferencesTool::setBasicPreferenceDefaults() { // General defaults setStringPreference("preferences", "language", "en"); setIntegerPreference("preferences", "capturebutton", captureButtonAfter); // Project defaults setIntegerPreference("preferences", "defaultrecordingmode", 0); setIntegerPreference("preferences", "defaultgrabbersource", 0); setIntegerPreference("preferences", "defaultmixmode", 0); setIntegerPreference("preferences", "defaultmixcount", 2); setIntegerPreference("preferences", "defaultplaybackcount", 5); // Image import defaults setIntegerPreference("preferences", "defaultimageformat", ImageGrabber::jpegFormat); setIntegerPreference("preferences", "defaultimagesize", ImageGrabber::defaultSize); setIntegerPreference("preferences", "defaulttransformation", true); setIntegerPreference("preferences", "defaultimageadjustment", ImageGrabber::centerDown); setIntegerPreference("preferences", "defaulliveviewfps", 20); // Video export defaults setIntegerPreference("preferences", "defaultencoderapplication", VideoEncoder::ffmpegApplication); setIntegerPreference("preferences", "defaultvideoformat", VideoEncoder::mp4Format); setIntegerPreference("preferences", "defaultvideosize", VideoEncoder::defaultSize); setIntegerPreference("preferences", "defaultvideofps", 12); setIntegerPreference("preferences", "defaultusedefaultoutputfile", false); // Grabber defaults setIntegerPreference("preferences", "v4l2grabber", true); setIntegerPreference("preferences", "v4l2controller", false); setIntegerPreference("preferences", "mediafoundationgrabber", true); setIntegerPreference("preferences", "mediafoundationcontroller", false); setIntegerPreference("preferences", "gphoto2grabber", false); setIntegerPreference("preferences", "gphoto2controller", false); } void PreferencesTool::addProject(const QString &filename) { QDomElement newProject; QDomElement newElement; QDomText newText; checkInitialized(); newProject = doc->createElement("project"); // newProject.setAttribute("id", id); newElement = doc->createElement("file"); newText = doc->createTextNode(filename); newElement.appendChild(newText); newProject.appendChild(newElement); // Insert the new project as first project in the list projectsElement.insertBefore(newProject, projectsElement.firstChild()); } const QString PreferencesTool::getProject(int index) { int runIndex = -1; checkInitialized(); QDomElement project = projectsElement.firstChildElement(); while (!project.isNull()) { QString nodeName = project.nodeName(); if (nodeName.compare(QLatin1String("project")) == 0) { runIndex++; if (runIndex != index) { project = project.nextSiblingElement(); continue; } QDomElement file = project.firstChildElement(); while (!file.isNull()) { QString fileName = file.nodeName(); if (fileName.compare(QLatin1String("file")) == 0) return(file.text()); file = file.nextSiblingElement(); } } project = project.nextSiblingElement(); } return(QString()); } bool PreferencesTool::removeProject(const QString &filename) { checkInitialized(); QDomElement project = projectsElement.firstChildElement(); while (!project.isNull()) { QString nodeName = project.nodeName(); if (nodeName.compare(QLatin1String("project")) == 0) { QDomElement file = project.firstChildElement(); while (!file.isNull()) { QString fileName = file.nodeName(); if (fileName.compare(QLatin1String("file")) == 0) { if (filename.compare(file.text()) == 0) { projectsElement.removeChild(project); return(true); } } file = file.nextSiblingElement(); } } project = project.nextSiblingElement(); } return(false); } void PreferencesTool::flushPreferences() { bool prefsFileExists = QFile::exists(preferencesFile); if (prefsFileExists == true) { QString oldPrefsFile(preferencesFile); oldPrefsFile.append(QLatin1String(".")); oldPrefsFile.append(PreferencesTool::backupSuffix); if (QFile::exists(oldPrefsFile)) { if (!QFile::remove(oldPrefsFile)) { frontend->showCritical(tr("Critical"), tr("Can't remove preferences backup file!")); } } if (!QFile::copy(preferencesFile, oldPrefsFile)) { // Not successful frontend->showCritical(tr("Critical"), tr("Can't copy preferences file to backup file!")); } } QFile file(preferencesFile); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); const int Ident = 4; doc->save(out, Ident); out.flush(); file.close(); } bool PreferencesTool::fileExists(const QString &filePath) { if (QFile::exists(filePath)) { return true; } return false; } void PreferencesTool::checkInitialized() { if (doc == NULL) { qWarning() << "PreferencesTool::setPreferencesFile --> A preferencesfile has to be specified before using the PreferencesTool."; exit(1); } } void PreferencesTool::cleanTree() { PreferencesElement *element; if (doc != NULL) { // rootElement = NULL; // versionElement = NULL; // projectsElement = NULL; for (int elementIndex = 0 ; elementIndex < elements.count() ; elementIndex++) { element = elements[elementIndex]; delete(element); elements[elementIndex] = NULL; } elements.clear(); doc->clear(); } } qstopmotion-2.3.2-Source/src/technical/videoencoder/videoencoder.cpp000644 000000 000000 00000006107 12654352322 025677 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "videoencoder.h" #include #include #include "technical/util.h" VideoEncoder::VideoEncoder() { valid = -1; } VideoEncoder::~VideoEncoder() { encoderCommand.clear(); stopCommand.clear(); outputFile.clear(); } const QString VideoEncoder::getEncoderCommand() const { return encoderCommand; } void VideoEncoder::setEncoderCommand(const QString &command, bool v) { if (!encoderCommand.isEmpty()) { encoderCommand.clear(); } encoderCommand.append(command); if (v) { valid = 1; } } const QString VideoEncoder::getStopCommand() const { return stopCommand; } void VideoEncoder::setStopCommand(const QString &command) { if (!stopCommand.isEmpty()) { stopCommand.clear(); } stopCommand.append(command); } const QString VideoEncoder::getOutputFile() const { return outputFile; } void VideoEncoder::setOutputFile(const QString &file) { if (!outputFile.isEmpty()) { outputFile.clear(); } outputFile.append(file); } bool VideoEncoder::isValid() { if (valid == -1) { const QString path = Util::checkCommand(encoderCommand); if (path.isEmpty()) { valid = 0; } else { encoderCommand.clear(); encoderCommand.append(path); valid = 1; } } if (valid == 0) { return false; } return true; } qstopmotion-2.3.2-Source/src/technical/videoencoder/ffmpegencoder.cpp000644 000000 000000 00000015531 12654352322 026036 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "ffmpegencoder.h" #include #include #include "domain/animation/projectserializer.h" #include "frontends/frontend.h" #include "technical/grabber/imagegrabber.h" /** * Prepare start command * * ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}... * * see: http://www.ffmpeg.org/ffmpeg-doc.html */ FfmpegEncoder::FfmpegEncoder(AnimationProject *ap) { animationProject = ap; QString encoderCommand; QString stopCommand; #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version Frontend *frontend = animationProject->getFrontend(); encoderCommand.append(frontend->getApplicationDirName()); encoderCommand.append(QLatin1String("ffmpeg/bin/ffmpeg.exe")); if (QFile::exists(encoderCommand)) { // Set start command setEncoderCommand(encoderCommand, true); } else { // The ffmpeg encoder is not a part of the qStopMotion installation // Search in the windows installation encoderCommand.clear(); encoderCommand.append(QLatin1String("ffmpeg")); // Set start command setEncoderCommand(encoderCommand, false); } // Prepare stop command stopCommand.append(""); // Set stop command setStopCommand(stopCommand); #else // Linux and Apple OS X version encoderCommand.append(QLatin1String("ffmpeg")); // Prepare stop command stopCommand.append(""); // Set start and stop command setEncoderCommand(encoderCommand, false); setStopCommand(stopCommand); #endif } FfmpegEncoder::~FfmpegEncoder() { } const QStringList FfmpegEncoder::getEncoderArguments() const { QStringList arguments; QString imagePath = animationProject->getNewImagePath(); QString imageFiles = QString(""); QString outputFile = QString(""); // =============================== // Input options // =============================== // Input frame rate (default = 25) arguments << QLatin1String("-r"); arguments << QString("%1").arg(animationProject->getVideoFps()); // =============================== // Input files // =============================== // Input file name if (!imagePath.isEmpty()) { arguments << QLatin1String("-i"); // imageFiles.append(QLatin1String("\"")); imageFiles.append(imagePath); imageFiles.append(QLatin1String("/")); imageFiles.append(QLatin1String("%6d.")); switch (animationProject->getImageFormat()) { case ImageGrabber::jpegFormat: imageFiles.append(PreferencesTool::jpegSuffix); break; case ImageGrabber::tiffFormat: imageFiles.append(PreferencesTool::tiffSuffix); break; case ImageGrabber::bmpFormat: imageFiles.append(PreferencesTool::bmpSuffix); break; } // imageFiles.append(QLatin1String("\"")); arguments << imageFiles; } else { // Error, empty image path return QStringList(); } // =============================== // Output options // =============================== // Use target option // arguments << QLatin1String("-target")); // // vcd.mpg // arguments << QLatin1String("vcd")); // pal-vcd // arguments << QLatin1String("pal-vcd")); // Use individual format options //Output frame rate (default = 25) arguments << QLatin1String("-r"); arguments << QLatin1String("25"); // Video size (default = Input size) arguments << QLatin1String("-s"); switch(animationProject->getVideoSize()) { case VideoEncoder::qvgaSize: arguments << QLatin1String("qvga"); break; case VideoEncoder::vgaSize: arguments << QLatin1String("vga"); break; case VideoEncoder::svgaSize: arguments << QLatin1String("svga"); break; case VideoEncoder::paldSize: arguments << QLatin1String("4cif"); break; case VideoEncoder::hdreadySize: arguments << QLatin1String("hd720"); break; case VideoEncoder::fullhdSize: arguments << QLatin1String("hd1080"); break; default: // Default value is VGA output arguments << QLatin1String("vga"); break; } // Video format arguments << QLatin1String("-f"); switch(animationProject->getVideoFormat()) { case VideoEncoder::aviFormat: arguments << QLatin1String("avi"); break; case VideoEncoder::mp4Format: arguments << QLatin1String("mp4"); break; default: // Default value is AVI output arguments << QLatin1String("avi"); break; } // Video quality // 1 = excellent quality, 31 worst quality arguments << QLatin1String("-qscale:v"); arguments << QLatin1String("1"); // Bit rate in bit/s (default = 200kb/s) arguments << QLatin1String("-b:v"); arguments << QLatin1String("1000k"); // =============================== // Output file // =============================== // outputFile.append(QLatin1String("\"")); outputFile.append(this->getOutputFile()); // outputFile.append(QLatin1String("\"")); arguments << outputFile; return arguments; } qstopmotion-2.3.2-Source/src/technical/videoencoder/ffmpegencoder.h000644 000000 000000 00000005140 12654352322 025476 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef FFMPEGENCODER_H #define FFMPEGENCODER_H #include #include "domain/animation/animationproject.h" #include "technical/videoencoder/videoencoder.h" class AnimationProject; /** * Class for gathering information needed to export a qstopmotion project to * a video file. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class FfmpegEncoder : public VideoEncoder { public: /** * Constructor */ FfmpegEncoder(AnimationProject *ap); /** * Destructor */ ~FfmpegEncoder(); /** * Gets the encoder command registered by the user in the preferences menu. * This is the command which should be used to start the encoder. * @return the command */ const QString getCommand(); /** * Gets the arguments for the encoder. * @return the encoder argument list */ const QStringList getEncoderArguments() const; private: AnimationProject *animationProject; }; #endif qstopmotion-2.3.2-Source/src/technical/videoencoder/videoencoderfactory.h000644 000000 000000 00000005132 12536560630 026733 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef VIDEOENCODERFACTORY_H #define VIDEOENCODERFACTORY_H #include "frontends/frontend.h" #include "technical/videoencoder/videoencoder.h" /** * Class for exporting a qstopmotion project containing images and sounds to * to a video file. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class VideoEncoderFactory { public: /** * Registers a serializer that will be used to gather information about * image paths etc. * @param f the frontend to display information to */ VideoEncoderFactory(Frontend *f); /** * Destructor */ ~VideoEncoderFactory(); /** * Creates the video file based on the passed encoder. The encoder holds * information needed to complete the export. * @param encoder the encoder to be used for video export * @return path to the created video file */ const QString createVideoFile(VideoEncoder *encoder); private: Frontend *frontend; }; #endif qstopmotion-2.3.2-Source/src/technical/videoencoder/libavencoder.cpp000644 000000 000000 00000015261 12654352322 025667 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "libavencoder.h" #include #include #include "domain/animation/projectserializer.h" #include "frontends/frontend.h" #include "technical/grabber/imagegrabber.h" /** * Prepare start command * * ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}... * * see: http://www.ffmpeg.org/ffmpeg-doc.html */ LibavEncoder::LibavEncoder(AnimationProject *ap) { animationProject = ap; QString encoderCommand; QString stopCommand; #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version Frontend *frontend = animationProject->getFrontend(); encoderCommand.append(frontend->getApplicationDirName()); encoderCommand.append(QLatin1String("libav/bin/avconv.exe")); if (QFile::exists(encoderCommand)) { // Set start command setEncoderCommand(encoderCommand, true); } else { // The linav encoder is not a part of the qStopMotion installation // Search in the windows installation encoderCommand.clear(); encoderCommand.append(QLatin1String("avconv")); // Set start command setEncoderCommand(encoderCommand, false); } // Prepare stop command stopCommand.append(""); // Set stop command setStopCommand(stopCommand); #else // Linux and Apple OS X version encoderCommand.append(QLatin1String("avconv")); // Prepare stop command stopCommand.append(""); // Set start and stop command setEncoderCommand(encoderCommand, false); setStopCommand(stopCommand); #endif } LibavEncoder::~LibavEncoder() { } const QStringList LibavEncoder::getEncoderArguments() const { QStringList arguments; QString imagePath = animationProject->getNewImagePath(); QString imageFiles = QString(""); QString outputFile = QString(""); // =============================== // Input options // =============================== // Input frame rate (default = 25) arguments << QLatin1String("-r"); arguments << QString("%1").arg(animationProject->getVideoFps()); // =============================== // Input files // =============================== // Input file name if (!imagePath.isEmpty()) { arguments << QLatin1String("-i"); // imageFiles.append(QLatin1String("\"")); imageFiles.append(imagePath); imageFiles.append(QLatin1String("/")); imageFiles.append(QLatin1String("%6d.")); switch (animationProject->getImageFormat()) { case ImageGrabber::jpegFormat: imageFiles.append(PreferencesTool::jpegSuffix); break; case ImageGrabber::tiffFormat: imageFiles.append(PreferencesTool::tiffSuffix); break; case ImageGrabber::bmpFormat: imageFiles.append(PreferencesTool::bmpSuffix); break; } // imageFiles.append(QLatin1String("\"")); arguments << imageFiles; } else { // Error, empty image path return QStringList(); } // =============================== // Output options // =============================== // Use target option // arguments << QLatin1String("-target")); // // vcd.mpg // arguments << QLatin1String("vcd")); // pal-vcd // arguments << QLatin1String("pal-vcd")); // Use individual format options //Output frame rate (default = 25) arguments << QLatin1String("-r"); arguments << QLatin1String("25"); // Video size (default = Input size) arguments << QLatin1String("-s"); switch(animationProject->getVideoSize()) { case VideoEncoder::qvgaSize: arguments << QLatin1String("qvga"); break; case VideoEncoder::vgaSize: arguments << QLatin1String("vga"); break; case VideoEncoder::svgaSize: arguments << QLatin1String("svga"); break; case VideoEncoder::paldSize: arguments << QLatin1String("4cif"); break; case VideoEncoder::hdreadySize: arguments << QLatin1String("hd720"); break; case VideoEncoder::fullhdSize: arguments << QLatin1String("hd1080"); break; default: // Default value is VGA output arguments << QLatin1String("vga"); break; } // Video format arguments << QLatin1String("-f"); switch(animationProject->getVideoFormat()) { case VideoEncoder::aviFormat: arguments << QLatin1String("avi"); break; case VideoEncoder::mp4Format: arguments << QLatin1String("mp4"); break; default: // Default value is AVI output arguments << QLatin1String("avi"); break; } // Video quality // 1 = excellent quality, 31 worst quality arguments << QLatin1String("-qscale:v"); arguments << QLatin1String("1"); // Bit rate in bit/s (default = 200kb/s) arguments << QLatin1String("-b:v"); arguments << QLatin1String("1000k"); // =============================== // Output file // =============================== // outputFile.append(QLatin1String("\"")); outputFile.append(this->getOutputFile()); // outputFile.append(QLatin1String("\"")); arguments << outputFile; return arguments; } qstopmotion-2.3.2-Source/src/technical/videoencoder/videoencoderfactory.cpp000644 000000 000000 00000005061 12654352322 027265 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "videoencoderfactory.h" #include #include VideoEncoderFactory::VideoEncoderFactory(Frontend *f) { frontend = f; } VideoEncoderFactory::~VideoEncoderFactory() { frontend = NULL; } const QString VideoEncoderFactory::createVideoFile(VideoEncoder *encoder) { qDebug() << "VideoEncoderFactory::createVideoFile --> Start"; QString command = encoder->getEncoderCommand(); QStringList arguments = encoder->getEncoderArguments(); qDebug() << "VideoEncoderFactory::createVideoFile --> Command:"; qDebug() << command << arguments; if (!command.isEmpty()) { if (frontend->runExternalCommand(command, arguments) == 0) { qDebug() << "VideoEncoderFactory::createVideoFile --> End (Done)"; return encoder->getOutputFile(); } } qDebug() << "VideoEncoderFactory::createVideoFile --> End (Nothing)"; return QString(); } qstopmotion-2.3.2-Source/src/technical/videoencoder/videoencoder.h000644 000000 000000 00000010746 12654352322 025350 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef VIDEOENCODER_H #define VIDEOENCODER_H #include #include /** * Class for gathering information needed to export a qstopmotion project to * a video file. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class VideoEncoder { public: /** * Enum with all possible encoder applications. */ enum encoderApplication { ffmpegApplication, libavApplication, noneApplication }; /** * Enum with all possible video output formats */ enum videoFormat { aviFormat, // AVI format mp4Format, // MP4 format noneFormat }; /** * Enum with all possible video sizes */ enum videoSize { defaultSize, // Source size qvgaSize, // 320x240 (QVGA) vgaSize, // 640x480 (VGA) svgaSize, // 800x600 (SVGA) paldSize, // 704x576 (PAL D) hdreadySize, // 1280x720 (HD Ready) fullhdSize // 1900x1080 (Full HD) }; /** * Destrictor */ ~VideoEncoder(); /** * Gets the encoder command registered by the user in the preferences menu. * This is the command which should be used to start the encoder. * @return the command */ const QString getEncoderCommand() const; /** * Gets the arguments for the encoder. * @return the encoder argument list */ virtual const QStringList getEncoderArguments() const = 0; /** * Gets the command line registerd by the user in the preferences menu. * This is the command which should be used to stop the encoder. * @return the stop command */ const QString getStopCommand() const; /** * Gets the output file generated by the encoder. * @return the output file */ const QString getOutputFile() const; /** * Sets the file which should be genereated by the encoder. */ void setOutputFile(const QString &file); /** * Checks if the registered encoder is a valid one. Checks if the encoder can * be excuted, the output file is a valid file etc. * @return true if valid, false otherwise */ bool isValid(); protected: /** * Constructor */ VideoEncoder(); /** * Sets the encoder command to be used. * @param command the encode command. * @param v Is the command valid. */ void setEncoderCommand(const QString &command, bool v); /** * Sets the stop command to be used for stopping the encoder. * @param command the stop command to be used in case the user want to * cancel the export */ void setStopCommand(const QString &command); protected: QString encoderCommand; QString stopCommand; QString outputFile; int valid; }; #endif qstopmotion-2.3.2-Source/src/technical/videoencoder/libavencoder.h000644 000000 000000 00000004673 12654352322 025341 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef LIBAVENCODER_H #define LIBAVENCODER_H #include #include "domain/animation/animationproject.h" #include "technical/videoencoder/videoencoder.h" class AnimationProject; /** * Class for gathering information needed to export a qstopmotion project to * a video file. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class LibavEncoder : public VideoEncoder { public: /** * Constructor */ LibavEncoder(AnimationProject *ap); /** * Destructor */ ~LibavEncoder(); /** * Gets the encoder command registered by the user in the preferences menu. * This is the command which should be used to start the encoder. * @return the command */ const QString getCommand(); /** * Gets the arguments for the encoder. * @return the encoder argument list */ const QStringList getEncoderArguments() const; private: AnimationProject *animationProject; }; #endif qstopmotion-2.3.2-Source/src/technical/audio/audiodriver.h000644 000000 000000 00000005554 12536560627 023663 0ustar00rootroot000000 000000 /*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef AUDIODRIVER_H #define AUDIODRIVER_H #include "audioformat.h" /** * Interface to be used by the implemented sound drivers. They * will be responsible for initializing of the sound device and flushing * PCM data to this device. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class AudioDriver { public: virtual ~AudioDriver() {}; /** * Abstract function for playing PCM data. The registered audio format * takes care of decoding to raw PCM. This function will not free the * CPU until the playing is finished. Use the playInThread function if * you want to play the sound in a separate thread. */ virtual void play() = 0; /** * Abstract function for playing PCM data. It works excactly like the play * function except that it plays in a separate thread. */ virtual void playInThread() = 0; /** * Abstract function for adding a audio file which later on can be played * with the play or playInThread functions. * @param audioFile the audio file to be played */ virtual void addAudioFile(AudioFormat *audioFile) = 0; /** * Abstract function for initializing the registered audio device. * @return true on success, false otherwise */ virtual bool initialize() = 0; /** * Abstract function for freeing the audio device so that other programs * can use it. */ virtual void shutdown() = 0; }; #endif qstopmotion-2.3.2-Source/src/technical/audio/audioformat.h000644 000000 000000 00000006024 12536560627 023651 0ustar00rootroot000000 000000 /*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef AUDIOFORMAT_H #define AUDIOFORMAT_H #include /** * Interface to be used by the implemented audio formats. They * will be responsible for decoding from their own format to raw PCM. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class AudioFormat { public: virtual ~AudioFormat() {}; /** * Abstract function for registering the given filename to be an audio * format file. This function checks that the file can be opened and that * it is a valid audio format file. * @param filename the filename to register * @return zero on success, less than zero on failure. * -1 = cannot open file for reading * -2 = not a valid audio format file */ virtual int setFilename(const QString filename) = 0; /** * Abstract function for opening the file registered with setFilename. * @return 0 on success, -1 on failure */ virtual int open() = 0; /** * Abstract function for closing the file registered with setFilename. * @return 0 on success, -1 on failure */ virtual int close() = 0; /** * Abstract function for filling the buffer with raw PCM data. It * fills the buffer with up to 'numBytes' bytes. * @param audioBuffer the buffer to be filled * @param numBytes number of bytes available in the buffer * @return number of bytes written to buffer */ virtual int fillBuffer(char *audioBuffer, int numBytes) = 0; /** * Abstract function for retrieving the sound path. * @return the sound path */ virtual QString getSoundPath() = 0; }; #endif qstopmotion-2.3.2-Source/src/technical/preferenceselement.h000644 000000 000000 00000010762 12654352322 024105 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef PREFERENCESELEMENT_H #define PREFERENCESELEMENT_H #include #include #include #include /** * Preferences element. * * @author Ralf Lange */ class PreferencesElement : public QObject { Q_OBJECT public: /** * Constructor * @param n Name of the element. * @param d DOM Element of the element. */ PreferencesElement(const QString &n, QDomElement &d); /** * Cleans up after the preferencestool. */ ~PreferencesElement(); /** * Get the name of the preferences element. * @return The name of the preferences element. */ const QString getName(); /** * Adds a string preference. * @param key The key for retrieving the preference. * @param attribute The attribute for the preference. * @return True if the preference was succesfully saved. If flushLater is * set to true this function will return true automaticaly. */ bool setStringPreference(const QString &key, const QString &attribute); /** * Retrieves a string preference. * @param key The key of the preference to retrieve. * @param value The value of the preference. * @return True if the preference was succesfully readed. */ bool getStringPreference(const QString &key, QString &value); /** * Adds an int preference. * @param key The key for retrieving the preference. * @param attribute The attribute for the preference. * @return True if the preference was succesfully saved. If flushLater is * set to true this function will return true automaticaly. */ bool setIntegerPreference(const QString &key, const int attribute); /** * Retrieves an int preference. * @param key The key of the preference to retrieve. * @param value The value of the preference. * @return True if the preference was succesfully readed. */ bool getIntegerPreference(const QString &key, int &value); /** * Removes the preference with the key "key". (Which, in practice, means * setting it to default). * @param key the key of the preference to remove. */ void removePreference(const QString &key); protected: private: /** * The name of the element. */ QString elementName; /** * The DOM element of the element */ QDomElement elementDom; /** * Retrieves the node with key "key". * @param key the key of the node to retrieve. * @return the node with the given key. */ QDomElement findPreferencesNode(const QString &key); /** * Create a element with key "key". * @param key the key of the element to create. * @return the new created element. */ QDomElement createElement(const QString &key); /** * Create a text node with attribute "attribute". * @param attribute the attribute of the text node to create. * @return the new created text node. */ QDomText createTextNode(const QString &attribute); }; #endif qstopmotion-2.3.2-Source/src/technical/externalchangemonitor.h000644 000000 000000 00000010360 12654352322 024624 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef EXTERNALCHANGEMONITOR_H #define EXTERNALCHANGEMONITOR_H #include #include #include #include #include "frontends/frontend.h" class QSocketNotifier; /** * Class for listening after changes to the disc representation of the * animationmodel. * * The class uses Inotify-tools to listen for changes * in the project directories. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ExternalChangeMonitor : public QObject { Q_OBJECT public: /** * Initializes the ExternalChangeMonitor and registers the animationModel * to notify of changes when the disk representation of the animation is * changed * @param frontend the GUI frontend * @param parent the parent of this QOject. */ ExternalChangeMonitor(Frontend *f, QObject *parent = 0); /** * Calls stopMonitoring and cleans up. */ ~ExternalChangeMonitor(); /** * Register the directory for monitoring. * @param directory the directory to listen for changes in. */ void addDirectory(const QString &directory); /** * Remove the directory from monitoring. * @param directory the directory to remove. */ void removeDirectory(const QString &directory); /** * Remove the directory from monitoring. * @param directory the directory to remove. */ void removeAllDirectories(); /** * Register the file for monitoring. * @param file the file to listen for changes in. */ void addFile(const QString &file); /** * Remove the file from monitoring. * @param file the file to remove. */ void removeFile(const QString &file); /** * Remove all files from monitoring. */ void removeAllFiles(); /** * Creates a inotify connection and listens for changes in the project directories. */ void startMonitoring(); /** * Stop the listening for changes in the project directories. */ void stopMonitoring(); private slots: /** * Callback function for when the QFileSystemWatcher send a directory changed event. * @param dir The changed directory. */ void directoryChangedEvents(const QString &dir); /** * Callback function for when the QFileSystemWatcher send a file changed event. * @param file The changed file. */ void fileChangedEvents(const QString &file); private: Frontend *frontend; QStringList directoryList; QStringList fileList; QFileSystemWatcher *fileSystemWatcher; }; #endif qstopmotion-2.3.2-Source/src/technical/preferencestool.h000644 000000 000000 00000025265 12751646113 023437 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef PREFERENCESTOOL_H #define PREFERENCESTOOL_H #include #include #include #include #include #include #include /** * A xml based tool for adding, changing and removing of * various preferences. Everything is saved to a xml organized file * and can be readed by the tool for later usage. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class PreferencesTool : public QObject { Q_OBJECT public: enum captureButtonFunction { captureButtonBevor, captureButtonAfter, captureButtonAppend }; /** * Showname of the application */ static const QString applicationShowName; /** * Name of the application */ static const QString applicationName; /** * Version of the application */ static const QString applicationVersion; /** * Year of the application version */ static const QString applicationYear; /** * Version of the preferences */ static const QString preferencesVersion; /** * Relative to project or application directory */ static const QString imageDirectory; /** * Relative to project or application directory */ static const QString soundDirectory; /** * Relative to application directory */ static const QString tempDirectory; /** * Relative to manual directory */ static const QString manualDirectory; /** * Relative to translations directory */ static const QString translationsDirectory; /** * Relative to graphics directory */ static const QString graphicsDirectory; /** * Relative to icons directory */ static const QString iconsDirectory; /** * Relative to pictures directory */ static const QString picturesDirectory; /** * Relative to home dirctory */ static const QString applicationDirectory; /** * Suffix of the property file */ static const QString preferencesSuffix; /** * Name of the property file */ static const QString preferencesName; /** * Suffix of the project file */ static const QString projectSuffix; /** * Suffix of the archive file */ static const QString archiveSuffix; /** * Suffix of the backup file */ static const QString backupSuffix; /** * Name of the history file */ static const QString historyFileName; /** * Suffix of the jpeg image file */ static const QString jpegSuffix; /** * Suffix of the tiff image file */ static const QString tiffSuffix; /** * Suffix of the bmp image file */ static const QString bmpSuffix; /** * Protected constructor to deny external instanciation of the singleton. */ PreferencesTool(Frontend *f); /** * Cleans up after the preferencestool. */ ~PreferencesTool(); /** * Sets the file to store preferences in. * @param filePath the path to the file where the preferences are * stored. * @param version the version of the program * @return true if file exists. false if the file doesn't exists * and the preferencesTool makes it. */ bool setPreferencesFile(const QString &filePath, const QString &version); /** * Sets the version of the preference file. * @param version the version number of the preference file */ void setVersion(const QString &version); /** * Returns the version number of the preference file or 0 if * there are no version tag. * @return the version number of the preference file or 0 if * there are no version tag. */ const QString getVersion(); /** * Flushes the preferences to the file specified with setPreferencesFile(..). */ void flushPreferences(); /** * Adds a string preference. * @param name The element name for the key for retrieving the preference. * @param key The key for retrieving the preference. * @param attribute The attribute for the preference. * @param flushLater True if you don't want the preferencesTool to flush * the preferences to disk at once. This is given for to allow * optimalization when several preferences ar saved at the same time. * flushPreferences() should be called at once after the preferences are * set to store them to disk. * @return True if the preference was succesfully saved. If flushLater is * set to true this function will return true automaticaly. */ bool setStringPreference(const QString &name, const QString &key, const QString &attribute, bool flushLater = false); /** * Retrieves a string preference. * @param name The element name for the key for retrieving the preference. * @param key The key of the preference to retrieve. * @param value The value of the preference. * @return true if the preference was succesfully readed. */ bool getStringPreference(const QString &name, const QString &key, QString &value); /** * Adds an int preference. * @param name The element name for the key for retrieving the preference. * @param key The key for retrieving the preference. * @param attribute The attribute for the preference. * @param flushLater True if you don't want the preferencesTool to flush * the preferences to disk at once. This is given for to allow * optimalization when several preferences ar saved at the same time. * flushPreferences() should be called at once after the preferences are * set to store them to disk. * @return True if the preference was succesfully saved. If flushLater is * set to true this function will return true automaticaly. */ bool setIntegerPreference(const QString &name, const QString &key, const int attribute, bool flushLater = false); /** * Retrieves an int preference. * @param name The element name for the key for retrieving the preference. * @param key The key of the preference to retrieve. * @param value The value of the preference. * @return true if the preference was succesfully readed. */ bool getIntegerPreference(const QString &name, const QString &key, int &value); /** * Set the default preferences */ void setBasicPreferenceDefaults(); /** * Add a new path on the first position of the path list * @param filename Absoluth file name of the project file */ void addProject(const QString &filename); /** * Get the file name of the project with the position index in the project list * @param index Position of the project in the project list (0....n) * @return Absolute file name of the project file or an empty string if a project with the index didn't exist */ const QString getProject(int index); /** * Delete a project from the project list * @param filename Absolut file name of the project file * @return true if successful, false otherwise */ bool removeProject(const QString &filename); protected: private: /** * The frontend of the application. */ Frontend *frontend; /** * The path to the preferences file. */ QString preferencesFile; /** * Version of the preferences. */ QString version; /** * The DOM document for the preferences file. */ QDomDocument *doc; /** * The root element of the DOM document. */ QDomElement rootElement; /** * The version element of the DOM document. */ QDomElement versionElement; /** * The project element of the DOM document. */ QDomElement projectsElement; /** * The vector for all other elements of the DOM document. */ QVector elements; /** * Removes the preference with the key "key". (Which, in practice, means * setting it to default). * @param name The element name for the key for retrieving the preference. * @param key the key of the preference to remove. */ void removePreference(const QString &name, const QString &key); /** * Retrieves the preferences element with name "name". * @param name The element name for the preferences element for retrieving. * @return the preferences element with the given name. */ PreferencesElement *findPreferencesElement(const QString &name); /** * Retrieves the project node with key "key". * @param key the key of the node to retrieve. * @return the node with the given key. */ QDomElement findProjectsNode(const QString &key); /** * Checks if the file at filePath exists. * @return true if the file exist. */ bool fileExists(const QString &filePath); /** * Checks if the preferencestool has been initialized and exits with an error * if it hasn't. */ void checkInitialized(); /** * Cleans the xml tree. */ void cleanTree(); }; #endif qstopmotion-2.3.2-Source/src/qstopmotion.ico000644 000000 000000 00000010276 12536560627 021227 0ustar00rootroot000000 000000   ( @ N S S S S S S S S S S S S S S S S S S S S   m m mv]~G mq]! mqi3 mqwG mq  mq) mq) mq) mq) mq) mq) mq) mq mq] mqq? mq`% mrԗxD m=  3 3   Cc 4 /q+ž}+pK; N xFy&ϻ˿e ^1Zθʼi i8z|}-++T b q` e0__ c1o.g] ^@?   >qstopmotion-2.3.2-Source/src/main.cpp000644 000000 000000 00000005071 12536560627 017564 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2012 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "frontends/qtfrontend/qtfrontend.h" int main(int argc, char **argv) { int ret = 0; bool hasRecovered = false; bool hasProjectArg = false; QtFrontend qtFrontend(argc, argv); ret = qtFrontend.checkApplicationDirectory(argv[0]); if (ret) { return ret; } qtFrontend.init(); qtFrontend.processEvents(); if (qtFrontend.isRecoveryMode()) { hasRecovered = qtFrontend.recoverProject(); if (hasRecovered == false) { qtFrontend.removeApplicationFiles(); } } else { qtFrontend.makeApplicationDirectories(); } if (hasRecovered == false) { hasProjectArg = qtFrontend.handleArguments(argc, argv); if (hasProjectArg == false) { qtFrontend.startDialog(); } } qtFrontend.setupDirectoryMonitoring(); ret = qtFrontend.run(argc, argv); qtFrontend.finalize(); return ret; } qstopmotion-2.3.2-Source/src/domain/undo/undotakeremove.cpp000644 000000 000000 00000007165 12654352322 024102 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undotakeremove.h" #include #include UndoTakeRemove::UndoTakeRemove(DomainFacade *df, int si, int ti) :UndoBase(df) { sceneIndex = si; takeIndex = ti; removedTake = NULL; undoFlag = false; setText(QString(tr("Remove take (%1,%2)")) .arg(sceneIndex).arg(takeIndex)); } UndoTakeRemove::~UndoTakeRemove() { if (NULL != removedTake) { delete removedTake; removedTake = NULL; } } void UndoTakeRemove::undo() { qDebug() << "UndoTakeRemove::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); if (takeIndex >= animationProject->getSceneTakeSize(sceneIndex)) { animationProject->addTake(sceneIndex, removedTake); facade->getView()->notifyAddTake(sceneIndex, takeIndex); } else { animationProject->insertTake(sceneIndex, takeIndex, removedTake); facade->getView()->notifyInsertTake(sceneIndex, takeIndex); } removedTake = NULL; animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); undoFlag = true; qDebug() << "UndoTakeRemove::undo --> End"; } void UndoTakeRemove::redo() { qDebug() << "UndoTakeRemove::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); removedTake = animationProject->removeTake(sceneIndex, takeIndex); animationProject->incAnimationChanges(); facade->getView()->notifyRemoveTake(sceneIndex, takeIndex); if (undoFlag) { facade->writeHistoryEntry(QLatin1String("redo")); undoFlag = false; } else { facade->writeHistoryEntry(QString("%1|%2|%3") .arg(QLatin1String("redoTakeRemove")) .arg(sceneIndex) .arg(takeIndex)); } qDebug() << "UndoTakeRemove::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoexposureinsert.cpp000644 000000 000000 00000010247 12654352322 025032 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undoexposureinsert.h" #include #include #include #include "domain/animation/exposure.h" UndoExposureInsert::UndoExposureInsert(DomainFacade *df, const QString &fn, int si, int ti, int ei) :UndoBase(df) { sceneIndex = si; takeIndex = ti; exposureIndex = ei; exposure = NULL; fileName.append(fn); setText(QString(tr("Insert exposure (%1,%2,%3) '%4'")) .arg(sceneIndex).arg(takeIndex).arg(exposureIndex) .arg(fileName.mid(fileName.lastIndexOf('/')+1))); } UndoExposureInsert::~UndoExposureInsert() { if (NULL != exposure) { delete exposure; exposure = NULL; } } void UndoExposureInsert::undo() { qDebug() << "UndoExposureInsert::undo --> Start"; Q_ASSERT(NULL == exposure); AnimationProject *animationProject = facade->getAnimationProject(); exposure = animationProject->removeExposure(sceneIndex, takeIndex, exposureIndex); facade->getView()->notifyRemoveExposure(sceneIndex, takeIndex, exposureIndex); animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); qDebug() << "UndoExposureInsert::undo --> End"; } void UndoExposureInsert::redo() { qDebug() << "UndoExposureInsert::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); if (NULL == exposure) { // First call of the redo function after creation of the undo object animationProject->insertExposure(sceneIndex, takeIndex, exposureIndex, fileName, AnimationProject::InTempPath); facade->writeHistoryEntry(QString("%1|%2|%3|%4|%5") .arg(QLatin1String("redoExposureInsert")) .arg(sceneIndex).arg(takeIndex).arg(exposureIndex) .arg(fileName)); } else { // Call of the redo function after a undo call animationProject->insertExposure(sceneIndex, takeIndex, exposureIndex, exposure); exposure = NULL; facade->writeHistoryEntry(QLatin1String("redo")); } facade->getView()->notifyInsertExposure(sceneIndex, takeIndex, exposureIndex); animationProject->incAnimationChanges(); qDebug() << "UndoExposureInsert::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undotakeremove.h000644 000000 000000 00000005447 12654352322 023550 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOTAKEREMOVE_H #define UNDOTAKEREMOVE_H #include /** * The UndoTakeRemove class for undoing removeTake(...) calls to the project. */ class UndoTakeRemove : public UndoBase { Q_OBJECT public: /** * Sets up the UndoTakeRemove command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param si the index of the scene the removed take had. * @param ti the index the removed take had. * command */ UndoTakeRemove(DomainFacade *df, int si, int ti); /** * Cleans up after the undo object. */ ~UndoTakeRemove(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int sceneIndex; int takeIndex; Take *removedTake; bool undoFlag; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undoexposuremove.cpp000644 000000 000000 00000007630 12654352322 024476 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undoexposuremove.h" #include #include UndoExposureMove::UndoExposureMove(DomainFacade *df, int fsi, int fti, int fei, int tsi, int tti, int tei) :UndoBase(df) { fromSceneIndex = fsi; fromTakeIndex = fti; fromExposureIndex = fei; toSceneIndex = tsi; toTakeIndex = tti; toExposureIndex = tei; undoFlag = false; setText(QString(tr("Move exposure (%1,%2,%3)")).arg(toSceneIndex).arg(toTakeIndex).arg(toExposureIndex)); } UndoExposureMove::~UndoExposureMove() { } void UndoExposureMove::undo() { /* TODO: Implementation of the redoExposureMove function qDebug() << "UndoExposureMove::undo --> Start"; facade->writeHistoryEntry(QLatin1String("undo")); undoFlag = true; qDebug() << "UndoExposureMove::undo --> End"; */ } void UndoExposureMove::redo() { /* TODO: Implementation of the redoExposureMove function qDebug() << "UndoExposureMove::redo --> Start"; Exposure* exposure = animationProject->removeExposure(sceneIndex, takeIndex, exposureIndex); getView()->notifyRemoveExposure(sceneIndex, takeIndex, exposureIndex); if (exposureIndex == animationProject->getActiveScene()->getActiveTake()->getExposureSize()) { this->setActiveExposureIndex(exposureIndex - 1); } else { this->setActiveExposureIndex(exposureIndex); } animationProject->setUnsavedChanges(); if (undoFlag) { facade->writeHistoryEntry(QLatin1String("redo")); undoFlag = false; } else { facade->writeHistoryEntry(QString("%1|%2|%3|%4|%5|%6|%7") .arg(QLatin1String("redoExposureMove") .arg(fromSceneIndex).arg(fromTakeIndex) .arg(fromExposureIndex) .arg(toSceneIndex) .arg(toTakeIndex) .arg(toExposureIndex)); } qDebug() << "UndoExposureMove::redo --> End"; */ } qstopmotion-2.3.2-Source/src/domain/undo/undosceneinsert.h000644 000000 000000 00000005445 12654352322 023726 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOSCENEINSERT_H #define UNDOSCENEINSERT_H #include /** * The UndoSceneNew class for undoing newScene(...) calls to the project. */ class UndoSceneInsert : public UndoBase { Q_OBJECT public: /** * Sets up the UndoSceneInsert command object with the information needed to undo and * redo the insert command. * @param df Domain facade for commands. * @param description The description of the new scene. * @param scIndex The index of the new scene. */ UndoSceneInsert(DomainFacade *df, const QString &description, int scIndex); /** * Cleans up after the undo object. */ ~UndoSceneInsert(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ QString sceneDescription; int sceneIndex; Scene *scene; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undotakeselect.h000644 000000 000000 00000005175 12654352322 023530 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOTAKESELECT_H #define UNDOTAKESELECT_H #include /** * The UndoTakeSelect class for undoing takeSelect(...) calls to the project. */ class UndoTakeSelect : public UndoBase { Q_OBJECT public: /** * Sets up the UndoTakeSelect command object with the information needed * to undo and redo the add commands. * @param df Domain facade for commands. * @param nsi the new index of the scene of the take. * @param nti the new index of the take. */ UndoTakeSelect(DomainFacade *df, int nsi, int nti); /** * Destructor */ ~UndoTakeSelect(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int oldSceneIndex; int oldTakeIndex; int newSceneIndex; int newTakeIndex; bool undoFlag; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undoexposuremove.h000644 000000 000000 00000006532 12654352322 024143 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOEXPOSUREMOVE_H #define UNDOEXPOSUREMOVE_H #include /** * The UndoExposureMove class for undoing moveExposure(...) calls to the project. */ class UndoExposureMove : public UndoBase { Q_OBJECT public: /** * Sets up the UndoExposureMove command object with the information needed to undo and * redo the add commands. * @param df Domain facade for commands. * @param fsi the index the scene of the take of the exposure had before being moved. * @param fti the index the take of the exposure had before being moved. * @param fei the index of the exposure had before being moved. * @param tsi the index the scene of the take of the exposure after moving. * @param tti the index the take of the exposure after moving. * @param tei the index of the exposure after moving. */ UndoExposureMove(DomainFacade *df, int fsi, int fti, int fei, int tsi, int tti, int tei); /** * Destructor */ ~UndoExposureMove(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int fromSceneIndex; int fromTakeIndex; int fromExposureIndex; int toSceneIndex; int toTakeIndex; int toExposureIndex; bool undoFlag; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undosceneadd.cpp000644 000000 000000 00000006641 12654352322 023504 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undosceneadd.h" #include #include UndoSceneAdd::UndoSceneAdd(DomainFacade *df, const QString &description) :UndoBase(df) { sceneIndex = df->getSceneSize(); sceneDescription.append(description); scene = NULL; setText(QString(tr("Add scene (%1) '%2'")) .arg(sceneIndex).arg(sceneDescription)); } UndoSceneAdd::~UndoSceneAdd() { if (NULL != scene) { delete scene; scene = NULL; } } void UndoSceneAdd::undo() { qDebug() << "UndoSceneAdd::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); scene = animationProject->removeScene(sceneIndex); facade->getView()->notifyRemoveScene(sceneIndex); animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); qDebug() << "UndoSceneAdd::undo --> End"; } void UndoSceneAdd::redo() { qDebug() << "UndoSceneAdd::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); if (NULL == scene) { // First call of the redo function after creation of the undo object animationProject->addScene(sceneDescription); facade->writeHistoryEntry(QString("%1|%2|%3") .arg(QLatin1String("redoSceneAdd")) .arg(sceneIndex) .arg(sceneDescription)); } else { // Call of the redo function after a undo call animationProject->addScene(scene); scene = NULL; facade->writeHistoryEntry(QLatin1String("redo")); } facade->getView()->notifyAddScene(sceneIndex); animationProject->incAnimationChanges(); qDebug() << "UndoSceneAdd::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoexposureremove.cpp000644 000000 000000 00000010157 12654352322 025023 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undoexposureremove.h" #include #include #include "domain/animation/exposure.h" UndoExposureRemove::UndoExposureRemove(DomainFacade *df, int si, int ti, int ei) :UndoBase(df) { sceneIndex = si; takeIndex = ti; exposureIndex = ei; exposure = NULL; undoFlag = false; setText(QString(tr("Remove exposure (%1,%2,%3)")) .arg(sceneIndex).arg(takeIndex).arg(exposureIndex)); } UndoExposureRemove::~UndoExposureRemove() { if (NULL != exposure) { delete exposure; exposure = NULL; } } void UndoExposureRemove::undo() { qDebug() << "UndoExposureRemove::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); if (exposureIndex >= animationProject->getTakeExposureSize(sceneIndex, takeIndex)) { animationProject->addExposure(sceneIndex, takeIndex, exposure); facade->getView()->notifyAddExposure(sceneIndex, takeIndex, exposureIndex); } else { animationProject->insertExposure(sceneIndex, takeIndex, exposureIndex, exposure); facade->getView()->notifyInsertExposure(sceneIndex, takeIndex, exposureIndex); } exposure = NULL; undoFlag = true; animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); qDebug() << "UndoExposureRemove::undo --> End"; } void UndoExposureRemove::redo() { qDebug() << "UndoExposureRemove::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); exposure = animationProject->removeExposure(sceneIndex, takeIndex, exposureIndex); facade->getView()->notifyRemoveExposure(sceneIndex, takeIndex, exposureIndex); animationProject->incAnimationChanges(); if (undoFlag) { // Call of the redo function after a undo call undoFlag = false; facade->writeHistoryEntry(QLatin1String("redo")); } else { facade->writeHistoryEntry(QString("%1|%2|%3|%4") .arg(QLatin1String("redoExposureRemove")) .arg(sceneIndex) .arg(takeIndex) .arg(exposureIndex)); } qDebug() << "UndoExposureRemove::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoscenemove.cpp000644 000000 000000 00000006060 12654352322 023715 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undoscenemove.h" #include #include UndoSceneMove::UndoSceneMove(DomainFacade *df, int fsi, int tsi) :UndoBase(df) { fromSceneIndex = fsi; toSceneIndex = tsi; undoFlag = false; setText(QString(tr("Move scene (%1,%2)")).arg(fromSceneIndex).arg(toSceneIndex)); } UndoSceneMove::~UndoSceneMove() { } void UndoSceneMove::undo() { qDebug() << "UndoSceneMove::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); undoFlag = true; qDebug() << "UndoSceneMove::undo --> Start"; } void UndoSceneMove::redo() { qDebug() << "UndoSceneMove::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); animationProject->moveScene(fromSceneIndex, toSceneIndex); animationProject->incAnimationChanges(); if (undoFlag) { facade->writeHistoryEntry(QLatin1String("redo")); undoFlag = false; } else { facade->writeHistoryEntry(QString("%1|%2|%3") .arg(QLatin1String("redoSceneMove")) .arg(fromSceneIndex) .arg(toSceneIndex)); } qDebug() << "UndoSceneMove::redo --> Start"; } qstopmotion-2.3.2-Source/src/domain/undo/undoprojectopen.cpp000644 000000 000000 00000007770 12654352322 024272 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undoprojectopen.h" #include #include UndoProjectOpen::UndoProjectOpen(DomainFacade *df, const QString &path) :UndoBase(df) { projectPath.append(path); project = NULL; setText(QString(tr("Open project '%1'")).arg(projectPath.mid(projectPath.lastIndexOf('/')+1))); } UndoProjectOpen::~UndoProjectOpen() { if (NULL != project) { delete project; project = NULL; } } void UndoProjectOpen::undo() { qDebug() << "UndoProjectOpen::undo --> Start"; Q_ASSERT(NULL == project); project = facade->removeProject(); facade->getView()->notifyRemoveProject(); // TODO: Implement separate frontende changes // frontend->setFrontendChanges(); facade->writeHistoryEntry(QLatin1String("undo")); qDebug() << "UndoProjectOpen::undo --> End"; } void UndoProjectOpen::redo() { qDebug() << "UndoProjectOpen::redo --> Start"; bool projectOpen = true; // facade->getView()->notifyNewProject(); if (NULL == project) { // First call of the redo function after creation of the undo object projectOpen = facade->openProject(projectPath); facade->writeHistoryEntry(QString("%1|%2") .arg(QLatin1String("redoProjectOpen")) .arg(projectPath)); } else { // Call of the redo function after a undo call facade->openProject(project); project = NULL; facade->writeHistoryEntry(QLatin1String("redo")); } if (projectOpen) { Frontend *frontend = facade->getFrontend(); facade->getView()->notifyOpenProject(); frontend->setProjectID(facade->getProjectDescription()); Scene *scene = facade->getActiveScene(); Q_ASSERT(NULL != scene); facade->getView()->notifyActivateScene(); frontend->setSceneID(scene->getDescription()); Take *take = facade->getActiveTake(); Q_ASSERT(NULL != take); facade->getView()->notifyActivateTake(); frontend->setTakeID(take->getDescription()); Exposure *exposure = facade->getActiveExposure(); if (NULL != exposure) { facade->getView()->notifyActivateExposure(); frontend->setExposureID(exposure->getId()); } } qDebug() << "UndoProjectOpen::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undosceneremove.h000644 000000 000000 00000005275 12654352322 023720 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOSCENEREMOVE_H #define UNDOSCENEREMOVE_H #include /** * The UndoSceneRemove class for undoing removeScene(...) calls to the project. */ class UndoSceneRemove : public UndoBase { Q_OBJECT public: /** * Sets up the UndoRemoveScene command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param si the index the removed scene had. * command */ UndoSceneRemove(DomainFacade *df, int si); /** * Cleans up after the undo object. */ ~UndoSceneRemove(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int sceneIndex; Scene *removedScene; bool undoFlag; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undotakeinsert.h000644 000000 000000 00000005636 12654352322 023557 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOTAKEINSERT_H #define UNDOTAKEINSERT_H #include /** * The UndoTakeInsert class for undoing newTake(...) calls to the project. */ class UndoTakeInsert : public UndoBase { Q_OBJECT public: /** * Sets up the UndoTakeInsert command object with the information needed to undo and * redo the insert command. * @param df Domain facade for commands. * @param description The description of the take. * @param scIndex The index of the scene the take were added to. * @param taIndex The index of the new take. */ UndoTakeInsert(DomainFacade *df, const QString &description, int scIndex, int taIndex); /** * Cleans up after the undo object. */ ~UndoTakeInsert(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ QString takeDescription; int sceneIndex; int takeIndex; Take *take; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undobase.h000644 000000 000000 00000005017 12654352322 022311 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOBASE_H #define UNDOBASE_H #include #include /** * The UndoBase class for general undo functionality. */ class UndoBase : public QObject, public QUndoCommand { Q_OBJECT protected: /** * Sets up an Undo command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. */ UndoBase(DomainFacade *df); /** * Destructor */ virtual ~UndoBase(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo() = 0; /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo() = 0; protected: /** * The model to perform the redo command on. */ DomainFacade *facade; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undosceneremove.cpp000644 000000 000000 00000006650 12654352322 024251 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undosceneremove.h" #include #include UndoSceneRemove::UndoSceneRemove(DomainFacade *df, int si) :UndoBase(df) { sceneIndex = si; removedScene = NULL; undoFlag = false; setText(QString(tr("Remove scene (%1)")).arg(sceneIndex)); } UndoSceneRemove::~UndoSceneRemove() { if (NULL != removedScene) { delete removedScene; removedScene = NULL; } } void UndoSceneRemove::undo() { qDebug() << "UndoSceneRemove::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); if (sceneIndex >= animationProject->getSceneSize()) { animationProject->addScene(removedScene); facade->getView()->notifyAddScene(sceneIndex); } else { animationProject->insertScene(sceneIndex, removedScene); facade->getView()->notifyInsertScene(sceneIndex); } removedScene = NULL; animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); undoFlag = true; qDebug() << "UndoSceneRemove::undo --> End"; } void UndoSceneRemove::redo() { qDebug() << "UndoSceneRemove::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); removedScene = animationProject->removeScene(sceneIndex); animationProject->incAnimationChanges(); facade->getView()->notifyRemoveScene(sceneIndex); if (undoFlag) { facade->writeHistoryEntry(QLatin1String("redo")); undoFlag = false; } else { facade->writeHistoryEntry(QString("%1|%2") .arg(QLatin1String("redoSceneRemove")) .arg(sceneIndex)); } qDebug() << "UndoSceneRemove::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoexposureselect.h000644 000000 000000 00000005530 12654352322 024451 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOEXPOSURESELECT_H #define UNDOEXPOSURESELECT_H #include /** * The UndoExposureSelect class for undoing exposureSelect(...) calls to the project. */ class UndoExposureSelect : public UndoBase { Q_OBJECT public: /** * Sets up the UndoExposureSelect command object with the information needed * to undo and redo the add commands. * @param df Domain facade for commands. * @param nsi the new index of the scene of the take of the exposure. * @param nti the new index of the take of the exposure. * @param nei the new index of the exposure. */ UndoExposureSelect(DomainFacade *df, int nsi, int nti, int nei); /** * Destructor */ ~UndoExposureSelect(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int oldSceneIndex; int oldTakeIndex; int oldExposureIndex; int newSceneIndex; int newTakeIndex; int newExposureIndex; bool undoFlag; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undosceneselect.h000644 000000 000000 00000005000 12654352322 023664 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOSCENESELECT_H #define UNDOSCENESELECT_H #include /** * The UndoSceneSelect class for undoing sceneSelect(...) calls to the project. */ class UndoSceneSelect : public UndoBase { Q_OBJECT public: /** * Sets up the UndoSceneSelect command object with the information needed * to undo and redo the add commands. * @param df Domain facade for commands. * @param nsi the index of the new selected scene. */ UndoSceneSelect(DomainFacade *df, int nsi); /** * Destructor */ ~UndoSceneSelect(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int oldSceneIndex; int newSceneIndex; bool undoFlag; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undotakeadd.cpp000644 000000 000000 00000007156 12654352322 023335 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undotakeadd.h" #include #include UndoTakeAdd::UndoTakeAdd(DomainFacade *df, const QString &description, int scIndex) :UndoBase(df) { sceneIndex = scIndex; takeIndex = df->getScene(sceneIndex)->getTakeSize(); takeDescription.append(description); take = NULL; setText(QString(tr("Add take (%1,%2) '%3'")) .arg(sceneIndex).arg(takeIndex) .arg(takeDescription)); } UndoTakeAdd::~UndoTakeAdd() { if (NULL != take) { delete take; take = NULL; } } void UndoTakeAdd::undo() { qDebug() << "UndoTakeAdd::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); take = animationProject->removeTake(sceneIndex, takeIndex); facade->getView()->notifyRemoveTake(sceneIndex, takeIndex); animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); qDebug() << "UndoTakeAdd::undo --> End"; } void UndoTakeAdd::redo() { qDebug() << "UndoTakeAdd::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); if (NULL == take) { // First call of the redo function after creation of the undo object animationProject->addTake(sceneIndex, takeDescription); facade->writeHistoryEntry(QString("%1|%2|%3|%4") .arg(QLatin1String("redoTakeAdd")) .arg(sceneIndex) .arg(takeIndex) .arg(takeDescription)); } else { // Call of the redo function after a undo call animationProject->addTake(sceneIndex, take); take = NULL; facade->writeHistoryEntry(QLatin1String("redo")); } facade->getView()->notifyAddTake(sceneIndex, takeIndex); animationProject->incAnimationChanges(); qDebug() << "UndoTakeAdd::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoprojectnew.h000644 000000 000000 00000005300 12654352322 023552 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOPROJECTNEW_H #define UNDOPROJECTNEW_H #include /** * The UndoProjectNew class for undoing newProject(...) calls to the project. */ class UndoProjectNew : public UndoBase { Q_OBJECT public: /** * Sets up the UndoProjectNew command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param description the description of the new project. */ UndoProjectNew(DomainFacade *df, const QString &description); /** * Cleans up after the undo object. */ ~UndoProjectNew(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ QString projectDescription; AnimationProject *project; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undosceneselect.cpp000644 000000 000000 00000011764 12654352322 024235 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undosceneselect.h" #include #include UndoSceneSelect::UndoSceneSelect(DomainFacade *df, int nsi) :UndoBase(df) { oldSceneIndex = facade->getActiveSceneIndex(); newSceneIndex = nsi; undoFlag = false; setText(QString(tr("Select scene (%1)-->(%2)")) .arg(oldSceneIndex).arg(newSceneIndex)); } UndoSceneSelect::~UndoSceneSelect() { } void UndoSceneSelect::undo() { qDebug() << "UndoSceneSelect::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); Frontend *frontend = facade->getFrontend(); animationProject->setActiveSceneIndex(oldSceneIndex); facade->getView()->notifyActivateScene(); if (0 <= oldSceneIndex) { Scene *activeScene = animationProject->getActiveScene(); frontend->setSceneID(activeScene->getDescription()); int activeTakeIndex = activeScene->getActiveTakeIndex(); if (0 <= activeTakeIndex) { facade->getView()->notifyActivateTake(); Take *activeTake = activeScene->getActiveTake(); frontend->setTakeID(activeTake->getDescription()); int activeExposureIndex = activeTake->getActiveExposureIndex(); if (0 <= activeExposureIndex) { facade->getView()->notifyActivateExposure(); frontend->setExposureID(activeTake->getExposure(activeExposureIndex)->getId()); } else { frontend->setExposureID("---"); } } else { frontend->setTakeID("---"); } } else { frontend->setSceneID("---"); } animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); undoFlag = true; qDebug() << "UndoSceneSelect::undo --> Start"; } void UndoSceneSelect::redo() { qDebug() << "UndoSceneSelect::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); Frontend *frontend = facade->getFrontend(); animationProject->setActiveSceneIndex(newSceneIndex); facade->getView()->notifyActivateScene(); if (0 <= newSceneIndex) { Scene *activeScene = animationProject->getActiveScene(); frontend->setSceneID(activeScene->getDescription()); int activeTakeIndex = activeScene->getActiveTakeIndex(); if (0 <= activeTakeIndex) { facade->getView()->notifyActivateTake(); Take *activeTake = activeScene->getActiveTake(); frontend->setTakeID(activeTake->getDescription()); int activeExposureIndex = activeTake->getActiveExposureIndex(); if (0 <= activeExposureIndex) { facade->getView()->notifyActivateExposure(); frontend->setExposureID(activeTake->getExposure(activeExposureIndex)->getId()); } else { frontend->setExposureID("---"); } } else { frontend->setTakeID("---"); } } else { frontend->setSceneID("---"); } animationProject->incAnimationChanges(); if (undoFlag) { facade->writeHistoryEntry(QLatin1String("redo")); undoFlag = false; } else { facade->writeHistoryEntry(QString("%1|%2|%3") .arg(QLatin1String("redoSceneSelect")) .arg(oldSceneIndex) .arg(newSceneIndex)); } qDebug() << "UndoSceneSelect::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undobase.cpp000644 000000 000000 00000003400 12654352322 022636 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undobase.h" UndoBase::UndoBase(DomainFacade *df) { facade = df; } UndoBase::~UndoBase() { } qstopmotion-2.3.2-Source/src/domain/undo/undoexposureselect.cpp000644 000000 000000 00000010402 12654352322 024776 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undoexposureselect.h" #include #include UndoExposureSelect::UndoExposureSelect(DomainFacade *df, int nsi, int nti, int nei) :UndoBase(df) { oldSceneIndex = facade->getActiveSceneIndex(); oldTakeIndex = facade->getActiveTakeIndex(); oldExposureIndex = facade->getActiveExposureIndex(); newSceneIndex = nsi; newTakeIndex = nti; newExposureIndex = nei; undoFlag = false; setText(QString(tr("Select exposure (%1,%2,%3)-->(%4,%5,%6)")) .arg(oldSceneIndex).arg(oldTakeIndex).arg(oldExposureIndex) .arg(newSceneIndex).arg(newTakeIndex).arg(newExposureIndex)); } UndoExposureSelect::~UndoExposureSelect() { } void UndoExposureSelect::undo() { qDebug() << "UndoExposureSelect::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); Frontend *frontend = facade->getFrontend(); animationProject->setActiveExposureIndex(oldExposureIndex); if (0 <= oldExposureIndex) { Exposure *activeExposure = animationProject->getActiveExposure(); frontend->setExposureID(activeExposure->getId()); } else { frontend->setExposureID("---"); } facade->getView()->notifyActivateExposure(); animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); undoFlag = true; qDebug() << "UndoExposureSelect::undo --> End"; } void UndoExposureSelect::redo() { qDebug() << "UndoExposureSelect::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); Frontend *frontend = facade->getFrontend(); animationProject->setActiveExposureIndex(newExposureIndex); if (0 <= newExposureIndex) { Exposure *activeExposure = animationProject->getActiveExposure(); frontend->setExposureID(activeExposure->getId()); } else { frontend->setExposureID("---"); } facade->getView()->notifyActivateExposure(); animationProject->incAnimationChanges(); if (undoFlag) { facade->writeHistoryEntry(QLatin1String("redo")); undoFlag = false; } else { facade->writeHistoryEntry(QString("%1|%2|%3|%4|%5|%6|%7") .arg(QLatin1String("redoExposureSelect")) .arg(oldSceneIndex) .arg(oldTakeIndex) .arg(oldExposureIndex) .arg(newSceneIndex) .arg(newTakeIndex) .arg(newExposureIndex)); } qDebug() << "UndoExposureSelect::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoexposureremove.h000644 000000 000000 00000006017 12654352322 024470 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOEXPOSUREREMOVE_H #define UNDOEXPOSUREREMOVE_H #include /** * The UndoExposureRemove class for undoing removeExposure(...) calls to the project. */ class UndoExposureRemove : public UndoBase { Q_OBJECT public: /** * Sets up the UndoAdd command object with the information needed to undo and * redo the add commands. * * Note: The needed information ``toIndex'' is extracted from the length of the * frameNames vector. * @param df Domain facade for commands. * @param si the index of the scene of the exposure to remove * @param ti the index of the take of the exposure to remove * @param ei the index of the exposure to remove */ UndoExposureRemove(DomainFacade *df, int si, int ti, int ei); ~UndoExposureRemove(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int sceneIndex; int takeIndex; int exposureIndex; Exposure *exposure; bool undoFlag; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undosceneinsert.cpp000644 000000 000000 00000007020 12654352322 024250 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undosceneinsert.h" #include #include UndoSceneInsert::UndoSceneInsert(DomainFacade *df, const QString &description, int scIndex) :UndoBase(df) { sceneIndex = scIndex; sceneDescription.append(description); scene = NULL; setText(QString(tr("Insert scene (%1) '%2'")).arg(sceneIndex).arg(sceneDescription)); } UndoSceneInsert::~UndoSceneInsert() { if (NULL != scene) { delete scene; scene = NULL; } } void UndoSceneInsert::undo() { qDebug() << "UndoSceneInsert::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); scene = animationProject->removeScene(sceneIndex); facade->getView()->notifyRemoveScene(sceneIndex); animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); qDebug() << "UndoSceneInsert::undo --> End"; } void UndoSceneInsert::redo() { qDebug() << "UndoSceneInsert::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); if (NULL == scene) { // First call of the redo function after creation of the undo object animationProject->insertScene(sceneIndex, sceneDescription); facade->writeHistoryEntry(QString("%1|%2|%3") .arg(QLatin1String("redoSceneInsert")) .arg(sceneIndex) .arg(sceneDescription)); } else { // Call of the redo function after a undo call animationProject->insertScene(sceneIndex, scene); scene = NULL; facade->writeHistoryEntry(QLatin1String("redo")); } facade->getView()->notifyInsertScene(sceneIndex); animationProject->incAnimationChanges(); qDebug() << "UndoSceneInsert::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoscenemove.h000644 000000 000000 00000005406 12654352322 023365 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOSCENEMOVE_H #define UNDOSCENEMOVE_H #include /** * The UndoSceneMove class for undoing moveScene(...) calls to the project. */ class UndoSceneMove : public UndoBase { Q_OBJECT public: /** * Sets up the UndoMoveScene command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param fsi the index the scene had before being moved. * @param tsi the index of the scene after moving. */ UndoSceneMove(DomainFacade *df, int fsi, int tsi); /** * Cleans up after the undo object. */ ~UndoSceneMove(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int fromSceneIndex; int toSceneIndex; bool undoFlag; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undotakeadd.h000644 000000 000000 00000005440 12654352322 022774 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOTAKEADD_H #define UNDOTAKEADD_H #include /** * The UndoTakeAdd class for undoing addTake(...) calls to the project. */ class UndoTakeAdd : public UndoBase { Q_OBJECT public: /** * Sets up the UndoTakeAdd command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param description the description of the take. * @param scIndex index of the scene the take were added to. */ UndoTakeAdd(DomainFacade *df, const QString &description, int scIndex); /** * Cleans up after the undo object. */ ~UndoTakeAdd(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ QString takeDescription; int sceneIndex; int takeIndex; Take *take; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undotakeinsert.cpp000644 000000 000000 00000007327 12654352322 024111 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undotakeinsert.h" #include #include UndoTakeInsert::UndoTakeInsert(DomainFacade *df, const QString &description, int scIndex, int taIndex) :UndoBase(df) { sceneIndex = scIndex; takeIndex = taIndex; takeDescription.append(description); take = NULL; setText(QString(tr("Insert take (%1,%2) '%3'")) .arg(sceneIndex).arg(takeIndex) .arg(takeDescription)); } UndoTakeInsert::~UndoTakeInsert() { if (NULL != take) { delete take; take = NULL; } } void UndoTakeInsert::undo() { qDebug() << "UndoTakeInsert::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); take = animationProject->removeTake(sceneIndex, takeIndex); facade->getView()->notifyRemoveTake(sceneIndex, takeIndex); animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); qDebug() << "UndoTakeInsert::undo --> End"; } void UndoTakeInsert::redo() { qDebug() << "UndoTakeInsert::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); if (NULL == take) { // First call of the redo function after creation of the undo object animationProject->insertTake(sceneIndex, takeIndex, takeDescription); facade->writeHistoryEntry(QString("%1|%2|%3|%4") .arg(QLatin1String("redoTakeInsert")) .arg(sceneIndex) .arg(takeIndex) .arg(takeDescription)); } else { // Call of the redo function after a undo call animationProject->insertTake(sceneIndex, takeIndex, take); take = NULL; facade->writeHistoryEntry(QLatin1String("redo")); } facade->getView()->notifyInsertTake(sceneIndex, takeIndex); animationProject->incAnimationChanges(); qDebug() << "UndoTakeInsert::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoprojectnew.cpp000644 000000 000000 00000007263 12654352322 024117 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undoprojectnew.h" #include #include #include "frontends/qtfrontend/toolbar.h" UndoProjectNew::UndoProjectNew(DomainFacade *df, const QString &description) :UndoBase(df) { projectDescription.append(description); project = NULL; setText(QString(tr("New project '%1'")).arg(projectDescription)); } UndoProjectNew::~UndoProjectNew() { if (NULL != project) { delete project; project = NULL; } } void UndoProjectNew::undo() { qDebug() << "UndoProjectNew::undo --> Start"; Q_ASSERT(NULL == project); Frontend *frontend = facade->getFrontend(); project = facade->removeProject(); facade->getView()->notifyRemoveProject(); frontend->setProjectID("---"); frontend->setSceneID("---"); frontend->setTakeID("---"); frontend->setExposureID("---"); frontend->setToolBarState(ToolBar::toolBarCameraOff); facade->writeHistoryEntry(QLatin1String("undo")); qDebug() << "UndoProjectNew::undo --> End"; } void UndoProjectNew::redo() { qDebug() << "UndoProjectNew::redo --> Start"; Frontend *frontend = facade->getFrontend(); if (NULL == project) { // First call of the redo function after creation of the undo object facade->newProject(projectDescription); facade->setProjectSettingsToDefault(); facade->writeHistoryEntry(QString("%1|%2") .arg(QLatin1String("redoProjectNew")) .arg(projectDescription)); } else { // Call of the redo function after a undo call facade->newProject(project); project = NULL; facade->writeHistoryEntry(QLatin1String("redo")); } facade->getView()->notifyNewProject(); frontend->setProjectID(facade->getProjectDescription()); frontend->setSceneID("---"); frontend->setTakeID("---"); frontend->setExposureID("---"); frontend->setToolBarState(ToolBar::toolBarCameraOff); qDebug() << "UndoProjectNew::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoexposureadd.h000644 000000 000000 00000005645 12536560627 023741 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOEXPOSUREADD_H #define UNDOEXPOSUREADD_H #include /** * The UndoExposureAdd class for undoing newExposure(...) calls to the project. */ class UndoExposureAdd : public UndoBase { Q_OBJECT public: /** * Sets up the UndoAdd command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param fn the name of the file with the image. * @param si index of the scene of the take the frames were added to. * @param ti index of the take the frames were added to. */ UndoExposureAdd(DomainFacade *df, const QString &fn, int si, int ti); /** * Destructor */ ~UndoExposureAdd(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int sceneIndex; int takeIndex; int exposureIndex; QString fileName; Exposure *exposure; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undotakemove.cpp000644 000000 000000 00000006052 12654352322 023545 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undotakemove.h" #include #include UndoTakeMove::UndoTakeMove(DomainFacade *df, int fsi, int fti, int tsi, int tti) :UndoBase(df) { fromSceneIndex = fsi; fromTakeIndex = fti; toSceneIndex = tsi; toTakeIndex = tti; undoFlag = false; setText(QString(tr("Move take (%1,%2)")) .arg(toSceneIndex).arg(toTakeIndex)); } UndoTakeMove::~UndoTakeMove() { } void UndoTakeMove::undo() { qDebug() << "UndoTakeMove::undo --> Start"; facade->writeHistoryEntry(QLatin1String("undo")); undoFlag = true; qDebug() << "UndoTakeMove::undo --> Start"; } void UndoTakeMove::redo() { qDebug() << "UndoTakeMove::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); animationProject->moveTake(fromSceneIndex, fromTakeIndex, toSceneIndex, toTakeIndex); animationProject->incAnimationChanges(); if (undoFlag) { facade->writeHistoryEntry(QLatin1String("redo")); undoFlag = false; } else { facade->writeHistoryEntry(QString("%1|%2|%3|%4|%5") .arg(QLatin1String("redoTakeMove")) .arg(fromSceneIndex) .arg(fromTakeIndex) .arg(toSceneIndex) .arg(toTakeIndex)); } qDebug() << "UndoTakeMove::redo --> Start"; } qstopmotion-2.3.2-Source/src/domain/undo/undoexposureinsert.h000644 000000 000000 00000006071 12536560627 024507 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOEXPOSUREINSERT_H #define UNDOEXPOSUREINSERT_H #include /** * The UndoExposureInsert class for undoing newExposure(...) calls to the project. */ class UndoExposureInsert : public UndoBase { Q_OBJECT public: /** * Sets up the UndoInsert command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param fn the name of the file with the image. * @param scIndex index of the scene of the take the frames were inserted to. * @param taIndex index of the take the frames were inserted to. * @param exIndex index of the frames were inserted to. */ UndoExposureInsert(DomainFacade *df, const QString &fn, int si, int ti, int ei); /** * Destructor */ ~UndoExposureInsert(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int sceneIndex; int takeIndex; int exposureIndex; QString fileName; Exposure *exposure; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undotakeselect.cpp000644 000000 000000 00000010757 12654352322 024065 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undotakeselect.h" #include #include UndoTakeSelect::UndoTakeSelect(DomainFacade *df, int nsi, int nti) :UndoBase(df) { oldSceneIndex = facade->getActiveSceneIndex(); oldTakeIndex = facade->getActiveTakeIndex(); newSceneIndex = nsi; newTakeIndex = nti; undoFlag = false; setText(QString(tr("Select take (%1,%2)-->(%3,%4)")) .arg(oldSceneIndex).arg(oldTakeIndex) .arg(newSceneIndex).arg(newTakeIndex)); } UndoTakeSelect::~UndoTakeSelect() { } void UndoTakeSelect::undo() { qDebug() << "UndoTakeSelect::undo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); Frontend *frontend = facade->getFrontend(); animationProject->setActiveTakeIndex(oldTakeIndex); facade->getView()->notifyActivateTake(); if (0 <= oldTakeIndex) { Take *activeTake = animationProject->getActiveTake(); frontend->setTakeID(activeTake->getDescription()); int activeExposureIndex = activeTake->getActiveExposureIndex(); if (0 <= activeExposureIndex) { facade->getView()->notifyActivateExposure(); frontend->setExposureID(activeTake->getExposure(activeExposureIndex)->getId()); } else { frontend->setExposureID("---"); } } else { frontend->setTakeID("---"); } animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); undoFlag = true; qDebug() << "UndoTakeSelect::undo --> End"; } void UndoTakeSelect::redo() { qDebug() << "UndoTakeSelect::redo --> Start"; AnimationProject *animationProject = facade->getAnimationProject(); Frontend *frontend = facade->getFrontend(); animationProject->setActiveTakeIndex(newTakeIndex); facade->getView()->notifyActivateTake(); if (0 <= newTakeIndex) { Take *activeTake = animationProject->getActiveTake(); frontend->setTakeID(activeTake->getDescription()); int activeExposureIndex = activeTake->getActiveExposureIndex(); if (0 <= activeExposureIndex) { facade->getView()->notifyActivateExposure(); frontend->setExposureID(activeTake->getExposure(activeExposureIndex)->getId()); } else { frontend->setExposureID("---"); } } else { frontend->setTakeID("---"); } animationProject->incAnimationChanges(); if (undoFlag) { facade->writeHistoryEntry(QLatin1String("redo")); undoFlag = false; } else { facade->writeHistoryEntry(QString("%1|%2|%3|%4|%5") .arg(QLatin1String("redoTakeSelect")) .arg(oldSceneIndex) .arg(oldTakeIndex) .arg(newSceneIndex) .arg(newTakeIndex)); } qDebug() << "UndoTakeSelect::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undoprojectopen.h000644 000000 000000 00000005261 12654352322 023730 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOPROJECTOPEN_H #define UNDOPROJECTOPEN_H #include /** * The UndoProjectOpen class for undoing openProject(...) calls to the project. */ class UndoProjectOpen : public UndoBase { Q_OBJECT public: /** * Sets up the UndoProjectOpen command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param path the path of the project to open. */ UndoProjectOpen(DomainFacade *df, const QString &path); /** * Cleans up after the undo object. */ ~UndoProjectOpen(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ QString projectPath; AnimationProject *project; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undotakemove.h000644 000000 000000 00000005537 12654352322 023221 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UndoTakeMove_H #define UndoTakeMove_H #include /** * The UndoTakeMove class for undoing moveTake(...) calls to the project. */ class UndoTakeMove : public UndoBase { Q_OBJECT public: /** * Sets up the UndoTakeMove command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param fsi the index the scene of the take had before being moved. * @param fti the index of the take had before being moved. * @param tsi the index the scene of the take after moving. * @param tti the index of the take after moving. */ UndoTakeMove(DomainFacade *df, int fsi, int fti, int tsi, int tti); /** * Cleans up after the undo object. */ ~UndoTakeMove(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ int fromSceneIndex; int fromTakeIndex; int toSceneIndex; int toTakeIndex; bool undoFlag; }; #endif qstopmotion-2.3.2-Source/src/domain/undo/undoexposureadd.cpp000644 000000 000000 00000010021 12654352322 024244 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "undoexposureadd.h" #include #include #include #include "domain/animation/exposure.h" UndoExposureAdd::UndoExposureAdd(DomainFacade *df, const QString &fn, int si, int ti) :UndoBase(df) { sceneIndex = si; takeIndex = ti; exposureIndex = facade->getScene(sceneIndex)->getTake(takeIndex)->getExposureSize(); fileName.append(fn); exposure = NULL; setText(QString(tr("Add exposure (%1,%2,%3) '%4'")) .arg(sceneIndex).arg(takeIndex).arg(exposureIndex) .arg(fileName.mid(fileName.lastIndexOf('/')+1))); } UndoExposureAdd::~UndoExposureAdd() { if (NULL != exposure) { delete exposure; exposure = NULL; } } void UndoExposureAdd::undo() { qDebug() << "UndoExposureAdd::undo --> Start"; Q_ASSERT(NULL == exposure); AnimationProject *animationProject = facade->getAnimationProject(); exposure = animationProject->removeExposure(sceneIndex, takeIndex, exposureIndex); facade->getView()->notifyRemoveExposure(sceneIndex, takeIndex, exposureIndex); animationProject->decAnimationChanges(); facade->writeHistoryEntry(QLatin1String("undo")); qDebug() << "UndoExposureAdd::undo --> End"; } void UndoExposureAdd::redo() { qDebug() << "UndoExposureAdd::redo --> Start"; #include AnimationProject *animationProject = facade->getAnimationProject(); if (NULL == exposure) { // First call of the redo function after creation of the undo object animationProject->addExposure(sceneIndex, takeIndex, fileName, AnimationProject::InTempPath); facade->writeHistoryEntry(QString("%1|%2|%3|%4|%5") .arg(QLatin1String("redoExposureAdd")) .arg(sceneIndex).arg(takeIndex).arg(exposureIndex) .arg(fileName)); } else { // Call of the redo function after a undo call animationProject->addExposure(sceneIndex, takeIndex, exposure); exposure = NULL; facade->writeHistoryEntry(QLatin1String("redo")); } facade->getView()->notifyAddExposure(sceneIndex, takeIndex, exposureIndex); animationProject->incAnimationChanges(); qDebug() << "UndoExposureAdd::redo --> End"; } qstopmotion-2.3.2-Source/src/domain/undo/undosceneadd.h000644 000000 000000 00000005257 12654352322 023153 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef UNDOSCENEADD_H #define UNDOSCENEADD_H #include /** * The UndoSceneNew class for undoing newScene(...) calls to the project. */ class UndoSceneAdd : public UndoBase { Q_OBJECT public: /** * Sets up the UndoSceneAdd command object with the information needed to undo and * redo the add command. * @param df Domain facade for commands. * @param description the description of the new scene. */ UndoSceneAdd(DomainFacade *df, const QString &description); /** * Cleans up after the undo object. */ ~UndoSceneAdd(); /** * Abstract function for undoing the command represented by this undo object. */ virtual void undo(); /** * Abstract function for redoing (performing) the command represented by this * undo object. */ virtual void redo(); private: /** * The model to perform the redo command on. */ QString sceneDescription; int sceneIndex; Scene *scene; }; #endif qstopmotion-2.3.2-Source/src/domain/domainfacade.cpp000644 000000 000000 00000102224 12751646113 022472 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "domainfacade.h" #include #include #include #include "domain/animation/animationproject.h" #include "domain/undo/undoexposureadd.h" #include "domain/undo/undoexposureinsert.h" #include "domain/undo/undoexposuremove.h" #include "domain/undo/undoexposureremove.h" #include "domain/undo/undoexposureselect.h" #include "domain/undo/undoprojectnew.h" #include "domain/undo/undoprojectopen.h" #include "domain/undo/undosceneadd.h" #include "domain/undo/undosceneinsert.h" #include "domain/undo/undoscenemove.h" #include "domain/undo/undosceneremove.h" #include "domain/undo/undosceneselect.h" #include "domain/undo/undotakeadd.h" #include "domain/undo/undotakeinsert.h" #include "domain/undo/undotakemove.h" #include "domain/undo/undotakeremove.h" #include "domain/undo/undotakeselect.h" #include "frontends/qtfrontend/toolbar.h" #include "technical/grabber/imagegrabber.h" #include "technical/videoencoder/videoencoder.h" DomainFacade::DomainFacade(Frontend *f) { frontend = f; animationProject = NULL; undoStack = new QUndoStack(); historyFilePath.clear(); historyFilePath.append(frontend->getUserDirName()); historyFilePath.append("/"); historyFilePath.append(PreferencesTool::historyFileName); historyFile = new QFile(historyFilePath); recovering = false; } DomainFacade::~DomainFacade() { if (animationProject != NULL) { clearUndoStack(); delete animationProject; animationProject = NULL; } recovering = false; if (undoStack != NULL) { delete undoStack; undoStack = NULL; } if (historyFile != NULL) { delete historyFile; historyFile = NULL; } frontend = NULL; } Frontend* DomainFacade::getFrontend() { return this->frontend; } ViewFacade* DomainFacade::getView() { return frontend->getView(); } bool DomainFacade::isRecovering() { return recovering; } /************************************************************************** * Audio functions **************************************************************************/ bool DomainFacade::initAudioDevice() { return animationProject->initAudioDevice(); } void DomainFacade::shutdownAudioDevice() { return animationProject->shutdownAudioDevice(); } /************************************************************************** * Undo functions **************************************************************************/ QUndoStack* DomainFacade::getUndoStack() { return undoStack; } void DomainFacade::clearUndoStack() { undoStack->clear(); } void DomainFacade::writeHistoryEntry(const QString &entry) { if (recovering) { // The project is in revovering mode --> no writing of history information return; } if (!historyFile->open(QIODevice::Append | QIODevice::Text)) { // Error frontend->showCritical(tr("Critical"), tr("Can't open history file to write entry!")); return; } QTextStream out(historyFile); out << entry << "\n"; // Flush and close the file historyFile->close(); return; } void DomainFacade::removeHistoryFile() { if (!historyFile->remove()) { // Error // frontend->showCritical(tr("Critical"), // tr("Can't remove history file!")); } } /************************************************************************** * Animation functions **************************************************************************/ AnimationProject* DomainFacade::getAnimationProject() { return this->animationProject; } bool DomainFacade::isProjectSettingsChanges() { if (NULL == animationProject) { return false; } return animationProject->isSettingsChanges(); } bool DomainFacade::isProjectAnimationChanges() { if (NULL == animationProject) { return false; } return animationProject->isAnimationChanges(); } bool DomainFacade::isActiveProject() { if (NULL == animationProject) { return false; } return true; } const QString DomainFacade::getNewProjectFilePath() { return animationProject->getNewProjectFilePath(); } const QString DomainFacade::getNewProjectPath() { return animationProject->getNewProjectPath(); } const QString DomainFacade::getProjectDescription() { return animationProject->getDescription(); } /************************************************************************** * Project preferences **************************************************************************/ int DomainFacade::getRecordingMode() { return animationProject->getRecordingMode(); } void DomainFacade::setRecordingMode(int newRecordingMode) { animationProject->setRecordingMode(newRecordingMode); frontend->setRecordingMode(newRecordingMode); } int DomainFacade::getVideoSource() { return animationProject->getVideoSource(); } void DomainFacade::setVideoSource(int newVideoSource) { animationProject->setVideoSource(newVideoSource); frontend->setVideoSource(newVideoSource); } int DomainFacade::getResolution() { return animationProject->getResolution(); } void DomainFacade::setResolution(int newResolution) { animationProject->setResolution(newResolution); frontend->setResolution(newResolution); } bool DomainFacade::convertImages(int newFormat, int newQuality) { return animationProject->convertImages(newFormat, newQuality); } int DomainFacade::getMixMode() { return animationProject->getMixMode(); } void DomainFacade::setMixMode(int newMixMode) { animationProject->setMixMode(newMixMode); frontend->setMixMode(newMixMode); } int DomainFacade::getMixCount() { return animationProject->getMixCount(); } void DomainFacade::setMixCount(int newMixCount) { animationProject->setMixCount(newMixCount); frontend->setMixCount(newMixCount); } int DomainFacade::getPlaybackCount() { return animationProject->getPlaybackCount(); } void DomainFacade::setPlaybackCount(int newPlaybackCount) { animationProject->setPlaybackCount(newPlaybackCount); } int DomainFacade::getUnitMode() { return animationProject->getUnitMode(); } void DomainFacade::setUnitMode(int newUnitMode) { animationProject->setUnitMode(newUnitMode); } int DomainFacade::getOverlayIntensity() { return animationProject->getOverlayIntensity(); } void DomainFacade::setOverlayIntensity(int overlay) { if (NULL != animationProject) { animationProject->setOverlayIntensity(overlay); } } /************************************************************************** * Image import preferences **************************************************************************/ int DomainFacade::getImageFormat() { return animationProject->getImageFormat(); } void DomainFacade::setImageFormat(int newIF) { animationProject->setImageFormat(newIF); } int DomainFacade::getImageQuality() { return animationProject->getImageQuality(); } void DomainFacade::setImageQuality(int newValue) { animationProject->setImageQuality(newValue); } int DomainFacade::getImageSize() { return animationProject->getImageSize(); } void DomainFacade::setImageSize(int newIS) { animationProject->setImageSize(newIS); } int DomainFacade::getImageTransformation() { if (animationProject == NULL) { // If no project is active use scale return 0; } return animationProject->getImageTransformation(); } void DomainFacade::setImageTransformation(int newTransform) { animationProject->setImageTransformation(newTransform); } int DomainFacade::getImageAdjustment() { return animationProject->getImageAdjustment(); } void DomainFacade::setImageAdjustment(int newIA) { animationProject->setImageAdjustment(newIA); } int DomainFacade::getZoomValue() { return animationProject->getZoomValue(); } void DomainFacade::setZoomValue(int newZV) { animationProject->setZoomValue(newZV); } int DomainFacade::getLiveViewFps() { return animationProject->getLiveViewFps(); } void DomainFacade::setLiveViewFps(int newValue) { animationProject->setLiveViewFps(newValue); getView()->notifyNewLiveViewFps(newValue); } /************************************************************************** * Video export preferences **************************************************************************/ int DomainFacade::getEncoderApplication() { return animationProject->getEncoderApplication(); } void DomainFacade::setEncoderApplication(int newEA) { animationProject->setEncoderApplication(newEA); } int DomainFacade::getVideoFormat() { return animationProject->getVideoFormat(); } void DomainFacade::setVideoFormat(int newVF) { animationProject->setVideoFormat(newVF); } int DomainFacade::getVideoSize() { return animationProject->getVideoSize(); } void DomainFacade::setVideoSize(int newVS) { animationProject->setVideoSize(newVS); } int DomainFacade::getVideoFps() { return animationProject->getVideoFps(); } void DomainFacade::setVideoFps(int newFps) { animationProject->setVideoFps(newFps); getView()->notifyNewVideoFps(newFps); } bool DomainFacade::getUseDefaultOutputFile() { return animationProject->getUseDefaultOutputFile(); } void DomainFacade::setUseDefaultOutputFile(bool newUDOF) { animationProject->setUseDefaultOutputFile(newUDOF); } const QString DomainFacade::getDefaultOutputFileName() { return animationProject->getDefaultOutputFileName(); } void DomainFacade::setDefaultOutputFileName(const QString newDOFN) { animationProject->setDefaultOutputFileName(newDOFN); } bool DomainFacade::exportToVideo(VideoEncoder *encoder) { return animationProject->exportToVideo(encoder); } bool DomainFacade::exportToCinelerra(const QString file) { return animationProject->exportToCinelerra(file); } /************************************************************************** * Project functions **************************************************************************/ bool DomainFacade::recoverProject() { qDebug() << "DomainFacade::recoverProject --> Start"; bool recovered = false; // Open the history file if (!historyFile->open(QIODevice::ReadOnly | QIODevice::Text)) { // Error frontend->showCritical(tr("Critical"), tr("Can't open history file to recover project!")); return recovered; } // Switch the write history functionality off recovering = true; QTextStream in(historyFile); while (!in.atEnd()) { QString line = in.readLine(); QStringList partStringList = line.split('|'); // // Exposure entries // if (0 == partStringList.at(0).compare("redoExposureAdd")) { // Add a exposure int sceneIndex = partStringList.at(1).toInt(); int takeIndex = partStringList.at(2).toInt(); addExposureToUndo(partStringList.at(4), sceneIndex, takeIndex); continue; } if (0 == partStringList.at(0).compare("redoExposureInsert")) { // Insert a exposure int sceneIndex = partStringList.at(1).toInt(); int takeIndex = partStringList.at(2).toInt(); int exposureIndex = partStringList.at(3).toInt(); insertExposureToUndo(partStringList.at(4), sceneIndex, takeIndex, exposureIndex); continue; } if (0 == partStringList.at(0).compare("redoExposureMove")) { // Move a exposure --> Not implemented Q_ASSERT(1); continue; } if (0 == partStringList.at(0).compare("redoExposureRemove")) { // Remove a exposure int sceneIndex = partStringList.at(1).toInt(); int takeIndex = partStringList.at(2).toInt(); int exposureIndex = partStringList.at(3).toInt(); removeExposureToUndo(sceneIndex, takeIndex, exposureIndex); continue; } if (0 == partStringList.at(0).compare("redoExposureSelect")) { // Select a exposure // int oldSceneIndex = partStringList.at(1).toInt(); // int oldTakeIndex = partStringList.at(2).toInt(); // int oldExposureIndex = partStringList.at(3).toInt(); int newSceneIndex = partStringList.at(4).toInt(); int newTakeIndex = partStringList.at(5).toInt(); int newExposureIndex = partStringList.at(6).toInt(); selectExposureToUndo(newSceneIndex, newTakeIndex, newExposureIndex); continue; } // // Take entries // if (0 == partStringList.at(0).compare("redoTakeAdd")) { // Add a take int sceneIndex = partStringList.at(1).toInt(); addTakeToUndo(partStringList.at(3), sceneIndex); continue; } if (0 == partStringList.at(0).compare("redoTakeInsert")) { // Insert a take int sceneIndex = partStringList.at(1).toInt(); int takeIndex = partStringList.at(2).toInt(); insertTakeToUndo(partStringList.at(3), sceneIndex, takeIndex); continue; } if (0 == partStringList.at(0).compare("redoTakeMove")) { // Move a take --> Not implemented Q_ASSERT(1); continue; } if (0 == partStringList.at(0).compare("redoTakeRemove")) { // Remove a take int sceneIndex = partStringList.at(1).toInt(); int takeIndex = partStringList.at(2).toInt(); removeTakeToUndo(sceneIndex, takeIndex); continue; } if (0 == partStringList.at(0).compare("redoTakeSelect")) { // Select a take // int oldSceneIndex = partStringList.at(1).toInt(); // int oldTakeIndex = partStringList.at(2).toInt(); int newSceneIndex = partStringList.at(3).toInt(); int newTakeIndex = partStringList.at(4).toInt(); selectTakeToUndo(newSceneIndex, newTakeIndex); continue; } // // Scene entries // if (0 == partStringList.at(0).compare("redoSceneAdd")) { // Add a scene addSceneToUndo(partStringList.at(2)); continue; } if (0 == partStringList.at(0).compare("redoSceneInsert")) { // Insert a scene int sceneIndex = partStringList.at(1).toInt(); insertSceneToUndo(partStringList.at(2), sceneIndex); continue; } if (0 == partStringList.at(0).compare("redoSceneMove")) { // Move a scene --> Not implemented Q_ASSERT(1); continue; } if (0 == partStringList.at(0).compare("redoSceneRemove")) { // Remove a scene int sceneIndex = partStringList.at(1).toInt(); removeSceneToUndo(sceneIndex); continue; } if (0 == partStringList.at(0).compare("redoSceneSelect")) { // Select a scene // int oldSceneIndex = partStringList.at(1).toInt(); int newSceneIndex = partStringList.at(2).toInt(); selectSceneToUndo(newSceneIndex); continue; } // // Project entries // if (0 == partStringList.at(0).compare("redoProjectNew")) { // Create the new project newProjectToUndo(partStringList.at(1)); recovered = true; continue; } if (0 == partStringList.at(0).compare("redoProjectOpen")) { // Open project openProjectToUndo(partStringList.at(1)); recovered = true; continue; } // // Undo/redo entries // if (0 == partStringList.at(0).compare("undo")) { // undo the last redo command undoStack->undo(); recovered = true; continue; } if (0 == partStringList.at(0).compare("redo")) { // redo the last undo command undoStack->redo(); recovered = true; continue; } } historyFile->close(); // Switch the write history functionality on recovering = false; frontend->setToolBarState(ToolBar::toolBarCameraOff); qDebug() << "DomainFacade::recoverProject --> End"; return recovered; } void DomainFacade::setProjectSettingsToDefault() { PreferencesTool *pref = frontend->getPreferences(); int value; // Project preferences if (pref->getIntegerPreference("preferences", "defaultrecordingmode", value) == false) { value = 0; } setRecordingMode(value); if (pref->getIntegerPreference("preferences", "defaultvideosource", value) == false) { value = 0; } setVideoSource(value); if (pref->getIntegerPreference("preferences", "defaultmixingmode", value) == false) { value = 0; } setMixMode(value); if (pref->getIntegerPreference("preferences", "defaultmixcount", value) == false) { value = 0; } setMixCount(value); if (pref->getIntegerPreference("preferences", "defaultplaybackcount", value) == false) { value = 0; } setPlaybackCount(value); if (pref->getIntegerPreference("preferences", "defaultunitmode", value) == false) { value = 0; } setUnitMode(value); // Image import preferences if (pref->getIntegerPreference("preferences", "defaultimageformat", value) == false) { value = ImageGrabber::jpegFormat; } setImageFormat(value); if (pref->getIntegerPreference("preferences", "defaultimagequality", value) == false) { value = 100; } setImageQuality(value); if (pref->getIntegerPreference("preferences", "defaultimagesize", value) == false) { value = ImageGrabber::defaultSize; } setImageSize(value); if (pref->getIntegerPreference("preferences", "defaulttransformation", value) == false) { value = 0; } setImageTransformation(value); if (pref->getIntegerPreference("preferences", "defaultimageadjustment", value) == false) { value = ImageGrabber::centerDown; } setImageAdjustment(value); if (pref->getIntegerPreference("preferences", "defaultliveviewfps", value) == false) { value = 20; } setLiveViewFps(value); // Video export preferences if (pref->getIntegerPreference("preferences", "defaultencoderapplication", value) == false) { value = VideoEncoder::noneApplication; } setEncoderApplication(value); if (pref->getIntegerPreference("preferences", "defaultvideoformat", value) == false) { value = VideoEncoder::noneFormat; } setVideoFormat(value); if (pref->getIntegerPreference("preferences", "defaultvideosize", value) == false) { value = VideoEncoder::defaultSize; } setVideoSize(value); if (pref->getIntegerPreference("preferences", "defaultvideofps", value) == false) { value = 12; } setVideoFps(value); if (pref->getIntegerPreference("preferences", "defaultusedefaultoutputfile", value) == false) { value = false; } setUseDefaultOutputFile(value); } void DomainFacade::newProjectToUndo(const QString &projectDescription) { UndoProjectNew *u = new UndoProjectNew(this, projectDescription); getUndoStack()->push(u); } void DomainFacade::newProject(const QString &projectDescription) { Q_ASSERT(NULL == animationProject); animationProject = new AnimationProject(frontend); animationProject->newProject(projectDescription); } void DomainFacade::newProject(AnimationProject *project) { Q_ASSERT(NULL == animationProject); animationProject = project; } void DomainFacade::openProjectToUndo(const QString &projectPath) { UndoProjectOpen *u = new UndoProjectOpen(this, projectPath); getUndoStack()->push(u); } bool DomainFacade::openProject(const QString &projectPath) { Q_ASSERT(NULL == animationProject); animationProject = new AnimationProject(frontend); return animationProject->openProject(projectPath); } void DomainFacade::openProject(AnimationProject *project) { Q_ASSERT(NULL == animationProject); animationProject = project; } void DomainFacade::saveProject(const QString &projectPath, bool saveAs) { qDebug() << "DomainFacade::saveProject --> Start"; Q_ASSERT(NULL != animationProject); bool ret; ret = animationProject->saveProject(projectPath, saveAs); if (ret) { clearUndoStack(); removeHistoryFile(); writeHistoryEntry(QString("%1%2") .arg(QLatin1String("redoProjectOpen|")) .arg(projectPath)); } qDebug() << "DomainFacade::saveProject --> End"; } void DomainFacade::closeProject() { qDebug() << "DomainFacade::closeProject --> Start"; Q_ASSERT(NULL != animationProject); delete animationProject; animationProject = NULL; clearUndoStack(); removeHistoryFile(); frontend->removeApplicationFiles(); getView()->notifyRemoveProject(); qDebug() << "DomainFacade::closeProject --> End"; } AnimationProject *DomainFacade::removeProject() { Q_ASSERT(NULL != animationProject); AnimationProject *oldProject = animationProject; animationProject = NULL; return oldProject; } /************************************************************************** * Scene functions **************************************************************************/ int DomainFacade::getActiveSceneIndex() { return animationProject->getActiveSceneIndex(); } Scene *DomainFacade::getActiveScene() { return animationProject->getActiveScene(); } int DomainFacade::getSceneSize() { return animationProject->getSceneSize(); } Scene *DomainFacade::getScene(int sceneIndex) { return animationProject->getScene(sceneIndex); } int DomainFacade::getSceneTakeSize(int sceneIndex) { return animationProject->getSceneTakeSize(sceneIndex); } int DomainFacade::getSceneExposureSize(int sceneIndex) { return animationProject->getSceneExposureSize(sceneIndex); } int DomainFacade::getSceneTakeExposureSize(int sceneIndex, int takeIndex) { return animationProject->getSceneTakeExposureSize(sceneIndex, takeIndex); } void DomainFacade::addSceneToUndo(const QString &sceneDescription) { UndoSceneAdd *u = new UndoSceneAdd(this, sceneDescription); getUndoStack()->push(u); } void DomainFacade::insertSceneToUndo(const QString &sceneDescription, int sceneIndex) { UndoSceneInsert *u = new UndoSceneInsert(this, sceneDescription, sceneIndex); getUndoStack()->push(u); } void DomainFacade::removeSceneToUndo(int sceneIndex) { UndoSceneRemove *u = new UndoSceneRemove(this, sceneIndex); getUndoStack()->push(u); } void DomainFacade::moveSceneToUndo(int fromSceneIndex, int toSceneIndex) { UndoSceneMove *u = new UndoSceneMove(this, fromSceneIndex, toSceneIndex); getUndoStack()->push(u); } void DomainFacade::selectSceneToUndo(int newSceneIndex) { UndoSceneSelect *u = new UndoSceneSelect(this, newSceneIndex); getUndoStack()->push(u); } /************************************************************************** * Scene sound functions **************************************************************************/ int DomainFacade::addSoundToScene(int sceneIndex, const QString filename, const QString soundName) { return animationProject->addSoundToScene(sceneIndex, filename, soundName); } void DomainFacade::removeSoundFromScene(int sceneIndex, int soundNumber) { animationProject->removeSoundFromScene(sceneIndex, soundNumber); } void DomainFacade::playSound(int sceneIndex) { animationProject->playSound(sceneIndex); } /************************************************************************** * Take functions **************************************************************************/ int DomainFacade::getActiveTakeIndex() { return animationProject->getActiveTakeIndex(); } Take *DomainFacade::getActiveTake() { return animationProject->getActiveTake(); } Take *DomainFacade::getTake(int sceneIndex, int takeIndex) { return animationProject->getTake(sceneIndex, takeIndex); } int DomainFacade::getTakeExposureSize(int sceneIndex, int takeIndex) { return animationProject->getTakeExposureSize(sceneIndex, takeIndex); } void DomainFacade::addTakeToUndo(const QString &takeDescription, int sceneIndex) { UndoTakeAdd *u = new UndoTakeAdd(this, takeDescription, sceneIndex); getUndoStack()->push(u); } void DomainFacade::insertTakeToUndo(const QString &takeDescription, int sceneIndex, int takeIndex) { UndoTakeInsert *u = new UndoTakeInsert(this, takeDescription, sceneIndex, takeIndex); getUndoStack()->push(u); } void DomainFacade::removeTakeToUndo(int sceneIndex, int takeIndex) { UndoTakeRemove *u = new UndoTakeRemove(this, sceneIndex, takeIndex); getUndoStack()->push(u); } void DomainFacade::moveTakeToUndo(int fromSceneIndex, int fromTakeIndex, int toSceneIndex, int toTakeIndex) { UndoTakeMove *u = new UndoTakeMove(this, fromSceneIndex, fromTakeIndex, toSceneIndex, toTakeIndex); getUndoStack()->push(u); } void DomainFacade::selectTakeToUndo(int newSceneIndex, int newTakeIndex) { UndoTakeSelect *u = new UndoTakeSelect(this, newSceneIndex, newTakeIndex); getUndoStack()->push(u); } /************************************************************************** * Exposure functions **************************************************************************/ int DomainFacade::getActiveExposureIndex() { int activeExposureIndex = animationProject->getActiveExposureIndex(); return activeExposureIndex; } Exposure *DomainFacade::getActiveExposure() { return animationProject->getActiveExposure(); } Exposure *DomainFacade::getExposure(int sceneIndex, int takeIndex, int exposureIndex) { Q_ASSERT(sceneIndex > -1); Q_ASSERT(takeIndex > -1); Q_ASSERT(exposureIndex > -1); return animationProject->getExposure(sceneIndex, takeIndex, exposureIndex); } int DomainFacade::getTotalExposureSize() { return animationProject->getTotalExposureSize(); } void DomainFacade::addExposureToUndo(const QString &filePath, int sceneIndex, int takeIndex) { Exposure::tempNumber++; UndoExposureAdd *u = new UndoExposureAdd(this, filePath, sceneIndex, takeIndex); getUndoStack()->push(u); } void DomainFacade::addExposureToUndo(const QImage &rawImage, int sceneIndex, int takeIndex) { QString newFileName; newFileName = copyToTemp(rawImage); UndoExposureAdd *u = new UndoExposureAdd(this, newFileName, sceneIndex, takeIndex); getUndoStack()->push(u); } void DomainFacade::insertExposureToUndo(const QString &filePath, int sceneIndex, int takeIndex, int exposureIndex) { Exposure::tempNumber++; UndoExposureInsert *u = new UndoExposureInsert(this, filePath, sceneIndex, takeIndex, exposureIndex); getUndoStack()->push(u); } void DomainFacade::insertExposureToUndo(const QImage &rawImage, int sceneIndex, int takeIndex, int exposureIndex) { QString newFileName; newFileName = copyToTemp(rawImage); UndoExposureInsert *u = new UndoExposureInsert(this, newFileName, sceneIndex, takeIndex, exposureIndex); getUndoStack()->push(u); } void DomainFacade::removeExposureToUndo(int sceneIndex, int takeIndex, int exposureIndex) { UndoExposureRemove *u = new UndoExposureRemove(this, sceneIndex, takeIndex, exposureIndex); getUndoStack()->push(u); } void DomainFacade::moveExposureToUndo(int fromSceneIndex, int fromTakeIndex, int fromExposureIndex, int toSceneIndex, int toTakeIndex, int toExposureIndex) { UndoExposureMove *u = new UndoExposureMove(this, fromSceneIndex, fromTakeIndex, fromExposureIndex, toSceneIndex, toTakeIndex, toExposureIndex); getUndoStack()->push(u); } void DomainFacade::selectExposureToUndo(int newSceneIndex, int newTakeIndex, int newExposureIndex) { UndoExposureSelect *u = new UndoExposureSelect(this, newSceneIndex, newTakeIndex, newExposureIndex); getUndoStack()->push(u); } bool DomainFacade::getModifyedExposure(const QString &filePath, int &modSceneIndex, int &modTakeIndex, int &modExposureIndex) { return animationProject->getModifyedExposure(filePath, modSceneIndex, modTakeIndex, modExposureIndex); } /************************************************************************** * Private functions **************************************************************************/ const QString DomainFacade::copyToTemp(const QImage &rawImage) { bool ret; qDebug() << "DomainFacade::copyToTemp --> Start"; // creates a new image name QString toImageName(QString("%1%2%3") .arg(QLatin1String("tmp_")) .arg(Exposure::tempNumber) .arg(QLatin1String("."))); switch (animationProject->getImageFormat()) { case ImageGrabber::jpegFormat: toImageName.append(PreferencesTool::jpegSuffix); break; case ImageGrabber::tiffFormat: toImageName.append(PreferencesTool::tiffSuffix); break; case ImageGrabber::bmpFormat: toImageName.append(PreferencesTool::bmpSuffix); break; } // creates a new image path QString toImagePath; toImagePath.append(frontend->getTempDirName()); toImagePath.append(QLatin1String("/")); toImagePath.append(toImageName); // Copy file to temp directory switch (animationProject->getImageFormat()) { case ImageGrabber::jpegFormat: ret = rawImage.save(toImagePath, "JPEG", 100); break; case ImageGrabber::tiffFormat: ret = rawImage.save(toImagePath, "TIFF", 100); break; case ImageGrabber::bmpFormat: ret = rawImage.save(toImagePath, "BMP", 100); break; } if (!ret) { // Not successful frontend->showCritical(tr("Critical"), tr("Can't copy image to temp directory!")); } Exposure::tempNumber++; qDebug() << "DomainFacade::copyToTemp --> End"; return toImageName; } qstopmotion-2.3.2-Source/src/domain/domainfacade.h000644 000000 000000 00000070143 13011043104 022120 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef DOMAINFACADE_H #define DOMAINFACADE_H #include #include #include #include #include #include #include "domain/animation/animationproject.h" #include "frontends/frontend.h" // #include "frontends/viewfacade.h" #include "technical/videoencoder/videoencoder.h" class AnimationProject; class Frontend; class Scene; class Take; class Exposure; class ViewFacade; /** * Singleton facade for the domain level. All requests into the domain layer * has to pass through this facade. The only exception is observer requests * for display data. * * DomainFacade is implemented with lazy allocation. * *@author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class DomainFacade : public QObject { Q_OBJECT public: /** * The constructor. It is protected so that it will be impossible for other classes, * which don't inherit from it to instanciate the singleton. * @param f the GUI frontend */ DomainFacade(Frontend *f); /** * Destructor */ ~DomainFacade(); /** * Retrieves the registered frontend. * @return the frontend if it is a valid frontend pointer, NULL otherwise. */ Frontend* getFrontend(); /** * Get the view facade. */ ViewFacade* getView(); /** * Is the project in recovering mode */ bool isRecovering(); /************************************************************************** * Audio functions **************************************************************************/ /** * Initializes the audio device so it is ready to play sounds. It will sends * an error message to the frontend if somethings goes wrong, and audio will * be disabled until the problem is fixed. * @return true on success, false otherwise */ bool initAudioDevice(); /** * Shutdowns the audio device so other programs can use it. */ void shutdownAudioDevice(); /************************************************************************** * Undo functions **************************************************************************/ /** * Get the undo stack. * @return The undo stack. */ QUndoStack* getUndoStack(); /** * Clears the undo stack and erase the history file. */ void clearUndoStack(); /** * Write a entry to the history file */ void writeHistoryEntry(const QString &entry); /** * Remove the history file and all of its content. * @return True if successful; otherwise fale. */ void removeHistoryFile(); /************************************************************************** * Animation functions **************************************************************************/ /** * Retrieves the animation model. * @return the animation model. */ AnimationProject* getAnimationProject(); /** * Checks if there are unsaved changes in the settings of the project. * @return true if there are unsaved changes, false otherwise. */ bool isProjectSettingsChanges(); /** * Checks if there are unsaved changes in the animation of the project. * @return true if there are unsaved changes, false otherwise. */ bool isProjectAnimationChanges(); /** * Checks if there are a active project. * @return true if there are a active project, false otherwise. */ bool isActiveProject(); /** * Retrieves the new project file path. * @return the project file path if it's set, NULL otherwise. */ const QString getNewProjectFilePath(); /** * Retrieves the new project path. * @return the project path if it's set, NULL otherwise. */ const QString getNewProjectPath(); /** * Retrieves the project description. * @return the project description if it's set, NULL otherwise. */ const QString getProjectDescription(); /************************************************************************** * Project preferences **************************************************************************/ /** * Get the active recording mode of the project. * @return active recording mode. */ int getRecordingMode(); /** * Set the active recording mode of the project. * @param newRecordingMode The new recording mode. */ void setRecordingMode(int newRecordingMode); /** * Get the active video source of the project. * @return active video source. */ int getVideoSource(); /** * Set the active video source of the project. * @param newVideoSource the new active source. */ void setVideoSource(int newVideoSource); /** * Get the active video resolution of the project. * @return active video resolution. */ int getResolution(); /** * Set the active video resolution of the project. * @param newVideoSource the new active resolution. */ void setResolution(int newResolution); /** * Convert all images of the current project to a new image file format. * @param newFormat The new format of the images. * @param newQuality The new quality value of the images. * @return true if all images are converted to the new image format. */ bool convertImages(int newFormat, int newQuality); /** * Get the active mixing mode of the project. * @return active mixing mode. */ int getMixMode(); /** * Set the active mix mode of the project. * @param newMixMode the new mix mode. */ void setMixMode(int newMixMode); /** * Get the active mix count of the project. * @return active mix count. */ int getMixCount(); /** * Set the active mix count of the project. * @param newSource the new mix count source. */ void setMixCount(int newMixCount); /** * Get the active playback count of the project. * @return active playback count. */ int getPlaybackCount(); /** * Set the active playback count of the project. * @param newPlaybackCount the new playback count source. */ void setPlaybackCount(int newPlaybackCount); /** * Get the active unit of the project. * @return active unit mode. */ int getUnitMode(); /** * Set the active unit mode of the project. * @param newUnitMode the new unit mode. */ void setUnitMode(int newUnitMode); /** * Get the overlay intensity value. * @return The overlay intensity value. */ int getOverlayIntensity(); /** * Set the overlay intensity value of the project. * @param overlay The new overlay intensity value. */ void setOverlayIntensity(int overlay); /************************************************************************** * Image import preferences **************************************************************************/ /** * Get the image format of the project. * @return image format. */ int getImageFormat(); /** * Set the image format of the project. * @param newVF The new image format. */ void setImageFormat(int newVF); /** * Get the image quality of the project. * @return image quality value. */ int getImageQuality(); /** * Set the image quality of the project. * @param newValue The new image quality value. */ void setImageQuality(int newValue); /** * Get the image size of the project. * @return image size. */ int getImageSize(); /** * Set the image size of the project. * @param newVS The new image size. */ void setImageSize(int newVS); /** * Get the transformation value of the project. * @return Transformation value. */ int getImageTransformation(); /** * Set the transformation value of the project. * @param newTransform The new transformation value. */ void setImageTransformation(int newTransform); /** * Get the image adjustment of the project. * @return Image adjustment. */ int getImageAdjustment(); /** * Set the image adjustment of the project. * @param newIA The new image adjustment. */ void setImageAdjustment(int newIA); /** * Get the zoom value of the project. * @return Zoom value. */ int getZoomValue(); /** * Set the zoom value of the project. * @param newZV The new zoom value. */ void setZoomValue(int newZV); /** * Get the live view fps of the project. * @return live view fps value. */ int getLiveViewFps(); /** * Set the live view fps of the project. * @param newValue The new live view fps value. */ void setLiveViewFps(int newValue); /************************************************************************** * Video export preferences **************************************************************************/ /** * Get the encoder application of the project. * @return Encoder application. */ int getEncoderApplication(); /** * Set the encoder application of the project. * @param newEA The new encoder application. */ void setEncoderApplication(int newEA); /** * Get the video format of the project. * @return Video format. */ int getVideoFormat(); /** * Set the video format of the project. * @param newVF The new video format. */ void setVideoFormat(int newVF); /** * Get the video size of the project. * @return Video size. */ int getVideoSize(); /** * Set the video size of the project. * @param newVS The new video size. */ void setVideoSize(int newVS); /** * Get the video frames per second of the project. * @return The video frames per second. */ int getVideoFps(); /** * Set the video frames per second of the project. * @param newFPS The new video frames per second. */ void setVideoFps(int newFPS); /** * Get the use default output file flag of the project. * @return Use default output file flag. */ bool getUseDefaultOutputFile(); /** * Set the use default output file flag of the project. * @param newUDOF The new use default output file flag. */ void setUseDefaultOutputFile(bool newUDOF); /** * Get the default output file name of the project. * @return Default output file name. */ const QString getDefaultOutputFileName(); /** * Set the default output file name of the project. * @param newDOFN The new default output file name. */ void setDefaultOutputFileName(const QString newDOFN); /** * Exports the current project to a video file as specified by the video encoder. * @param encoder the video encoder to use for export to video * @return true on success, false otherwise */ bool exportToVideo(VideoEncoder *encoder); /** * Exports the current project to a cinelerra-cv project. * @param file the cinelerra-cv project file * @return true on success, false otherwise */ bool exportToCinelerra(const QString file); /************************************************************************** * Project functions **************************************************************************/ /** * Recover the last changes after a crash. * @return true if an crashed project is recovered */ bool recoverProject(); /** * Set all settings to the actual default settings. */ void setProjectSettingsToDefault(); /** * Add a new newProject object to the undo history. * @param projectDescription the description of the scene or a empty string. */ void newProjectToUndo(const QString &projectDescription); /** * Create a new project. * @param projectDescription the description of the scene or a empty string. */ void newProject(const QString &projectDescription); /** * Create a existing project. * @param project The existing project. */ void newProject(AnimationProject *project); /** * Add a new openProject object to the undo history. * @param projectPath the path to the project file. */ void openProjectToUndo(const QString &projectPath); /** * Open an project. * @param projectPath the path to the project file. * @return true on success, false otherwise */ bool openProject(const QString &projectPath); /** * Open an existing project. * @param project The existing project. */ void openProject(AnimationProject *project); /** * Save the project. * @param projectPath the path to the project file. * @param saveAs this is a save as operation. */ void saveProject(const QString &projectPath, bool saveAs); /** * Close the project. */ void closeProject(); /** * Remove the animation project from the facade. */ AnimationProject *removeProject(); /************************************************************************** * Scene functions **************************************************************************/ /** * Returns the index of the currently active scene. * @return the index of the active scene. */ int getActiveSceneIndex(); /** * Return the active scene. * @return the active scene. */ Scene *getActiveScene(); /** * Function for retrieving number of scenes. * @return number of scenes */ int getSceneSize(); /** * Function for retrieving a given scene. * @param sceneIndex the scene number * @return scene */ Scene *getScene(int sceneIndex); /** * Returns the take size of the scene. * @param sceneIndex the index of the scene. * @return the take size of the scene. */ int getSceneTakeSize(int sceneIndex); /** * Returns the exposure size of the scene. * @arg sceneIndex index of the scene the exposure size to get. * @return the exposure size of the scene. */ int getSceneExposureSize(int sceneIndex); /** * Returns the exposure size of the take of the scene. * @arg sceneIndex index of the scene of the take the exposure size to get. * @arg takeIndex index of the take the exposure size to get. * @return the exposure size of the scene. */ int getSceneTakeExposureSize(int sceneIndex, int takeIndex); /** * Add a new addScene object to the undo history. * @param sceneDescription the description of the scene or a empty string. */ void addSceneToUndo(const QString &sceneDescription); /** * Add a new insert scene object to the undo history. * @param sceneDescription the description of the scene or a empty string. * @param sceneIndex The index of the scene where the new scene is inserted bevor. */ void insertSceneToUndo(const QString &sceneDescription, int sceneIndex); /** * Add a remove scene object to the undo history. * @param sceneIndex the index of the scene to retrieve. */ void removeSceneToUndo(int sceneIndex); /** * Add a move scene object to the undo history. * @param fromSceneIndex the index of the scene to move. * @param toSceneIndex the position to move the scene to. */ void moveSceneToUndo(int fromSceneIndex, int toSceneIndex); /** * Add a select scene object to the undo history. * @param newSceneIndex the position to move the scene to. */ void selectSceneToUndo(int newSceneIndex); /************************************************************************** * Scene sound functions **************************************************************************/ /** * Adds a sound the given frame number. An error message will be * sent to the frontend if somethings goes wrong with the adding. * @param frameNumber the number of the frame to add the sound to * @param filename the path to the file with the sound * @param soundName the new name of the sound. * @return zero on success, less than zero on failure */ int addSoundToScene(int sceneIndex, const QString filename, const QString soundName); /** * Removes the sound with index soundNumber from the frame with index * frameNumber. * @param frameNumber the index of the frame to remove a sound from. * @param soundNumber the index of the sound to remove from the frame. */ void removeSoundFromScene(int sceneIndex, int soundNumber); /** * Plays the sound of the scene with the index sceneIndex * @param sceneIndex the index of the scene to play */ void playSound(int sceneIndex); /************************************************************************** * Take functions **************************************************************************/ /** * Retrieving the index of the currently active take. * @return the index of the active take. */ int getActiveTakeIndex(); /** * Return the active take from the active scene. * @return the active take. */ Take *getActiveTake(); /** * Function for retrieving a given take of a given scene. * @param sceneIndex the index of the scene. * @param takeIndex the index of the take. * @return take */ Take *getTake(int sceneIndex, int takeIndex); /** * Returns the exposure size of the take. * @param sceneIndex the index of the scene. * @param takeIndex the index of the take. * @return the exposure size of the take. */ int getTakeExposureSize(int sceneIndex, int takeIndex); /** * Add a new add take object to the undo history. * @param takeDescription the description of the take or a empty string. * @param sceneIndex the index of the scene the take to add */ void addTakeToUndo(const QString &takeDescription, int sceneIndex); /** * Add a new insert take object to the undo history. * @param takeDescription The description of the take or a empty string. * @param sceneIndex The index of the scene the take to add * @param takeIndex The index of the take where the new take is inserted bevor. */ void insertTakeToUndo(const QString &takeDescription, int sceneIndex, int takeIndex); /** * Removes the active take from the animation. * @param sceneIndex the index of the scene to retrieve the take from. * @param takeIndex the index of the take to retrieve. */ void removeTakeToUndo(int sceneIndex, int takeIndex); /** * Add a new move take object to the undo history. * @param fromSceneIndex the index of the scene of the take to move. * @param fromTakeIndex the index of the take to move. * @param toSceneIndex the index of the scene of move the take to. * @param toTakeIndex the index to move the take to. */ void moveTakeToUndo(int fromSceneIndex, int fromTakeIndex, int toSceneIndex, int toTakeIndex); /** * Add a new select take object to the undo history. * @param newSceneIndex the new index of the scene of the take. * @param newTakeIndex the new index of the take. */ void selectTakeToUndo(int newSceneIndex, int newTakeIndex); /************************************************************************** * Exposure functions **************************************************************************/ /** * Retrieving the index of the currently active exposure. * @return the index of the active exposure. */ int getActiveExposureIndex(); /** * Return the active exposure from the active scene and active take. * @return the actual exposure. */ Exposure *getActiveExposure(); /** * Return the exposure with the given scene index, take index and exposure index. * @param sceneIndex the index of the scene to retrieve the exposure from. * @param takeIndex the index of the take to retrieve the exposure from. * @param exposureIndex the index of the exposure to retrieve * @return the exposure to retrieve. */ Exposure *getExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Retrieves the size of the model * @return the size of the model */ int getTotalExposureSize(); /** * Creates a new addExposure object in the undo history. * @param filePath the file path to the image file of the exposure. * @param sceneIndex the index of the scene of the take the exposure to add * @param takeIndex the index of the take the exposure to add */ void addExposureToUndo(const QString &filePath, int sceneIndex, int takeIndex); /** * Creates a new addExposure object in the undo history. * Save the image to the temp path. * @param rawImage the image of the exposure. * @param sceneIndex the index of the scene of the take the exposure to add * @param takeIndex the index of the take the exposure to add */ void addExposureToUndo(const QImage &rawImage, int sceneIndex, int takeIndex); /** * Creates a new insertExposure object in the undo history. * @param filePath the file path of the image file of the exposure or a empty string. * @param sceneIndex the index of the scene of the take the exposure to add * @param takeIndex the index of the take the exposure to add * @param exposureIndex The index of the exposure where the new exposures are inserted bevor. */ void insertExposureToUndo(const QString &filePath, int sceneIndex, int takeIndex, int exposureIndex); /** * Creates a new insertExposure object in the undo history. * Save the image to the temp path. * @param rawImage the image of the exposure or a empty string. * @param sceneIndex the index of the scene of the take the exposure to add * @param takeIndex the index of the take the exposure to add * @param exposureIndex The index of the exposure where the new exposures are inserted bevor. */ void insertExposureToUndo(const QImage &rawImage, int sceneIndex, int takeIndex, int exposureIndex); /** * Add a new remove exposure object to the undo history. * @param sceneIndex the index of the scene of the exposure to remove * @param takeIndex the index of the take of the exposure to remove * @param exposureIndex the index of the exposure to remove */ void removeExposureToUndo(int sceneIndex, int takeIndex, int exposureIndex); /** * Add a new move exposure object to the undo history. * @param fromSceneIndex the from index of the scene of the take of the exposure to move * @param fromTakeIndex the from index of the take of the exposure to move * @param fromExposureIndex the from index of the exposure to move * @param toSceneIndex the to index of the scene of the take of the exposure to move * @param toTakeIndex the to index of the take of the exposure to move * @param toExposureIndex the to index of the exposure to move */ void moveExposureToUndo(int fromSceneIndex, int fromTakeIndex, int fromExposureIndex, int toSceneIndex, int toTakeIndex, int toExposureIndex); /** * Add a new select exposure object to the undo history. * @param newSceneIndex the new index of the scene of the take of the exposure to select * @param newTakeIndex the new index of the take of the exposure to select * @param newExposureIndex the new index of the exposure to select */ void selectExposureToUndo(int newSceneIndex, int newTakeIndex, int newExposureIndex); /** * Get the position of the modified exposure in the project. * @param filePath The path to the modified exposure. * @param modSceneIndex the index of the scene of the take of the modified exposure. * @param modTakeIndex the index of the take of the modified exposure. * @param modExposureIndex the index of the modified exposure. * @return True if the exposure is found and false else. */ bool getModifyedExposure(const QString &filePath, int &modSceneIndex, int &modTakeIndex, int &modExposureIndex); /************************************************************************** * Private functions **************************************************************************/ private: /** * Copies the files belonging to this Exposure to a temporary directory. * @param rawImage the image to copy. * @return the file name of the new file. */ const QString copyToTemp(const QImage &rawImage); /************************************************************************** * Private members **************************************************************************/ private: /** * The frontend in the program */ Frontend *frontend; /** * The animation project in the program */ AnimationProject *animationProject; /** * Path of the history file. */ QString historyFilePath; /** * The history file. */ QFile *historyFile; /** * Flag to indicate that recovery is running. */ bool recovering; /** * Container where one can register and retrieve undo objects for undo and * remove operations. */ QUndoStack *undoStack; }; #endif qstopmotion-2.3.2-Source/src/domain/animation/scene.cpp000644 000000 000000 00000056163 12654352322 023163 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "scene.h" #include #include #include #include #include "domain/domainfacade.h" #include "technical/preferencestool.h" Scene::Scene(AnimationProject *project) { parent = project; activeTakeIndex = -1; nextTakeIndex = 0; isProjectFile = false; soundsNumber = 0; soundStartPosition = 0; } Scene::~Scene() { unsigned int soundSize = sounds.size(); for (unsigned int soundIndex = 0; soundIndex < soundSize; ++soundIndex) { delete sounds[soundIndex]; sounds[soundIndex] = NULL; } sounds.clear(); unsigned int takeSize = takes.size(); for (unsigned int takeIndex = 0; takeIndex < takeSize; ++takeIndex) { delete takes[takeIndex]; takes[takeIndex] = NULL; } takes.clear(); } bool Scene::isEmpty() { return takes.isEmpty(); } const QString Scene::getId() const { return id; } void Scene::setId(const QString &newId) { if (!newId.isEmpty()) { id.clear(); id.append(newId); } } const QString Scene::getDescription() const { return description; } void Scene::setDescription(const QString &newDescription) { if (!newDescription.isEmpty()) { description.clear(); description.append(newDescription); } } const QString Scene::getNewImagePath() const { return parent->getNewImagePath(); } const QString Scene::getOldImagePath() const { return parent->getOldImagePath(); } AnimationProject* Scene::getParent() { return this->parent; } unsigned int Scene::getIndex() { unsigned int index; index = parent->getSceneIndex(this); return index; } Frontend* Scene::getFrontend() { return this->parent->getFrontend(); } void Scene::markAsProjectFile() { isProjectFile = true; } bool Scene::readDataFromProject(QDomElement &sceneNode) { qDebug() << "Scene::readDataFromProject --> Start"; QString activeTakeId; id.append(sceneNode.attributeNode(QLatin1String("id")).value()); description.append(sceneNode.attributeNode(QLatin1String("descr")).value()); QDomElement currElement = sceneNode.firstChildElement(); while (!currElement.isNull()) { QString elementName = currElement.nodeName(); if (elementName.compare("take") == 0) { // This is a take data element Take *newTake = new Take(this); takes.append(newTake); if (!newTake->readDataFromProject(currElement)) { qWarning() << "Scene::readDataFromProject --> Read take data failed"; return false; } } else if (currElement.nodeName().compare("activetake") == 0) { activeTakeId.clear(); activeTakeId.append(currElement.text()); } else if (currElement.nodeName().compare("nexttake") == 0) { nextTakeIndex = currElement.text().toUInt(); } else if (elementName.compare("sound") == 0) { if (!readSoundFromProject(currElement)) { qWarning() << "Scene::readDataFromProject --> Read sound data failed"; return false; } } currElement = currElement.nextSiblingElement(); } // Search the active take with the readed id. int takeSize = takes.size(); for ( int takeIndex = 0; takeIndex < takeSize; takeIndex++) { if (takes[takeIndex]->getId().compare(activeTakeId) == 0) { activeTakeIndex = takeIndex; break; } } // Compatibility for old project files. if (nextTakeIndex == 0) { nextTakeIndex = takeSize; } this->isProjectFile = true; qDebug() << "Scene::readDataFromProject --> End"; return true; } bool Scene::saveDataToProject(QDomDocument &doc, QDomElement &sceneNode) { qDebug() << "Scene::saveDataToProject --> Start"; unsigned int takeSize = takes.size(); unsigned int takeIndex; // Save scene attributes sceneNode.setAttribute("id", id); sceneNode.setAttribute("descr", description); // Save takes for (takeIndex = 0; takeIndex < takeSize; ++takeIndex) { QDomElement takeElement = doc.createElement("take"); sceneNode.appendChild(takeElement); if (!takes[takeIndex]->saveDataToProject(doc, takeElement)) { qWarning() << "Scene::saveDataToProject --> Save take data failed"; return false; } } if (activeTakeIndex >= 0) { // Save activeTakeIndex parameter after the takes, because the names of // the takes are modifyed during the writing of the project file. QDomElement atiElement = doc.createElement("activetake"); QDomText atiText = doc.createTextNode(takes[activeTakeIndex]->getId()); atiElement.appendChild(atiText); sceneNode.appendChild(atiElement); // Save nextTakeIndex parameter. QDomElement leiElement = doc.createElement("nexttake"); QDomText leiText = doc.createTextNode(QString("%1").arg(takeSize)); leiElement.appendChild(leiText); sceneNode.appendChild(leiElement); } // Sounds if (!saveSoundToProject(doc, sceneNode)) { qWarning() << "Scene::saveDataToProject --> Save sound data failed"; return false; } this->isProjectFile = true; qDebug() << "Scene::saveDataToProject --> End"; return true; } const QString Scene::getAppTempDirName() const { return parent->getAppTempDirName(); } /************************************************************************** * Take functions **************************************************************************/ int Scene::getActiveTakeIndex() const { return activeTakeIndex; } int Scene::getTakeIndex(Take *take) const { int index; index = takes.indexOf(take); return index; } void Scene::setActiveTakeIndex(int takeIndex) { qDebug() << "Scene::setActiveTakeIndex --> Start"; // The new take index can be the same as the active take index // if the active take is removed from the take vector // Q_ASSERT(takeIndex != activeTakeIndex); this->activeTakeIndex = takeIndex; qDebug() << "Scene::setActiveTakeIndex --> End"; } Take *Scene::getActiveTake() { Q_ASSERT(activeTakeIndex > -1); return takes[activeTakeIndex]; } void Scene::setActiveTake(Take *newTake) { qDebug() << "Scene::setActiveTake --> Start"; // Check the actual scene index parent->setActiveScene(this); int takeSize = takes.size(); int takeIndex; Take *newActiveTake; for (takeIndex = 0; takeIndex < takeSize; ++takeIndex) { newActiveTake = takes[takeIndex]; if (newActiveTake == newTake) { break; } } Q_ASSERT(takeIndex != takeSize); if (takeIndex != activeTakeIndex) { this->activeTakeIndex = takeIndex; } qDebug() << "Scene::setActiveTake --> End"; } int Scene::getTakeSize() const { return takes.size(); } Take* Scene::getTake(unsigned int takeIndex) { return takes[takeIndex]; } void Scene::addTake(const QString &takeDescription) { qDebug() << "Scene::addTake(new) --> Start"; Take *take = new Take(this); take->setId(QString("%1").arg(nextTakeIndex, 2, 10, QLatin1Char('0'))); nextTakeIndex++; if (!takeDescription.isEmpty()) { take->setDescription(takeDescription); } takes.append(take); qDebug() << "Scene::addTake(new) --> End"; } void Scene::addTake(Take *take) { qDebug() << "Scene::addTake(exist) --> Start"; takes.append(take); qDebug() << "Scene::addTake(exist) --> End"; } void Scene::insertTake(int takeIndex, const QString &takeDescription) { qDebug() << "Scene::insertTake(new) --> Start"; Q_ASSERT(takeIndex > -1); Q_ASSERT(takeIndex < getTakeSize()); Take *take = new Take(this); take->setId(QString("%1").arg(nextTakeIndex, 2, 10, QLatin1Char('0'))); nextTakeIndex++; if (!takeDescription.isEmpty()) { take->setDescription(takeDescription); } takes.insert(takeIndex, take); if (takeIndex <= activeTakeIndex) { setActiveTakeIndex(activeTakeIndex+1); } qDebug() << "Scene::insertTake(new) --> End"; } void Scene::insertTake(int takeIndex, Take *take) { qDebug() << "Scene::insertTake(exist) --> Start"; Q_ASSERT(takeIndex > -1); Q_ASSERT(takeIndex < getTakeSize()); takes.insert(takeIndex, take); if (takeIndex <= activeTakeIndex) { setActiveTakeIndex(activeTakeIndex+1); } qDebug() << "Scene::insertTake(exist) --> End"; } void Scene::moveTake(int takeIndex, int movePosition) { if (takeIndex != movePosition) { this->setActiveTakeIndex(-1); Take *take = takes[takeIndex]; takes.remove(takeIndex); takes.insert(movePosition, take); // this->notifyMoveScene(takeIndex, movePosition); } } Take *Scene::removeTake(int takeIndex) { qDebug() << "Scene::removeTake --> Start"; Q_ASSERT(takeIndex != activeTakeIndex); if (takeIndex < activeTakeIndex) { // Take bevor the active take will be removed setActiveTakeIndex(activeTakeIndex-1); Q_ASSERT(-1 < activeTakeIndex); } Take *removedTake = takes[takeIndex]; takes.remove(takeIndex); qDebug() << "Scene::removeTake --> End"; return removedTake; } /************************************************************************** * Exposure functions **************************************************************************/ int Scene::getActiveExposureIndex() const { Q_ASSERT(activeTakeIndex >= 0); Take *activeTake = takes[activeTakeIndex]; int activeExposureIndex = activeTake->getActiveExposureIndex(); return activeExposureIndex; } void Scene::setActiveExposureIndex(int exposureIndex) { if (0 > activeTakeIndex) { // No active take --> nothing to do return; } takes[activeTakeIndex]->setActiveExposureIndex(exposureIndex); } unsigned int Scene::getExposureSize() const { unsigned int exposureNumber = 0; unsigned int numElem = takes.size(); for (unsigned int i = 0; i < numElem; ++i) { exposureNumber += takes[i]->getExposureSize(); } return exposureNumber; } Exposure* Scene::getExposure(unsigned int takeIndex, unsigned int exposureIndex) { return takes[takeIndex]->getExposure(exposureIndex); } void Scene::getExposures(QVector& allExposures) { unsigned int numTakes = takes.size(); for (unsigned int countTake = 0; countTake < numTakes; ++countTake) { unsigned int numExpos = takes[countTake]->getExposureSize(); for (unsigned int countExpo = 0; countExpo < numExpos; ++countExpo) { allExposures.append(takes[countTake]->getExposure(countExpo)); } } } void Scene::addExposure(int takeIndex, const QString &fileName, int location) { getTake(takeIndex)->addExposure(fileName, location); } void Scene::addExposure(int takeIndex, Exposure *exposure) { getTake(takeIndex)->addExposure(exposure); } void Scene::insertExposure(int takeIndex, int exposureIndex, const QString &fileName, int location) { getTake(takeIndex)->insertExposure(exposureIndex, fileName, location); } void Scene::insertExposure(int takeIndex, int exposureIndex, Exposure *exposure) { getTake(takeIndex)->insertExposure(exposureIndex, exposure); } bool Scene::getModifyedExposure(const QString &filePath, int &modTakeIndex, int &modExposureIndex) { qDebug() << "Scene::getModifyedExposure --> Start"; int takeSize = takes.size(); for (modTakeIndex = 0; modTakeIndex < takeSize; ++modTakeIndex) { if (takes[modTakeIndex]->getModifyedExposure(filePath, modExposureIndex)) { // Exposure found qDebug() << "Scene::getModifyedExposure --> End"; return true; } } modTakeIndex = -1; qDebug() << "Scene::getModifyedExposure --> End (Error)"; return false; } void Scene::cleanExposures(unsigned int fromExposure, unsigned int toExposure) { takes.erase(takes.begin() + fromExposure, takes.begin() + toExposure); } void Scene::addSavedExposure(Exposure *e) { takes[activeTakeIndex]->addSavedExposure(e);; } const QVector Scene::removeExposures(unsigned int fromExposure, const unsigned int toExposure) { return takes[activeTakeIndex]->removeExposures(fromExposure, toExposure); } void Scene::moveExposures(unsigned int fromExposure, unsigned int toExposure, unsigned int movePosition) { takes[activeTakeIndex]->moveExposures(fromExposure, toExposure, movePosition); } Exposure* Scene::removeExposure(unsigned int takeIndex, unsigned int exposureIndex) { Take *take = takes[takeIndex]; return take->removeExposure(exposureIndex); } QVector Scene::getImagePaths() const { QVector sceneImagePaths; unsigned int takeSize = takes.size(); unsigned int takeIndex; unsigned int takeImageSize; unsigned int takeImageIndex; for (takeIndex = 0; takeIndex < takeSize; ++takeIndex) { QVector takeImagePaths = takes[takeIndex]->getImagePaths(); takeImageSize = takeImagePaths.size(); for (takeImageIndex = 0; takeImageIndex < takeImageSize; ++takeImageIndex) { sceneImagePaths.append(takeImagePaths[takeImageIndex]); } } return sceneImagePaths; } /************************************************************************** * Sound functions **************************************************************************/ unsigned int Scene::getSoundStartPosition() const { qDebug() << "Take::getSountPosition --> Start"; return this->soundStartPosition; } void Scene::setSoundStartPosition(unsigned int newSoundStartPosition) { soundStartPosition = newSoundStartPosition; } // TODO: Check audio type (ogg, mp3, wav ...) int Scene::addSound(const QString & /*filename*/, const QString & /*soundname*/) { qDebug() << "Scene::addSound --> Start"; /* AudioFormat *f = new OggVorbis(); int ret = f->setFilename(filename); if (ret != 0) { delete f; return ret; } // Check if the file exsists, which it probably should do. // The setFilename function will fail if the file doesn't exists, // but paranoid people have to dobbel check :-). if (QFile::exists(filename) == 0) { // Create a new path QString imgId(getImageId()); QString newSoundPath(QString("%1%2%3%4%5") .arg(tempPath) .arg(imgId) .arg(QLatin1String("_snd_")) .arg(++soundNum) .arg(filename.mid(filename.lastIndexOf('.')))); // Check if the sound already is inside the tmp directory. // (This can be the fact if we runs in recovery mode.) QString tempName; tempName.append(QLatin1String("/")); tempName.append(ProjectSerializer::applicationDirectory); tempName.append(QLatin1String("/")); tempName.append(ProjectSerializer::tempDirectory); if (filename.indexOf(tempName, 0, Qt::CaseInsensitive) == -1) { if (!QFile::copy(filename, newSoundPath)) { // Not successful parent->getFrontend()->showCritical(tr("Critical"), tr("Can't copy sound file!")); } } else { if (!QFile::rename(filename, newSoundPath)) { // Rename not successful --> copy and remove if (!QFile::copy(filename, newSoundPath)) { parent->getFrontend()->showCritical(tr("Critical"), tr("Can't copy soundfile!")); } if (!QFile::remove(filename)) { parent->getFrontend()->showCritical(tr("Critical"), tr("Can't remove soundfile!")); } } } // Update with the new path f->setFilename(newSoundPath); // and add it to the vector sounds.append(f); QString ss("Sound"); ss.append(QString::number(soundsNumber)); soundNames.append(ss); soundNames[soundNumber] = soundName; return 0; } */ qDebug() << "Scene::addSound --> End"; return 0; } void Scene::removeSound(unsigned int soundIndex) { Q_ASSERT(sounds[soundIndex] != NULL); AudioFormat *f = sounds[soundIndex]; if (QFile::exists(f->getSoundPath()) == 0) { if (!QFile::remove(f->getSoundPath())) { // Not successful parent->getFrontend()->showCritical(tr("Critical"), tr("Can't remove sound file!")); } } delete sounds[soundIndex]; sounds[soundIndex] = NULL; sounds.erase(sounds.begin() + soundIndex); --soundsNumber; } unsigned int Scene::getNumberOfSounds() const { return sounds.size(); } QVector& Scene::getSounds() { return sounds; } const QString Scene::getSoundName(unsigned int soundIndex) const { return soundNames[soundIndex]; } void Scene::playSounds(AudioDriver *driver) { unsigned int numElem = sounds.size(); if (numElem > 0) { for (unsigned int i = 0; i < numElem; ++i) { driver->addAudioFile(sounds[i]); } driver->playInThread(); } } void Scene::moveToSoundDir(const QString &directory) { Q_ASSERT(directory.isEmpty()); // Move all of the sounds belonging to this Scene // to the sounds directory unsigned int numSounds = sounds.size(); for (unsigned int i = 0; i < numSounds; ++i) { AudioFormat *f = sounds[i]; QString soundPath = f->getSoundPath(); // Create a new sound path QString newSoundPath(QString("%1%2%3%4%5%6") .arg(directory) .arg(QLatin1String("/")) .arg(this->id) .arg(QLatin1String("_snd_")) .arg(++soundsNumber) .arg(soundPath.mid(soundPath.lastIndexOf('.')))); if (QFile::exists(soundPath) == 0) { // Move from old path to new path if (!QFile::rename(soundPath, newSoundPath)) { // Rename not successful --> copy and remove if (!QFile::copy(soundPath, newSoundPath)) { parent->getFrontend()->showCritical(tr("Critical"), tr("Can't copy sound file!")); } if (!QFile::remove(soundPath)) { parent->getFrontend()->showCritical(tr("Critical"), tr("Can't remove sound file!")); } } } // Update with the new path f->setFilename(newSoundPath); f = NULL; } } bool Scene::readSoundFromProject(QDomElement &soundNode) { qDebug() << "Scene::readSoundFromProject --> Start"; QDomElement currElement = soundNode.firstChildElement(); while (!currElement.isNull()) { QString nodeName = currElement.nodeName(); if (nodeName.compare("clip") == 0) { // The node is a sound file QString soundFile(QString("%1%2%3") .arg(soundPath) .arg(QLatin1String("/")) .arg(currElement.text())); QString soundName = currElement.attribute("descr", NULL); addSound(soundFile, soundName); } else if (nodeName.compare("offset") == 0) { // The node is a offset value QString tmp = currElement.text(); soundStartPosition = tmp.toInt(); } currElement = currElement.nextSiblingElement(); } qDebug() << "Scene::readSoundFromProject --> End"; return true; } bool Scene::saveSoundToProject(QDomDocument &doc, QDomElement &sceneNode) { qDebug() << "Scene::saveSoundFromProject --> Start"; QDomElement clipElement; // QString absPath; QString relPath; AudioFormat *sound; moveToSoundDir(soundPath); markAsProjectFile(); // Sounds unsigned int soundSize = getNumberOfSounds(); for (unsigned int soundIndex = 0; soundIndex < soundSize; ++soundIndex) { sound = sounds[soundIndex]; relPath.clear(); QString soundPath = sounds[soundIndex]->getSoundPath(); relPath.append(soundPath.mid(soundPath.lastIndexOf("/"))); clipElement = doc.createElement("clip"); sceneNode.appendChild(clipElement); clipElement.setAttribute("src", relPath); clipElement.setAttribute("alt", getSoundName(soundIndex)); } qDebug() << "Scene::saveSoundFromProject --> End"; return true; } /************************************************************************** * Operator functions **************************************************************************/ /* bool Scene::operator!= (const Scene &other) const { qDebug() << "Scene::operator!= --> Start"); qDebug() << "Scene::operator!= --> End"); } */ /************************************************************************** * Private functions **************************************************************************/ /* void Scene::activateTake() { qDebug() << "Scene::activateTake --> Start"); parent->notifyActivateTake(); qDebug() << "Scene::activateTake --> End"); } */ qstopmotion-2.3.2-Source/src/domain/animation/animationproject.h000644 000000 000000 00000075303 13011043104 025055 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef ANIMATIONPROJECT_H #define ANIMATIONPROJECT_H #include #include #include "domain/animation/exposure.h" #include "domain/animation/projectserializer.h" #include "domain/animation/scene.h" #include "frontends/frontend.h" #include "technical/audio/audiodriver.h" #include "technical/videoencoder/ffmpegencoder.h" class ProjectSerializer; // class Scene; // class Take; // class Exposure; /** * Implementation of the animationmodel containing the data about the animation. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class AnimationProject : public QObject { Q_OBJECT public: enum ExposureFileLocation { NoFile, InProjectPath, InTempPath, }; enum ImageTransformationMode { ScaleImage, // Scale the image to the output size ClipImage, // Clip the image to the output size according to the adjustment setting ZoomImage, // Zoom the image to the output size according to the zoom setting }; /** * Initializes the variables of the animation to starting values. * @param f The frontend of the application. */ AnimationProject(Frontend* f); /** * Cleans up the animation. */ ~AnimationProject(); /** * Get the frontend. * @return the frontend. */ Frontend* getFrontend(); /** * Get the project serializer. * @return the project serializer. */ ProjectSerializer* getProjectSerializer(); /** * Get the name ot the temp directory of the project * @return temp directory of the project */ const QString getAppTempDirName() const; /** * Retrieves the new project file name * @return the project file name if it's set, NULL otherwise. */ const QString getNewProjectFilePath() const; /** * Get the new project path of the project * @return project path of the project */ const QString getNewProjectPath() const; /** * Get the description of the project * @return Description of the project */ const QString getDescription() const; /** * Get the new image path of the project * @return image path of the project */ const QString getNewImagePath() const; /** * Get the old image path of the project * @return image path of the project */ const QString getOldImagePath() const; /** * Get the new sound path of the project * @return sound path of the project */ const QString getNewSoundPath() const; /** * Get the old sound path of the project * @return sound path of the project */ const QString getOldSoundPath() const; /************************************************************************** * Project preferences **************************************************************************/ /** * Get the active recording mode of the project. * @return active recording mode. */ int getRecordingMode() const; /** * Set the active recording mode of the project. * @param newRecordingMode The new recording mode. */ void setRecordingMode(int newRecordingMode); /** * Get the index of the active video source device of the project. * @return active video source. */ int getVideoSource() const; /** * Set the index of the active video source device of the project. * @param newVideoSource the new active source. */ void setVideoSource(int newVideoSource); /** * Get the active video resolution of the project. * @return active video resolution. */ int getResolution() const; /** * Set the active video resolution of the project. * @param newResolution the new active resolution. */ void setResolution(int newResolution); /** * Get the active mixing mode of the project. * @return active mixing mode. */ int getMixMode() const; /** * Set the active mixing mode of the project. * @param newMixingMode the new mixing mode. */ void setMixMode(int newMixingMode); /** * Get the active mix count of the project. * @return active mix count. */ int getMixCount() const; /** * Set the active mix count of the project. * @param newSource the new mix count source. */ void setMixCount(int newMixCount); /** * Get the active playback count of the project. * @return active playback count. */ int getPlaybackCount() const; /** * Set the active playback count of the project. * @param newPlaybackCount the new playback count source. */ void setPlaybackCount(int newPlaybackCount); /** * Get the active unit of the project. * @return active unit mode. */ int getUnitMode() const; /** * Set the active unit mode of the project. * @param newUnitMode the new unit mode. */ void setUnitMode(int newUnitMode); /** * Get the overlay intensity value. * @return The overlay intensity value. */ int getOverlayIntensity(); /** * Set the overlay intensity value of the project. * @param overlay The new overlay intensity value. */ void setOverlayIntensity(int overlay); /************************************************************************** * Image import preferences **************************************************************************/ /** * Get the image format of the project. * @return image format. */ int getImageFormat(); /** * Set the image format of the project. * @param newIF The new image format. */ void setImageFormat(int newIF); /** * Get the image quality value of the project. * @return image quality value. */ int getImageQuality(); /** * Set the image quality value of the project. * @param newValue The new image quality value. */ void setImageQuality(int newValue); /** * Get the image size of the project. * @return image size. */ int getImageSize(); /** * Set the image size of the project. * @param newVS The new image size. */ void setImageSize(int newVS); /** * Get the transformation value of the project. * @return Transformation value. */ int getImageTransformation(); /** * Set the transformation value of the project. * @param newTransform The new transformation value. */ void setImageTransformation(int newTransform); /** * Get the image adjustment of the project. * @return Image adjustment. */ int getImageAdjustment(); /** * Set the image adjustment of the project. * @param newIA The new image adjustment. */ void setImageAdjustment(int newIA); /** * Get the zoom value of the project. * @return Zoom value. */ int getZoomValue(); /** * Set the zoom value of the project. * @param newZV The new zoom value. */ void setZoomValue(int newZV); /** * Get the live view fps of the project. * @return live view fps value. */ int getLiveViewFps(); /** * Set the live view fps of the project. * @param newValue The new live view fps value. */ void setLiveViewFps(int newValue); /************************************************************************** * Video export preferences **************************************************************************/ /** * Get the encoder application of the project. * @return Encoder application. */ int getEncoderApplication() const; /** * Set the encoder application of the project. * @param newEA The new encoder application. */ void setEncoderApplication(int newEA); /** * Get the video format of the project. * @return Video format. */ int getVideoFormat() const; /** * Set the video format of the project. * @param newVF The new video format. */ void setVideoFormat(int newVF); /** * Get the video size of the project. * @return Video size. */ int getVideoSize() const; /** * Set the video size of the project. * @param newVS The new video size. */ void setVideoSize(int newVS); /** * Get the video frames per second of the project. * @return The video frames per second. */ int getVideoFps() const; /** * Set the video frames per second of the project. * @param newFPS The new video frames per second. */ void setVideoFps(int newFPS); /** * Get the use default output file flag of the project. * @return Use default output file flag. */ bool getUseDefaultOutputFile() const; /** * Set the use default output file flag of the project. * @param newUDOF The new use default output file flag. */ void setUseDefaultOutputFile(bool newUDOF); /** * Get the default output file name of the project. * @return Default output file name. */ const QString getDefaultOutputFileName(); /** * Set the default output file name of the project. * @param newDOFN The new default output file name. */ void setDefaultOutputFileName(const QString newDOFN); /************************************************************************** * Project functions **************************************************************************/ /** * Opens a project. * @param filePath the project file path of the project to open. * @return true on success, false otherwise */ bool openProject(const QString &filePath); /** * Saves the active project to a XML-file which is written to disk. * @param filepath the path to store the project files within. * @param saveAs the project sa to saved to a new project * @return true on success, false otherwise */ bool saveProject(const QString &filePath, bool saveAs); /** * Creates a new project. * @param projectDescription the description of the project or a empty string. * @return true on success, false otherwise */ bool newProject(const QString &projectDescription); /** * Checks if there are unsaved changes in the settings. * @return true if there are unsaved changes, false otherwise. */ bool isSettingsChanges() const; /** * Increment the number of unsaved changes in the settings. */ void incSettingsChanges(); /** * Decrement the number of unsaved changes in the settings. */ void decSettingsChanges(); /** * Checks if there are unsaved changes in the animation. * @return true if there are unsaved changes, false otherwise. */ bool isAnimationChanges() const; /** * Increment the number of unsaved changes in the animation. */ void incAnimationChanges(); /** * Decrement the number of unsaved changes in the animation. */ void decAnimationChanges(); /** * Initializes the audio device so it is ready to play sounds. * @return true on success, false otherwise */ bool initAudioDevice(); /** * Shutdowns the the audio device so that other programs can use it. */ void shutdownAudioDevice(); /** * Function to call when a file has been altered and the gui * should be updated. * @param alteredFile the file which has been altered. */ // void animationChanged(const QString &alteredFile); /** * Exports the current project to a video file as specified by the video encoder. * @param encoder the video encoder to use for export to video * @return true on success, false otherwise */ bool exportToVideo(VideoEncoder *encoder); /** * Exports the current project to a cinelerra-cv project. * @param file the cinelerra-cv project file * @return true on success, false otherwise */ bool exportToCinelerra(const QString &file); /** * Get the data of the settings from the project file */ bool readSettingsFromProject(QDomElement &settingsNode); /** * Set the data of the settings to the project file */ bool saveSettingsToProject(QDomDocument &doc, QDomElement &settingsNode); /** * Convert all images of the project to a new new image format. * @param newFormat The new format of the images. * @param newQuality The new quality value of the images. * @return true if all images are converted to the new image format. */ bool convertImages(int newFormat, int newQuality); /************************************************************************** * Scene functions **************************************************************************/ /** * Returns the index of the currently active scene. * @return the index of the active scene. */ int getActiveSceneIndex() const; /** * Returns the index of the given scene in the animation project. * Returns -1 if no item matched. * @return the index of the given scene. */ int getSceneIndex(Scene* scene); /** * Sets the scene with with the pointer newScene as the active scene. * @param newScene the pointer of the new active scene. */ void setActiveScene(Scene *newScene); /** * Sets the scene with at position sceneIndex as the active scene. * @param sceneIndex the index of the new active scene. */ void setActiveSceneIndex(int sceneIndex); /** * Overloaded function for convenience. Assumes the scene to retrieve there take. * @return the active scene. */ Scene* getActiveScene(); /** * Retrieves the number of scenes in the animation. * @return the number of scenes in the animation. */ int getSceneSize() const; /** * Returns the take size of the scene. * @arg sceneIndex index of the scene the take size to get. * @return the take size of the scene. */ int getSceneTakeSize(int sceneIndex) const; /** * Returns the exposure size of the scene. * @arg sceneIndex index of the scene the exposure size to get. * @return the exposure size of the scene. */ int getSceneExposureSize(int sceneIndex) const; /** * Returns the exposure size of the take of the scene. * @arg sceneIndex index of the scene of the take the exposure size to get. * @arg takeIndex index of the take the exposure size to get. * @return the exposure size of the take. */ int getSceneTakeExposureSize(int sceneIndex, int takeIndex) const; /** * Retrieves the scene at index sceneIndex. * @param sceneIndex the index of the scene. * @return the scene. */ Scene *getScene(int sceneIndex); /** * Create a new scene and adds the scene to the end of the animation. * @param sceneDescription the description of the scene or a empty string. */ void addScene(const QString &sceneDescription); /** * Add a existing scene to the end of the animation. * @param scene The existing scene. */ void addScene(Scene *scene); /** * Create a new scene and insert the scene bevor the active scene in the animation. * @param sceneIndex The index of the scene where the new scene is inserted bevor. * @param sceneDescription The description of the scene or a empty string. */ void insertScene(int sceneIndex, const QString &sceneDescription); /** * Insert a existing scene bevor the active scene in the animation. * @param sceneIndex The index of the scene where the new scene is inserted bevor. * @param scene The existing scene. */ void insertScene(int sceneIndex, Scene *scene); /** * Moves the scene at position sceneIndex to the position movePosition. * @param sceneIndex the index of the scene to move. * @param movePosition the position to move the scene to. */ void moveScene(int sceneIndex, int movePosition); /** * Removes the active scene from the animation. */ // void removeActiveScene(); /** * Removes the active scene from the animation. * @param sceneIndex The index of the scene to remove. * @return The removed scene. */ Scene *removeScene(int sceneIndex); /** * Get the data of the scenes from the project file */ bool readScenesFromProject(QDomElement &animationNode); /** * Set the data of the scenes to the project file */ bool saveScenesToProject(QDomDocument &doc, QDomElement &animationNode); /** * Set the data of the scenes to the project file */ bool saveAsScenesToProject(QDomDocument &doc, QDomElement &animationNode); /************************************************************************** * Sound functions **************************************************************************/ /** * Adds the sound from the file "sound" to scene at position sceneIndex. * @param sceneIndex the index of the scene to add the sound to * @param filename the path to the file with the sound * @param soundName the new name of the sound. * @return zero on success, less than zero on failure; * -1 = file is not readable * -2 = not a valid audio file */ int addSoundToScene(unsigned int sceneIndex, const QString &filename, const QString &soundName); /** * Removes the sound with index soundIndex from the scene with index * sceneIndex. * @param sceneIndex the index of the scene to remove a sound from. * @param soundIndex the index of the sound to remove from the frame. */ void removeSoundFromScene(unsigned int sceneIndex, unsigned int soundIndex); /** * Plays the sound of the scene with index sceneIndex. * @param sceneIndex the index of the scene to play. */ void playSound(int sceneIndex); /************************************************************************** * Take functions **************************************************************************/ /** * Retrieving the index of the currently active take. * @return the index of the active take. */ int getActiveTakeIndex() const; /** * Sets the take with at position takeIndex as the active take. * @param takeIndex the index of the new active take. */ void setActiveTakeIndex(int takeIndex); /** * Overloaded function for convenience. Assumes the scene to retrieve there * take from is the active scene. * @return the active take in the active scene. */ Take *getActiveTake(); /** * Create a new take and add the take as the last to the scene. * @param sceneIndex Index of the scene the take is added to. * @param takeDescription the description of the take or a empty string. */ void addTake(int sceneIndex, const QString &takeDescription); /** * Add an existing take as the last to the scene. * @param sceneIndex Index of the scene the take is added to. * @param take The existing take object. */ void addTake(int sceneIndex, Take *take); /** * Create a new take and insert the take bevor the active scene. * @param sceneIndex Index of the scene the take is added to. * @param takeIndex The index of the take to insert the new take before. * @param takeDescription the description of the take or a empty string. */ void insertTake(int sceneIndex, int takeIndex, const QString &takeDescription); /** * Insert an existing take and insert it bevor the active scene. * @param sceneIndex Index of the scene the take is added to. * @param takeIndex The index of the take to insert the new take before. * @param take The existing take object. */ void insertTake(int sceneIndex, int takeIndex, Take *take); /** * Moves the take at position takeIndex to the position movePosition. * @param fromSceneIndex the index of the scene of the take to move. * @param fromTakeIndex the index of the take to move. * @param toSceneIndex the scene position to move the take to. * @param toTakeIndex the position to move the take to. */ void moveTake(int fromSceneIndex, int fromTakeIndex, int toSceneIndex, int toTakeIndex); /** * Removes the active take from the animation. * @return The removed take; */ // Take *removeActiveTake(); /** * Removes the active take from the animation. * @param sceneIndex The index of the scene of the take to remove. * @param takeIndex The index of the take to remove. * @return The removed take; */ Take *removeTake(int sceneIndex, int takeIndex); /** * Returns the exposure size of the take. * @param sceneIndex The index of the scene. * @param takeIndex The index of the take. * @return The exposure size of the take. */ int getTakeExposureSize(unsigned int sceneIndex, unsigned int takeIndex) const; /** * Retrieves the take at index takeIndex. * @param sceneIndex the index of the scene. * @param takeIndex the index of the take. * @return the take. */ Take *getTake(int sceneIndex, int takeIndex); /************************************************************************** * Exposure functions **************************************************************************/ /** * Function for changing the currently active exposure. * @param exposureIndex the index of the new active exposure. */ void setActiveExposureIndex(int exposureIndex); /** * Returns the total count of exposures of the model. * @return the count of the model. */ unsigned int getTotalExposureSize() const; /** * Retrieving the index of the currently active exposure. * @return the index of the active exposure. */ int getActiveExposureIndex() const; /** * Return the exposure with the given scene index, take index and exposure index. * @param sceneIndex the index of the scene to retrieve the exposure from. * @param takeIndex the index of the take to retrieve the exposure from. * @param exposureIndex the index of the exposure to retrieve * @return the exposure to retrieve. */ Exposure *getExposure(unsigned int sceneIndex, unsigned int takeIndex, unsigned int exposureIndex); /** * Overloaded function for convenience. Assumes the scene to retrieve there * exposure from is the active scene and active take. * @return the active exposure in the active scene and active take. */ Exposure *getActiveExposure(); /** * Create a new exposure and add it to end of the vector containing * the exposures. * @param sceneIndex the index of the scene with the exposure to add * @param takeIndex the index of the take with the exposure to add * @param fileName the name of the image file. * @param location the location of the picture */ void addExposure(int sceneIndex, int takeIndex, const QString &fileName, int location); /** * Add a existing exposure in the vector containing the exposures. * @param sceneIndex the index of the scene with the exposure to add * @param takeIndex the index of the take with the exposure to add * @param exposure The existing exposure to add. */ void addExposure(int sceneIndex, int takeIndex, Exposure *exposure); /** * Create a new exposure and insert it in the vector containing the exposures. * @param sceneIndex the index of the scene with the exposure to insert * @param takeIndex the index of the take with the exposure to insert * @param exposureIndex the index of the new exposure where inserted bevor. * @param fileName the name to the image file. * @param location the location of the picture */ void insertExposure(int sceneIndex, int takeIndex, int exposureIndex, const QString &fileName, int location); /** * Inser an existing exposure in the vector containing the exposures. * @param sceneIndex the index of the scene with the exposure to insert * @param takeIndex the index of the take with the exposure to insert * @param exposureIndex the index of the new exposure where inserted bevor. * @param exposure The existing exposure. */ void insertExposure(int sceneIndex, int takeIndex, int exposureIndex, Exposure *exposure); /** * Removes the active exposure from the animation. * @return The removed exposure or NULL if nothing is done */ Exposure *removeActiveExposure(); /** * Removes the exposure with the given tree item from the animation. * @param sceneIndex the index of the scene with the exposure to remove * @param takeIndex the index of the take with the exposure to remove * @param exposureIndex the index of the exposure to remove * @return The removed exposure or NULL if nothing is done */ Exposure *removeExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Get the next exposure index. * @return Next exposure inde. */ unsigned int getNextTotalExposureIndex(); /** * Get the position of the modified exposure in the project. * @param filePath The path to the modified exposure. * @param modSceneIndex the index of the scene of the take of the modified exposure. * @param modTakeIndex the index of the take of the modified exposure. * @param modExposureIndex the index of the modified exposure. * @return True if the exposure is found and false else. */ bool getModifyedExposure(const QString &filePath, int &modSceneIndex, int &modTakeIndex, int &modExposureIndex); private: /** * Frontend of the application. */ Frontend *frontend; /** * Description of the animation. */ QString description; /** * Serializer to be used on saving and loading of the project. */ ProjectSerializer *serializer; /** * Active recording mode of the project. */ int recordingMode; /** * Index of the active video source device of the project. */ int videoSource; /** * Active video resolution of the project. */ int videoResolution; /** * Active mixing mode of the project. */ int mixMode; /** * Active mix count of the project. */ int mixCount; /** * Active playback count of the project. */ int playbackCount; /** * Active encoder application of the project. */ int encoderApplication; /** * Active image format of the project. */ int imageFormat; /** * Active image quality of the project. */ int imageQuality; /** * Active image size of the project. */ int imageSize; /** * Active image transformation mode */ int imageTransformation; /** * Active image adjustment of the project. */ int imageAdjustment; /** * Active zoom value of the project. */ int zoomValue; /** * Active live view fps of the project. */ int liveViewFps; /** * Active video format of the project. */ int videoFormat; /** * Active video size of the project. */ int videoSize; /** * Active video frames per second of the project. */ int videoFps; /** * Active use default output file flag of the project. */ bool useDefaultOutputFile; /** * Active default output file name of the project. */ QString defaultOutputFileName; /** * Active unit mode of the project. */ int unitMode; /** * Active overlay value of the project. */ int overlayIntensity; /** * All of the scenes in the animation. */ QVector scenes; /** * Index of the active scene. */ int activeSceneIndex; /** * Next scene index to use to create a dummy description string. */ unsigned int nextSceneIndex; /** * Index of the active scene. */ unsigned int nextTotalExposureIndex; /** * Number of unsaved changes in the settings */ int settingsChanges; /** * Number of unsaved changes in the animation */ int animationChanges; /** * Number of sounds added to the model. */ int soundsNumber; /** * Audio driver that can play sound. */ AudioDriver *audioDriver; /** * Variable for checking if the audio device is successfully initialized. */ bool isAudioDriverInitialized; }; #endif qstopmotion-2.3.2-Source/src/domain/animation/exposure.cpp000644 000000 000000 00000027236 12654352322 023737 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "exposure.h" #include #include #include #include #include "domain/animation/projectserializer.h" #include "technical/util.h" #include "technical/preferencestool.h" #include "technical/grabber/imagegrabber.h" unsigned int Exposure::tempNumber = 0; Exposure::Exposure(Take *take) { parent = take; theFrame.clear(); exposureLocation = AnimationProject::NoFile; id.clear(); } Exposure::Exposure(Exposure *exposure) { parent = exposure->parent; theFrame.clear(); theFrame.append(exposure->theFrame); Q_ASSERT(!theFrame.isEmpty()); exposureLocation = exposure->exposureLocation; id.clear(); id.append(exposure->getId()); } Exposure::Exposure(Take *take, const QString &fileName, int location) { parent = take; Q_ASSERT(!fileName.isEmpty()); theFrame.clear(); theFrame.append(fileName); exposureLocation = location; id.clear(); } Exposure::~Exposure() { } bool Exposure::isEmpty() { return theFrame.isEmpty(); } const QString Exposure::getId() const { return id; } void Exposure::setId(const QString &newId) { if (!newId.isEmpty()) { id.clear(); id.append(newId); } } Take *Exposure::getTake() const { return parent; } unsigned int Exposure::getIndex() { unsigned int index; index = parent->getExposureIndex(this); return index; } unsigned int Exposure::getTakeIndex() const { unsigned int index; index = parent->getIndex(); return index; } unsigned int Exposure::getSceneIndex() const { unsigned int index; index = parent->getSceneIndex(); return index; } const QString Exposure::getImagePath() const { // qDebug() << "Exposure::getNewImagePath --> Start"); Q_ASSERT(!theFrame.isEmpty()); QString absImagePath; switch (exposureLocation) { case AnimationProject::InProjectPath: absImagePath.append(parent->getNewImagePath()); break; case AnimationProject::InTempPath: absImagePath.append(parent->getAppTempDirName()); break; default: return QString(); } absImagePath.append(QLatin1String("/")); absImagePath.append(theFrame); // qDebug() << "Exposure::getNewImagePath --> End"); return absImagePath; } void Exposure::moveToTemp(bool isRecovery) { QString fromImagePath; QString toImagePath; switch (exposureLocation) { case AnimationProject::InProjectPath: fromImagePath.append(parent->getNewImagePath()); break; default: return; } fromImagePath.append(QLatin1String("/")); fromImagePath.append(theFrame); // creates a new image name QString toImageName(QString("%1%2%3") .arg(QLatin1String("tmp_")) .arg(Exposure::tempNumber) .arg(fromImagePath.mid(fromImagePath.lastIndexOf('.')))); Exposure::tempNumber++; toImagePath.append(parent->getAppTempDirName()); toImagePath.append(QLatin1String("/")); toImagePath.append(toImageName); if (!isRecovery) { if (!QFile::rename(fromImagePath, toImagePath)) { // Rename not successful --> copy and remove if (!QFile::copy(fromImagePath, toImagePath)) { parent->getFrontend()->showCritical(tr("Critical"), tr("Can't copy the image to the temporary directory!")); } if (!QFile::remove(fromImagePath)) { parent->getFrontend()->showCritical(tr("Critical"), tr("Can't remove the image from the project directory!")); } } } theFrame.clear(); theFrame.append(toImageName); exposureLocation = AnimationProject::InTempPath; } void Exposure::copyToTemp() { QString fromImagePath; QString toImagePath; switch (exposureLocation) { case AnimationProject::InProjectPath: fromImagePath.append(parent->getOldImagePath()); break; default: return; } fromImagePath.append(QLatin1String("/")); fromImagePath.append(theFrame); // creates a new image name QString toImageName(QString("%1%2%3") .arg(QLatin1String("tmp_")) .arg(Exposure::tempNumber) .arg(fromImagePath.mid(fromImagePath.lastIndexOf('.')))); Exposure::tempNumber++; toImagePath.append(parent->getAppTempDirName()); toImagePath.append(QLatin1String("/")); toImagePath.append(toImageName); if (!QFile::copy(fromImagePath, toImagePath)) { // Not successful parent->getFrontend()->showCritical(tr("Critical"), tr("Can't copy the image to the temporary directory!")); } // if (exposureLocation == InTrashPath) { // Exposure::trashNum--; // } theFrame.clear(); theFrame.append(toImageName); exposureLocation = AnimationProject::InTempPath; } void Exposure::convertToTemp(int newFormat, int quality) { QString fromImagePath; QString toImagePath; switch (exposureLocation) { case AnimationProject::InProjectPath: fromImagePath.append(parent->getOldImagePath()); break; case AnimationProject::InTempPath: fromImagePath.append(parent->getAppTempDirName()); break; default: return; } fromImagePath.append(QLatin1String("/")); fromImagePath.append(theFrame); // creates a new image name QString toImageName(theFrame.left(theFrame.lastIndexOf('.') + 1)); // Including the '.') switch(newFormat) { case ImageGrabber::jpegFormat: toImageName.append(PreferencesTool::jpegSuffix); break; case ImageGrabber::tiffFormat: toImageName.append(PreferencesTool::tiffSuffix); break; case ImageGrabber::bmpFormat: toImageName.append(PreferencesTool::bmpSuffix); break; } toImagePath.append(parent->getAppTempDirName()); toImagePath.append(QLatin1String("/")); toImagePath.append(toImageName); // Save the image in the new file format to the temp dirctory QImage image(fromImagePath); if (!image.save(toImagePath, 0, quality)) { // Not successful parent->getFrontend()->showCritical(tr("Critical"), tr("Can't save the image in the new file format to the temporary directory!")); } theFrame.clear(); theFrame.append(toImageName); exposureLocation = AnimationProject::InTempPath; } void Exposure::moveToProject(const QString newName) { QString fromImagePath; QString toImagePath; switch (exposureLocation) { case AnimationProject::InTempPath: fromImagePath.append(parent->getAppTempDirName()); break; default: return; } fromImagePath.append(QLatin1String("/")); fromImagePath.append(theFrame); toImagePath.append(parent->getNewImagePath()); toImagePath.append(QLatin1String("/")); toImagePath.append(newName); if (!QFile::rename(fromImagePath, toImagePath)) { // Rename not successful --> copy and remove if (!QFile::copy(fromImagePath, toImagePath)) { parent->getFrontend()->showCritical(tr("Critical"), tr("Can't copy the image to the project directory!")); } if (!QFile::remove(fromImagePath)) { parent->getFrontend()->showCritical(tr("Critical"), tr("Can't remove the image in the temporary directory!")); } } theFrame.clear(); theFrame.append(newName); exposureLocation = AnimationProject::InProjectPath; } /* void Exposure::markAsProjectFile() { isProjectFile = true; } */ /* const QString Exposure::getImageId() { QString tmp(theFrame); QString bname(tmp.mid(tmp.lastIndexOf(QLatin1String("/")))); QString imgID(bname.left(bname.indexOf('.'))); return imgID; } */ /* Exposure::fileLocation Exposure::getExposureLocation() { return exposureLocation; } */ bool Exposure::readDataFromProject(QDomElement &exposureNode) { // qDebug() << "Exposure::readDataFromProject --> Start"); id.append(exposureNode.attributeNode(QLatin1String("id")).value()); QDomElement currNode = exposureNode.firstChildElement(); while (!currNode.isNull()) { QString nodeName = currNode.nodeName(); if (nodeName.compare("theframe") == 0) { // The node is a 'the Frame' node QString filename = currNode.text(); if (!filename.isNull()) { theFrame.clear(); theFrame.append(filename); exposureLocation = AnimationProject::InProjectPath; } } else { // The node is a 'capture Frame' node } currNode = currNode.nextSiblingElement(); } // qDebug() << "Exposure::readDataFromProject --> End"); return true; } bool Exposure::saveDataToProject(QDomDocument &doc, QDomElement &exposureNode) { qDebug() << "Exposure::saveDataFromProject --> Start"; QDomElement theFrameElement; // Save exposure parameter exposureNode.setAttribute("id", id); // Save the frame theFrameElement = doc.createElement("theframe"); QDomText theFrameText = doc.createTextNode(theFrame); theFrameElement.appendChild(theFrameText); exposureNode.appendChild(theFrameElement); // Save all captured frames /* unsigned int numFrames = actScene.getSize(); for (unsigned int j = 0; j < numFrames; ++j) { Frame& frame = actScene.getFrame(j); frame.moveToProjectDir(imagePath, soundPath, ++index); frame.markAsProjectFile(); absPath.clear(); absPath.append(frame.getImagePath()); QString relPath(absPath.mid(absPath.lastIndexOf(QLatin1String("/")))+1); img = doc.createElement("img"); imagesNode.appendChild(img); img.setAttribute("src", relPath); } */ qDebug() << "Exposure::saveDataFromProject --> End"; return true; } qstopmotion-2.3.2-Source/src/domain/animation/animationproject.cpp000644 000000 000000 00000146560 13011043104 025414 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "animationproject.h" #include #include #include #include #include "domain/domainfacade.h" // #include "technical/audio/ossdriver.h" #include "technical/videoencoder/videoencoderfactory.h" AnimationProject::AnimationProject(Frontend* f) { qDebug() << "AnimationProject::Constructor --> Start"; frontend = f; serializer = new ProjectSerializer(f); recordingMode = 0; videoSource = 0; videoResolution = 0; mixMode = 0; mixCount = 2; playbackCount = 0; overlayIntensity = 100; encoderApplication = 0; imageFormat = 0; imageQuality = 100; imageSize = 0; imageTransformation = AnimationProject::ScaleImage; imageAdjustment = 0; zoomValue = 25; liveViewFps = 20; videoFormat = 0; videoSize = 0; videoFps = 12; useDefaultOutputFile = false; unitMode = 0; activeSceneIndex = -1; nextSceneIndex = 0; nextTotalExposureIndex = 0; settingsChanges = 0; animationChanges = 0; soundsNumber = -1; audioDriver = NULL; //new OSSDriver("/dev/dsp"); isAudioDriverInitialized = false; qDebug() << "AnimationProject::Constructor --> End"; } AnimationProject::~AnimationProject() { qDebug() << "AnimationProject::Destructor --> Start"; unsigned int sceneSize = scenes.size(); for (unsigned int sceneIndex = 0; sceneIndex < sceneSize; ++sceneIndex) { delete scenes[sceneIndex]; scenes[sceneIndex] = NULL; } scenes.clear(); if (serializer != NULL) { serializer->cleanup(); delete serializer; } if (audioDriver != NULL) { delete audioDriver; audioDriver = NULL; } description.clear(); frontend = NULL; qDebug() << "AnimationProject::Destructor --> End"; } Frontend* AnimationProject::getFrontend() { Q_ASSERT(frontend != NULL); return frontend; } ProjectSerializer* AnimationProject::getProjectSerializer() { return serializer; } const QString AnimationProject::getAppTempDirName() const { return QString(this->frontend->getTempDirName()); } const QString AnimationProject::getNewProjectFilePath() const { return serializer->getNewProjectFilePath(); } const QString AnimationProject::getNewProjectPath() const { return serializer->getNewProjectPath(); } const QString AnimationProject::getDescription() const { return this->description; } const QString AnimationProject::getNewImagePath() const { return serializer->getNewImagePath(); } const QString AnimationProject::getOldImagePath() const { return serializer->getOldImagePath(); } const QString AnimationProject::getNewSoundPath() const { return serializer->getNewSoundPath(); } const QString AnimationProject::getOldSoundPath() const { return serializer->getOldSoundPath(); } /************************************************************************** * Project preferences **************************************************************************/ int AnimationProject::getRecordingMode() const { return recordingMode; } void AnimationProject::setRecordingMode(int newRecordingMode) { if (recordingMode != newRecordingMode) { recordingMode = newRecordingMode; incSettingsChanges(); } } int AnimationProject::getVideoSource() const { return videoSource; } void AnimationProject::setVideoSource(int newVideoSource) { if (videoSource != newVideoSource) { videoSource = newVideoSource; incSettingsChanges(); } } int AnimationProject::getResolution() const { return videoResolution; } void AnimationProject::setResolution(int newResolution) { if (videoResolution != newResolution) { videoResolution = newResolution; incSettingsChanges(); } } int AnimationProject::getMixMode() const { return mixMode; } void AnimationProject::setMixMode(int newMixMode) { if (mixMode != newMixMode) { mixMode = newMixMode; incSettingsChanges(); } } int AnimationProject::getMixCount() const { return mixCount; } void AnimationProject::setMixCount(int newMixCount) { if (mixCount != newMixCount) { mixCount = newMixCount; incSettingsChanges(); } } int AnimationProject::getPlaybackCount() const { return playbackCount; } void AnimationProject::setPlaybackCount(int newPlaybackCount) { if (playbackCount != newPlaybackCount) { playbackCount = newPlaybackCount; incSettingsChanges(); } } int AnimationProject::getUnitMode() const { return unitMode; } void AnimationProject::setUnitMode(int newUnitMode) { if (unitMode != newUnitMode) { unitMode = newUnitMode; incSettingsChanges(); } } int AnimationProject::getOverlayIntensity() { return overlayIntensity; } void AnimationProject::setOverlayIntensity(int overlay) { if (overlayIntensity != overlay) { overlayIntensity = overlay; incSettingsChanges(); } } /************************************************************************** * Image import preferences **************************************************************************/ int AnimationProject::getImageFormat() { return imageFormat; } void AnimationProject::setImageFormat(int newIF) { if (imageFormat != newIF) { imageFormat = newIF; incSettingsChanges(); } } int AnimationProject::getImageQuality() { return imageQuality; } void AnimationProject::setImageQuality(int newValue) { if (imageQuality != newValue) { imageQuality = newValue; incSettingsChanges(); } } int AnimationProject::getImageSize() { return imageSize; } void AnimationProject::setImageSize(int newIS) { if (imageSize != newIS) { imageSize = newIS; incSettingsChanges(); } } int AnimationProject::getImageTransformation() { return imageTransformation; } void AnimationProject::setImageTransformation(int newTransform) { if (imageTransformation != newTransform) { imageTransformation = newTransform; incSettingsChanges(); } } int AnimationProject::getImageAdjustment() { return imageAdjustment; } void AnimationProject::setImageAdjustment(int newIA) { if (imageAdjustment != newIA) { imageAdjustment = newIA; incSettingsChanges(); } } int AnimationProject::getZoomValue() { return zoomValue; } void AnimationProject::setZoomValue(int newZV) { if (zoomValue != newZV) { zoomValue = newZV; incSettingsChanges(); } } int AnimationProject::getLiveViewFps() { return liveViewFps; } void AnimationProject::setLiveViewFps(int newValue) { if (liveViewFps != newValue) { liveViewFps = newValue; incSettingsChanges(); } } /************************************************************************** * Video export preferences **************************************************************************/ int AnimationProject::getEncoderApplication() const { return encoderApplication; } void AnimationProject::setEncoderApplication(int newEA) { if (encoderApplication != newEA) { encoderApplication = newEA; incSettingsChanges(); } } int AnimationProject::getVideoFormat() const { return videoFormat; } void AnimationProject::setVideoFormat(int newVF) { if (videoFormat != newVF) { videoFormat = newVF; incSettingsChanges(); } } int AnimationProject::getVideoSize() const { return videoSize; } void AnimationProject::setVideoSize(int newVS) { if (videoSize != newVS) { videoSize = newVS; incSettingsChanges(); } } int AnimationProject::getVideoFps() const { return videoFps; } void AnimationProject::setVideoFps(int newFPS) { if (videoFps != newFPS) { videoFps = newFPS; incSettingsChanges(); } } bool AnimationProject::getUseDefaultOutputFile() const { return useDefaultOutputFile; } void AnimationProject::setUseDefaultOutputFile(bool newUDOF) { if (useDefaultOutputFile != newUDOF) { useDefaultOutputFile = newUDOF; incSettingsChanges(); } } const QString AnimationProject::getDefaultOutputFileName() { return defaultOutputFileName; } void AnimationProject::setDefaultOutputFileName(const QString newDOFN) { if (defaultOutputFileName.compare(newDOFN) != 0) { defaultOutputFileName = newDOFN; incSettingsChanges(); } } /************************************************************************** * Project functions **************************************************************************/ bool AnimationProject::openProject(const QString &filePath) { qDebug() << "AnimationProject::openProject --> Start"; serializer->setNewProjectFilePath(filePath); serializer->read(); if (!readSettingsFromProject(serializer->getSettingsElement())) { qWarning() << "AnimationProject::openProject --> Read settings failed"; return false; } if (!readScenesFromProject(serializer->getAnimationElement())) { qWarning() << "AnimationProject::openProject --> Read animation data failed"; return false; } if (scenes.size() == 0) { qDebug() << "AnimationProject::openProject --> End (without scene)"; return false; } qDebug() << "AnimationProject::openProject --> End"; return true; } bool AnimationProject::saveProject(const QString &filePath, bool saveAs) { qDebug() << "AnimationProject::saveProject --> Start"; if (!filePath.isEmpty()) { serializer->setNewProjectFilePath(filePath); } frontend->showProgress(tr("Saving scenes to disk ..."), frontend->getProject()->getTotalExposureSize()); if (!serializer->save(this, saveAs)) { qWarning() << "AnimationProject::saveProject --> save animation data failed"; frontend->hideProgress(); return false; } // TODO: Differentiation in savig of settings and animation settingsChanges = 0; animationChanges = 0; frontend->hideProgress(); qDebug() << "AnimationProject::saveProject --> End"; return true; } bool AnimationProject::newProject(const QString &projectDescription) { qDebug() << "AnimationProject::newProject --> Start"; description.append(projectDescription); qDebug() << "AnimationProject::newProject --> End"; return true; } bool AnimationProject::isSettingsChanges() const { if (0 == settingsChanges) { return false; } return true; } void AnimationProject::incSettingsChanges() { settingsChanges++; } void AnimationProject::decSettingsChanges() { Q_ASSERT(0 < settingsChanges); settingsChanges--; } bool AnimationProject::isAnimationChanges() const { if (0 == animationChanges) { return false; } return true; } void AnimationProject::incAnimationChanges() { animationChanges++; } void AnimationProject::decAnimationChanges() { Q_ASSERT(0 < animationChanges); animationChanges--; } bool AnimationProject::initAudioDevice() { qDebug() << "AnimationProject::initAudioDevice --> Empty"; /* isAudioDriverInitialized = audioDriver->initialize(); if (!isAudioDriverInitialized && numSounds > -1) { frontend->showWarning(tr("Initialization Audio"), tr("Cannot play sound. Check that you have the right\n" "permissions and other programs do not block\n" "the audio device. Audio will be disabled until you\n" "have fixed the problem.")); } qDebug() << "AnimationProject::initAudioDevice --> Start"; return isAudioDriverInitialized; */ return false; } void AnimationProject::shutdownAudioDevice() { qDebug() << "AnimationProject::shutdownAudioDevice --> Start"; audioDriver->shutdown(); isAudioDriverInitialized = false; qDebug() << "AnimationProject::shutdownAudioDevice --> End"; } bool AnimationProject::exportToVideo(VideoEncoder * encoder) { qDebug() << "AnimationProject::exportToVideo --> Start"; VideoEncoderFactory factory(this->getFrontend()); if (factory.createVideoFile(encoder) != NULL) { return true; } qDebug() << "AnimationProject::exportToVideo --> End"; return false; } bool AnimationProject::exportToCinelerra(const QString&) { return false; } bool AnimationProject::readSettingsFromProject(QDomElement &settingsNode) { qDebug() << "AnimationProject::readSettingsFromProject --> Start"; QDomElement currElement = settingsNode.firstChildElement(); while (!currElement.isNull()) { QString nodeName = currElement.nodeName(); // Save project parameter if (nodeName.compare("recordingmode") == 0) { QString tmp = currElement.text(); recordingMode = tmp.toInt(); frontend->setRecordingMode(tmp.toInt()); } else if (nodeName.compare("videosource") == 0) { QString tmp = currElement.text(); if (frontend->setVideoSource(tmp.toInt())) { videoSource = tmp.toInt(); } else { setVideoSource(frontend->getVideoSource()); frontend->setVideoSource(getVideoSource()); } } else if (nodeName.compare("videoresolution") == 0) { QString tmp = currElement.text(); if (frontend->setResolution(tmp.toInt())) { videoResolution = tmp.toInt(); } else { setResolution(frontend->getResolution()); } } else if (nodeName.compare("mixmode") == 0) { QString tmp = currElement.text(); mixMode = tmp.toInt(); frontend->setMixMode(tmp.toInt()); } else if (nodeName.compare("mixcount") == 0) { QString tmp = currElement.text(); mixCount = tmp.toInt(); frontend->setMixCount(tmp.toInt()); } else if (nodeName.compare("playbackcount") == 0) { QString tmp = currElement.text(); playbackCount = tmp.toInt(); } else if (nodeName.compare("unitmode") == 0) { QString tmp = currElement.text(); unitMode = tmp.toInt(); } else if (nodeName.compare("overlayintensity") == 0) { QString tmp = currElement.text(); overlayIntensity = tmp.toInt(); frontend->setOverlayIntensity(overlayIntensity); } // Save image import parameter else if (nodeName.compare("imageformat") == 0) { QString tmp = currElement.text(); imageFormat = tmp.toInt(); } else if (nodeName.compare("imagequality") == 0) { QString tmp = currElement.text(); imageQuality = tmp.toInt(); } else if (nodeName.compare("imagesize") == 0) { QString tmp = currElement.text(); imageSize = tmp.toInt(); } else if (nodeName.compare("imagetransformation") == 0) { QString tmp = currElement.text(); imageTransformation = tmp.toInt(); } else if (nodeName.compare("imageadjustment") == 0) { QString tmp = currElement.text(); imageAdjustment = tmp.toInt(); } else if (nodeName.compare("zoomvalue") == 0) { QString tmp = currElement.text(); zoomValue = tmp.toInt(); } else if (nodeName.compare("liveviewfps") == 0) { QString tmp = currElement.text(); liveViewFps = tmp.toInt(); } // Save video export parameter else if (nodeName.compare("encoderapplication") == 0) { QString tmp = currElement.text(); encoderApplication = tmp.toInt(); } else if (nodeName.compare("videoformat") == 0) { QString tmp = currElement.text(); videoFormat = tmp.toInt(); } else if (nodeName.compare("videosize") == 0) { QString tmp = currElement.text(); videoSize = tmp.toInt(); } else if (nodeName.compare("videofps") == 0) { QString tmp = currElement.text(); videoFps = tmp.toInt(); if (videoFps == 0) { videoFps = 12; } } else if (nodeName.compare("usedefaultoutputfile") == 0) { QString tmp = currElement.text(); if (1 == tmp.toInt()) { useDefaultOutputFile = true; } else { useDefaultOutputFile = false; } } else if (nodeName.compare("defaultoutputfilename") == 0) { QString tmp = currElement.text(); defaultOutputFileName.clear(); defaultOutputFileName.append(tmp); } currElement = currElement.nextSiblingElement(); } qDebug() << "AnimationProject::readSettingsFromProject --> End"; return true; } bool AnimationProject::saveSettingsToProject(QDomDocument &doc, QDomElement &settingsNode) { qDebug() << "AnimationProject::saveSettingsToProject --> Start"; // Save project parameter // Save recording mode parameter QDomElement recordingModeElement = doc.createElement("recordingmode"); QDomText recordingModeText = doc.createTextNode(QString("%1").arg(recordingMode)); recordingModeElement.appendChild(recordingModeText); settingsNode.appendChild(recordingModeElement); // Save video source parameter QDomElement videoSourceElement = doc.createElement("videosource"); QDomText videoSourceText = doc.createTextNode(QString("%1").arg(videoSource)); videoSourceElement.appendChild(videoSourceText); settingsNode.appendChild(videoSourceElement); // Save video resolution parameter QDomElement resolutionElement = doc.createElement("videoresolution"); QDomText resolutionText = doc.createTextNode(QString("%1").arg(videoResolution)); resolutionElement.appendChild(resolutionText); settingsNode.appendChild(resolutionElement); // Save mixing mode parameter QDomElement mixingModeElement = doc.createElement("mixmode"); QDomText mixingModeText = doc.createTextNode(QString("%1").arg(mixMode)); mixingModeElement.appendChild(mixingModeText); settingsNode.appendChild(mixingModeElement); // Save mix count parameter QDomElement mixCountElement = doc.createElement("mixcount"); QDomText mixCountText = doc.createTextNode(QString("%1").arg(mixCount)); mixCountElement.appendChild(mixCountText); settingsNode.appendChild(mixCountElement); // Save playback count parameter QDomElement playbackCountElement = doc.createElement("playbackcount"); QDomText playbackCountText = doc.createTextNode(QString("%1").arg(playbackCount)); playbackCountElement.appendChild(playbackCountText); settingsNode.appendChild(playbackCountElement); // Save unit mode parameter QDomElement unitModeElement = doc.createElement("unitmode"); QDomText unitModeText = doc.createTextNode(QString("%1").arg(unitMode)); unitModeElement.appendChild(unitModeText); settingsNode.appendChild(unitModeElement); // Save overlay intensity parameter QDomElement overlayIntensityElement = doc.createElement("overlayintensity"); QDomText overlayIntensityText = doc.createTextNode(QString("%1").arg(overlayIntensity)); overlayIntensityElement.appendChild(overlayIntensityText); settingsNode.appendChild(overlayIntensityElement); // Save image import preferences // Save imageFormat parameter QDomElement ifElement = doc.createElement("imageformat"); QDomText ifText = doc.createTextNode(QString("%1").arg(imageFormat)); ifElement.appendChild(ifText); settingsNode.appendChild(ifElement); // Save imageQuality parameter QDomElement icElement = doc.createElement("imagequality"); QDomText icText = doc.createTextNode(QString("%1").arg(imageQuality)); icElement.appendChild(icText); settingsNode.appendChild(icElement); // Save imageSize parameter QDomElement isElement = doc.createElement("imagesize"); QDomText isText = doc.createTextNode(QString("%1").arg(imageSize)); isElement.appendChild(isText); settingsNode.appendChild(isElement); // Save imageTransformation parameter QDomElement itElement = doc.createElement("imagetransformation"); QDomText itText = doc.createTextNode(QString("%1").arg(imageTransformation)); itElement.appendChild(itText); settingsNode.appendChild(itElement); // Save imageAdjustment parameter QDomElement iaElement = doc.createElement("imageadjustment"); QDomText iaText = doc.createTextNode(QString("%1").arg(imageAdjustment)); iaElement.appendChild(iaText); settingsNode.appendChild(iaElement); // Save zoomValue parameter QDomElement zvElement = doc.createElement("zoomvalue"); QDomText zvText = doc.createTextNode(QString("%1").arg(zoomValue)); zvElement.appendChild(zvText); settingsNode.appendChild(zvElement); // Save liveViewFps parameter QDomElement lvfElement = doc.createElement("liveviewfps"); QDomText lvfText = doc.createTextNode(QString("%1").arg(liveViewFps)); lvfElement.appendChild(lvfText); settingsNode.appendChild(lvfElement); // Save video export preferences // Save encoderApplication parameter QDomElement eaElement = doc.createElement("encoderapplication"); QDomText eaText = doc.createTextNode(QString("%1").arg(encoderApplication)); eaElement.appendChild(eaText); settingsNode.appendChild(eaElement); // Save videoFormat parameter QDomElement vfElement = doc.createElement("videoformat"); QDomText vfText = doc.createTextNode(QString("%1").arg(videoFormat)); vfElement.appendChild(vfText); settingsNode.appendChild(vfElement); // Save videoSize parameter QDomElement vsElement = doc.createElement("videosize"); QDomText vsText = doc.createTextNode(QString("%1").arg(videoSize)); vsElement.appendChild(vsText); settingsNode.appendChild(vsElement); // Save videoFps parameter QDomElement fpsElement = doc.createElement("videofps"); QDomText fpsText = doc.createTextNode(QString("%1").arg(videoFps)); fpsElement.appendChild(fpsText); settingsNode.appendChild(fpsElement); // Save useDefaultOutputFile parameter QDomElement udofElement = doc.createElement("usedefaultoutputfile"); QDomText udofText = doc.createTextNode(QString("%1").arg((true == useDefaultOutputFile ? 1 : 0))); udofElement.appendChild(udofText); settingsNode.appendChild(udofElement); // Save defaultOutputFileName parameter QDomElement dofnElement = doc.createElement("defaultoutputfilename"); QDomText dofnText = doc.createTextNode(defaultOutputFileName); dofnElement.appendChild(dofnText); settingsNode.appendChild(dofnElement); qDebug() << "AnimationProject::saveSettingsToProject --> End"; return true; } /************************************************************************** * Scene functions **************************************************************************/ int AnimationProject::getActiveSceneIndex() const { return activeSceneIndex; } int AnimationProject::getSceneIndex(Scene* scene) { int index; index = scenes.indexOf(scene); Q_ASSERT(index != -1); return index; } void AnimationProject::setActiveScene(Scene *newScene) { qDebug() << "AnimationProject::setActiveScene --> Start"; int sceneSize = scenes.size(); int sceneIndex; for (sceneIndex = 0; sceneIndex < sceneSize; ++sceneIndex) { if (scenes[sceneIndex] == newScene) { break; } } Q_ASSERT(sceneIndex != sceneSize); if (sceneIndex != activeSceneIndex) { this->activeSceneIndex = sceneIndex; } qDebug() << "AnimationProject::setActiveScene --> End"; } void AnimationProject::setActiveSceneIndex(int sceneIndex) { qDebug() << "AnimationProject::setActiveSceneIndex --> Start"; // The new scene index can be the same as the active scene index // if the active scene is removed from the scene vector // Q_ASSERT(sceneIndex != activeSceneIndex) this->activeSceneIndex = sceneIndex; qDebug() << "AnimationProject::setActiveSceneIndex --> End"; } Scene *AnimationProject::getActiveScene() { Q_ASSERT(activeSceneIndex >= 0); return scenes[activeSceneIndex]; } int AnimationProject::getSceneSize() const { return scenes.size(); } int AnimationProject::getSceneTakeSize(int sceneIndex) const { return scenes[sceneIndex]->getTakeSize(); } int AnimationProject::getSceneExposureSize(int sceneIndex) const { return scenes[sceneIndex]->getExposureSize(); } int AnimationProject::getSceneTakeExposureSize(int sceneIndex, int takeIndex) const { return scenes[sceneIndex]->getTake(takeIndex)->getExposureSize(); } Scene *AnimationProject::getScene(int sceneIndex) { if (sceneIndex > -1 && sceneIndex < scenes.size()) { return scenes[sceneIndex]; } return NULL; } void AnimationProject::addScene(const QString &sceneDescription) { qDebug() << "AnimationProject::addScene --> Start"; Scene *scene = new Scene(this); scene->setId(QString("%1").arg(nextSceneIndex, 3, 10, QLatin1Char('0'))); this->nextSceneIndex++; if (!sceneDescription.isEmpty()) { scene->setDescription(sceneDescription); } scenes.append(scene); qDebug() << "AnimationProject::addScene --> End"; } void AnimationProject::addScene(Scene *scene) { qDebug() << "AnimationProject::addScene --> Start"; scenes.append(scene); qDebug() << "AnimationProject::addScene --> End"; } void AnimationProject::insertScene(int sceneIndex, const QString &sceneDescription) { qDebug() << "AnimationProject::insertScene --> Start"; Q_ASSERT(sceneIndex > -1); Q_ASSERT(sceneIndex < getSceneSize()); Scene *scene = new Scene(this); scene->setId(QString("%1").arg(nextSceneIndex, 3, 10, QLatin1Char('0'))); this->nextSceneIndex++; if (!sceneDescription.isEmpty()) { scene->setDescription(sceneDescription); } scenes.insert(sceneIndex, scene); if (sceneIndex <= activeSceneIndex) { setActiveSceneIndex(activeSceneIndex+1); } qDebug() << "AnimationProject::insertScene --> End"; } void AnimationProject::insertScene(int sceneIndex, Scene *scene) { qDebug() << "AnimationProject::insertScene --> Start"; Q_ASSERT(sceneIndex > -1); Q_ASSERT(sceneIndex < getSceneSize()); scenes.insert(sceneIndex, scene); if (sceneIndex <= activeSceneIndex) { setActiveSceneIndex(activeSceneIndex+1); } qDebug() << "AnimationProject::insertScene --> End"; } void AnimationProject::moveScene(int sceneIndex, int movePosition) { if (sceneIndex != movePosition) { this->setActiveSceneIndex(-1); Scene *scene = scenes[sceneIndex]; scenes.remove(sceneIndex); scenes.insert(movePosition, scene); // this->notifyMoveScene(sceneIndex, movePosition); } } /* void AnimationProject::removeActiveScene() { if (activeSceneIndex < 0) { return; } int sceneIndex = activeSceneIndex; if (sceneIndex < getSceneSize() - 1) { activeSceneIndex = sceneIndex + 1; } else { activeSceneIndex = sceneIndex - 1; } scenes.remove(sceneIndex); } */ Scene *AnimationProject::removeScene(int sceneIndex) { qDebug() << "AnimationProject::removeScene --> Start"; Q_ASSERT(sceneIndex != activeSceneIndex); if (sceneIndex < activeSceneIndex) { // Scene bevor the active scene will be removed setActiveSceneIndex(activeSceneIndex-1); Q_ASSERT(-1 < activeSceneIndex); } Scene *removedScene = scenes[sceneIndex]; scenes.remove(sceneIndex); qDebug() << "AnimationProject::removeScene --> End"; return removedScene; } bool AnimationProject::readScenesFromProject(QDomElement &animationNode) { qDebug() << "AnimationProject::readScenesFromProject --> Start"; QString activeSceneId; description.append(animationNode.attributeNode(QLatin1String("descr")).value()); QDomElement currElement = animationNode.firstChildElement(); while (!currElement.isNull()) { QString nodeName = currElement.nodeName(); // The node is a scene node if (nodeName.compare("scene") == 0) { Scene *newScene = new Scene(this); scenes.append(newScene); if (!newScene->readDataFromProject(currElement)) { qDebug() << "AnimationProject::readScenesFromProject --> End (false)"; return false; } } else if (nodeName.compare("activescene") == 0) { activeSceneId.clear(); activeSceneId.append(currElement.text()); } else if (currElement.nodeName().compare("nextscene") == 0) { nextSceneIndex = currElement.text().toUInt(); } currElement = currElement.nextSiblingElement(); } // Search the active scene with the readed id. int sceneSize = scenes.size(); for ( int sceneIndex = 0; sceneIndex < sceneSize; sceneIndex++) { if (scenes[sceneIndex]->getId().compare(activeSceneId) == 0) { activeSceneIndex = sceneIndex; break; } } // Compatibility for old project files. if (nextSceneIndex == 0) { nextSceneIndex = sceneSize; } qDebug() << "AnimationProject::readScenesFromProject --> End"; return true; } bool AnimationProject::saveScenesToProject(QDomDocument &doc, QDomElement &animationNode) { qDebug() << "AnimationProject::saveScenesToProject --> Start"; unsigned int sceneSize = scenes.size(); unsigned int sceneIndex; QDomElement sceneElement; // Save project parameter animationNode.setAttribute("descr", description); if (isAnimationChanges()) { // The Animation is changed, rearrange the frames // Removes frames which already are saved. Had to do this to prevent // frames to overwrite each other. for (sceneIndex = 0; sceneIndex < sceneSize; ++sceneIndex) { Scene *scene = scenes[sceneIndex]; unsigned int takeSize = scene->getTakeSize(); for (unsigned int takeIndex = 0; takeIndex < takeSize; ++takeIndex) { Take *take = scene->getTake(takeIndex); unsigned int exposureSize = take->getExposureSize(); for (unsigned int exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { Exposure *exposure = take->getExposure(exposureIndex); exposure->moveToTemp(false); } } } // Delete all image file that stay in the image directory // (All files that deleted from the project.) QString imagePath = this->getOldImagePath(); QDir imageDir(imagePath); QStringList fileNameList = imageDir.entryList(QDir::Files); for (int fileIndex = 0 ; fileIndex < fileNameList.count() ; fileIndex++) { imageDir.remove(fileNameList[fileIndex]); } nextTotalExposureIndex = 0; // Move all frames to the project directory with a new indexed name for (sceneIndex = 0; sceneIndex < sceneSize; ++sceneIndex) { Scene *scene = scenes[sceneIndex]; // Create a new id for the scene scene->setId(QString("%1").arg((sceneIndex), 3, 10, QLatin1Char('0'))); unsigned int takeSize = scene->getTakeSize(); for (unsigned int takeIndex = 0; takeIndex < takeSize; ++takeIndex) { Take *take = scene->getTake(takeIndex); // Create a new id for the take take->setId(QString("%1").arg((takeIndex), 2, 10, QLatin1Char('0'))); unsigned int exposureSize = take->getExposureSize(); for (unsigned int exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { Exposure *exposure = take->getExposure(exposureIndex); // Create a new id for the Exposure exposure->setId(QString("%1").arg((exposureIndex), 4, 10, QLatin1Char('0'))); // Create a new file name for the frame /* This version didn't work with ffmpeg encoder QString newFrameName(scene->getId()); newFrameName.append('_'); newFrameName.append(take->getId()); newFrameName.append('_'); newFrameName.append(exposure->getId()); newFrameName.append(theFrame.mid(theFrame.lastIndexOf('.'))); */ QString oldFrameName = exposure->getImagePath(); int newTotalExposureIndex = getNextTotalExposureIndex(); QString newFrameName(QString("%1").arg(newTotalExposureIndex, 6, 10, QLatin1Char('0'))); newFrameName.append(oldFrameName.mid(oldFrameName.lastIndexOf('.'))); // Move frame file to project directory exposure->moveToProject(newFrameName); } } } // Delete all image file that stay in the temp directory // (All files that deleted from the project.) QString tempPath = this->getAppTempDirName(); QDir tempDir(tempPath); fileNameList = tempDir.entryList(QDir::Files); for (int fileIndex = 0 ; fileIndex < fileNameList.count() ; fileIndex++) { tempDir.remove(fileNameList[fileIndex]); } } // Reset the temp file index Exposure::tempNumber = 0; for (sceneIndex = 0; sceneIndex < sceneSize; ++sceneIndex) { // Scenes sceneElement = doc.createElement("scene"); animationNode.appendChild(sceneElement); if (!scenes[sceneIndex]->saveDataToProject(doc, sceneElement)) { qDebug() << "AnimationProject::saveScenesToProject --> End (false)"; return false; } } if (activeSceneIndex >= 0) { // Save activeSceneIndex parameter after the scenes, because the names of // the scenes are modifyed during the writing of the project file. QDomElement asiElement = doc.createElement("activescene"); QDomText asiText = doc.createTextNode(scenes[activeSceneIndex]->getId()); asiElement.appendChild(asiText); animationNode.appendChild(asiElement); // Save nextSceneIndex parameter. QDomElement leiElement = doc.createElement("nextscene"); QDomText leiText = doc.createTextNode(QString("%1").arg(sceneSize)); leiElement.appendChild(leiText); animationNode.appendChild(leiElement); } qDebug() << "AnimationProject::saveScenesToProject --> End"; return true; } bool AnimationProject::saveAsScenesToProject(QDomDocument &doc, QDomElement &animationNode) { qDebug() << "AnimationProject::saveScenesToProject --> Start"; unsigned int sceneSize = scenes.size(); unsigned int sceneIndex; QDomElement sceneElement; // Save project parameter animationNode.setAttribute("descr", description); // Removes frames which already are saved. Had to do this to prevent // frames to overwrite each other. for (sceneIndex = 0; sceneIndex < sceneSize; ++sceneIndex) { Scene *scene = scenes[sceneIndex]; unsigned int takeSize = scene->getTakeSize(); for (unsigned int takeIndex = 0; takeIndex < takeSize; ++takeIndex) { Take *take = scene->getTake(takeIndex); unsigned int exposureSize = take->getExposureSize(); for (unsigned int exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { Exposure *exposure = take->getExposure(exposureIndex); exposure->copyToTemp(); } } } nextTotalExposureIndex = 0; // Move all frames to the new project directory with a new indexed name for (sceneIndex = 0; sceneIndex < sceneSize; ++sceneIndex) { Scene *scene = scenes[sceneIndex]; // Create a new id for the scene scene->setId(QString("%1").arg((sceneIndex), 3, 10, QLatin1Char('0'))); unsigned int takeSize = scene->getTakeSize(); for (unsigned int takeIndex = 0; takeIndex < takeSize; ++takeIndex) { Take *take = scene->getTake(takeIndex); // Create a new id for the take take->setId(QString("%1").arg((takeIndex), 2, 10, QLatin1Char('0'))); unsigned int exposureSize = take->getExposureSize(); for (unsigned int exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { Exposure *exposure = take->getExposure(exposureIndex); // Create a new id for the Exposure exposure->setId(QString("%1").arg((exposureIndex), 4, 10, QLatin1Char('0'))); // Create a new file name for the frame /* This version didn't work with ffmpeg encoder QString newFrameName(scene->getId()); newFrameName.append('_'); newFrameName.append(take->getId()); newFrameName.append('_'); newFrameName.append(exposure->getId()); newFrameName.append(theFrame.mid(theFrame.lastIndexOf('.'))); */ QString oldFrameName = exposure->getImagePath(); int newTotalExposureIndex = getNextTotalExposureIndex(); QString newFrameName(QString("%1").arg(newTotalExposureIndex, 6, 10, QLatin1Char('0'))); newFrameName.append(oldFrameName.mid(oldFrameName.lastIndexOf('.'))); // Move frame file to project directory exposure->moveToProject(newFrameName); } } } for (sceneIndex = 0; sceneIndex < sceneSize; ++sceneIndex) { // Scenes sceneElement = doc.createElement("scene"); animationNode.appendChild(sceneElement); if (!scenes[sceneIndex]->saveDataToProject(doc, sceneElement)) { qDebug() << "AnimationProject::saveScenesToProject --> End (false)"; return false; } } if (activeSceneIndex >= 0) { // Save activeSceneIndex parameter after the scenes, because the names of // the scenes are modifyed during the writing of the project file. QDomElement asiElement = doc.createElement("activescene"); QDomText asiText = doc.createTextNode(scenes[activeSceneIndex]->getId()); asiElement.appendChild(asiText); animationNode.appendChild(asiElement); // Save nextSceneIndex parameter. QDomElement leiElement = doc.createElement("nextscene"); QDomText leiText = doc.createTextNode(QString("%1").arg(sceneSize)); leiElement.appendChild(leiText); animationNode.appendChild(leiElement); } qDebug() << "AnimationProject::saveScenesToProject --> End"; return true; } bool AnimationProject::convertImages(int newFormat, int newQuality) { qDebug() << "AnimationProject::saveScenesToProject --> Start"; unsigned int sceneSize = scenes.size(); unsigned int sceneIndex; // Removes frames which already are saved. Had to do this to prevent // frames to overwrite each other. for (sceneIndex = 0; sceneIndex < sceneSize; ++sceneIndex) { Scene *scene = scenes[sceneIndex]; unsigned int takeSize = scene->getTakeSize(); for (unsigned int takeIndex = 0; takeIndex < takeSize; ++takeIndex) { Take *take = scene->getTake(takeIndex); unsigned int exposureSize = take->getExposureSize(); for (unsigned int exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { Exposure *exposure = take->getExposure(exposureIndex); exposure->convertToTemp(newFormat, newQuality); } } } incAnimationChanges(); setImageFormat(newFormat); setImageQuality(newQuality); /* Delete all image file that stay in the image directory // (All files that deleted from the project.) QString imagePath = this->getOldImagePath(); QDir imageDir(imagePath); QStringList fileNameList = imageDir.entryList(QDir::Files); for (int fileIndex = 0 ; fileIndex < fileNameList.count() ; fileIndex++) { imageDir.remove(fileNameList[fileIndex]); } */ return true; } /************************************************************************** * Sound functions **************************************************************************/ int AnimationProject::addSoundToScene(unsigned int sceneIndex, const QString &sound, const QString &soundName) { qDebug() << "AnimationProject::addSoundToScene --> Start"; ++soundsNumber; int ret = scenes[sceneIndex]->addSound(sound, soundName); if (ret == -1) { frontend->showWarning(tr("Add Sound"), tr("Cannot open the selected audio file for reading.\n" "Check that you have the right permissions set.\n" "The animation will be run without sound if you\n" "choose to play.")); --soundsNumber; } else if (ret == -2) { frontend->showWarning(tr("Add Sound"), tr("The selected audio file is not valid within the\n" "given audio format. The animation will be run\n" "without sound if you choose to play.")); --soundsNumber; } qDebug() << "AnimationProject::addSoundToScene --> End"; return ret; } void AnimationProject::removeSoundFromScene(unsigned int sceneIndex, unsigned int soundIndex) { scenes[sceneIndex]->removeSound(soundIndex); --soundsNumber; } void AnimationProject::playSound(int sceneIndex) { if (isAudioDriverInitialized) { scenes[sceneIndex]->playSounds(audioDriver); } // notifyPlaySound(sceneIndex); } /************************************************************************** * Take functions **************************************************************************/ int AnimationProject::getActiveTakeIndex() const { Q_ASSERT(activeSceneIndex > -1); return scenes[activeSceneIndex]->getActiveTakeIndex(); } void AnimationProject::setActiveTakeIndex(int takeIndex) { Q_ASSERT(activeSceneIndex > -1); Scene *activeScene = scenes[activeSceneIndex]; activeScene->setActiveTakeIndex(takeIndex); } Take *AnimationProject::getActiveTake() { Q_ASSERT(activeSceneIndex >= 0); return getTake(activeSceneIndex, getActiveTakeIndex()); } void AnimationProject::addTake(int sceneIndex, const QString &takeDescription) { Scene *scene = getScene(sceneIndex); scene->addTake(takeDescription); } void AnimationProject::addTake(int sceneIndex, Take *take) { Scene *scene = getScene(sceneIndex); scene->addTake(take); } void AnimationProject::insertTake(int sceneIndex, int takeIndex, const QString &takeDescription) { Scene *scene = getScene(sceneIndex); scene->insertTake(takeIndex, takeDescription); } void AnimationProject::insertTake(int sceneIndex, int takeIndex, Take *take) { Scene *scene = getScene(sceneIndex); scene->insertTake(takeIndex, take); } void AnimationProject::moveTake(int fromSceneIndex, int fromTakeIndex, int toSceneIndex, int toTakeIndex) { Q_ASSERT(fromSceneIndex > -1); Q_ASSERT(toSceneIndex > -1); // TODO: Implement the move from one scene to another Q_ASSERT(fromSceneIndex == toSceneIndex); Scene *fromScene = scenes[fromSceneIndex]; fromScene->moveTake(fromTakeIndex, toTakeIndex); } /* Take *AnimationProject::removeActiveTake() { Q_ASSERT(activeSceneIndex > -1); Scene *activeScene = scenes[activeSceneIndex]; Take *removedTake = activeScene->removeActiveTake(); return removedTake; } */ Take *AnimationProject::removeTake(int sceneIndex, int takeIndex) { Scene *scene = scenes[sceneIndex]; Take *removedTake = scene->removeTake(takeIndex); return removedTake; } int AnimationProject::getTakeExposureSize(unsigned int sceneIndex, unsigned int takeIndex) const { return scenes[sceneIndex]->getTake(takeIndex)->getExposureSize(); } Take *AnimationProject::getTake(int sceneIndex, int takeIndex) { if (takeIndex > -1 && takeIndex < int(scenes[sceneIndex]->getTakeSize())) { return scenes[sceneIndex]->getTake(takeIndex); } return NULL; } /************************************************************************** * Exposure functions **************************************************************************/ int AnimationProject::getActiveExposureIndex() const { if (-1 == activeSceneIndex) { return -1; } Scene *activeScene = scenes[activeSceneIndex]; if (-1 == getActiveTakeIndex()) { return -1; } int activeExposureIndex = activeScene->getActiveExposureIndex(); return activeExposureIndex; } void AnimationProject::setActiveExposureIndex(int exposureIndex) { qDebug() << "AnimationProject::setActiveExposureIndex --> Start"; scenes[this->activeSceneIndex]->setActiveExposureIndex(exposureIndex); qDebug() << "AnimationProject::setActiveExposureIndex --> End"; } unsigned int AnimationProject::getTotalExposureSize() const { unsigned int modelSize = 0; unsigned int size = scenes.size(); for (unsigned int i = 0; i < size; ++i) { modelSize += scenes[i]->getExposureSize(); } return modelSize; } Exposure *AnimationProject::getExposure(unsigned int sceneIndex, unsigned int takeIndex, unsigned int exposureIndex) { // qDebug() << "AnimationProject::getExposure --> Start"); Q_ASSERT(exposureIndex < scenes[sceneIndex]->getExposureSize()); Exposure* exposure = scenes[sceneIndex]->getExposure(takeIndex, exposureIndex); // qDebug() << "AnimationProject::getExposure --> End"); return exposure; } Exposure *AnimationProject::getActiveExposure() { if (0 > activeSceneIndex) { // return a empty exposure return NULL; } int activeTakeIndex = getActiveTakeIndex(); if (0 > activeTakeIndex) { // return a empty exposure return NULL; } int activeExposureIndex = getActiveExposureIndex(); if (0 > activeExposureIndex) { // return a empty exposure return NULL; } return getExposure(activeSceneIndex, getActiveTakeIndex(), getActiveExposureIndex()); } void AnimationProject::addExposure(int sceneIndex, int takeIndex, const QString &fileName, int location) { Take *take = getTake(sceneIndex, takeIndex); take->addExposure(fileName, location); } void AnimationProject::addExposure(int sceneIndex, int takeIndex, Exposure *exposure) { Take *take = getTake(sceneIndex, takeIndex); take->addExposure(exposure); } void AnimationProject::insertExposure(int sceneIndex, int takeIndex, int exposureIndex, const QString &fileName, int location) { Take *take = getTake(sceneIndex, takeIndex); take->insertExposure(exposureIndex, fileName, location); } void AnimationProject::insertExposure(int sceneIndex, int takeIndex, int exposureIndex, Exposure *exposure) { Take *take = getTake(sceneIndex, takeIndex); take->insertExposure(exposureIndex, exposure); } Exposure *AnimationProject::removeActiveExposure() { Q_ASSERT(activeSceneIndex > -1); Scene *activeScene = scenes[activeSceneIndex]; Take *activeTake = activeScene->getTake(activeScene->getActiveTakeIndex()); Exposure *exposure = activeTake->removeActiveExposure(); return exposure; } Exposure *AnimationProject::removeExposure(int sceneIndex, int takeIndex, int exposureIndex) { Scene *scene = scenes[sceneIndex]; Exposure *exposure = scene->removeExposure(takeIndex, exposureIndex); return exposure; } unsigned int AnimationProject::getNextTotalExposureIndex() { unsigned int ret = nextTotalExposureIndex; nextTotalExposureIndex++; return ret; } bool AnimationProject::getModifyedExposure(const QString &filePath, int &modSceneIndex, int &modTakeIndex, int &modExposureIndex) { qDebug() << "AnimationProject::getModifyedExposure --> Start"; int sceneSize = scenes.size(); for (modSceneIndex = 0; modSceneIndex < sceneSize; ++modSceneIndex) { if (scenes[modSceneIndex]->getModifyedExposure(filePath, modTakeIndex, modExposureIndex)) { // Exposure found qDebug() << "AnimationProject::getModifyedExposure --> End"; return true; } } modSceneIndex = -1; qDebug() << "AnimationProject::getModifyedExposure --> End (Error)"; return false; } /************************************************************************** * Private functions **************************************************************************/ /* void AnimationProject::loadSavedScenes() { qDebug() << "AnimationProject::loadSavedScenes --> Start"); unsigned int numElem = scenes.size(); for (unsigned int i = 0; i < numElem; ++i) { notifyNewScene(i); } setActiveSceneIndex(numElem - 1); qDebug() << "AnimationProject::loadSavedScenes --> End"); } void AnimationProject::activateScene() { qDebug() << "AnimationProject::activateScene --> Start"); this->notifyActivateScene(); qDebug() << "AnimationProject::activateScene --> End"); } */ qstopmotion-2.3.2-Source/src/domain/animation/projectserializer.h000644 000000 000000 00000013610 12654352322 025261 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef PROJECTSERIALIZER_H #define PROJECTSERIALIZER_H #include #include #include // #include "domain/animation/animationproject.h" #include "frontends/frontend.h" class ProjectSerializer; class AnimationProject; /** * Class for serializing the project. It creates differents directories containing * the files belonging to the current project. Finally everything is packed in * a tarball. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad. */ class ProjectSerializer : public QObject { Q_OBJECT public: /** * Constructor. */ ProjectSerializer(Frontend* f); /** * Destructor. */ ~ProjectSerializer(); /** * Opens the project file and read the data. * @return true if reading was sucessful, false otherwise */ bool read(); /** * Saves the files in differents directories. * @param animation the project to be saved * @param saveAs the project sa to saved to a new project * @return true if saving was successfull, false otherwise */ bool save(AnimationProject *animation, bool saveAs); /** * Set a new the project file path. * @param fileName the new project file path. */ void setNewProjectFilePath(const QString &filePath); /** * Retrieves the new project file path. * @return the project path if it exist, NULL otherwise */ const QString getNewProjectFilePath() const; /** * Retrieves the absolute new project path. * This is the path where the files within the tarball are located or * the path to the project directory * @return the project path if it exist, NULL otherwise */ const QString getNewProjectPath() const; /** * Retrieves the absolute new image path, a subdirectory of the project path. * This is the path where the images can be found. * @return the image path if it exist, NULL otherwise */ const QString getNewImagePath() const; /** * Retrieves the absolute old image path, a subdirectory of the project path. * This is the path where the images can be found. * If the old path is empty, the new one is returned. * @return the image path if it exist, NULL otherwise */ const QString getOldImagePath() const; /** * Retrieves the absolute new sound path, a subdirectory of the project path. * This is the path where the sound can be found. * @return the sound path if it exist, NULL otherwise */ const QString getNewSoundPath() const; /** * Retrieves the absolute old sound path, a subdirectory of the project path. * This is the path where the sound can be found. * If the old path is empty, the new one is returned. * @return the sound path if it exist, NULL otherwise */ const QString getOldSoundPath() const; /** * Get the animation element of the projet tree * @return the animation element */ QDomElement &getAnimationElement(); /** * Get the settings element of the projet tree * @return the settings element */ QDomElement &getSettingsElement(); /** * Get the version element of the projet tree * @return the version element */ const QDomElement getVersionElement() const; /** * Deletes unessecary files and pointers. */ void cleanup(); /** * Deletes unessecary files and pointers. */ void cleanupOldFiles(); private: /** * Frontend of the application. */ Frontend *frontend; QDomDocument doc; // QDomElement rootNode; QDomElement versionElement; QDomElement settingsElement; QDomElement animationElement; /** * Absolute path to the project */ QString newProjectPath; QString oldProjectPath; /** * Absolute path to the image files */ QString newImagePath; QString oldImagePath; /** * Absolute path to the sound files */ QString newSoundPath; QString oldSoundPath; /** * Absolute file path of the project file */ QString newProjectFilePath; QString oldProjectFilePath; /** * Absolute file path of the archiv file */ QString newArchiveFilePath; QString oldArchiveFilePath; }; #endif qstopmotion-2.3.2-Source/src/domain/animation/projectserializer.cpp000644 000000 000000 00000030122 12654352322 025611 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "projectserializer.h" #include "domain/domainfacade.h" #include "technical/preferencestool.h" #include #include #include #include #include #include #include ProjectSerializer::ProjectSerializer(Frontend* f) { frontend = f; //Create the xml tree QDomImplementation domImpl; QDomDocumentType dtd = domImpl.createDocumentType("qsmd", "-//qStopMotion//DTD QSMD 1.0//EN", "http://www.qstopmotion.org/xmltemplates/qsmd1.dtd"); doc = QDomDocument(dtd); // rootNode = NULL; cleanup(); } ProjectSerializer::~ProjectSerializer() { doc.clear(); versionElement.clear(); animationElement.clear(); cleanup(); } bool ProjectSerializer::read() { qDebug() << "ProjectSerializer::read --> Start"; QString errorStr; int errorLine; int errorColumn; QDomElement rootElement; QDomElement element; QFile file(newProjectFilePath); if (!file.open(QIODevice::ReadOnly)) { frontend->showWarning(tr("DOM Parser"), QString(tr("Couldn't open XML file:\n%1")).arg(newProjectFilePath)); return false; } if (!doc.setContent(&file, true, &errorStr, &errorLine, &errorColumn)) { file.close(); frontend->showWarning(tr("DOM Parser"), QString(tr("Parse error at line %1, column %2:\n%3\n%4")) .arg(errorLine) .arg(errorColumn) .arg(errorStr) .arg(newProjectFilePath)); return false; } file.close(); rootElement = doc.documentElement(); element = rootElement.firstChildElement(); while (!element.isNull()) { if (element.nodeName().compare("version") == 0) { versionElement = element; } if (element.nodeName().compare("settings") == 0) { settingsElement = element; } if (element.nodeName().compare("animation") == 0) { animationElement = element; } element = element.nextSiblingElement(); } if (versionElement.isNull()) { qWarning() << "ProjectSerializer::read --> Error while parsing project file"; return false; } qDebug() << "ProjectSerializer::read --> End"; return true; } // check if the user wants to save an opened project to an another file. bool ProjectSerializer::save(AnimationProject *animation, bool saveAs) { qDebug() << "ProjectSerializer::save --> Start"; bool isSaved = false; QDomElement rootElement; QDomElement versionElement; // QDomImplementation *domImpl = new QDomImplementation(); // QDomDocumentType dtd = domImpl->createDocumentType("smil", // "-//W3C//DTD SMIL 2.0//EN", // "http://www.w3.org/2001/SMIL20/SMIL20.dtd"); doc.clear(); // doc = QDomDocument(dtd); QDomNode xmlNode = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"ISO-8859-1\""); doc.insertBefore(xmlNode, doc.firstChild()); rootElement = doc.createElement("qsmd"); rootElement.setAttribute("xmlns", "http://www.qstopmotion.org/xmltemplates/Language"); rootElement.setAttribute("xml:lang", "en"); rootElement.setAttribute("title", "qStopMotion"); doc.appendChild(rootElement); versionElement = doc.createElement("version"); QDomText versionText = doc.createTextNode("1.0"); versionElement.appendChild(versionText); rootElement.appendChild(versionElement); // Save settings settingsElement = doc.createElement("settings"); rootElement.appendChild(settingsElement); animation->saveSettingsToProject(doc, settingsElement); // Save animation animationElement = doc.createElement("animation"); rootElement.appendChild(animationElement); if (saveAs) { animation->saveAsScenesToProject(doc, animationElement); } else { animation->saveScenesToProject(doc, animationElement); } if (QFile::exists(newProjectFilePath)) { QString backup(newProjectFilePath + "." + PreferencesTool::backupSuffix); if (QFile::exists(backup)) { if (!QFile::remove(backup)) { // Not successful frontend->showCritical(tr("Critical"), tr("Can't remove old backup of project file!")); } } if (!QFile::rename(newProjectFilePath, backup)) { // Rename not successful --> copy and remove if (!QFile::copy(newProjectFilePath, backup)) { frontend->showCritical(tr("Critical"), tr("Can't copy the project file to backup!")); } if (!QFile::remove(newProjectFilePath)) { frontend->showCritical(tr("Critical"), tr("Can't remove the old project file!")); } } } QFile file(newProjectFilePath); if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) { qWarning() << "ProjectSerializer::save --> Can't open project file"; return isSaved; } QTextStream out(&file); doc.save(out, 2); out.flush(); file.close(); isSaved = true; unsigned int numElem = animation->getTotalExposureSize(); animation->getFrontend()->updateProgress(numElem); animation->getFrontend()->hideProgress(); qDebug() << "ProjectSerializer::save --> End"; return isSaved; } /* void ProjectSerializer::saveDOMToFile(const QDomDocument &doc) { QFile file(projectFilePath); QTextStream out(&file); const int Ident = 4; doc.save(out, Ident); } */ void ProjectSerializer::setNewProjectFilePath(const QString &pfp) { qDebug() << "ProjectSerializer::setNewProjectFilePath --> Start"; Q_ASSERT(!pfp.isEmpty()); if(newProjectFilePath.compare(pfp) == 0) { // No new file path return; } // This is a new project file name oldProjectFilePath.append(newProjectFilePath); newProjectFilePath.clear(); oldArchiveFilePath.append(newArchiveFilePath); newArchiveFilePath.clear(); oldProjectPath.append(newProjectPath); newProjectPath.clear(); oldImagePath.append(newImagePath); newImagePath.clear(); oldSoundPath.append(newSoundPath); newSoundPath.clear(); QString rootDir; QFileInfo projectFileInfo(pfp); // Get the absolute path of the project file rootDir.append(projectFileInfo.absoluteDir().absolutePath()); newProjectPath.append(rootDir); newProjectFilePath.append(pfp); newArchiveFilePath.append(pfp); newArchiveFilePath.replace(PreferencesTool::projectSuffix, PreferencesTool::archiveSuffix); newImagePath.append(QString("%1%2%3") .arg(newProjectPath) .arg(QLatin1String("/")) .arg(PreferencesTool::imageDirectory)); newSoundPath.append(QString("%1%2%3") .arg(newProjectPath) .arg(QLatin1String("/")) .arg(PreferencesTool::soundDirectory)); if (!QFile::exists(newProjectPath)) { if (!QDir::root().mkpath(newProjectPath)) { this->frontend->showCritical(tr("Critical"), tr("Can't create project directory!")); } if (!QFile::setPermissions(newProjectPath, QFile::ReadUser | QFile::WriteUser | QFile::ExeUser | QFile::ReadGroup | QFile::WriteGroup | QFile::ReadOther | QFile::WriteOther)) { this->frontend->showCritical(tr("Critical"), tr("Can't change permissions of the project directory!")); } } if (!QFile::exists(newImagePath)) { if (!QDir::root().mkpath(newImagePath)) { this->frontend->showCritical(tr("Critical"), tr("Can't create image directory!")); } // Set permissions to 0755 if (!QFile::setPermissions(newImagePath, QFile::ReadUser | QFile::WriteUser | QFile::ExeUser | QFile::ReadGroup | QFile::WriteGroup | QFile::ReadOther | QFile::WriteOther)) { this->frontend->showCritical(tr("Critical"), tr("Can't change permissions of the image directory!")); } } if (!QFile::exists(newSoundPath)) { if (!QDir::root().mkpath(newSoundPath)) { this->frontend->showCritical(tr("Critical"), tr("Can't create sound directory!")); } if (!QFile::setPermissions(newSoundPath, QFile::ReadUser | QFile::WriteUser | QFile::ExeUser | QFile::ReadGroup | QFile::WriteGroup | QFile::ReadOther | QFile::WriteOther)) { this->frontend->showCritical(tr("Critical"), tr("Can't change permissions of the sound directory!")); } } qDebug() << "ProjectSerializer::setNewProjectFilePath --> End"; } const QString ProjectSerializer::getNewProjectFilePath() const { return newProjectFilePath; } const QString ProjectSerializer::getNewProjectPath() const { return newProjectPath; } const QString ProjectSerializer::getNewImagePath() const { return newImagePath; } const QString ProjectSerializer::getOldImagePath() const { if (!oldImagePath.isEmpty()) { return oldImagePath; } return newImagePath; } const QString ProjectSerializer::getNewSoundPath() const { return newSoundPath; } const QString ProjectSerializer::getOldSoundPath() const { if (!oldSoundPath.isEmpty()) { return oldSoundPath; } return newSoundPath; } QDomElement &ProjectSerializer::getAnimationElement() { return animationElement; } QDomElement &ProjectSerializer::getSettingsElement() { return settingsElement; } const QDomElement ProjectSerializer::getVersionElement() const { return versionElement; } void ProjectSerializer::cleanup() { newProjectFilePath.clear(); newArchiveFilePath.clear(); newProjectPath.clear(); newImagePath.clear(); newSoundPath.clear(); cleanupOldFiles(); } void ProjectSerializer::cleanupOldFiles() { oldProjectFilePath.clear(); oldArchiveFilePath.clear(); oldProjectPath.clear(); oldImagePath.clear(); oldSoundPath.clear(); } qstopmotion-2.3.2-Source/src/domain/animation/scene.h000644 000000 000000 00000040332 12654352322 022617 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef SCENE_H #define SCENE_H #include #include #include #include #include "domain/animation/animationproject.h" #include "domain/animation/exposure.h" #include "domain/animation/take.h" #include "frontends/frontend.h" #include "technical/audio/audiodriver.h" #include "technical/audio/audioformat.h" class AnimationProject; class Scene; class Take; class Exposure; class Frontend; /** * Class representing the scenes in the animation * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class Scene : public QObject { Q_OBJECT public: /** * Initializes the scene */ Scene(AnimationProject *project); /** * Cleans up the scene and delete the takes. */ ~Scene(); /** * Is this a empty Scene. */ bool isEmpty(); /** * Get the id of the scene. * @return id of the scene. */ const QString getId() const; /** * Set the id of the scene. If the new id string is empty, * nothing is done. */ void setId(const QString &newId); /** * Get the description of the scene. * @return description of the scene. */ const QString getDescription() const; /** * Set the description of the scene. If the new description string is empty, * nothing is done. */ void setDescription(const QString &newDescription); /** * Get the new image path of the project * @return image path of the project */ const QString getNewImagePath() const; /** * Get the old image path of the project * @return image path of the project */ const QString getOldImagePath() const; /** * Get the parent of the scene * @return parent of the scene */ AnimationProject *getParent(); /** * Get the index of the scene in the animation project * @return the index of the scene */ unsigned int getIndex(); /** * Get the frontend. * @return the frontend. */ Frontend* getFrontend(); /** * Sets this Exposure as a valid project file. */ void markAsProjectFile(); /** * Get scene data from project file. */ bool readDataFromProject(QDomElement &sceneNode); /** * Set scene data to project file. */ bool saveDataToProject(QDomDocument &doc, QDomElement &sceneNode); /** * Get the temp path of the project * @return temp path of the project */ const QString getAppTempDirName() const; /************************************************************************** * Take functions **************************************************************************/ /** * Retrieves the index of the active take in the scene. * @return the index of take in the scene. */ int getActiveTakeIndex() const; /** * Returns the index of the given take in the scene. * Returns -1 if no item matched. * @return the index of the given take. */ int getTakeIndex(Take *take) const; /** * Set the active take index. * @param takeIndex the index of the new active take. */ void setActiveTakeIndex(int takeIndex); /** * Retrieves the active take in the scene. * @return the active of take in the scene. */ Take *getActiveTake(); /** * Set the active take. * @param newTake the pointer of the new active take. */ void setActiveTake(Take *newTake); /** * Retrieves the size of takes in the scene. * @return the size of takes in the scene. */ int getTakeSize() const; /** * Retrieves the take at position takeIndex. * @param takeIndex the index of the exposure to retrieve. * @return the take at position takeIndex. */ Take *getTake(unsigned int takeIndex); /** * Create a new take and add the take as the last to the scene. * @param takeDescription the description of the take or a empty string. */ void addTake(const QString &takeDescription); /** * Add an existing take as the last to the scene. * @param take The existing take object. */ void addTake(Take *take); /** * Create a new take and insert the take bevor the active take. * @param takeIndex The index of the take the new take inserted before. * @param takeDescription the description of the take or a empty string. */ void insertTake(int takeIndex, const QString &takeDescription); /** * Insert a existing take bevor the active take. * @param takeIndex The index of the take the new take inserted before. * @param take The existing take object. */ void insertTake(int takeIndex, Take *take); /** * Moves the take at position takeIndex to the position movePosition. * @param takeIndex the index of the take to move. * @param movePosition the position to move the take to. */ void moveTake(int takeIndex, int movePosition); /** * Removes a take from the scene. * @param takeIndex The index of the take to remove. * @return The removed take. */ Take *removeTake(int takeIndex); /************************************************************************** * Exposure functions **************************************************************************/ /** * Retrieves the number of exposures in the scene. * @return the number of exposures in the scene. */ unsigned int getExposureSize() const; /** * Retrieves the index of active exposure in the active take. * @return the index of exposure in the take. */ int getActiveExposureIndex() const; /** * Set the active exposure index. * @param exposureIndex the index of the new active exposure. */ void setActiveExposureIndex(int exposureIndex); /** * Retrieves the exposure at position exposureIndex in the take takeIndex. * @param takeIndex the index of the take of the exposure to retrieve. * @param exposureIndex the index of the exposure to retrieve. * @return the exposure at position exposureIndex. */ Exposure* getExposure(unsigned int takeIndex, unsigned int exposureIndex); /** * Temporary functions to assist in an orderly transfer of functionality from * Animation, without having to break the project for big time-periods. */ void getExposures(QVector& allExposures); /** * Creates a exposure with the picture at location exposureName and * adds it the end of the actual take of the scene. * @param takeIndex The index of the take to create the exposure. * @param fileName the name fo the image file to the exposure to create. * @param location the location of the picture */ void addExposure(int takeIndex, const QString &fileName, int location); /** * Adds a existing exposure at the end of the actual take of the scene. * @param takeIndex The index of the take to create the exposure. * @param exposure The existing exposure. */ void addExposure(int takeIndex, Exposure *exposure); /** * Creates a exposure with the picture at location exposureName and adds * in the take. * @param takeIndex The index of the take to create the exposure. * @param exposureIndex the place to create the exposure. * @param fileName the name to the image file to the exposure to create. * @param location the location of the picture */ void insertExposure(int takeIndex, int exposureIndex, const QString &fileName, int location); /** * Insert an existing exposure in the take. * @param takeIndex The index of the take to create the exposure. * @param exposureIndex the place to create the exposure. * @param exposure The existing exposure. */ void insertExposure(int takeIndex, int exposureIndex, Exposure *exposure); /** * Remove the exposures at the positions from fromExposure to toExposure (inclusive) * from the scene. * @param fromExposure the first exposure to remove from the scene. * @param toExposure the last exposure to remove from the scene. * @return the new paths where the exposure pictures has been moved. This is * for the undo object. */ const QVector removeExposures(unsigned int fromExposure, const unsigned int toExposure); /** * Removes the exposure with the given tree item from the animation. * @param takeIndex the index of the take with the exposure to remove * @param exposureIndex the index of the exposure to remove * @return The removed exposure or NULL if nothing is done */ Exposure *removeExposure(unsigned int takeIndex, unsigned int exposureIndex); /** * Moves the exposures at the positions from fromExposure to toExposure (inclusive) * to the position movePosition inside the scene. * @param fromExposure the first exposure to move. * @param toExposure the lst exposure to move. * @param movePosition the position to move the exposures to. */ void moveExposures(unsigned int fromExposure, unsigned int toExposure, unsigned int movePosition); /** * Get the position of the modified exposure in the project. * @param filePath The path to the modified exposure. * @param modTakeIndex the index of the take of the modified exposure. * @param modExposureIndex the index of the modified exposure. * @return True if the exposure is found and false else. */ bool getModifyedExposure(const QString &filePath, int &modTakeIndex, int &modExposureIndex); /** * Cleans exposures from the scene without moving them around. Used when the user * aborts while adding exposures. * @param fromExposure the first exposure to remove. * @param toExposure the last exposure to remove. */ void cleanExposures(unsigned int fromExposure, unsigned int toExposure); /** * Adds an already saved exposure. * @param f the exposure to add */ void addSavedExposure(Exposure *f); /** * Retrieves the image paths of all the exposures in this scene. *(This is an convenience function and is used when opening scenes) * @return the image paths of all the exposures in this scene. */ QVector getImagePaths() const; /************************************************************************** * Sound functions **************************************************************************/ /** * Get the start position of the scene on th sound file of the scene. * @return start position. */ unsigned int getSoundStartPosition() const; /** * Sets the start position of the take on the sound file of the scene. * @param newSoundStartPosition new start position. */ void setSoundStartPosition(unsigned int newSoundStartPosition); /** * Adds the sound in the file filename to this Exposure. * @param filename the name of the file where the sound is. * @param soundName the new name of the sound. * @return zero on success, less than zero on failure; * -1 = file is not readable * -2 = not a valid audio file */ int addSound(const QString &filename, const QString &soundName); /** * Removes sound with the index soundIndex from this Exposure. * @param soundIndex Index of the sound to remove. */ void removeSound(unsigned int soundIndex); /** * Returns the number of sounds in this Exposure. * @return the number of sounds in this Exposure. */ unsigned int getNumberOfSounds() const; /** * Returns the sounds belonging to this Exposure. * @return a vector containing audio objects which kan be played * with the implemented audio driver */ QVector& getSounds(); /** * Retrieves the name of the sound at index soundIndex in this Exposure. * @param soundIndex the index of the sound to return. * @return the sound at index soundIndex in this Exposure. */ const QString getSoundName(unsigned int soundIndex) const; /** * Plays the sounds belonging to this Exposure. */ void playSounds(AudioDriver *driver); /** * Moves the sounds to a sound directory. * @param directory the directory to move the sounds to */ void moveToSoundDir(const QString &directory); /** * Get sound data from project file. */ bool readSoundFromProject(QDomElement &soundNode); /** * Set sound data to project file. */ bool saveSoundToProject(QDomDocument &doc, QDomElement &sceneNode); /************************************************************************** * Operator functions **************************************************************************/ // bool operator!= (const Scene &other) const; private: /** * The parent of the scene object */ AnimationProject *parent; /** * Id of the scene. */ QString id; /** * Description of the scene. */ QString description; /** * True if this scene is saved to a project file. It is also true if the * scene is loaded from a previously saved project. */ bool isProjectFile; /** * Contains the sounds beloning to this Exposure. */ QVector sounds; /** * Contains the sound names beloning to this Exposure. The names are user * defined e.g. Speech 1. */ QVector soundNames; /** * Number of sounds belonging to this Exposure. */ int soundsNumber; /** * Start position of the take on the sound file of the scene */ unsigned int soundStartPosition; /** * Absolute path to the sound file. The sound can either be in a project * directory, the tmp directory or the trash directory. */ QString soundPath; /** * Current active Take of the scene */ int activeTakeIndex; /** * next take index to use to create a dummy description string. */ unsigned int nextTakeIndex; /** * Vector containing all takes of the scene */ QVector takes; /************************************************************************** * Private functions **************************************************************************/ /** * Activate the activeTake. */ // void activateTake(); }; #endif qstopmotion-2.3.2-Source/src/domain/animation/take.cpp000644 000000 000000 00000037044 12654352322 023007 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "take.h" #include #include #include #include "domain/domainfacade.h" Take::Take(Scene *scene) { parent = scene; activeExposureIndex = -1; nextExposureIndex = 0; isProjectFile = false; soundStartPosition = 0; } Take::~Take() { unsigned int exposureSize = exposures.size(); for (unsigned int exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { delete exposures[exposureIndex]; exposures[exposureIndex] = NULL; } exposures.clear(); } bool Take::isEmpty() { return exposures.isEmpty(); } const QString Take::getId() const { return id; } void Take::setId(const QString &newId) { if (!newId.isEmpty()) { id.clear(); id.append(newId); } } const QString Take::getDescription() const { return description; } void Take::setDescription(const QString &newDescription) { if (!newDescription.isEmpty()) { description.clear(); description.append(newDescription); } } Scene *Take::getScene() { return parent; } unsigned int Take::getIndex() { unsigned int index; index = parent->getTakeIndex(this); return index; } unsigned int Take::getSceneIndex() { unsigned int index; index = parent->getIndex(); #include return index; } const QString Take::getNewImagePath() const { return parent->getNewImagePath(); } const QString Take::getOldImagePath() const { return parent->getOldImagePath(); } Frontend* Take::getFrontend() { return parent->getFrontend(); } AnimationProject* Take::getAnimationProject() { return parent->getParent(); } bool Take::readDataFromProject(QDomElement &takeNode) { qDebug() << "Take::readDataFromProject --> Start"; QString activeExposureId; id.append(takeNode.attributeNode(QLatin1String("id")).value()); description.append(takeNode.attributeNode(QLatin1String("descr")).value()); QDomElement currElement = takeNode.firstChildElement(); while (!currElement.isNull()) { QString elementName = currElement.nodeName(); if (elementName.compare("exposure") == 0) { // This is a exposure data element Exposure *newExposure = new Exposure(this); exposures.append(newExposure); if (!newExposure->readDataFromProject(currElement)) { qWarning() << "Take::readDataFromProject --> Read exposure data failed"; return false; } } else if (currElement.nodeName().compare("activeexposure") == 0) { activeExposureId.clear(); activeExposureId.append(currElement.text()); } else if (currElement.nodeName().compare("nextexposure") == 0) { nextExposureIndex = currElement.text().toUInt(); } else if (elementName.compare("sound") == 0) { if (!readSoundFromProject(currElement)) { qWarning() << "Take::readDataFromProject --> Read sound data failed"; return false; } } currElement = currElement.nextSiblingElement(); } // Search the active exposure with the readed id. int exposureSize = exposures.size(); for ( int exposureIndex = 0; exposureIndex < exposureSize; exposureIndex++) { if (exposures[exposureIndex]->getId().compare(activeExposureId) == 0) { activeExposureIndex = exposureIndex; break; } } // Compatibility for old project files. if (nextExposureIndex == 0) { nextExposureIndex = exposureSize; } this->isProjectFile = true; qDebug() << "Take::readDataFromProject --> End"; return true; } bool Take::saveDataToProject(QDomDocument &doc, QDomElement &takeNode) { qDebug() << "Take::saveDataFromProject --> Start"; unsigned int exposureSize = exposures.size(); unsigned int exposureIndex; // Save take attributes takeNode.setAttribute("id", id); takeNode.setAttribute("descr", description); // Save exposureses for (exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { getFrontend()->increaseProgress(); QDomElement exposureElement = doc.createElement("exposure"); takeNode.appendChild(exposureElement); if (!exposures[exposureIndex]->saveDataToProject(doc, exposureElement)) { qWarning() << "Take::saveDataFromProject --> Save exposure data failed"; return false; } } if (activeExposureIndex >= 0) { // Save activeTakeIndex parameter after the exposures, because the names of // the exposures are modifyed during the writing of the project file. QDomElement aeiElement = doc.createElement("activeexposure"); QDomText aeiText = doc.createTextNode(exposures[activeExposureIndex]->getId()); aeiElement.appendChild(aeiText); takeNode.appendChild(aeiElement); // Save nextExposureIndex parameter. QDomElement leiElement = doc.createElement("nextexposure"); QDomText leiText = doc.createTextNode(QString("%1").arg(exposureSize)); leiElement.appendChild(leiText); takeNode.appendChild(leiElement); } // Sounds if (!saveSoundToProject(doc, takeNode)) { qWarning() << "Take::saveDataFromProject --> Save sound data failed"; return false; } this->isProjectFile = true; qDebug() << "Take::saveDataFromProject --> End"; return true; } const QString Take::getAppTempDirName() const { return parent->getAppTempDirName(); } /************************************************************************** * Exposure functions **************************************************************************/ int Take::getActiveExposureIndex() const { return activeExposureIndex; } int Take::getExposureIndex(Exposure *exposure) { int index; index = exposures.indexOf(exposure); return index; } void Take::setActiveExposure(Exposure *newExposure) { qDebug() << "Take::setActiveExposure --> Start"; // Check the active take index and active scene index parent->setActiveTake(this); // Set the new active exposure int exposureSize = exposures.size(); int exposureIndex; for (exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { if (exposures[exposureIndex] == newExposure) { break; } } Q_ASSERT(exposureIndex != exposureSize); if (exposureIndex != activeExposureIndex) { this->activeExposureIndex = exposureIndex; } qDebug() << "Take::setActiveExposure --> End"; } void Take::setActiveExposureIndex(int exposureIndex) { qDebug() << "Take::setActiveExposureIndex --> Start"; // The new exposure index can be the same as the active exposure index // if the active exposure is removed from the exposure vector // Q_ASSERT(exposureIndex != activeExposureIndex); this->activeExposureIndex = exposureIndex; qDebug() << "Take::setActiveExposureIndex --> End"; } void Take::getExposures(QVector& allExposures) { unsigned int exposureSize = exposures.size(); for (unsigned int exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { allExposures.append(exposures[exposureIndex]); } } int Take::getExposureSize() const { return exposures.size(); } Exposure* Take::getExposure(unsigned int exposureIndex) { return exposures[exposureIndex]; } void Take::addExposure(const QString &fileName, int location) { qDebug() << "Take::addExposure(new) --> Start"; Exposure *newExposure = new Exposure(this, fileName, location); newExposure->setId(QString("%1").arg(nextExposureIndex, 4, 10, QLatin1Char('0'))); nextExposureIndex++; exposures.append(newExposure); qDebug() << "Take::addExposure(new) --> End"; } void Take::addExposure(Exposure *exposure) { qDebug() << "Take::addExposure(exist) --> Start"; exposures.append(exposure); qDebug() << "Take::addExposure(exist) --> End"; } void Take::insertExposure(int exposureIndex, const QString &fileName, int location) { qDebug() << "Take::insertExposure(new) --> Start"; Q_ASSERT(exposureIndex > -1); Q_ASSERT(exposureIndex < getExposureSize()); Exposure *newExposure = new Exposure(this, fileName, location); newExposure->setId(QString("%1").arg(nextExposureIndex, 4, 10, QLatin1Char('0'))); nextExposureIndex++; exposures.insert(exposureIndex, newExposure); if (exposureIndex <= activeExposureIndex) { setActiveExposureIndex(activeExposureIndex+1); } qDebug() << "Take::insertExposure(new) --> End"; } void Take::insertExposure(int exposureIndex, Exposure *exposure) { qDebug() << "Take::insertExposure(exist) --> Start"; Q_ASSERT(exposureIndex > -1); Q_ASSERT(exposureIndex < getExposureSize()); exposures.insert(exposureIndex, exposure); if (exposureIndex <= activeExposureIndex) { setActiveExposureIndex(activeExposureIndex+1); } qDebug() << "Take::insertExposure(exist) --> End"; } bool Take::getModifyedExposure(const QString &filePath, int &modExposureIndex) { qDebug() << "Take::getModifyedExposure --> Start"; int exposureSize = exposures.size(); for (modExposureIndex = 0; modExposureIndex < exposureSize; ++modExposureIndex) { QString imagePath(exposures[modExposureIndex]->getImagePath()); if (0 == filePath.compare(imagePath)) { // Exposure found qDebug() << "Take::getModifyedExposure --> End"; return true; } } modExposureIndex = -1; qDebug() << "Take::getModifyedExposure --> End (Error)"; return false; } void Take::cleanExposures(unsigned int fromExposure, unsigned int toExposure) { exposures.erase(exposures.begin() + fromExposure, exposures.begin() + toExposure); } void Take::addSavedExposure(Exposure *f) { exposures.append(f); } void Take::moveExposures(unsigned int fromExposure, unsigned int toExposure, unsigned int movePosition) { if (movePosition < fromExposure) { for (unsigned int i = fromExposure, j = movePosition; i <= toExposure; ++i, ++j) { Exposure *exposure = exposures[i]; exposures.erase(exposures.begin() + i); exposures.insert(exposures.begin() + j, exposure); } } else { for (unsigned int i = fromExposure; i <= toExposure; ++i) { Exposure *exposure = exposures[fromExposure]; exposures.erase(exposures.begin() + fromExposure); exposures.insert(exposures.begin() + movePosition, exposure); } } return; } const QVector Take::removeExposures(unsigned int fromExposure, const unsigned int toExposure) { QVector newExposures; if (toExposure < (unsigned int)exposures.size()) { for (unsigned int i = fromExposure; i <= toExposure; ++i) { Exposure *exposure = exposures[fromExposure]; newExposures.append(exposure); exposures.remove(fromExposure); } } return newExposures; } Exposure* Take::removeActiveExposure() { unsigned int exposureSize = exposures.size(); Exposure *exposure; exposure = exposures[activeExposureIndex]; exposures.remove(activeExposureIndex); if (activeExposureIndex == (exposureSize - 1)) { // It is the last exposure in the vector this->setActiveExposureIndex(activeExposureIndex - 1); } else { // It is a exposure in the middle of the vector // Selecting of the new exposure necessary this->setActiveExposureIndex(activeExposureIndex); } return exposure; } Exposure* Take::removeExposure(int exposureIndex) { Exposure *exposure; Q_ASSERT(exposureIndex != activeExposureIndex); exposure = exposures[exposureIndex]; exposures.remove(exposureIndex); if (exposureIndex <= activeExposureIndex) { setActiveExposureIndex(activeExposureIndex - 1); } return exposure; } QVector Take::getImagePaths() const { QVector imagePaths; unsigned int exposureSize = exposures.size(); for (unsigned int exposureIndex = 0; exposureIndex < exposureSize; ++exposureIndex) { imagePaths.append(exposures[exposureIndex]->getImagePath()); } return imagePaths; } /************************************************************************** * Sound functions **************************************************************************/ unsigned int Take::getSoundStartPosition() const { return soundStartPosition; } void Take::setSoundStartPosition(unsigned int newSoundStartPosition) { soundStartPosition = newSoundStartPosition; } bool Take::readSoundFromProject(QDomElement &soundNode) { qDebug() << "Take::readSoundFromProject --> Start"; QDomElement currElement = soundNode.firstChildElement(); while (!currElement.isNull()) { QString nodeName = currElement.nodeName(); if (nodeName.compare("offset") == 0) { // The node is a offset value QString tmp = currElement.text(); soundStartPosition = tmp.toInt(); } currElement = currElement.nextSiblingElement(); } qDebug() << "Take::readSoundFromProject --> End"; return true; } bool Take::saveSoundToProject(QDomDocument &/*doc*/, QDomElement &/*takeNode*/) { qDebug() << "Take::saveSoundFromProject --> Start"; // Save the node offset value qDebug() << "Take::saveSoundFromProject --> End"; return true; } /************************************************************************** * Private functions **************************************************************************/ /* void Take::activateExposure() { qDebug() << "Take::activateExposure --> Start"; parent->getParent()->notifyActivateExposure(); qDebug() << "Take::activateExposure --> End"; } */ qstopmotion-2.3.2-Source/src/domain/animation/take.h000644 000000 000000 00000026345 12654352322 022456 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef TAKE_H #define TAKE_H #include #include #include #include #include "domain/animation/animationproject.h" #include "domain/animation/scene.h" #include "domain/animation/take.h" #include "domain/animation/exposure.h" #include "frontends/frontend.h" class Scene; class Take; class Exposure; class Frontend; /** * Class representing the scenes in the animation * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class Take : public QObject { Q_OBJECT public: /** * Initializes the take */ Take(Scene *s); /** * Cleans up the take and delete the exposures. */ ~Take(); /** * Is this a empty Take. */ bool isEmpty(); /** * Get the id of the take. * @return id of the take. */ const QString getId() const; /** * Set the id of the take. If the new id string is empty, * nothing is done. */ void setId(const QString &newId); /** * Get the description of the take. * @return description of the take. */ const QString getDescription() const; /** * Set the description of the take. If the new description string is empty, * nothing is done. */ void setDescription(const QString &newDescription); /** * Get the scene object of the take. * @return the scene object of the take. */ Scene *getScene(); /** * Get the new image path of the project * @return image path of the project */ const QString getNewImagePath() const; /** * Get the old image path of the project * @return image path of the project */ const QString getOldImagePath() const; /** * Get the index of the take in the scene * @return the index of the take */ unsigned int getIndex(); /** * Get the index of the scene of the take in the animation project * @return the index of the scene */ unsigned int getSceneIndex(); /** * Get the frontend. * @return the frontend. */ Frontend* getFrontend(); /** * Get the animation project. * @return the animation project. */ AnimationProject* getAnimationProject(); /** * Get take data from project file. */ bool readDataFromProject(QDomElement &takeNode); /** * Set take data to project file. */ bool saveDataToProject(QDomDocument &doc, QDomElement &takeNode); /** * Get the temp path of the project * @return temp path of the project */ const QString getAppTempDirName() const; /************************************************************************** * Exposure functions **************************************************************************/ /** * Returns the index of the currently active exposure in the take. * @return the index of the currently active exposure. */ int getActiveExposureIndex() const; /** * Returns the index of the given exposure in the take. * Returns -1 if no item matched. * @return the index of the given exposure. */ int getExposureIndex(Exposure *exposure); /** * Set the active exposure. * @param newExposure the pointer of the actual exposure. */ void setActiveExposure(Exposure *newExposure); /** * Set the active exposure index. * @param exposureIndex the index of the actual exposure. */ void setActiveExposureIndex(int exposureIndex); /** * Retrieves the size of exposures of the take. * @return the size of exposures in the take. */ int getExposureSize() const; /** * Retrieves the exposure at position exposureIndex in the scene. * @param exposureIndex the index of the exposure to retrieve. * @return the exposure at position exposureIndex. */ Exposure *getExposure(unsigned int exposureIndex); /** *Temporary functions to assist in an orderly transfer of functionality from *Animation, without having to break the project for big time-periods. */ void getExposures(QVector& allExposures); /** * Creates a exposure with the picture at location exposureName and * adds it at the end of the take. * @param fileName the name of the image file to the exposure to create. * @param location the location of the picture */ void addExposure(const QString &fileName, int location); /** * Add an existing exposure at the end of the take. * @param exposure The existing exposure. */ void addExposure(Exposure *exposure); /** * Creates a exposure with the picture at location exposureName and adds it * at position exposureIndex in the take. * @param exposureIndex the place to create the exposure. * @param fileName the name of the image file of the exposure to create. * @param location the location of the picture */ void insertExposure(int exposureIndex, const QString &fileName, int location); /** * Insert an existing exposure at position exposureIndex in the take. * @param exposureIndex the place to create the exposure. * @param exposure The existing exposure. */ void insertExposure(int exposureIndex, Exposure *exposure); /** * Moves the exposures at the positions from fromExposure to toExposure (inclusive) * to the position movePosition inside the scene. * @param fromExposure the first exposure to move. * @param toExposure the lst exposure to move. * @param movePosition the position to move the exposures to. */ void moveExposures(unsigned int fromExposure, unsigned int toExposure, unsigned int movePosition); /** * Remove the exposures at the positions from fromExposure to toExposure (inclusive) * from the scene. * @param fromExposure the first exposure to remove from the scene. * @param toExposure the last exposure to remove from the scene. * @return the new paths where the exposure pictures has been moved. This is * for the undo object. */ const QVector removeExposures(unsigned int fromExposure, const unsigned int toExposure); /** * Removes the active exposure from the animation. * @return The removed exposure. */ Exposure* removeActiveExposure(); /** * Removes the exposure with the given index from the animation. * @param exposureIndex the index of the exposure to remove * @return The removed exposure or NULL if nothing is done */ Exposure* removeExposure(int exposureIndex); /** * Get the position of the modified exposure in the project. * @param filePath The path to the modified exposure. * @param modExposureIndex the index of the modified exposure. * @return True if the exposure is found and false else. */ bool getModifyedExposure(const QString &filePath, int &modExposureIndex); /** * Cleans exposures from the scene without moving them around. Used when the user * aborts while adding exposures. * @param fromExposure the first exposure to remove. * @param toExposure the last exposure to remove. */ void cleanExposures(unsigned int fromExposure, unsigned int toExposure); /** * Adds an already saved exposure. * @param f the exposure to add */ void addSavedExposure(Exposure *f); /** * Retrieves the image paths of all the exposures in this scene. *(This is an convenience function and is used when opening scenes) * @return the image paths of all the exposures in this scene. */ QVector getImagePaths() const; /************************************************************************** * Sound functions **************************************************************************/ /** * Get the start position of the take on th sound file of the scene. * @return start position. */ unsigned int getSoundStartPosition() const; /** * Sets the start position of the take on the sound file of the scene. * @param newSoundStartPosition new start position. */ void setSoundStartPosition(unsigned int newSoundStartPosition); /** * Get sound data from project file. */ bool readSoundFromProject(QDomElement &soundNode); /** * Set sound data to project file. */ bool saveSoundToProject(QDomDocument &doc, QDomElement &takeNode); private: /** * The parent of the scene object */ Scene *parent; /** * Id of the take. */ QString id; /** * Description of the take. */ QString description; /** * True if this take is saved to a project file. It is also true if the * take is loaded from a previously saved project. */ bool isProjectFile; /** * Start position of the take on the sound file of the scene */ unsigned int soundStartPosition; /** * Next exposure index to use to create a dummy description string. */ unsigned int nextExposureIndex; /** * Current active exposure of the take */ int activeExposureIndex; /** * Vector containing the exposures of the take. */ QVector exposures; /************************************************************************** * Private functions **************************************************************************/ /** * Activate the activeExposure. */ // void activateExposure(); }; #endif qstopmotion-2.3.2-Source/src/domain/animation/exposure.h000644 000000 000000 00000014141 12654352322 023373 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef EXPOSURE_H #define EXPOSURE_H #include #include #include #include #include #include "domain/animation/animationproject.h" // #include "domain/animation/scene.h" #include "domain/animation/take.h" // class AnimationProject; // class Scene; class Take; // class Exposure; /** * Class representing the Exposures in the animation * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class Exposure : public QObject { Q_OBJECT public: /** * Number of files in the temporary directory. */ static unsigned int tempNumber; /** * Default constructor * @param take The parent of the exposure */ Exposure(Take *take); /** * Copy constructor * * @param f Exposure to copy */ Exposure(Exposure *exposure); /** * Creates a Exposure with the picture in the file with name * filename, * @param take The parent of the exposure * @param fileName the name of the image file for this Exposure. * @param location the location of the picture */ Exposure(Take *take, const QString &fileName, int location); /** * Cleans up after the Exposure */ ~Exposure(); /** * Is this a empty Exposure. */ bool isEmpty(); /** * Get the id of the exposure. * @return id of the exposure. */ const QString getId() const; /** * Set the id of the exposure. If the new id string is empty, * nothing is done. */ void setId(const QString &newId); /** * Get the take object of the exposure. * @return Take object of the exposure. */ Take *getTake() const; /** * Get the index of the exposure in the take * @return the index of the exposure */ unsigned int getIndex(); /** * Get the index of the take of the exposure in the scene * @return the index of the take */ unsigned int getTakeIndex() const; /** * Get the index of the scene of the exposure in the animation project * @return the index of the scene */ unsigned int getSceneIndex() const; /** * Get the exposure location. * @return the exposure location */ // Exposure::fileLocation getExposureLocation(); /** * Retrieves the absolute path to the picture of this Exposure. * @return the absolute path to the picture of this Exposure. */ const QString getImagePath() const; /** * Moves the files belonging to this Exposure from the current directory * to the temporary directory. * @param isRecovery The project is in the recovery mode. */ void moveToTemp(bool isRecovery); /** * Copy the files belonging to this Exposure from the old directory * to the temporary directory. */ void copyToTemp(); /** * Convert the files belonging to this Exposure to a new image format * @param newFormat The new format of the images * from the directory to the temporary directory. * @param quality The quality of the image. */ void convertToTemp(int newFormat, int quality); /** * Moves the files belonging to this Exposure from the current directory * to the project directory. */ void moveToProject(const QString newName); /** * Get frame data from project file */ bool readDataFromProject(QDomElement &exposureNode); /** * Set frame data to project file. */ bool saveDataToProject(QDomDocument &doc, QDomElement &exposureNode); private: /** * The parent of the scene object */ Take *parent; /** * Id of the exposure. */ QString id; /** * Absolute path to the image file. The image can either be in a project * directory, the tmp directory or the trash directory. */ // QString imagePath; /** * File name of the frame */ QString theFrame; /** * True if this Exposure is saved to a project file. It is also true if the * Exposure is loaded from a previously saved project. */ int exposureLocation; /************************************************************************** * Private functions **************************************************************************/ /** * Gets the id of an image. This is just the filename of the image without * extension. * @return an id for the image */ const QString getExposureId(); }; #endif qstopmotion-2.3.2-Source/src/frontends/viewfacade.h000644 000000 000000 00000023016 13011043104 022353 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef VIEWFACADE_H #define VIEWFACADE_H #include #include #include #include #include "frontends/observer.h" #include "frontends/frontend.h" #include "technical/videoencoder/ffmpegencoder.h" class Frontend; class Observer; class DomainFacade; /** * The facade to all views class. * * ViewFacade serves as the Subject in our implementation of the observer * pattern, and takes care of notifying the observers when a change occur. */ class ViewFacade { public: /** * Constructor. * @param f the GUI frontend */ ViewFacade(Frontend *f); /** * Destructor. */ virtual ~ViewFacade(); /** * Get the frontend. * @return the frontend. */ Frontend* getFrontend(); /** * Get the domain facade */ DomainFacade* getProject(); /** * Attatches a new observer to the model. The observer will be notified * when something is changed in the model. * @param o the observer to be attached to the model. */ void attach(Observer *o); /** * Detatches an observer from the model. The observer will no longer be * notified when something is changed in the model. * @param o the observer to be detatched from the model. */ void detatch(Observer *o); /************************************************************************** * Animation notification functions **************************************************************************/ /** * Notify the observers that the model has been cleared. */ void notifyRemoveProject(); /** * Notify the observers that a new project is created. */ void notifyNewProject(); /** * Notify the observers that a project is opened. */ void notifyOpenProject(); /** * Notify the observers that a scene is to be played. * @param sceneIndex the scene to be played. */ void notifyPlaySound(int sceneIndex); /** * Notify the observers that a new mix mode is selected. * @param newMixMode the new mix mode. */ void notifyNewMixMode(int newMixMode); /** * Notify the observers that a new mix count is selected. * @param newMixCount the new mix count. */ void notifyNewMixCount(int newMixCount); /** * Notify the observers that a new live view frames per second value is selected. * @param newFps the new frames per second. */ void notifyNewLiveViewFps(int newFps); /** * Notify the observers that a new video frames per second value is selected. * @param newFps the new frames per second. */ void notifyNewVideoFps(int newFps); /************************************************************************** * Scene notification functions **************************************************************************/ /** * Notify the observers that a new scene has been added to the animation. * @param sceneIndex the place the new scene should be added to. */ void notifyAddScene(int sceneIndex); /** * Notify the observers that a new scene has been inserted in the animation. * @param sceneIndex the place the new scene should be inserted to. */ void notifyInsertScene(int sceneIndex); /** * Notify the observers that a new scene is activated. */ void notifyActivateScene(); /** * Notify the observers that a scene has been removed from the animation. * @param sceneIndex the scene which has been removed from the animation. */ void notifyRemoveScene(int sceneIndex); /** * Notify the observers that a scene in the animation has been moved. * @param sceneIndex the scene which has been moved. * @param movePosition the location the scene has been moved to. */ void notifyMoveScene(int sceneIndex, int movePosition); /************************************************************************** * Take notification functions **************************************************************************/ /** * Notify the observers that a new take has been added to the animation. * @param sceneIndex the scene the new take should be added to. * @param takeIndex the place the new take should be added to. */ void notifyAddTake(int sceneIndex, int takeIndex); /** * Notify the observers that a new take has been inserted to the animation. * @param sceneIndex the scene the new take should be inserted to. * @param takeIndex the place the new take should be inserted to. */ void notifyInsertTake(int sceneIndex, int takeIndex); /** * Notify the observers that a new take is activated. */ void notifyActivateTake(); /** * Notify the observers that a take has been removed from the animation. * @param sceneIndex The scene of the take which has been removed from the animation. * @param takeIndex The take which has been removed from the animation. */ void notifyRemoveTake(int sceneIndex, int takeIndex); /************************************************************************** * Exposure notification functions **************************************************************************/ /** * Notify the observers that a new exposure has been added to the animation. * @param sceneIndex the scene of the take the new take should be added to. * @param takeIndex the take the new exposure should be added to. * @param exposureIndex the place the new exposure should be added to. */ void notifyAddExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Notify the observers that a new exposure has been inserted to the animation. * @param sceneIndex the scene of the take the new take should be inserted to. * @param takeIndex the take the new exposure should be inserted to. * @param exposureIndex the place the new exposure inserted be added to. */ void notifyInsertExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Notify the observers that a new scene is activated. */ void notifyActivateExposure(); /** * Notify the observers that a selected exposure are removed from the model. * @param sceneIndex the scene index of the selected exposure. * @param takeIndex the take index of the selected exposure. * @param exposureIndex the index of the removed exposure. */ void notifyRemoveExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Notify the observers that a frame in the model has changed location (moved). * @param fromFrame the first frame in the selection * @param toFrame the last frame in the selection * @param movePosition the index to move the selected frames */ void notifyMoveExposures(int fromFrame, int toFrame, int movePosition); /** * Notify the observers the frame of an exposure has changed. * @param modSceneIndex The index of the scene of the modified exposure. * @param modTakeIndex The index of the take of the modified exposure. * @param modExposureIndex The index of the modified exposure. */ void notifyModifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex); protected: private: /** * The frontend in the program */ Frontend *frontend; /** * The datastructure containing the observers to be notified when something is * changed in the model. */ QVector observers; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/menuframe.cpp000644 000000 000000 00000004721 12654352322 024776 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "menuframe.h" #include MenuFrame::MenuFrame(QWidget * parent, const char * name) : QFrame(parent) { focusSpinBox = NULL; focusLineEdit = NULL; setObjectName(name); } void MenuFrame::mousePressEvent(QMouseEvent *) { } void MenuFrame::setFocusWidget(QSpinBox * focusSpinBox) { this->focusSpinBox = focusSpinBox; } void MenuFrame::setFocusWidget(QLineEdit * focusLineEdit) { this->focusLineEdit = focusLineEdit; } void MenuFrame::open() { if (focusSpinBox != 0) { focusSpinBox->setFocus(); focusSpinBox->selectAll(); } else if (focusLineEdit != 0) { focusLineEdit->setFocus(); focusLineEdit->selectAll(); } this->show(); } void MenuFrame::close(QWidget * newFocusWidget) { this->hide(); newFocusWidget->setFocus(); } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/menuframe.h000644 000000 000000 00000007722 12654352322 024447 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef MENUFRAME_H #define MENUFRAME_H #include #include #include #include /** * A customized GUI menu class for embedded menues which shouldn't be visible * at all times. The menues are hidden and pops up at various places in the * gui interface. * * This class allow you to create preferences/etc. menues without resorting to * the modal cover-the-gui menues. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class MenuFrame : public QFrame { Q_OBJECT public: /** * Creates and sets up the menu frame. * * @param parent the parent widget. * @param name the name of the menu. */ MenuFrame(QWidget * parent = 0, const char * name = 0); /** * Sets the focus widget to the QSpinBox: focusSpinBox. * * NB: One should only use use one of the two setFocusWidget functions. If both * are used the spinbox will be used. (A bit hacky but saves me from creating * a custom(/messy!) class hierarchy and gives me time to go out and have * a few beers tonight). * * @param focusSpinBox the focuswidget of this menu. */ void setFocusWidget(QSpinBox * focusSpinBox = 0); /** * Sets the focus widget to the QLineEdit: focusSpinBox. * * NB: One should only use use one of the two setFocusWidget functions. If both * are used the spinbox will be used. (A bit hacky but saves me from creating * a custom(/messy!) class hierarchy and gives me time to go out and have * a few beers tonight). * * @param focusLineEdit the focuswidget of this menu. */ void setFocusWidget(QLineEdit * focusLineEdit = 0); protected: /** * Overloaded function to intercept when the user press the mouse inside * the menu. (So that the mainwindow doesn't get the event). * @param e information about the event. */ void mousePressEvent(QMouseEvent * e); private: QSpinBox *focusSpinBox; QLineEdit *focusLineEdit; public slots: /** * Opens the menu. */ virtual void open(); /** * Closes the menu and turns the focus to the newFocusWidget. * @param newFocusWidget the widget who will recieve the focus after this menu * closes. */ virtual void close(QWidget * newFocusWidget); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/frameview/frameviewimage.h000644 000000 000000 00000021724 12751646113 027445 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef FRAMEVIEWIMAGE_H #define FRAMEVIEWIMAGE_H #include #include #include #include #include "domain/animation/exposure.h" #include "frontends/qtfrontend/frameview/frameviewinterface.h" /** * Implementation of the interface for the widget for viewing the frames in the * animation using QImage. * * Note: I'm considering redesigning the entire framework around this class, both * to make it more intuiative and to work with dynamic plugins for filters such * as onionskinning, diffing, you name it! (plugins are cool) =) However this is * not very important and is left for a weekend where i'm bored :p * * @author Ralf Lange */ class FrameViewImage : public FrameViewInterface { Q_OBJECT public: /** * Creates and initializes the frameview. * @param f the frontend of the applikaction. * @param parent the parent widget. * @param playbackSpeed which speed the playback has to be played in if * the playback mode is choosen */ FrameViewImage(Frontend *f, QWidget *parent = 0, int pS = 10); /** * Cleans up after the frameview. */ ~FrameViewImage(); /** * Initiation is compleated. */ void initCompleted(); QSize minimumSizeHint() const Q_DECL_OVERRIDE; QSize sizeHint() const Q_DECL_OVERRIDE; /************************************************************************** * Animation notification functions **************************************************************************/ /** * Function to receive notification when the model is erased. */ void updateRemoveProject(); /** * Function to recieve notification when a sound of a scene is to be played. * @param sceneIndex the scene to be played */ void updatePlaySound(int sceneIndex); /************************************************************************** * Scene notification functions **************************************************************************/ /** * Function to recueve notification when a scene is removed from * the model. * @param sceneIndex the scene which has been removed from the model. */ void updateRemoveScene(int sceneIndex); /************************************************************************** * Take notification functions **************************************************************************/ /** * Function to recueve notification when a take is removed from * the model. * @param sceneIndex The scene of the take which has been removed from the model. * @param takeIndex The take which has been removed from the model. */ void updateRemoveTake(int sceneIndex, int takeIndex); /************************************************************************** * Exposure notification functions **************************************************************************/ /** * Function to recieve notification when a new exposure is added to the * model. * @param sceneIndex the scene of the take where the new exposure is added. * @param takeIndex the take where the new exposure is added. * @param exposureIndex the index of the new exposure. */ void updateAddExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Function to recieve notification when a new exposure is inserted to the * model. * @param sceneIndex the scene of the take where the new exposure is inserted. * @param takeIndex the take where the new exposure is inserted. * @param exposureIndex the index of the new exposure. */ void updateInsertExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Function to recieve notification when a new frame is selected. */ void updateActivateExposure(); /** * Function to recieve notification when the frame of an exposure has modifyed. * @param modSceneIndex The index of the scene of the modifyed exposure. * @param modTakeIndex The index of the take of the modifyed exposure. * @param modExposureIndex The index of the modifyed exposure. */ void updateModifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex); /************************************************************************** * Other functions **************************************************************************/ /** * Function for performing the redraw with the next frame of the animation. * @param exposureIndex Index of the next frame */ void nextAnimationFrame(int exposureIndex); public slots: /** * Draws the next frame from the camera. */ void redraw(); /** * Function for performing playbacks. Will call redraw with regular intervals. */ void nextPlayBack(); protected: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; // bool event(QEvent *event) Q_DECL_OVERRIDE; void resizeEvent(QResizeEvent *event); private: static const int alphaLut[5]; QImage activeImage; QQueue imageBuffer; QTimer grabTimer; QTimer playbackTimer; ImageGrabThread *grabThread; /** * Loads the new frames picture into the frameview. * @param sceneIndex * @param takeIndex * @param exposureIndex */ // void setFrame(int sceneIndex, int takeIndex, int exposureIndex); /** * Loads the new active frame picture into the frameview. */ void activateExposure(); /** * Loads the modifyed frame picture into the frameview. * @param modSceneIndex The index of the scene of the modifyed exposure. * @param modTakeIndex The index of the take of the modifyed exposure. * @param modExposureIndex The index of the modifyed exposure. */ void modifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex); /** * Add a image to the image buffer */ void addToImageBuffer(QImage const image); /** * Load all entries in the image buffer */ void loadImageBuffer(); /** * Delete all entries in the image buffer */ void clearImageBuffer(); /** * Highly tweaked/optimized homemade function for taking the rgb differences * between two images. * * deltaRed = abs(r1 - r2), deltaGreen = abs(g1 - g2), deltaBlue = abs(b1 - b2) * for all pixels. * * @param image1 the first image of the two to differentiate. * @param image2 the second image of the two to differentiate. * @return a image with the rgb difference of image1 and image2. */ const QImage createDifferentiatedImage(QImage &image1, QImage &image2); /** * Change the alpha value of the image. * * @param image The first image of the two to differentiate. * @return A image with the new alpha value. */ const QImage createAlphaImage(QImage &image); /** * Change the alpha value of the gray image of the image. * * @param image The first image of the two to differentiate. * @return A image with the new alpha value. */ const QImage createGrayAlphaImage(QImage &image); /** * Show the logo as active image */ void showLogo(); void paintMethod(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/frameview/frameviewinterface.h000644 000000 000000 00000031751 13011043104 030301 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef FRAMEVIEWINTERFACE_H #define FRAMEVIEWINTERFACE_H #include #include #include #include #include #include "domain/animation/exposure.h" #include "frontends/observer.h" #include "frontends/frontend.h" class ImageGrabThread; /** * Interface for the frame view functionality of the widget for viewing the * frames in the animation. * * Note: I'm considering redesigning the entire framework around this class, both * to make it more intuiative and to work with dynamic plugins for filters such * as onionskinning, diffing, you name it! (plugins are cool) =) However this is * not very important and is left for a weekend where i'm bored :p * * @author Ralf Lange */ class FrameViewInterface : public QWidget, public Observer { Q_OBJECT public: /** * Enum with all possible image output formats */ enum frameViewDisplayMode { emptyMode, // Display nothing logoMode, // Display the logo stillImageMode, // Display the actual image of the project liveImageMode, // Display the live image playbackMode // Display all images of the project }; /** * Creates and initializes the frameview. * @param f the frontend of the applikaction. * @param parent the parent widget. * @param playbackSpeed which speed the playback has to be played in if * the playback mode is choosen */ FrameViewInterface(Frontend *f, QWidget *parent = 0, int pS = 10); /** * Cleans up after the frameview. */ virtual ~FrameViewInterface(); /** * Get the frontend. * @return the frontend. */ Frontend* getFrontend(); /** * Set the frontend. * @param f the frontend. * void setFrontend(Frontend* f); */ /** * */ virtual void initCompleted() = 0; /** * Sets the view to 4:3 format. */ void setWidescreenRatio(); /** * Sets the view to 16:9 format. */ void setNormalRatio(); /************************************************************************** * Animation notification functions **************************************************************************/ /** * Function to receive notification when the model is erased. */ virtual void updateRemoveProject() = 0; /** * Function to receive notification when a new Project is created. */ void updateNewProject(); /** * Function for receiving notification when a project is opened. */ virtual void updateOpenProject(); /** * Function to recieve notification when a sound of a scene is to be played. * @param sceneIndex the scene to be played */ virtual void updatePlaySound(int sceneIndex) = 0; /** * Function to recieve notification when new mix mode is set. * @param newMixMode the new mix mode */ virtual void updateMixMode(int newMixMode); /** * Function to recieve notification when new mix count is set. * @param newMixCount the new mix count */ virtual void updateMixCount(int newMixCount); /** * Function to recieve notification when new live view frames per second value is set. * @param newFps the new frames per second */ virtual void updateLiveViewFps(int newFps); /** * Function to recieve notification when new video frames per second value is set. * @param newFps the new frames per second */ virtual void updateVideoFps(int newFps); /************************************************************************** * Scene notification functions **************************************************************************/ /** * Function to recieve notification when a new scene is added to the * model. * @param sceneIndex the index of the new scene. */ void updateAddScene(int sceneIndex); /** * Function to recieve notification when a new scene is inserted to the * model. * @param sceneIndex the index of the new scene. */ void updateInsertScene(int sceneIndex); /** * Function which recieves notification when a scene is selected as the * active scene in the animationmodel. * @param sceneIndex the new active scene. * opening the new active scene. */ // void updateSetNewActiveScene(int sceneIndex); /** * Function which recieves notification when a scene is selected as the * active scene in the animationmodel. */ void updateActivateScene(); /** * Function to recueve notification when a scene is removed from * the model. * @param sceneIndex the scene which has been removed from the model. */ virtual void updateRemoveScene(int sceneIndex) = 0; /** * Function which recieve notification when a scene in the animation * has been moved. * @param sceneNumber the scene which have been moved. * @param movePosition the position the scene has been moved to. */ virtual void updateMoveScene(int sceneNumber, int movePosition); /************************************************************************** * Take notification functions **************************************************************************/ /** * Function to recieve notification when a new take is added to the * model. * @param sceneIndex the scene where the new take is added. * @param takeIndex the index of the new take. */ void updateAddTake(int sceneIndex, int takeIndex); /** * Function to recieve notification when a new take is inserted to the * model. * @param sceneIndex the scene where the new take is inserted. * @param takeIndex the index of the new take. */ void updateInsertTake(int sceneIndex, int takeIndex); /** * Function which recieves notification when a take is selected as the * active take in the animationmodel. * @param takeIndex the new active take. * opening the new active take. */ // void updateSetNewActiveTake(int takeIndex); /** * Function which recieves notification when a take is selected as the * active take in the animationmodel. */ void updateActivateTake(); /** * Function to recueve notification when a take is removed from * the model. * @param sceneIndex The scene of the take which has been removed from the model. * @param takeIndex The take which has been removed from the model. */ virtual void updateRemoveTake(int sceneIndex, int takeIndex) = 0; /************************************************************************** * Exposure notification functions **************************************************************************/ /** * Function to recieve notification when a new exposure is added to the * model. * @param sceneIndex the scene of the take where the new exposure is added. * @param takeIndex the take where the new exposure is added. * @param exposureIndex the index of the new exposure. */ void updateAddExposure(int sceneIndex, int takeIndex, int exposureIndex) = 0; /** * Function to recieve notification when a new exposure is inserted to the * model. * @param sceneIndex the scene of the take where the new exposure is added. * @param takeIndex the take where the new exposure is added. * @param exposureIndex the index of the new exposure. */ void updateInsertExposure(int sceneIndex, int takeIndex, int exposureIndex) = 0; /** * Function to recieve notification when a new exposure is selected. */ virtual void updateActivateExposure() = 0; /** * Function to recieve notification when one exposure are deleted. * @param sceneIndex the scene index of the selected exposure. * @param takeIndex the take index of the selected exposure. * @param exposureIndex the index of the removed exposure. */ void updateRemoveExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Function to recieve notification when one or more frames are moved. * */ void updateMoveExposures(int fromFrame, int toFrame, int movePosition); /************************************************************************** * Frameview functions **************************************************************************/ /** * Turns on the webcamera/video import mode. */ bool cameraOn(); /** * Turns off the webcamera/video import mode. */ void cameraOff(); /** * Returns the mix mode. * @return the mix mode. */ int getMixMode() const; /** * Sets the mix mode/type of effect used when displaying the video. * @param mode the type of effect to be showed on the video. The modes are:\n * 0: Image mixing/onion skinning\n * 1: Image differentiating\n * 2: Playback\n * @return true if the mode was succesfully changed */ bool setMixMode(int mode); /** * */ void setMixCount(int mixCount); /** * Sets the live view frames per second. * @param fps the speed to be set */ void setLiveViewFps(int fps); /** * Sets the video frames per second for the playback. * @param fps the speed to be set */ void setVideoFps(int fps); /** * Function for performing the redraw with the next frame of the animation. * @param exposureIndex Index of the next frame */ virtual void nextAnimationFrame(int exposureIndex) = 0; public slots: /** * Draws the next frame from the camera. */ virtual void redraw() = 0; /** * Function for performing playbacks. Will call redraw with regular intervals. */ virtual void nextPlayBack() = 0; protected: /** * Activate a new scene. */ virtual void activateScene(); /** * Activate a new take. */ virtual void activateTake(); /** * Loads the new frames picture into the frameview. * @param sceneIndex * @param takeIndex * @param exposureIndex */ // virtual void setFrame(int sceneIndex, int takeIndex, int exposureIndex) = 0; /** * Loads the new active frames picture into the frameview. */ virtual void activateExposure() = 0; /** * Delete all entries in the image buffer */ virtual void clearImageBuffer() = 0; /** * Show the logo as active image */ virtual void showLogo() = 0; /** * Clip the image to the video size * @param image The image to clip * @return The cliped image */ QImage clipImage(QImage image); /** * Scale the image to the frame view size * @param image The image to scale * @return The scaled image */ QImage scaleImage(QImage image); /** * Frontend of the application */ Frontend *frontend; /** * */ QTimer grabTimer; /** * */ QTimer playbackTimer; /** * */ int displayMode; /** * */ int liveViewFps; /** * */ int videoFps; /** * */ int widthConst; /** * */ int heightConst; /** * */ int frameViewWidth; /** * */ int frameViewHeight; /** * Number of images to display in mix mode. */ int mixCount; /** * Mode to viewing the images. */ int mixMode; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/frameview/frameviewinterface.cpp000644 000000 000000 00000035243 13011043104 030634 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "frameviewinterface.h" #include #include #include #include #include #include #include #include #include #include #include #include "domain/animation/animationproject.h" #include "technical/grabber/imagegrabber.h" FrameViewInterface::FrameViewInterface(Frontend *f, QWidget *parent, int fps) :QWidget(0) { qDebug() << "FrameViewInterface::Constructor --> Start"; frontend = f; this->liveViewFps = fps; displayMode = logoMode; widthConst = 4; heightConst = 3; frameViewWidth = 0; frameViewHeight = 0; mixCount = 2; mixMode = 0; setNormalRatio(); frontend->getView()->attach(this); qDebug() << "FrameViewInterface::Constructor --> FrameView is attached to the ViewFacade"; connect(&grabTimer, SIGNAL(timeout()), this, SLOT(redraw())); connect(&playbackTimer, SIGNAL(timeout()), this, SLOT(nextPlayBack())); qDebug() << "FrameViewInterface::Constructor --> End"; } FrameViewInterface::~FrameViewInterface() { qDebug() << "FrameViewInterface::Destructor --> Start"; frontend = NULL; qDebug() << "FrameViewInterface::Destructor --> End"; } Frontend* FrameViewInterface::getFrontend() { Q_ASSERT(frontend != NULL); return frontend; } /* void FrameViewInterface::setFrontend(Frontend* f) { frontend = f; } */ void FrameViewInterface::setWidescreenRatio() { qDebug() << "FrameViewInterface::setWidescreenRatio --> Start"; widthConst = 16; heightConst = 9; float minWidth = 300 * (16 / 9); this->setMinimumSize((int)minWidth, 300); this->update(); qDebug() << "FrameViewInterface::setWidescreenRatio --> End"; } void FrameViewInterface::setNormalRatio() { qDebug() << "FrameViewInterface::setNormalRatio --> Start"; widthConst = 4; heightConst = 3; this->setMinimumSize(400, 300); this->update(); qDebug() << "FrameViewInterface::setNormalRatio --> End"; } /************************************************************************** * Animation notification functions **************************************************************************/ void FrameViewInterface::updateNewProject() { qDebug() << "FrameViewInterface::updateNewProject --> Nothing"; // this->newProject(); // qDebug() << "FrameViewInterface::updateNewProject --> End"; } void FrameViewInterface::updateOpenProject() { qDebug() << "FrameViewInterface::updateOpenProject --> Nothing"; // this->openProject(); // qDebug() << "FrameViewInterface::updateOpenProject --> End"; } void FrameViewInterface::updateMixMode(int newMixMode) { qDebug() << "FrameViewInterface::updateMixMode --> Start"; this->setMixMode(newMixMode); qDebug() << "FrameViewInterface::updateMixMode --> End"; } void FrameViewInterface::updateMixCount(int newMixCount) { qDebug() << "FrameViewInterface::updateMixCount --> Start"; this->mixCount = newMixCount; qDebug() << "FrameViewInterface::updateMixCount --> End"; } void FrameViewInterface::updateLiveViewFps(int newFps) { qDebug() << "FrameViewInterface::updateLiveViewFps --> Start"; this->setLiveViewFps(newFps); qDebug() << "FrameViewInterface::updateLiveViewFps --> End"; } void FrameViewInterface::updateVideoFps(int newFps) { qDebug() << "FrameViewInterface::updateVideoFps --> Start"; this->setVideoFps(newFps); qDebug() << "FrameViewInterface::updateVideoFps --> End"; } /************************************************************************** * Scene notification functions **************************************************************************/ void FrameViewInterface::updateAddScene(int) { qDebug() << "FrameViewInterface::updateAddScene --> Empty"; } void FrameViewInterface::updateInsertScene(int) { qDebug() << "FrameViewInterface::updateInsertScene --> Empty"; } // void FrameViewInterface::updateSetNewActiveScene(int) {} void FrameViewInterface::updateActivateScene() { qDebug() << "FrameViewInterface::updateActivateScene --> Start"; activateScene(); qDebug() << "FrameViewInterface::updateActivateScene --> End"; } void FrameViewInterface::updateMoveScene(int, int) {} /************************************************************************** * Take notification functions **************************************************************************/ void FrameViewInterface::updateAddTake(int, int) { qDebug() << "FrameViewInterface::updateAddTake --> Empty"; } void FrameViewInterface::updateInsertTake(int, int) { qDebug() << "FrameViewInterface::updateInsertTake --> Empty"; } // void FrameViewInterface::updateSetNewActiveTake(int) {} void FrameViewInterface::updateActivateTake() { qDebug() << "FrameViewInterface::updateActivateTake --> Start"; qDebug() << "FrameViewInterface::updateActivateTake --> End"; } /************************************************************************** * Exposure notification functions **************************************************************************/ void FrameViewInterface::updateRemoveExposure(int, int, int) {} void FrameViewInterface::updateMoveExposures(int, int, int) {} /************************************************************************** * Frameview functions **************************************************************************/ bool FrameViewInterface::cameraOn() { qDebug() << "FrameViewInterface::cameraOn --> Start"; initCompleted(); displayMode = liveImageMode; grabTimer.start(1000 / liveViewFps * 10 ); // The liveViewFps = 20 means 2.0 qDebug() << "FrameViewInterface::cameraOn --> End"; return true; } void FrameViewInterface::cameraOff() { qDebug() << "FrameViewInterface::cameraOff --> Start"; grabTimer.stop(); playbackTimer.stop(); clearImageBuffer(); // Clear the display displayMode = emptyMode; repaint(); if (0 == frontend->getProject()->getTotalExposureSize()) { showLogo(); } else { displayMode = stillImageMode; activateExposure(); } this->update(); qDebug() << "FrameViewInterface::cameraOff --> End"; } int FrameViewInterface::getMixMode() const { return mixMode; } bool FrameViewInterface::setMixMode(int mode) { qDebug() << "FrameViewInterface::setMixMode --> Start"; // Going into playback mode. if (mode == 2 && this->mixMode != 2) { grabTimer.stop(); playbackTimer.start(1000 / videoFps); } // Going out of playback mode. else if (mode != 2 && mixMode == 2) { playbackTimer.stop(); grabTimer.start(1000 / liveViewFps * 10); // The liveViewFps = 20 means 2.0 } mixMode = mode; qDebug() << "FrameViewInterface::setMixMode --> End (true)"; return true; } void FrameViewInterface::setMixCount(int mixCount) { this->mixCount = mixCount; } void FrameViewInterface::setLiveViewFps(int fps) { this->liveViewFps = fps; if (grabTimer.isActive()) { grabTimer.setInterval(1000 / fps * 10); // The liveViewFps = 20 means 2.0 } } void FrameViewInterface::setVideoFps(int fps) { this->videoFps = fps; if (playbackTimer.isActive()) { playbackTimer.setInterval(1000 / fps); } } /************************************************************************** * Protected functions **************************************************************************/ void FrameViewInterface::activateScene() { qDebug() << "FrameViewInterface::activateScene --> Start"; // activateTake(); qDebug() << "FrameViewInterface::activateScene --> End"; } void FrameViewInterface::activateTake() { qDebug() << "FrameViewInterface::activateTake --> Start"; // activateExposure(); qDebug() << "FrameViewInterface::activateTake --> End"; } QImage FrameViewInterface::clipImage(QImage image) { QImage outputImage; QImage clipImage; double destWidth = 0; double destHeight = 0; double imageWidth = image.width(); double imageHeight = image.height(); double newImageWidth = 0; double newImageHeight = 0; double widthScale = 0; double heightScale = 0; int x = 0; int y = 0; int trans = frontend->getProject()->getImageTransformation(); if (displayMode == liveImageMode) { // Cliping and zooming is only necessary for live image mode switch (frontend->getProject()->getVideoSize()) { case ImageGrabber::qvgaSize: // QVGA destWidth = 320; destHeight = 240; break; case ImageGrabber::vgaSize: // VGA destWidth = 640; destHeight = 480; break; case ImageGrabber::svgaSize: // SVGA destWidth = 800; destHeight = 600; break; case ImageGrabber::paldSize: // PAL D destWidth = 704; destHeight = 576; break; case ImageGrabber::hdreadySize: // HD Ready destWidth = 1280; destHeight = 720; break; case ImageGrabber::fullhdSize: // Full HD destWidth = 1900; destHeight = 1080; break; default: // Camera image size destWidth = imageWidth; destHeight = imageHeight; break; } switch (trans) { case AnimationProject::ScaleImage: // Scale the image to the output size widthScale = imageWidth / frameViewWidth; heightScale = imageHeight / frameViewHeight; if (widthScale > heightScale) { outputImage = image.scaledToWidth(frameViewWidth); } else { outputImage = image.scaledToHeight(frameViewHeight); } break; case AnimationProject::ClipImage: // Clip the image to the output size switch (frontend->getProject()->getImageAdjustment()) { case ImageGrabber::leftUp: case ImageGrabber::leftMiddle: case ImageGrabber::leftDown: x = 0; break; case ImageGrabber::centerUp: case ImageGrabber::centerMiddle: case ImageGrabber::centerDown: x = (int)((imageWidth-destWidth)/2); break; case ImageGrabber::rightUp: case ImageGrabber::rightMiddle: case ImageGrabber::rightDown: x = (int)(imageWidth-destWidth); break; } switch (frontend->getProject()->getImageAdjustment()) { case ImageGrabber::leftUp: case ImageGrabber::centerUp: case ImageGrabber::rightUp: y = 0; break; case ImageGrabber::leftMiddle: case ImageGrabber::centerMiddle: case ImageGrabber::rightMiddle: y = (int)((imageHeight-destHeight)/2); break; case ImageGrabber::leftDown: case ImageGrabber::centerDown: case ImageGrabber::rightDown: y = (int)(imageHeight-destHeight); break; } clipImage = image.copy(x, y, destWidth, destHeight); widthScale = imageWidth / frameViewWidth; heightScale = imageHeight / frameViewHeight; if (widthScale > heightScale) { outputImage = clipImage.scaledToWidth(frameViewWidth); } else { outputImage = clipImage.scaledToHeight(frameViewHeight); } break; case AnimationProject::ZoomImage: // Zoom the image int zoomValue = frontend->getProject()->getZoomValue(); // 1. Step: Clip the image to the output size newImageWidth = imageWidth - ((imageWidth - destWidth) * zoomValue / 100); newImageHeight = imageHeight - ((imageHeight - destHeight) * zoomValue / 100); x = (int)((imageWidth-newImageWidth)/2); y = (int)((imageHeight-newImageHeight)/2); clipImage = image.copy(x, y, newImageWidth, newImageHeight); // 2. Step: Scale up the image widthScale = newImageWidth / frameViewWidth; heightScale = newImageHeight / frameViewHeight; if (widthScale > heightScale) { outputImage = clipImage.scaledToWidth(frameViewWidth); } else { outputImage = clipImage.scaledToHeight(frameViewHeight); } break; } } else { // All other modes - nothing to do outputImage = image; } return outputImage; } QImage FrameViewInterface::scaleImage(QImage image) { QImage outputImage; double imageWidth = image.width(); double imageHeight = image.height(); double widthScale = 0; double heightScale = 0; // Scale the image to the frame view size widthScale = imageWidth / frameViewWidth; heightScale = imageHeight / frameViewHeight; if (widthScale > heightScale) { outputImage = image.scaledToWidth(frameViewWidth); } else { outputImage = image.scaledToHeight(frameViewHeight); } return outputImage; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/frameview/frameviewimage.cpp000644 000000 000000 00000051236 12751646113 030001 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "frameviewimage.h" #include #include #include #include // const int FrameViewImage::alphaLut[5] = { 128, 64, 43, 32, 26 }; const int FrameViewImage::alphaLut[5] = { 255, 128, 64, 32, 16 }; FrameViewImage::FrameViewImage(Frontend *f, QWidget *parent, int pS) : FrameViewInterface(f, parent, pS) { qDebug() << "FrameViewImage::Constructor --> Start"; this->setObjectName("FrameViewImage"); // setAttribute(Qt::WA_PaintOnScreen); setBackgroundRole(QPalette::Base); setAutoFillBackground(true); this->showLogo(); qDebug() << "FrameViewImage::Constructor --> End"; } FrameViewImage::~FrameViewImage() { qDebug() << "FrameViewImage::Destructor --> Start"; // Turn off camera if it's on if (displayMode == liveImageMode) { cameraOff(); } clearImageBuffer(); qDebug() << "FrameViewImage::Destructor --> End"; } void FrameViewImage::initCompleted() { qDebug() << "FrameViewImage::initCompleted --> Start"; // Fill the image buffer clearImageBuffer(); loadImageBuffer(); // Clear the display displayMode = emptyMode; repaint(); qDebug() << "FrameViewImage::initCompleted --> End"; } QSize FrameViewImage::sizeHint() const { return QSize(400, 200); } QSize FrameViewImage::minimumSizeHint() const { return QSize(100, 100); } /************************************************************************** * Animation notification functions **************************************************************************/ void FrameViewImage::updateRemoveProject() { qDebug() << "FrameViewImage::updateRemoveProject --> Start"; showLogo(); qDebug() << "FrameViewImage::updateRemoveProject --> End"; } void FrameViewImage::updatePlaySound(int /*sceneIndex*/ ) { qDebug() << "FrameViewImage::updatePlaySound --> Start"; /* if (sceneIndex > -1) { setActiveFrame(frameNumber); } else { this->update(); } */ qDebug() << "FrameViewImage::updatePlaySound --> End"; } /************************************************************************** * Scene notification functions **************************************************************************/ void FrameViewImage::updateRemoveScene(int) { if (frontend->getProject()->getActiveSceneIndex() < 0) { showLogo(); return; } if (frontend->getProject()->getActiveTakeIndex() < 0) { showLogo(); } } /************************************************************************** * Take notification functions **************************************************************************/ void FrameViewImage::updateRemoveTake(int, int) { if (frontend->getProject()->getActiveSceneIndex() < 0) { showLogo(); return; } if (frontend->getProject()->getActiveTakeIndex() < 0) { showLogo(); } } /************************************************************************** * Exposure notification functions **************************************************************************/ void FrameViewImage::updateAddExposure(int sceneIndex, int takeIndex, int exposureIndex) { // qDebug() << "FrameViewImage::updateAddExposure --> Start"; if (displayMode == liveImageMode) { Exposure *exposure = frontend->getProject()->getExposure(sceneIndex, takeIndex, exposureIndex); addToImageBuffer(QImage(exposure->getImagePath())); } // qDebug() << "FrameViewImage::updateAddExposure --> End"; } void FrameViewImage::updateInsertExposure(int sceneIndex, int takeIndex, int exposureIndex) { qDebug() << "FrameViewImage::updateInsertExposure --> Start"; if (displayMode == liveImageMode) { Exposure *exposure = frontend->getProject()->getExposure(sceneIndex, takeIndex, exposureIndex); addToImageBuffer(QImage(exposure->getImagePath())); } qDebug() << "FrameViewImage::updateInsertExposure --> End"; } void FrameViewImage::updateActivateExposure() { qDebug() << "FrameViewImage::updateActivateExposure --> Start"; activateExposure(); qDebug() << "FrameViewImage::updateActivateExposure --> End"; } void FrameViewImage::updateModifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex) { qDebug() << "FrameViewImage::updateModifyExposure --> Start"; modifyExposure(modSceneIndex, modTakeIndex, modExposureIndex); qDebug() << "FrameViewImage::updateModifyExposure --> End"; } /************************************************************************** * Other functions **************************************************************************/ void FrameViewImage::nextAnimationFrame(int exposureIndex) { // qDebug() << "FrameViewImage::nextAnimationFrame --> Start"); int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); Q_ASSERT(activeSceneIndex >= 0); Q_ASSERT(activeTakeIndex >= 0); Exposure *exposure; exposure = frontend->getProject()->getExposure(activeSceneIndex, activeTakeIndex, exposureIndex); if (!exposure->isEmpty()) { QImage nextImage; nextImage.load(exposure->getImagePath()); activeImage = scaleImage(nextImage); QPainter widgetPainter(this); widgetPainter.drawImage(0, 0, scaleImage(activeImage)); } // Call the redraw function this->update(); // qDebug() << "FrameViewImage::nextAnimationFrame --> End"); return; } /************************************************************************** * Signals **************************************************************************/ /************************************************************************** * Slots **************************************************************************/ void FrameViewImage::redraw() { // qDebug() << "FrameViewImage::redraw --> Start"; const QImage liveImage = frontend->getLiveImage(); if (liveImage.isNull()) { qDebug() << "FrameViewImage::redraw --> End (empty live image)"; return; } activeImage = clipImage(liveImage); update(); // qDebug() << "FrameViewImage::redraw --> End"; } void FrameViewImage::nextPlayBack() { qDebug() << "FrameViewImage::nextPlayBack --> Start"; static int i = 0; // Need to check that there is an active scene before checking // what its size is. int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); int activeExposureIndex = frontend->getProject()->getActiveExposureIndex(); Q_ASSERT(activeSceneIndex >= 0); Q_ASSERT(activeTakeIndex >= 0); Q_ASSERT(activeExposureIndex >= 0); if ((int)i < mixCount && i < (int)activeExposureIndex + 1) { Exposure *exposure; if (activeExposureIndex <= mixCount) { exposure = frontend->getProject()->getExposure(activeSceneIndex, activeTakeIndex, i++); } else { exposure = frontend->getProject()->getExposure(activeSceneIndex, activeTakeIndex, activeExposureIndex - mixCount + i++); } if (!exposure->isEmpty()) { activeImage.load(exposure->getImagePath()); QPainter widgetPainter(this); widgetPainter.drawImage(0, 0, scaleImage(activeImage)); } this->update(); //Exit from function/skip redraw(). This is better than having a bool which is //set because this is a play function run "often". qDebug() << "FrameViewImage::nextPlayBack --> End"; return; } // This code is run if one of the two above tests fail. Can't be an else because // then I would have to have two such elses, and I think the return is better. i = 0; redraw(); qDebug() << "FrameViewImage::nextPlayBack --> End"; } /************************************************************************** * QWidget functions **************************************************************************/ void FrameViewImage::resizeEvent(QResizeEvent*) { qDebug() << "FrameViewImage::resizeEvent --> Start"; frameViewWidth = width(); frameViewHeight = height(); if (activeImage.isNull()) { showLogo(); } qDebug() << "FrameViewImage::resizeEvent --> End"; } void FrameViewImage::paintEvent(QPaintEvent *) { // qDebug() << "FrameViewImage::paintEvent --> Start"; // QImage outputImage = activeImage; QPainter widgetPainter(this); QColor gridColor; QRect widgetRect(this->rect()); widgetPainter.setRenderHint(QPainter::Antialiasing, true); if (displayMode == liveImageMode) { // Playing live video QPainter imagePainter(&activeImage); int offset; switch (mixMode) { case 0: // Image mixing // Set the composite mode for the images in the buffer imagePainter.setCompositionMode(QPainter::CompositionMode_Overlay); offset = imageBuffer.count() - 1; for (int i = 0; i < imageBuffer.count() && i < mixCount; ++i) { QImage image(imageBuffer[offset - i]); // QImage alphaImage(this->createAlphaImage(image)); QImage alphaImage(this->createGrayAlphaImage(image)); imagePainter.drawImage(0, 0, scaleImage(alphaImage)); } break; case 1: // Image differentiating if (imageBuffer.count() > 0) { QImage image(imageBuffer.last()); QImage diffImage(this->createDifferentiatedImage(activeImage, image)); imagePainter.eraseRect(activeImage.rect()); imagePainter.drawImage(0, 0, scaleImage(diffImage)); } break; } } switch (displayMode) { case emptyMode: // Display nothing widgetPainter.fillRect(widgetRect, QColor(225, 225, 225, 255)); break; case logoMode: // Fill the start screen widgetPainter.fillRect(widgetRect, QColor(225, 225, 225, 255)); default: // Display the actual image QImage outputImage = scaleImage(activeImage); QSize outputImageSize(outputImage.size()); int x = (widgetRect.width() - outputImageSize.width()) / 2; int y = (widgetRect.height() - outputImageSize.height()) / 2; widgetPainter.drawImage(x, y, outputImage); } switch (displayMode) { case liveImageMode: case playbackMode: int r, g, b, a; frontend->getGridColorRGB(&r, &g, &b, &a); gridColor.setRgb(r, g, b, a); if (frontend->getVerticalGrid()) { // Draw a vertical grid on top of the image int verticalLines = frontend->getVerticalSpin(); int vericalDistance = widgetRect.width() / (verticalLines + 1); int x1, y1, x2, y2; x1 = y1 = 0; y2 = widgetRect.height(); widgetPainter.setPen(gridColor); for (int v = 0 ; v < verticalLines ; v++) { x1 += vericalDistance; x2 = x1; widgetPainter.drawLine(x1, y1, x2, y2); } } if (frontend->getHorizontalGrid()) { // Draw a horizontal grid on top of the image int horizontalLines = frontend->getHorizontalSpin(); int horizontalDistance = widgetRect.height() / (horizontalLines + 1); int x1, y1, x2, y2; x1 = y1 = 0; x2 = widgetRect.width(); widgetPainter.setPen(gridColor); for (int h = 0 ; h < horizontalLines ; h++) { y1 += horizontalDistance; y2 = y1; widgetPainter.drawLine(x1, y1, x2, y2); } } break; } widgetPainter.setRenderHint(QPainter::Antialiasing, false); // qDebug() << "FrameViewImage::paintEvent --> End"; } /************************************************************************** * Private functions **************************************************************************/ void FrameViewImage::activateExposure() { qDebug() << "FrameViewImage::activateExposure --> Start"; Exposure *exposure = NULL; switch (displayMode) { case logoMode: displayMode = stillImageMode; case stillImageMode: exposure = frontend->getProject()->getActiveExposure(); // Q_ASSERT(exposure != NULL); if (exposure != NULL) { const QString fileName = exposure->getImagePath(); activeImage = QImage(fileName); } else { showLogo(); } update(); break; case liveImageMode: break; case playbackMode: break; } qDebug() << "FrameViewImage::activateExposure --> End"; } void FrameViewImage::modifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex) { qDebug() << "FrameViewImage::modifyExposure --> Start"; int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); if (activeSceneIndex != modSceneIndex) { // The scene of the modifyed exposure is not displayed in the frame view qDebug() << "FrameViewImage::modifyExposure --> End (Nothing)"; return; } int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); if (activeTakeIndex != modTakeIndex) { // The take of the modifyed exposure is not displayed in the frame view qDebug() << "FrameViewImage::modifyExposure --> End (Nothing)"; return; } int activeExposureIndex = frontend->getProject()->getActiveSceneIndex(); if (activeExposureIndex != modExposureIndex) { // The modifyed exposure is not displayed in the frame view qDebug() << "FrameViewImage::modifyExposure --> End (Nothing)"; return; } Exposure *exposure = frontend->getProject()->getActiveExposure(); if (exposure != NULL) { const QString fileName = exposure->getImagePath(); activeImage.load(fileName); } else { this->clearImageBuffer(); this->showLogo(); } this->update(); qDebug() << "FrameViewImage::modifyExposure --> End"; } void FrameViewImage::addToImageBuffer(QImage const image) { qDebug() << "FrameViewImage::addToImageBuffer --> Start"; imageBuffer.append(image); qDebug() << "FrameViewImage::addToImageBuffer --> End"; } void FrameViewImage::loadImageBuffer() { qDebug() << "FrameViewImage::loadImageBuffer --> Start"; int activeExposure = frontend->getProject()->getActiveExposureIndex(); int exposureIndex = activeExposure - this->mixCount + 1; if (exposureIndex < 0) { exposureIndex = 0; } for ( ; exposureIndex <= activeExposure ; exposureIndex++ ) { Exposure *exposure = frontend->getProject()->getExposure(frontend->getProject()->getActiveSceneIndex(), frontend->getProject()->getActiveTakeIndex(), exposureIndex); addToImageBuffer(QImage(exposure->getImagePath())); } qDebug() << "FrameViewImage::loadImageBuffer --> End"; } void FrameViewImage::clearImageBuffer() { qDebug() << "FrameViewImage::clearImageBuffer --> Start"; imageBuffer.clear(); qDebug() << "FrameViewImage::clearImageBuffer --> End"; } const QImage FrameViewImage::createDifferentiatedImage(QImage &image1, QImage &image2) { qDebug() << "FrameViewImage::createDifferentiatedImage --> Start"; int imageRows = image2.height(); int imageCols = image2.width(); QImage diffImage(imageCols, imageRows, QImage::Format_ARGB32); QColor diffColor; QColor image1Color; QColor image2Color; // Goes through the surfaces as one-dimensional arrays. for (int r = 0; r < imageRows; ++r) { for (int c = 0; c < imageCols; ++c) { image1Color = image1.pixel(c, r); image2Color = image2.pixel(c, r); diffColor.setRed(abs(image1Color.red() - image2Color.red())); diffColor.setGreen(abs(image1Color.green() - image2Color.green())); diffColor.setBlue(abs(image1Color.blue() - image2Color.blue())); diffColor.setAlpha(image1Color.alpha()); diffImage.setPixel(c, r, diffColor.rgba()); } } qDebug() << "FrameViewImage::createDifferentiatedImage --> End"; return diffImage; } const QImage FrameViewImage::createAlphaImage(QImage &image) { // qDebug() << "FrameViewImage::createAlphaImage --> Start"; int imageRows = image.height(); int imageCols = image.width(); int overlayIntensity = frontend->getProject()->getOverlayIntensity(); QImage alphaImage(image.size(), QImage::Format_ARGB32); QColor alphaColor; int overlayAlpha = 255 - overlayIntensity; // We assume the format to be RGB32!!! Q_ASSERT(image.format() == QImage::Format_RGB32); // Goes through the surfaces as one-dimensional arrays. for (int r = 0; r < imageRows; ++r) { for (int c = 0; c < imageCols; ++c) { alphaColor = image.pixel(c, r); alphaColor.setAlpha(overlayAlpha); // Qt < 5.6 version alphaImage.setPixel(c, r, alphaColor.rgba()); // Qt >= 5.6 version // alphaImage.setPixelColor(c, r, alphaColor); } } // qDebug() << "FrameViewImage::createAlphaImage --> End"; return alphaImage; } const QImage FrameViewImage::createGrayAlphaImage(QImage &image) { // qDebug() << "FrameViewImage::createGrayAlphaImage --> Start"; int imageRows = image.height(); int imageCols = image.width(); int overlayIntensity = frontend->getProject()->getOverlayIntensity(); QImage alphaImage(image.size(), QImage::Format_ARGB32); QColor alphaColor; QRgb grayRgba; // QColor grayColor; int gray; int overlayAlpha = 255 - overlayIntensity; // We assume the format to be RGB32!!! Q_ASSERT(image.format() == QImage::Format_RGB32); // Goes through the surfaces as one-dimensional arrays. for (int r = 0; r < imageRows; ++r) { for (int c = 0; c < imageCols; ++c) { alphaColor = image.pixel(c, r); gray = qGray(alphaColor.rgb()); // Qt < 5.6 grayRgba = qRgba(gray, gray, gray, overlayAlpha); alphaImage.setPixel(c, r, grayRgba); // Qt >= 5.6 // grayColor.setRgba(qRgba(gray, gray, gray, overlayAlpha)); // alphaImage.setPixelColor(c, r, grayColor); } } // qDebug() << "FrameViewImage::createGrayAlphaImage --> End"; return alphaImage; } void FrameViewImage::showLogo() { qDebug() << "FrameViewImage::showLogo --> Start"; QString iconFile(frontend->getGraphicsDirName()); iconFile.append(QLatin1String("qstopmotion_logo_60.png")); activeImage = scaleImage(QImage(iconFile)); displayMode = logoMode; update(); qDebug() << "FrameViewImage::showLogo --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/mainwindowgui.cpp000644 000000 000000 00000245430 13011043104 025663 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include #include #include #include #include #include #include "mainwindowgui.h" #include "domain/domainfacade.h" #include "domain/animation/projectserializer.h" #include "frontends/qtfrontend/toolbar.h" #include "frontends/qtfrontend/dialogs/aboutdialog.h" #include "frontends/qtfrontend/dialogs/startdialog.h" #include "frontends/qtfrontend/frameview/frameviewimage.h" #include "technical/preferencestool.h" #include "technical/util.h" #include "technical/videoencoder/ffmpegencoder.h" #include "technical/videoencoder/libavencoder.h" using namespace Qt; /************************************************************************** * Public functions **************************************************************************/ MainWindowGUI::MainWindowGUI(QApplication *stApp, Frontend *f) : stApp(stApp), frontend(f) { qDebug() << "MainWindowGUI::Constructor --> Start"; centerWidget = 0; centerWidgetLayout = 0; workArea = 0; workAreaLayout = 0; viewArea = 0; viewAreaLayout = 0; timeLine = 0; frameView = 0; toolBar = 0; newAct = 0; openAct = 0; mostRecentAct = 0; secondMostRecentAct = 0; thirdMostRecentAct = 0; fourthMostRecentAct = 0; saveAct = 0; saveAsAct = 0; videoAct = 0; cinelerraAct = 0; propertiesAct = 0; quitAct = 0; undoAct = 0; redoAct = 0; insertSceneAct = 0; addSceneAct = 0; removeSceneAct = 0; insertTakeAct = 0; addTakeAct = 0; removeTakeAct = 0; insertFramesAct = 0; addFramesAct = 0; removeFramesAct = 0; cutAct = 0; copyAct = 0; pasteAct = 0; preferencesAct = 0; whatsthisAct = 0; undoViewAct = 0; cameraControllerAct = 0; aboutAct = 0; helpAct = 0; fileMenu = 0; exportMenu = 0; mostRecentMenu = 0; editMenu = 0; windowsMenu = 0; helpMenu = 0; sideBar = 0; recordingTab = 0; projectTab = 0; // viewTab = 0; // compositingTab = 0; // gotoFrameAct = 0; // gotoMenuCloseButton = 0; // gotoMenuWidget = 0; // gotoMenuWidgetLayout = 0; // gotoSpinner = 0; // Status bar progressDialog = 0; timer = 0; projectLabel = 0; projectID = 0; sceneLabel = 0; sceneID = 0; takeLabel = 0; takeID = 0; exposureLabel = 0; exposureID = 0; // Other widgets undoView = 0; cameraControllerDialog = 0; helpBrowser = 0; changeMonitor = 0; grabber = 0; verticalGrid = false; verticalSpin = 5; horizontalGrid = false; horizontalSpin = 5; gridColor.setNamedColor("#000000"); // RGB Black this->setObjectName("MainWindowGUI"); stApp->installTranslator(&appTranslator); stApp->installTranslator(&qtTranslator); qDebug() << "MainWindowGUI::Constructor --> End"; } MainWindowGUI::~MainWindowGUI() { qDebug() << "MainWindowGUI::Destructor --> Start"; if (helpBrowser) { helpBrowser->close(); delete helpBrowser; helpBrowser = 0; } if (grabber != 0) { delete grabber; grabber = 0; } frontend = NULL; qDebug() << "MainWindowGUI::Destructor --> End"; } void MainWindowGUI::retranslateStrings() { qDebug() << "MainWindowGUI::retranslateStrings --> Start"; // The actions caption texts newAct->setText(tr("&New")); openAct->setText(tr("&Open")); saveAct->setText(tr("&Save")); saveAsAct->setText(tr("Save &As")); videoAct->setText(tr("Video")); cinelerraAct->setText(tr("Cinelerra")); propertiesAct->setText(tr("Properties")); quitAct->setText(tr("&Quit")); undoAct->setText(tr("&Undo")); redoAct->setText(tr("Re&do")); insertSceneAct->setText(tr("Insert Scene")); addSceneAct->setText(tr("Add Scene")); removeSceneAct->setText(tr("Remove Scene")); insertTakeAct->setText(tr("Insert Take")); addTakeAct->setText(tr("Add Take")); removeTakeAct->setText(tr("Remove Take")); insertFramesAct->setText(tr("Insert Frames")); addFramesAct->setText(tr("Add Frames")); removeFramesAct->setText(tr("Remove Frames")); // cutAct->setText(tr("Cu&t")); // copyAct->setText(tr("&Copy")); // pasteAct->setText(tr("&Paste")); preferencesAct->setText(tr("Preferences")); whatsthisAct->setText(tr("What's &This")); undoViewAct->setText(tr("&Undo stack")); cameraControllerAct->setText(tr("&Camera Controller")); helpAct->setText(tr("&Help")); aboutQtAct->setText(tr("About &Qt")); aboutAct->setText(tr("&About")); // The menus fileMenu->setTitle(tr("&File")); mostRecentMenu->setTitle(tr("Open &Recent")); exportMenu->setTitle(tr("&Export")); editMenu->setTitle(tr("&Edit")); windowsMenu->setTitle(tr("&Windows")); helpMenu->setTitle(tr("&Help")); updateMostRecentMenu(); // Status bar projectLabel->setText(tr("Project ID: ")); sceneLabel->setText(tr("Scene ID: ")); takeLabel->setText(tr("Take ID: ")); exposureLabel->setText(tr("Exposure ID: ")); // The sub widgets toolBar->retranslateStrings(); recordingTab->retranslateStrings(); sideBar->setTabText(0, tr("Recording")); projectTab->retranslateStrings(); sideBar->setTabText(1, tr("Project")); // viewTab->retranslateStrings(); // sideBar->setTabText(2, tr("View")); // compositingTab->retranslateStrings(); // sideBar->setTabText(3, tr("Compositing")); // Tooltip and whatsthis texts retranslateHelpText(); if (cameraControllerDialog != NULL) { cameraControllerDialog->retranslateStrings(); } if (helpBrowser != NULL) { delete helpBrowser; helpBrowser = NULL; } qDebug() << "MainWindowGUI::retranslateStrings --> End"; } void MainWindowGUI::retranslateHelpText() { QString infoText; // File menu infoText = tr("

New

" "

Creates a new project.

"); newAct->setWhatsThis(infoText); //The prepend part is a trick to keep the accelerator in the tooltip infoText = newAct->toolTip().prepend(tr("New project")); newAct->setToolTip(infoText); infoText = tr("

Open

" "

Opens a qStopMotion project file.

"); openAct->setWhatsThis(infoText); infoText = openAct->toolTip().prepend(tr("Open project")); openAct->setToolTip(infoText); infoText = tr("

Save

" "

Saves the current animation as a qStopMotion " "project file.
If this project has been saved before it will " "automatically be saved to the previously selected file.

"); saveAct->setWhatsThis(infoText); infoText = saveAct->toolTip().prepend(tr("Save project")); saveAct->setToolTip(infoText); infoText = tr("

Save As

" "

Saves the current animation as a qStopMotion " "project file.

"); saveAsAct->setWhatsThis(infoText); infoText = saveAsAct->toolTip().prepend(tr("Save project As")); saveAsAct->setToolTip(infoText); infoText = tr("

Video

" "

Exports the current project as video.

" "You will be given a wizard to guide you."); videoAct->setWhatsThis(infoText); videoAct->setToolTip(infoText); infoText = tr("

Cinelerra

" "

Exports the current animation as a cinelerra-cv project.

" "You will be given a wizard to guide you."); cinelerraAct->setWhatsThis(infoText); cinelerraAct->setToolTip(infoText); infoText = tr("

Properties of the project

" "

This will opens a window where you can change " "properties of the animation project.

"); propertiesAct->setWhatsThis(infoText); infoText = propertiesAct->toolTip().prepend(tr("Properties of the animation project")); propertiesAct->setToolTip(infoText); infoText = tr("

Quit

" "

Quits the program.

"); quitAct->setWhatsThis(infoText); infoText = quitAct->toolTip().prepend(tr("Quit")); quitAct->setToolTip(infoText); // Edit menu infoText = tr("

Undo

" "

Undoes your last operation. You can press undo " "several time to undo earlier operations.

"); undoAct->setWhatsThis(infoText); infoText = undoAct->toolTip().prepend(tr("Undo")); undoAct->setToolTip(infoText); infoText = tr("

Redo

" "

Redoes your last operation. You can press redo " "several times to redo several operations.

"); redoAct->setWhatsThis(infoText); infoText = redoAct->toolTip().prepend(tr("Redo")); redoAct->setToolTip(infoText); /* infoText = tr("

Cut

" "

Cuts the selected frames out of the animation and adds them " "to the clipboard so that you can paste them in somewhere else.

"); cutAct->setWhatsThis(infoText); infoText = cutAct->toolTip().prepend(tr("Cut")); cutAct->setToolTip(infoText); infoText = tr("

Copy

" "

Copies the selected frames to the clipboard. You can " "then paste them in another place.

"); copyAct->setWhatsThis(infoText); infoText = copyAct->toolTip().prepend(tr("Copy")); copyAct->setToolTip(infoText); infoText = tr("

Paste

" "

Pastes the frames which are currently in the clipboard " "into the selected location.

You can copy/cut images from another " "programs and then use this option to paste them into this animation.

"); pasteAct->setWhatsThis(infoText); infoText = pasteAct->toolTip().prepend(tr("Paste")); pasteAct->setToolTip(infoText); infoText = tr("

Go to frame

" "

This will bring up a popup-menu at the bottom where you can choose " "a frame you want to go to.

"); gotoFrameAct->setWhatsThis(infoText); infoText = gotoFrameAct->toolTip().prepend(tr("Go to frame")); gotoFrameAct->setToolTip(infoText); */ infoText = tr("

Preferences of the application

" "

This will opens a window where you can change " "the preferences of the application.

"); preferencesAct->setWhatsThis(infoText); infoText = preferencesAct->toolTip().prepend(tr("Preferences of qStopMotion")); preferencesAct->setToolTip(infoText); // Windows menu // Help menu infoText = tr("

What's This

" "

This will give you a WhatsThis mouse cursor which can be used to " "bring up helpful information like this.

"); whatsthisAct->setWhatsThis(infoText); infoText = whatsthisAct->toolTip().prepend(tr("What's This")); whatsthisAct->setToolTip(infoText); infoText = tr("

Help

" "

This button will bring up a dialog with the qStopMotion manual

"); helpAct->setWhatsThis(infoText); infoText = helpAct->toolTip().prepend(tr("Help")); helpAct->setToolTip(infoText); infoText = tr("

About Qt

" "

This will display a small information box where you can read " "general information about the Qt library.

"); aboutQtAct->setWhatsThis(infoText); infoText = aboutAct->toolTip().prepend(tr("About Qt")); aboutQtAct->setToolTip(infoText); infoText = tr("

About

" "

This will display a small information box where you can read " "general information as well as the names of the developers " "behind this excellent piece of software.

"); aboutAct->setWhatsThis(infoText); infoText = aboutAct->toolTip().prepend(tr("About")); aboutAct->setToolTip(infoText); // Status bar infoText = tr("

Project ID

This area displays the id " "of the currently active project

"); projectLabel->setToolTip(infoText); projectLabel->setWhatsThis(infoText); projectID->setToolTip(infoText); projectID->setWhatsThis(infoText); infoText = tr("

Scene ID

This area displays the id " "of the currently selected scene

"); sceneLabel->setToolTip(infoText); sceneLabel->setWhatsThis(infoText); sceneID->setToolTip(infoText); sceneID->setWhatsThis(infoText); infoText = tr("

Take ID

This area displays the id " "of the currently selected take

"); takeLabel->setToolTip(infoText); takeLabel->setWhatsThis(infoText); takeID->setToolTip(infoText); takeID->setWhatsThis(infoText); infoText = tr("

Exposure ID

This area displays the id " "of the currently selected exposure

"); exposureLabel->setToolTip(infoText); exposureLabel->setWhatsThis(infoText); exposureID->setToolTip(infoText); exposureID->setWhatsThis(infoText); // Various menues infoText = tr("

FrameView

In this area you can see the " "selected frame. You can also play " "animations in this window by pressing the " "Play button.

"); frameView->setWhatsThis(infoText); /* infoText = tr("

Go to frame menu

" "

Here you can specify a framenumber and the program will jump " "to the specified frame

"); gotoMenuWidget->setWhatsThis(infoText); */ infoText = tr("

TimeLine

" "

In this area you can see the frames and scenes " "in the animations and build the animation " "by moving the them around.

You can " "switch to the next and the previous frame " "using the arrow buttons or x " "and z

"); timeLine->setWhatsThis(infoText); } void MainWindowGUI::initialize() { qDebug() << "MainWindowGUI::initialize --> Start"; int value; QString gridColorName; lastVisitedDir.clear(); this->initTranslations(); PreferencesTool *pref = frontend->getPreferences(); QString activeLocale; pref->getStringPreference("preferences", "language", activeLocale); createTranslator(activeLocale); grabber = new ImageGrabberFacade(frontend); grabber->initialization(); if (!grabber->isGrabberInitialized()) { frontend->hideProgress(); frontend->showWarning(tr("Select image grabber"), tr("You have to define an image grabber to use.\n" "This can be set in the preferences menu.")); } centerWidget = new QWidget; centerWidget->setObjectName("CenterWidget"); centerWidgetLayout = new QVBoxLayout; centerWidgetLayout->setObjectName("CenterWidgetLayout"); centerWidgetLayout->setSpacing(5); centerWidgetLayout->setMargin(0); timeLine = new TimeLine(this->frontend); // Initializes and sets up the workarea consisting of the toolsmenu and the frameview. workArea = new QWidget; workArea->setObjectName("WorkArea"); workAreaLayout = new QHBoxLayout; workAreaLayout->setObjectName("WorkAreaLayout"); workAreaLayout->setSpacing(5); workAreaLayout->setMargin(0); makeViews(workAreaLayout); makeToolsMenu(workAreaLayout); workArea->setLayout(workAreaLayout); centerWidgetLayout->addWidget(workArea); centerWidgetLayout->addWidget(timeLine); centerWidget->setLayout(centerWidgetLayout); setCentralWidget(centerWidget); makeStatusBar(); // Initializes and sets up the menue system. createAccelerators(); createActions(); createMenus(); // Mainwindow preferences. setWindowTitle("qStopMotion"); QString iconFile(frontend->getIconsDirName()); iconFile.append(QLatin1String("window.png")); setWindowIcon(QPixmap(iconFile)); setContentsMargins(5, 0, 5, 0); setAcceptDrops(true); statusBar()->showMessage(tr("Ready to rumble ;-)"), 2000); statusBar()->setSizeGripEnabled(false); // Sets all the text in the program. retranslateStrings(); connect(this, SIGNAL(startNewProject()), this, SLOT(newProject())); connect(this, SIGNAL(startLastProject()), this, SLOT(openMostRecent())); connect(this, SIGNAL(startOpenProject()), this, SLOT(openProject())); connect(this, SIGNAL(startExit()), this, SLOT(closeApplication())); if (pref->getIntegerPreference("preferences", "verticalgrid", value) == false) { value = false; } verticalGrid = value; if (pref->getIntegerPreference("preferences", "verticalspin", verticalSpin) == false) { verticalSpin = 5; } if (pref->getIntegerPreference("preferences", "horizontalgrid", value) == false) { value = false; } horizontalGrid = value; if (pref->getIntegerPreference("preferences", "horizontalspin", horizontalSpin) == false) { horizontalSpin = 5; } if (pref->getStringPreference("preferences", "gridcolor", gridColorName) == true) { gridColor.setNamedColor(gridColorName); } qDebug() << "MainWindowGUI::initialize --> End"; } void MainWindowGUI::closeEvent(QCloseEvent *event) { qDebug() << "MainWindowGUI::closeEvent --> Start"; // Last changes saved? checkSaved(); event->accept(); qDebug() << "MainWindowGUI::closeEvent --> End"; } void MainWindowGUI::mousePressEvent(QMouseEvent *) { // gotoMenuWidget->hide(); } void MainWindowGUI::keyPressEvent(QKeyEvent *k) { DomainFacade *facade = frontend->getProject(); int activeSceneIndex = -1; int activeTakeIndex = -1; if (facade->isActiveProject()) { activeSceneIndex = facade->getActiveSceneIndex(); } if (-1 < activeSceneIndex) { // If there is a active scene, there can be a active take facade->getActiveTakeIndex(); } switch (k->key()) { case Key_Shift: timeLine->setSelecting(true); break; case Key_A: // TODO: change so that CTRL+A instead of just A selects all the frames. if (activeSceneIndex >= 0) { if (facade->getSceneExposureSize(activeSceneIndex) > 1) { facade->selectExposureToUndo(activeSceneIndex, activeTakeIndex, 0); // timeLine->setSelection(facade->getSceneExposureSize(activeScene) - 1); } } break; default: k->ignore(); break; } } const QVector MainWindowGUI::getLanguages() { return this->translationsLanguages; } const QVector MainWindowGUI::getLocales() { return this->translationsLocales; } void MainWindowGUI::changeLanguage(int newIndex) { this->createTranslator(this->translationsLocales[newIndex]); retranslateStrings(); } void MainWindowGUI::changeCaptureButtonFunction(PreferencesTool::captureButtonFunction newFunction) { recordingTab->changeCaptureButtonFunction(newFunction); } bool MainWindowGUI::getVerticalGrid() { return verticalGrid; } void MainWindowGUI::setVerticalGrid(bool newState) { verticalGrid = newState; } int MainWindowGUI::getVerticalSpin() { return verticalSpin; } void MainWindowGUI::setVerticalSpin(int newSpin) { verticalSpin = newSpin; } bool MainWindowGUI::getHorizontalGrid() { return horizontalGrid; } void MainWindowGUI::setHorizontalGrid(bool newState) { horizontalGrid = newState; } int MainWindowGUI::getHorizontalSpin() { return horizontalSpin; } void MainWindowGUI::setHorizontalSpin(int newSpin) { horizontalSpin = newSpin; } void MainWindowGUI::getGridColorRGB(int *r, int *g, int *b, int *a) { gridColor.getRgb(r, g, b, a); } void MainWindowGUI::setGridColorRGB(int r, int g, int b, int a) { gridColor.setRgb(r, g, b, a); } void MainWindowGUI::showProgress(const QString &operation, unsigned int numOperations) { if (numOperations > 0) { progressDialog = new QProgressDialog(operation, tr("Cancel"), 0, numOperations, this); progressDialog->show(); } } void MainWindowGUI::hideProgress() { if (progressDialog) { progressDialog->hide(); delete progressDialog; progressDialog = NULL; } } void MainWindowGUI::updateProgress(int numOperationsDone) { if (progressDialog) { progressDialog->setValue(numOperationsDone); } } void MainWindowGUI::increaseProgress() { if (progressDialog) { progressDialog->setValue(progressDialog->value() + 1); } } void MainWindowGUI::setProgressInfo(const QString infoText) { if (progressDialog) { progressDialog->setLabelText(infoText); } } bool MainWindowGUI::isOperationAborted() { if (progressDialog) { return progressDialog->wasCanceled(); } return false; } void MainWindowGUI::showMessage(const QString &message, int timeout) { statusBar()->showMessage(message, timeout); } void MainWindowGUI::clearMessage() { statusBar()->clearMessage(); } void MainWindowGUI::setProjectID(const QString &id) { projectID->setText(id); } void MainWindowGUI::setSceneID(const QString &id) { sceneID->setText(id); } void MainWindowGUI::setTakeID(const QString &id) { takeID->setText(id); } void MainWindowGUI::setExposureID(const QString &id) { exposureID->setText(id); } void MainWindowGUI::startDialog() { qDebug() << "MainWindowGUI::startDialog --> Start"; QString pID(mostRecentAct->text()); StartDialog *dialog = new StartDialog(frontend, pID, this); int ret = dialog->exec(); if (ret == QDialog::Rejected) { // The user canceled the input dialog emit startExit(); qDebug() << "MainWindowGUI::startDialog --> End (cancel)"; return; } int selection = dialog->getSelectedPossibility(); switch (selection) { case 1: // New project emit startNewProject(); break; case 2: // Last project emit startLastProject(); break; case 3: // Open project emit startOpenProject(); break; } qDebug() << "MainWindowGUI::startDialog --> End"; } bool MainWindowGUI::startGrabber() { qDebug() << "MainWindowGUI::startGrabber --> Start"; frontend->showMessage(tr("Connecting camera...")); grabber->init(); if (!grabber->isGrabberInited()) { frontend->hideProgress(); frontend->showWarning(tr("Select image grabber"), tr("You have to define an image grabber to use.\n" "This can be set on the recording tool tab.")); return false; } frameView->cameraOn(); frontend->clearMessage(); if (0 != cameraControllerDialog) { if (!cameraControllerDialog->isHidden()) { cameraControllerDialog->setUp(); } } qDebug() << "MainWindowGUI::startGrabber --> End"; return true; } bool MainWindowGUI::isGrabberInited() { qDebug() << "MainWindowGUI::isGrabberInited --> Start"; bool ret = grabber->isGrabberInited(); qDebug() << "MainWindowGUI::isGrabberInited --> End"; return ret; } void MainWindowGUI::stopGrabber() { qDebug() << "MainWindowGUI::stopGrabber --> Start"; if (0 != cameraControllerDialog) { cameraControllerDialog->tearDown(); } frameView->cameraOff(); grabber->finalize(); qDebug() << "MainWindowGUI::stopGrabber --> End"; } GrabberController * MainWindowGUI::getGrabberController() { return grabber->getDevice(getVideoSource())->getController(); } const QVector MainWindowGUI::getDevices() { return grabber->getDevices(); } ImageGrabberDevice* MainWindowGUI::getDevice(int deviceIndex) { return grabber->getDevice(deviceIndex); } const QVector MainWindowGUI::getDeviceNames() { return grabber->getDeviceNames(); } const QVector MainWindowGUI::getResolutionNames(int deviceIndex) { return grabber->getResolutionNames(deviceIndex); } const QImage MainWindowGUI::getLiveImage() { return grabber->getLiveImage(); } const QImage MainWindowGUI::getRawImage() { return grabber->getRawImage(); } void MainWindowGUI::nextAnimationFrame(int exposureIndex) { frameView->nextAnimationFrame(exposureIndex); } void MainWindowGUI::openProject(const QString &filePath) { Q_ASSERT(filePath != NULL); checkSaved(); if (frontend->getProject()->isActiveProject()) { // Close the old project // frontend->getProject()->closeProjectToUndo(); frontend->getProject()->closeProject(); } frontend->getProject()->openProjectToUndo(filePath); setMostRecentProject(); saveAsAct->setEnabled(true); saveAct->setEnabled(true); toolBar->setActualState(ToolBar::toolBarCameraOff); int lastSlash = filePath.lastIndexOf("/"); QString fileName = filePath.mid(lastSlash+1); QString fileDirectory = filePath.left(lastSlash+1); lastVisitedDir.clear(); lastVisitedDir.append(fileDirectory); setWindowTitle("qStopMotion - " + fileName); } void MainWindowGUI::setToolBarState(int newState) { qDebug() << "MainWindowGUI::setToolBarState --> Start"; toolBar->setActualState(newState); qDebug() << "MainWindowGUI::setToolBarState --> End"; } int MainWindowGUI::getRecordingMode() { return recordingTab->getRecordingMode(); } void MainWindowGUI::setRecordingMode(int mode) { recordingTab->setRecordingMode(mode); } int MainWindowGUI::getVideoSource() { return recordingTab->getVideoSource(); } bool MainWindowGUI::setVideoSource(int index) { if (recordingTab->setVideoSource(index) == false) { return false; } if (cameraControllerDialog != 0) { if (cameraControllerDialog->isVisible()) { cameraControllerDialog->reject(); } delete cameraControllerDialog; cameraControllerDialog = 0; } if (grabber->getDevice(index)->isController()) { cameraControllerAct->setEnabled(true); } else { cameraControllerAct->setEnabled(false); } return true; } int MainWindowGUI::getResolution() { return recordingTab->getResolution(); } bool MainWindowGUI::setResolution(int index) { if (recordingTab->setResolution(index) == false) { return false; } /* if (cameraControllerDialog != 0) { if (cameraControllerDialog->isVisible()) { cameraControllerDialog->reject(); } delete cameraControllerDialog; cameraControllerDialog = 0; } if (grabber->getDevice(index)->isController()) { cameraControllerAct->setEnabled(true); } else { cameraControllerAct->setEnabled(false); } */ return true; } const GrabberResolution MainWindowGUI::getResolution(int index) { return grabber->getResolution(frontend->getProject()->getVideoSource(), index); } bool MainWindowGUI::convertImages(int newFormat, int newQuality) { if (frontend->getProject()->getTotalExposureSize()) { int convert = frontend->askQuestion(tr("Existing Images"), tr("There are some images in the open project. Do you want to convert the images to the new file format or quality?")); if (convert == 0) { // user pressed button 0, which is 'yes' if (frontend->getProject()->convertImages(newFormat, newQuality)) { saveProject(); return true; } else { return false; } } else { // user say not 'yes' return false; } } // The project is empty return true; } int MainWindowGUI::getMixMode() { return recordingTab->getMixMode(); } void MainWindowGUI::setMixMode(int mode) { recordingTab->setMixMode(mode); } int MainWindowGUI::getMixCount() { return recordingTab->getMixCount(); } void MainWindowGUI::setMixCount(int count) { recordingTab->setMixCount(count); } int MainWindowGUI::getPlaybackCount() { return recordingTab->getPlaybackCount(); } void MainWindowGUI::setPlaybackCount(int count) { recordingTab->setPlaybackCount(count); } int MainWindowGUI::getOverlayIntensity() { return toolBar->getOverlayIntensity(); } void MainWindowGUI::setOverlayIntensity(int overlay) { toolBar->setOverlayIntensity(overlay); } void MainWindowGUI::setupDirectoryMonitoring() { qDebug() << "MainWindowGUI::setupDirectoryMonitoring --> Start"; changeMonitor = new ExternalChangeMonitor(frontend, this); qDebug() << "MainWindowGUI::setupDirectoryMonitoring --> End"; } void MainWindowGUI::addDirectoryToMonitoring(const QString &directory) { changeMonitor->addDirectory(directory); } void MainWindowGUI::removeDirectoryFromMonitoring(const QString &directory) { changeMonitor->removeDirectory(directory); } void MainWindowGUI::removeAllDirectoriesFromMonitoring() { changeMonitor->removeAllDirectories(); } void MainWindowGUI::addFileToMonitoring(const QString &file) { changeMonitor->addFile(file); } void MainWindowGUI::removeFileFromMonitoring(const QString &file) { changeMonitor->removeFile(file); } void MainWindowGUI::removeAllFilesFromMonitoring() { changeMonitor->removeAllFiles(); } /************************************************************************** * Public slots **************************************************************************/ /************************************************************************** * Private slots **************************************************************************/ void MainWindowGUI::newProject() { qDebug() << "MainWindowGUI::newProject --> Start"; DomainFacade* project = frontend->getProject(); recordingTab->checkCameraOff(); checkSaved(); DescriptionDialog *dialog = new DescriptionDialog(frontend, DescriptionDialog::ProjectDescription); dialog->setProjectDescription(tr("The Project")); dialog->setSceneDescription(tr("Scene 001")); dialog->setTakeDescription(tr("Take 01")); int ret = dialog->exec(); if (ret == QDialog::Rejected) { // The user canceled the input dialog qDebug() << "MainWindowGUI::newProject --> End (cancel)"; delete(dialog); return; } QString projectDescription = dialog->getProjectDescription(); QString sceneDescription = dialog->getSceneDescription(); QString takeDescription = dialog->getTakeDescription(); if (project->isActiveProject()) { // Close the old project project->closeProject(); } // Create the new project project->newProjectToUndo(projectDescription); // Create and activate the new scene project->addSceneToUndo(sceneDescription); project->selectSceneToUndo(0); // Create and activate the new take project->addTakeToUndo(takeDescription, 0); project->selectTakeToUndo(0, 0); setToolBarState(ToolBar::toolBarCameraOff); frontend->setOverlayIntensity(project->getOverlayIntensity()); delete(dialog); QDir homeDir = QDir::home(); lastVisitedDir.clear(); lastVisitedDir.append(homeDir.absolutePath()); setWindowTitle(tr("qStopMotion - New Animation Project")); qDebug() << "MainWindowGUI::newProject --> End"; } void MainWindowGUI::openProject() { qDebug() << "MainWindowGUI::openProject --> Start"; recordingTab->checkCameraOff(); QFileDialog fileDialog(this, tr("Choose project file"), lastVisitedDir); QStringList filters; filters << QString(tr("Project (*.%1)")).arg(PreferencesTool::projectSuffix); // << QString(tr("Archive (*.%2)")).arg(PreferencesTool::archiveSuffix); fileDialog.setNameFilters(filters); fileDialog.setAcceptMode(QFileDialog::AcceptOpen); fileDialog.setFileMode(QFileDialog::ExistingFiles); int ret = fileDialog.exec(); if (ret == QDialog::Accepted) { QStringList openFiles = fileDialog.selectedFiles(); // Open the new project openProject(openFiles[0]); } qDebug() << "MainWindowGUI::openProject --> End"; } void MainWindowGUI::openMostRecent() { const QString fileName = Util::convertPathFromOsSpecific(mostRecentAct->text()); recordingTab->checkCameraOff(); // Open the new project openProject(fileName); } void MainWindowGUI::openSecondMostRecent() { const QString fileName = Util::convertPathFromOsSpecific(secondMostRecentAct->text()); recordingTab->checkCameraOff(); // Open the new project openProject(fileName); } void MainWindowGUI::openThirdMostRecent() { const QString fileName = Util::convertPathFromOsSpecific(thirdMostRecentAct->text()); recordingTab->checkCameraOff(); // Open the new project openProject(fileName); } void MainWindowGUI::openFourthMostRecent() { const QString fileName = Util::convertPathFromOsSpecific(fourthMostRecentAct->text()); recordingTab->checkCameraOff(); // Open the new project openProject(fileName); } void MainWindowGUI::saveProject() { const QString filePath = frontend->getProject()->getNewProjectFilePath(); recordingTab->checkCameraOff(); if (!filePath.isEmpty()) { frontend->getProject()->saveProject(filePath, false); } else { saveProjectAs(); } } void MainWindowGUI::saveProjectAs() { QString filePath; recordingTab->checkCameraOff(); QFileDialog fileDialog(this, tr("Save As"), lastVisitedDir); QStringList filters; int ret; filters << QString(tr("Project (*.%1)")).arg(PreferencesTool::projectSuffix); // << QString(tr("Archive (*.%2)")).arg(PreferencesTool::archiveSuffix); fileDialog.setNameFilters(filters); fileDialog.setAcceptMode(QFileDialog::AcceptSave); fileDialog.setFileMode(QFileDialog::AnyFile); while (1) { ret = fileDialog.exec(); if (ret == QDialog::Accepted) { QStringList openFiles = fileDialog.selectedFiles(); filePath.append(openFiles[0]); } if (filePath.isEmpty()) { return; } if (!filePath.endsWith(PreferencesTool::projectSuffix)) { // Append the project suffix filePath.append("."); filePath.append(PreferencesTool::projectSuffix); } if (filePath.indexOf('|') != -1) { // Remove all '|' characters frontend->showInformation(tr("Information"), tr("The character '|' is not allowed in the project file name and will be removed.")); filePath.remove('|'); } // Only one project per directory is possible QDir fileDirectory = QFileInfo(filePath).absoluteDir(); QString nameFilter("*."); nameFilter.append(PreferencesTool::projectSuffix); QStringList nameFilterList(nameFilter); QStringList fileList = fileDirectory.entryList(nameFilterList); if (fileList.count() == 0) { break; } // User must select an other directory frontend->showWarning(tr("Warning"), tr("The project directory must not contain more than one project file.")); filePath.clear(); } frontend->getProject()->saveProject(filePath, true); QString fileDir = frontend->getProject()->getNewProjectPath(); QString fileName = filePath.mid(filePath.lastIndexOf("/")+1); lastVisitedDir.clear(); lastVisitedDir.append(fileDir); saveAct->setEnabled(true); setMostRecentProject(); setWindowTitle("qStopMotion - " + fileName); } void MainWindowGUI::exportToVideo() { qDebug() << "MainWindowGUI::exportToVideo --> Start"; VideoEncoder *enc = NULL; int activeEncoderApplication; bool useDefaultOutputFile; recordingTab->checkCameraOff(); activeEncoderApplication = this->frontend->getProject()->getEncoderApplication(); if (activeEncoderApplication == VideoEncoder::noneApplication) { frontend->showWarning(tr("Warning"), tr("No encoder selected for the video export.\n" "This can be set in the properties dialog of the project.\n" "Export to video will not be possible until you\n" "have set an encoder to use!")); return; } switch (activeEncoderApplication) { case VideoEncoder::ffmpegApplication: enc = new FfmpegEncoder(this->frontend->getProject()->getAnimationProject()); break; case VideoEncoder::libavApplication: enc = new LibavEncoder(this->frontend->getProject()->getAnimationProject()); break; default: return; } useDefaultOutputFile = this->frontend->getProject()->getUseDefaultOutputFile(); if (useDefaultOutputFile == false) { QStringList filters; QString exportSuffix; QString outputFile; int videoFormat = VideoEncoder::noneFormat; videoFormat = this->frontend->getProject()->getVideoFormat(); switch(videoFormat) { case VideoEncoder::aviFormat: filters << tr("AVI Videos (*.avi)"); exportSuffix.append("avi"); break; case VideoEncoder::mp4Format: filters << tr("MP4 Videos (*.mp4)"); exportSuffix.append("mp4"); break; case VideoEncoder::noneFormat: frontend->showWarning(tr("Warning"), tr("No video format selected for the video export.\n" "This can be set in the properties dialog of the project.\n" "Export to video will not be possible until you\n" "have set an video format to use!")); return; } QFileDialog fileDialog(this, tr("Export to video file"), lastVisitedDir); fileDialog.setNameFilters(filters); fileDialog.setAcceptMode(QFileDialog::AcceptSave); fileDialog.setFileMode(QFileDialog::AnyFile); int ret = fileDialog.exec(); if (ret == QDialog::Accepted) { QStringList openFiles = fileDialog.selectedFiles(); outputFile.append(openFiles[0]); } if (outputFile.isEmpty()) { delete enc; enc = NULL; return; } else { if (!outputFile.endsWith(exportSuffix)) { outputFile.append("."); outputFile.append(exportSuffix); } enc->setOutputFile(outputFile); } } else { QString outputFileName; int videoFormat = VideoEncoder::noneFormat; outputFileName = this->frontend->getProject()->getDefaultOutputFileName(); if (outputFileName.isEmpty()) { frontend->showWarning(tr("Warning"), tr("No default output file name defined.\n" "Check your settings in the properties dialo of the project!")); return; } videoFormat = this->frontend->getProject()->getVideoFormat(); switch(videoFormat) { case VideoEncoder::aviFormat: if (outputFileName.indexOf(".avi") == -1) { outputFileName.append(".avi"); } break; case VideoEncoder::mp4Format: if (outputFileName.indexOf(".mp4") == -1 ) { outputFileName.append(".mp4"); } break; } enc->setOutputFile(outputFileName); } // Remove an existing file QFile::remove(enc->getOutputFile()); if (!enc->isValid()) { frontend->showWarning(tr("Warning"), tr("The selected encoder is not installed on your computer.\n" "Install the encoder or select another one!")); delete enc; enc = NULL; return; } checkSaved(); frontend->showProgress(tr("Exporting ..."), frontend->getProject()->getTotalExposureSize()); frontend->getProject()->exportToVideo(enc); frontend->hideProgress(); delete enc; enc = NULL; qDebug() << "MainWindowGUI::exportToVideo --> End"; } void MainWindowGUI::exportToCinelerra() { QString outputFile; recordingTab->checkCameraOff(); QFileDialog fileDialog(this, tr("Export to file"), lastVisitedDir); QStringList filters; filters << "Cinelerra (*.XML)"; fileDialog.setNameFilters(filters); fileDialog.setAcceptMode(QFileDialog::AcceptSave); fileDialog.setFileMode(QFileDialog::AnyFile); int ret = fileDialog.exec(); if (ret == QDialog::Accepted) { QStringList openFiles = fileDialog.selectedFiles(); outputFile.append(openFiles[0]); } if (!outputFile.isNull()) { frontend->getProject()->exportToCinelerra(outputFile); } } void MainWindowGUI::closeApplication() { // Switch off the camera recordingTab->checkCameraOff(); // Last changes saved? checkSaved(); // remove all temporary files and directories frontend->removeApplicationFiles(); frontend->removeApplicationDirectories(); // Exit the application with status success // TODO: This exit cancel the application without calling finalize of the QtFrontend class!!! exit(0); } // TODO: New implementation of copy necessary void MainWindowGUI::copy() { /* QList urls; // DO: return the scene, take and frame from the frame bar!!!! int selectionFrame = timeLine->getSelectionFrame(); int activeFrame = 1; // frontend->getProject()->getActiveExposureIndex(); int highend = (selectionFrame > activeFrame) ? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame) ? selectionFrame : activeFrame; for (int i = lowend; i <= highend; ++i) { // DO: Get the filename from the frame bar Exposure* exposure = frontend->getProject()->getExposure(1, 1, i); urls.append(QUrl::fromLocalFile(exposure->getImagePath())); } //QDrag *drag = new QDrag((MainWindowGUI*)this->parent()); QMimeData *mimeData = new QMimeData; mimeData->setUrls(urls); //drag->setMimeData(mimeData); //drag->start(Qt::MoveAction); QApplication::clipboard()->setMimeData(mimeData); */ } // TODO: New implementation of past necessary void MainWindowGUI::paste() { /* const QMimeData *mimeData = QApplication::clipboard()->mimeData(); if (mimeData->hasUrls()) { QStringList fileNames; QList urls = mimeData->urls(); int numFrames = urls.size(); for (int i = 0; i < numFrames; ++i) { fileNames.append(urls[i].toLocalFile()); } emit addFrames(fileNames); } */ } // TODO: New Implementation of add sound void MainWindowGUI::addSound() { /* QString openFile; QFileDialog fileDialog(this, tr("Choose sound file"), lastVisitedDir); QStringList filters; filters << tr("Sounds (*.ogg)"); fileDialog.setFilters(filters); fileDialog.setAcceptMode(QFileDialog::AcceptSave); fileDialog.setFileMode(QFileDialog::AnyFile); int ret = fileDialog.exec(); if (ret == QDialog::Accepted) { QStringList openFiles = fileDialog.selectedFiles(); openFile.append(openFiles[0]); } if (!openFile.isNull()) { DomainFacade *facade = frontend->getProject(); bool ok = false; int ret = 0; QString text = QInputDialog::getText(0, tr("Sound name"), tr("Enter the name of the sound:"), QLineEdit::Normal, QString::null, &ok); if (ok && !text.isEmpty()) { ret = facade->addSoundToScene(facade->getActiveSceneIndex(), openFile, text); } else { ret = facade->addSoundToScene(facade->getActiveSceneIndex(), openFile, QString()); } if (ret == 0) { Scene *scene = facade->getScene(facade->getActiveSceneIndex()); if (!scene->isEmpty()) { soundsList->insertItem(soundsList->count(), new QListWidgetItem(scene->getSoundName(soundsList->count()))); soundsList->item(soundsList->currentRow())->setText(text); emit soundsChanged(); } } } */ } // TODO: New Implementation of remove sound void MainWindowGUI::removeSound() { /* int index = soundsList->currentRow(); if (index >= 0) { frontend->getProject()->removeSoundFromScene(frontend->getProject()->getActiveSceneIndex(), index); QListWidgetItem *qlwi = soundsList->takeItem(index); delete qlwi; emit soundsChanged(); } */ } void MainWindowGUI::showPreferencesDialog() { GeneralDialog *preferencesDialog; preferencesDialog = new GeneralDialog(frontend); int ret = preferencesDialog->exec(); if (ret == QDialog::Rejected) { // The user canceled the input dialog qDebug() << "MainWindowsGUI::showPreferencesDialog --> End (cancel)"; } delete(preferencesDialog); } void MainWindowGUI::showPropertiesDialog() { ProjectDialog *propertiesDialog; propertiesDialog = new ProjectDialog(frontend); int ret = propertiesDialog->exec(); if (ret == QDialog::Rejected) { // The user canceled the input dialog qDebug() << "MainWindowsGUI::showPropertiesDialog --> End (cancel)"; } delete(propertiesDialog); } void MainWindowGUI::showUndoStack() { QRect fGeo = this->frameGeometry(); // Open up undo stack window if (undoView == 0) { undoView = new QUndoView(frontend->getProject()->getUndoStack()); undoView->setWindowTitle(tr("qStopMotion - Undo stack")); undoView->setAttribute(Qt::WA_QuitOnClose, false); undoView->setGeometry(geometry().x() + fGeo.width(), geometry().y(), 250, height()); } undoView->show(); this->activateWindow(); } void MainWindowGUI::showCameraControllerDialog() { QRect fGeo = this->frameGeometry(); Q_ASSERT(grabber->getDevice(getVideoSource())->getController() != NULL); if (cameraControllerDialog == 0) { cameraControllerDialog = new CameraControllerDialog(frontend, grabber->getDevice(getVideoSource()), this); cameraControllerDialog->initialize(); cameraControllerDialog->setGeometry(geometry().x() + fGeo.width(), geometry().y(), 200, height()); } cameraControllerDialog->show(); if (frontend->isGrabberInited()) { cameraControllerDialog->setUp(); } } void MainWindowGUI::whatsThis() { QWhatsThis::enterWhatsThisMode(); } void MainWindowGUI::showHelpDialog() { if (helpBrowser == 0) { helpBrowser = new HelpBrowser(frontend, this); helpBrowser->setGeometry(this->x() + 40, this->y() + 40, this->width(), this->height()); } helpBrowser->show(); } void MainWindowGUI::showAboutDialog() { AboutDialog *aboutDialog = new AboutDialog(frontend, this); aboutDialog->show(); } /************************************************************************** * Private functions **************************************************************************/ void MainWindowGUI::createTranslator(const QString &newLocale) { qDebug() << "MainWindowGUI::createTranslator --> Start"; PreferencesTool *pref = frontend->getPreferences(); QString appTranslationFile("qstopmotion_"); QString qtTranslationFile("qt_"); QString qmPath(frontend->getTranslationsDirName()); QString languagePref; if (pref->getStringPreference("preferences", "language", languagePref) == false) { languagePref.append(newLocale); } if (newLocale.isEmpty()) { if (languagePref.isEmpty()) { // Get system locale. languagePref = QLocale::system().name().toLower(); if (languagePref == QLatin1String("nb_no")) languagePref = QLatin1String("no_nb"); else if (languagePref == QLatin1String("nn_no")) languagePref = QLatin1String("no_nn"); else if (languagePref == QLatin1String("se_no")) languagePref = QLatin1String("no_se"); else languagePref.truncate(2); pref->setStringPreference("preferences", "language", languagePref); } appTranslationFile.append(languagePref); qtTranslationFile.append(languagePref); } else { appTranslationFile.append(newLocale); qtTranslationFile.append(newLocale); } if (!appTranslationFile.isEmpty()) { qDebug() << "MainWindowGUI::createTranslator --> Loading translator:" << appTranslationFile; if (!appTranslator.load(appTranslationFile, qmPath)) { // Translation file not opend qDebug() << "MainWindowGUI::createTranslator --> qStopMotion translator not loaded!"; } qDebug() << "MainWindowGUI::createTranslator --> Loading translator:" << qtTranslationFile; if (!qtTranslator.load(qtTranslationFile, qmPath)) { // Translation file not opend qDebug() << "MainWindowGUI::createTranslator --> Qt translator not loaded!"; } } qDebug() << "MainWindowGUI::createTranslator --> End"; } void MainWindowGUI::initTranslations() { qDebug() << "MainWindowGUI::initTranslations --> Start"; // Fill the list with possible languages QString qmPath(frontend->getTranslationsDirName()); QDir dir(qmPath); QStringList fileNames = dir.entryList(QStringList("qstopmotion_*.qm")); //English is a special case (base language) translationsLanguages.append("English"); translationsLocales.append("en"); for (int i = 0; i < fileNames.size(); ++i) { QTranslator translator; translator.load(fileNames[i], qmPath); QString language = translator.translate("MainWindowGUI", "English", "This should be translated to the name of the " "language you are translating to, in that language. " "Example: English = Deutsch (Deutsch is \"German\" " "in German)"); // Checks that the mimimum requirement for accepting a string is covered. // The mimimum requirement is that the menu option string (English) is translated. if (language != "") { QString locale = fileNames[i]; locale = locale.mid(locale.indexOf('_') + 1); locale.truncate(locale.indexOf('.')); translationsLanguages.append(language); translationsLocales.append(locale); } } qDebug() << "MainWindowGUI::initTranslations --> End"; } void MainWindowGUI:: createAccelerators() { // First Exposure QShortcut *firstExposureAccel1 = new QShortcut(QKeySequence(Qt::Key_3), this); connect(firstExposureAccel1, SIGNAL(activated()), toolBar, SLOT(selectFirstFrame())); QShortcut *firstExposureAccel2 = new QShortcut(QKeySequence(Qt::Key_PageDown), this); connect(firstExposureAccel2, SIGNAL(activated()), toolBar, SLOT(selectFirstFrame())); QShortcut *firstExposureAccel3 = new QShortcut(QKeySequence(Qt::Key_L), this); connect(firstExposureAccel3, SIGNAL(activated()), toolBar, SLOT(selectFirstFrame())); // Previous Exposure QShortcut *previousExposureAccel = new QShortcut(QKeySequence(Qt::Key_6), this); connect(previousExposureAccel, SIGNAL(activated()), toolBar, SLOT(selectPreviousFrame())); QShortcut *previousExposureAccel2 = new QShortcut(QKeySequence(Qt::Key_Right), this); connect(previousExposureAccel2, SIGNAL(activated()), toolBar, SLOT(selectPreviousFrame())); QShortcut *previousExposureAcce3 = new QShortcut(QKeySequence(Qt::Key_O), this); connect(previousExposureAcce3, SIGNAL(activated()), toolBar, SLOT(selectPreviousFrame())); // Next Exposure QShortcut *nextExposureAccel1 = new QShortcut(QKeySequence(Qt::Key_9), this); connect(nextExposureAccel1, SIGNAL(activated()), toolBar, SLOT(selectNextFrame())); QShortcut *nextExposureAccel2 = new QShortcut(QKeySequence(Qt::Key_PageUp), this); connect(nextExposureAccel2, SIGNAL(activated()), toolBar, SLOT(selectNextFrame())); // Last Exposure QShortcut *lastExposureAccel1 = new QShortcut(QKeySequence(Qt::Key_Asterisk), this); connect(lastExposureAccel1, SIGNAL(activated()), toolBar, SLOT(selectLastFrame())); QShortcut *lastExposureAccel2 = new QShortcut(QKeySequence(Qt::Key_P), this); connect(lastExposureAccel2, SIGNAL(activated()), toolBar, SLOT(selectLastFrame())); // Add exposure QShortcut *captureAccel1 = new QShortcut(QKeySequence(Qt::Key_Space), this); connect(captureAccel1, SIGNAL(activated()), recordingTab, SLOT(captureFrame())); QShortcut *captureAccel2 = new QShortcut(QKeySequence(Qt::Key_Return), this); // Return key on the keyboard connect(captureAccel2, SIGNAL(activated()), recordingTab, SLOT(captureFrame())); QShortcut *captureAccel3 = new QShortcut(QKeySequence(Qt::Key_Enter), this); // Enter key on the keypad connect(captureAccel3, SIGNAL(activated()), recordingTab, SLOT(captureFrame())); // Delete exposure QShortcut *removeFramesAccel = new QShortcut(QKeySequence(Qt::Key_Delete), this); connect(removeFramesAccel, SIGNAL(activated()), projectTab, SLOT(removeFramesSlot())); // First take QShortcut *firstTakeAccel1 = new QShortcut(QKeySequence(Qt::Key_2), this); connect(firstTakeAccel1, SIGNAL(activated()), toolBar, SLOT(selectFirstTake())); QShortcut *firstTakeAccel2 = new QShortcut(QKeySequence(Qt::Key_Down), this); connect(firstTakeAccel2, SIGNAL(activated()), toolBar, SLOT(selectFirstTake())); QShortcut *firstTakeAccel3 = new QShortcut(QKeySequence(Qt::Key_K), this); connect(firstTakeAccel3, SIGNAL(activated()), toolBar, SLOT(selectFirstTake())); // Previous take QShortcut *prevTakeAccel1 = new QShortcut(QKeySequence(Qt::Key_5), this); connect(prevTakeAccel1, SIGNAL(activated()), toolBar, SLOT(selectPreviousTake())); QShortcut *prevTakeAccel2 = new QShortcut(QKeySequence(Qt::Key_Clear), this); connect(prevTakeAccel2, SIGNAL(activated()), toolBar, SLOT(selectPreviousTake())); QShortcut *prevTakeAccel3 = new QShortcut(QKeySequence(Qt::Key_I), this); connect(prevTakeAccel3, SIGNAL(activated()), toolBar, SLOT(selectPreviousTake())); // Next take QShortcut *nextTakeAccel1 = new QShortcut(QKeySequence(Qt::Key_8), this); connect(nextTakeAccel1, SIGNAL(activated()), toolBar, SLOT(selectNextTake())); QShortcut *nextTakeAccel2 = new QShortcut(QKeySequence(Qt::Key_Up), this); connect(nextTakeAccel2, SIGNAL(activated()), toolBar, SLOT(selectNextTake())); // Last take QShortcut *lastTakeAccel1 = new QShortcut(QKeySequence(Qt::Key_Slash), this); connect(lastTakeAccel1, SIGNAL(activated()), toolBar, SLOT(selectLastTake())); // Add take QShortcut *addTakeAccel1 = new QShortcut(QKeySequence(Qt::Key_Plus), this); connect(addTakeAccel1, SIGNAL(activated()), projectTab, SLOT(addTakeSlot())); // First scene QShortcut *firstSceneAccel1 = new QShortcut(QKeySequence(Qt::Key_0), this); connect(firstSceneAccel1, SIGNAL(activated()), toolBar, SLOT(selectFirstScene())); QShortcut *firstSceneAccel2 = new QShortcut(QKeySequence(Qt::Key_Insert), this); connect(firstSceneAccel2, SIGNAL(activated()), toolBar, SLOT(selectFirstScene())); QShortcut *firstSceneAccel3 = new QShortcut(QKeySequence(Qt::Key_M), this); connect(firstSceneAccel3, SIGNAL(activated()), toolBar, SLOT(selectFirstScene())); // Previous scene QShortcut *prevSceneAccel1 = new QShortcut(QKeySequence(Qt::Key_1), this); connect(prevSceneAccel1, SIGNAL(activated()), toolBar, SLOT(selectPreviousScene())); QShortcut *prevSceneAccel2 = new QShortcut(QKeySequence(Qt::Key_End), this); connect(prevSceneAccel2, SIGNAL(activated()), toolBar, SLOT(selectPreviousScene())); QShortcut *prevSceneAccel3 = new QShortcut(QKeySequence(Qt::Key_J), this); connect(prevSceneAccel3, SIGNAL(activated()), toolBar, SLOT(selectPreviousScene())); // Next scene QShortcut *nextSceneAccel1 = new QShortcut(QKeySequence(Qt::Key_4), this); connect(nextSceneAccel1, SIGNAL(activated()), toolBar, SLOT(selectNextScene())); QShortcut *nextSceneAccel2 = new QShortcut(QKeySequence(Qt::Key_Left), this); connect(nextSceneAccel2, SIGNAL(activated()), toolBar, SLOT(selectNextScene())); QShortcut *nextSceneAccel3 = new QShortcut(QKeySequence(Qt::Key_U), this); connect(nextSceneAccel3, SIGNAL(activated()), toolBar, SLOT(selectNextScene())); // Last scene QShortcut *lastSceneAccel1 = new QShortcut(QKeySequence(Qt::Key_7), this); connect(lastSceneAccel1, SIGNAL(activated()), toolBar, SLOT(selectLastScene())); QShortcut *lastSceneAccel2 = new QShortcut(QKeySequence(Qt::Key_Home), this); connect(lastSceneAccel2, SIGNAL(activated()), toolBar, SLOT(selectLastScene())); // Add scene QShortcut *addSceneAccel1 = new QShortcut(QKeySequence(Qt::Key_Minus), this); connect(addSceneAccel1, SIGNAL(activated()), projectTab, SLOT(addSceneSlot())); QShortcut *addSceneAccel2 = new QShortcut(QKeySequence(Qt::Key_Odiaeresis), this); connect(addSceneAccel2, SIGNAL(activated()), projectTab, SLOT(addSceneSlot())); // Camera button clicked QShortcut *toggleCameraAccel = new QShortcut(QKeySequence(Qt::Key_C), this); connect(toggleCameraAccel, SIGNAL(activated()), recordingTab, SLOT(cameraButtonClicked())); /* Test test test QShortcut *captureAccel4 = new QShortcut(QKeySequence(Qt::Key_5), this); connect(captureAccel4, SIGNAL(activated()), recordingTab, SLOT(captureFrame())); QShortcut *captureAccel5 = new QShortcut(QKeySequence(Qt::KeypadModifier + Qt::Key_1), this); connect(captureAccel5, SIGNAL(activated()), recordingTab, SLOT(captureFrame())); QShortcut *removeSceneAccel = new QShortcut(QKeySequence(Qt::ShiftModifier + Qt::Key_Delete), this); connect(removeSceneAccel, SIGNAL(activated()), projectTab, SLOT(removeSceneSlot())); QShortcut *addExposureAccel = new QShortcut(QKeySequence(Qt::Key_F), this); connect(addExposureAccel, SIGNAL(activated()), projectTab, SLOT(addFramesSlot())); */ } void MainWindowGUI::createActions() { QString iconFile(frontend->getIconsDirName()); // File menu newAct = new QAction(this); iconFile.append(QLatin1String("filenew.png")); newAct->setIcon(QIcon(iconFile)); newAct->setShortcut(ControlModifier + Key_N); newAct->setIconVisibleInMenu(true); connect(newAct, SIGNAL(triggered()), this, SLOT(newProject())); openAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("fileopen.png")); openAct->setIcon(QPixmap(iconFile)); openAct->setShortcut(ControlModifier + Key_O); openAct->setIconVisibleInMenu(true); connect(openAct, SIGNAL(triggered()), this, SLOT(openProject())); mostRecentAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("project1.png")); mostRecentAct->setIcon(QIcon(iconFile)); mostRecentAct->setIconVisibleInMenu(true); connect(mostRecentAct, SIGNAL(triggered()), this, SLOT(openMostRecent())); secondMostRecentAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("project2.png")); secondMostRecentAct->setIcon(QIcon(iconFile)); secondMostRecentAct->setIconVisibleInMenu(true); connect(secondMostRecentAct, SIGNAL(triggered()), this, SLOT(openSecondMostRecent())); thirdMostRecentAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("project3.png")); thirdMostRecentAct->setIcon(QIcon(iconFile)); thirdMostRecentAct->setIconVisibleInMenu(true); connect(thirdMostRecentAct, SIGNAL(triggered()), this, SLOT(openThirdMostRecent())); fourthMostRecentAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("project4.png")); fourthMostRecentAct->setIcon(QIcon(iconFile)); fourthMostRecentAct->setIconVisibleInMenu(true); connect(fourthMostRecentAct, SIGNAL(triggered()), this, SLOT(openFourthMostRecent())); saveAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("filesave.png")); saveAct->setIcon(QIcon(iconFile)); saveAct->setShortcut(ControlModifier + Key_S); saveAct->setIconVisibleInMenu(true); connect(saveAct, SIGNAL(triggered()), this, SLOT(saveProject())); saveAsAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("filesaveas.png")); saveAsAct->setIcon(QIcon(iconFile)); saveAsAct->setShortcut(ControlModifier + ShiftModifier + Key_S); saveAsAct->setIconVisibleInMenu(true); connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveProjectAs())); videoAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("videoexport.png")); videoAct->setIcon(QIcon(iconFile)); videoAct->setShortcut(ControlModifier + ALT + Key_V); videoAct->setIconVisibleInMenu(true); connect(videoAct, SIGNAL(triggered()), this, SLOT(exportToVideo())); cinelerraAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("window.png")); cinelerraAct->setIcon(QIcon(iconFile)); cinelerraAct->setShortcut(ControlModifier + ALT + Key_C); cinelerraAct->setEnabled(false); cinelerraAct->setIconVisibleInMenu(true); connect(cinelerraAct, SIGNAL(triggered()), this, SLOT(exportToCinelerra())); propertiesAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("configure.png")); propertiesAct->setIcon(QIcon(iconFile)); propertiesAct->setShortcut(ControlModifier + Key_P); propertiesAct->setIconVisibleInMenu(true); connect(propertiesAct, SIGNAL(triggered()), this, SLOT(showPropertiesDialog())); quitAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("quit.png")); quitAct->setIcon(QIcon(iconFile)); quitAct->setShortcut(ControlModifier + Key_Q); quitAct->setIconVisibleInMenu(true); // connect(quitAct, SIGNAL(triggered()), qApp, SLOT(quit())); connect(quitAct, SIGNAL(triggered()), this, SLOT(closeApplication())); // Edit menu undoAct = frontend->getProject()->getUndoStack()->createUndoAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("undo.png")); undoAct->setIcon(QIcon(iconFile)); undoAct->setShortcut(ControlModifier + Key_Z); undoAct->setIconVisibleInMenu(true); redoAct = frontend->getProject()->getUndoStack()->createRedoAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("redo.png")); redoAct->setIcon(QIcon(iconFile)); redoAct->setShortcut(ControlModifier + ShiftModifier + Key_Z); redoAct->setIconVisibleInMenu(true); insertSceneAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("insertscene.png")); insertSceneAct->setIcon(QIcon(iconFile)); // insertSceneAct->setShortcut(ControlModifier + Key_Q); insertSceneAct->setIconVisibleInMenu(true); connect(insertSceneAct, SIGNAL(triggered()), projectTab, SLOT(insertSceneSlot())); addSceneAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("addscene.png")); addSceneAct->setIcon(QIcon(iconFile)); // addSceneAct->setShortcut(ControlModifier + Key_Q); addSceneAct->setIconVisibleInMenu(true); connect(addSceneAct, SIGNAL(triggered()), projectTab, SLOT(addSceneSlot())); removeSceneAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("removescene.png")); removeSceneAct->setIcon(QIcon(iconFile)); // removeSceneAct->setShortcut(ControlModifier + Key_Q); removeSceneAct->setIconVisibleInMenu(true); connect(removeSceneAct, SIGNAL(triggered()), projectTab, SLOT(removeSceneSlot())); insertTakeAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("inserttake.png")); insertTakeAct->setIcon(QIcon(iconFile)); // insertTakeAct->setShortcut(ControlModifier + Key_Q); insertTakeAct->setIconVisibleInMenu(true); connect(insertTakeAct, SIGNAL(triggered()), projectTab, SLOT(insertTakeSlot())); addTakeAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("addtake.png")); addTakeAct->setIcon(QIcon(iconFile)); // addTakeAct->setShortcut(ControlModifier + Key_Q); addTakeAct->setIconVisibleInMenu(true); connect(addSceneAct, SIGNAL(triggered()), projectTab, SLOT(addTakeSlot())); removeTakeAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("removetake.png")); removeTakeAct->setIcon(QIcon(iconFile)); // removeTakeAct->setShortcut(ControlModifier + Key_Q); removeTakeAct->setIconVisibleInMenu(true); connect(removeTakeAct, SIGNAL(triggered()), projectTab, SLOT(removeTakeSlot())); insertFramesAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("insertframes.png")); insertFramesAct->setIcon(QIcon(iconFile)); // insertFramesAct->setShortcut(ControlModifier + Key_Q); insertFramesAct->setIconVisibleInMenu(true); connect(insertFramesAct, SIGNAL(triggered()), projectTab, SLOT(insertFramesSlot())); addFramesAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("addframes.png")); addFramesAct->setIcon(QIcon(iconFile)); // addFramesAct->setShortcut(ControlModifier + Key_Q); addFramesAct->setIconVisibleInMenu(true); connect(addFramesAct, SIGNAL(triggered()), projectTab, SLOT(addFramesSlot())); removeFramesAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("removeframes.png")); removeFramesAct->setIcon(QIcon(iconFile)); // removeFramesAct->setShortcut(ControlModifier + Key_Q); removeFramesAct->setIconVisibleInMenu(true); connect(removeFramesAct, SIGNAL(triggered()), projectTab, SLOT(removeFramesSlot())); /* cutAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("cut.png")); cutAct->setIcon(QIcon(iconFile)); cutAct->setIconVisibleInMenu(true); cutAct->setEnabled(false); cutAct->setShortcut(ControlModifier + Key_X); copyAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("copy.png")); copyAct->setIcon(QIcon(iconFile)); copyAct->setShortcut(ControlModifier + Key_C); copyAct->setIconVisibleInMenu(true); copyAct->setEnabled(false); connect(copyAct, SIGNAL(triggered()), this, SLOT(copy())); pasteAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("paste.png")); pasteAct->setIcon(QIcon(iconFile)); pasteAct->setShortcut(ControlModifier + Key_V); pasteAct->setIconVisibleInMenu(true); pasteAct->setEnabled(false); connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste())); */ preferencesAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("configure.png")); preferencesAct->setIcon(QIcon(iconFile)); preferencesAct->setShortcut(ControlModifier + Key_P); preferencesAct->setIconVisibleInMenu(true); connect(preferencesAct, SIGNAL(triggered()), this, SLOT(showPreferencesDialog())); // Windows menu undoViewAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("undoview.png")); undoViewAct->setIcon(QIcon(iconFile)); undoViewAct->setShortcut(ControlModifier + Key_U); undoViewAct->setIconVisibleInMenu(true); connect(undoViewAct, SIGNAL(triggered()), this, SLOT(showUndoStack())); cameraControllerAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("undoview.png")); cameraControllerAct->setIcon(QIcon(iconFile)); cameraControllerAct->setShortcut(ControlModifier + Key_C); cameraControllerAct->setIconVisibleInMenu(true); connect(cameraControllerAct, SIGNAL(triggered()), this, SLOT(showCameraControllerDialog())); // Help menu whatsthisAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("whatsthis.png")); whatsthisAct->setIcon(QIcon(iconFile)); whatsthisAct->setShortcut(ShiftModifier + Key_F1); whatsthisAct->setIconVisibleInMenu(true); connect(whatsthisAct, SIGNAL(triggered()), this, SLOT(whatsThis())); helpAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("window.png")); helpAct->setIcon(QIcon(iconFile)); helpAct->setShortcut(Key_F1); helpAct->setIconVisibleInMenu(true); connect(helpAct, SIGNAL(triggered()), this, SLOT(showHelpDialog())); aboutQtAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("qtlogo.png")); aboutQtAct->setIcon(QIcon(iconFile)); aboutQtAct->setIconVisibleInMenu(true); connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); aboutAct = new QAction(this); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("window.png")); aboutAct->setIcon(QIcon(iconFile)); aboutAct->setIconVisibleInMenu(true); connect(aboutAct, SIGNAL(triggered()), this, SLOT(showAboutDialog())); } void MainWindowGUI::createMenus() { // Export menu exportMenu = new QMenu(this); exportMenu->addAction(videoAct); exportMenu->addAction(cinelerraAct); // Most recent menu mostRecentMenu = new QMenu(this); // File menu fileMenu = new QMenu(this); fileMenu->addAction(newAct); fileMenu->addAction(openAct); fileMenu->addMenu(mostRecentMenu); fileMenu->addSeparator(); fileMenu->addAction(saveAct); fileMenu->addAction(saveAsAct); fileMenu->addSeparator(); fileMenu->addMenu(exportMenu); fileMenu->addSeparator(); fileMenu->addAction(propertiesAct); fileMenu->addSeparator(); fileMenu->addAction(quitAct); menuBar()->addMenu(fileMenu); // Edit menu editMenu = new QMenu(this); editMenu->addAction(undoAct); editMenu->addAction(redoAct); editMenu->addSeparator(); editMenu->addAction(insertSceneAct); editMenu->addAction(addSceneAct); editMenu->addAction(removeSceneAct); editMenu->addSeparator(); editMenu->addAction(insertTakeAct); editMenu->addAction(addTakeAct); editMenu->addAction(removeTakeAct); editMenu->addSeparator(); editMenu->addAction(insertFramesAct); editMenu->addAction(addFramesAct); editMenu->addAction(removeFramesAct); // editMenu->addSeparator(); // editMenu->addAction(cutAct); // editMenu->addAction(copyAct); // editMenu->addAction(pasteAct); editMenu->addSeparator(); editMenu->addAction(preferencesAct); menuBar()->addMenu(editMenu); // Windows menu windowsMenu = new QMenu(this); windowsMenu->addAction(undoViewAct); windowsMenu->addAction(cameraControllerAct); menuBar()->addMenu(windowsMenu); // Help menu helpMenu = new QMenu(this); helpMenu->addAction(whatsthisAct); helpMenu->addAction(helpAct); helpMenu->addSeparator(); helpMenu->addAction(aboutQtAct); helpMenu->addAction(aboutAct); menuBar()->addMenu(helpMenu); } void MainWindowGUI::makeToolsMenu(QHBoxLayout *layout) { QString iconFile(frontend->getIconsDirName()); sideBar = new QTabWidget(); sideBar->setObjectName("sideBar"); sideBar->setTabPosition(QTabWidget::South); sideBar->setMaximumWidth(250); sideBar->setMinimumWidth(200); layout->addWidget(sideBar); Q_ASSERT(frontend != 0); recordingTab = new RecordingTab(frontend, toolBar, this); recordingTab->initialize(); iconFile.append(QLatin1String("clapper.png")); sideBar->addTab(recordingTab, QIcon(iconFile), "Recording"); projectTab = new ProjectTab(frontend, lastVisitedDir); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("view.png")); sideBar->addTab(projectTab, QIcon(iconFile), "Project"); /* viewTab = new ViewTab(frontend); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("view.png")); sideBar->addTab(viewTab, QIcon(iconFile), "View"); compositingTab = new CompositingTab(frontend); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("compositing.png")); sideBar->addTab(compositingTab, QIcon(iconFile), "Compositing"); */ } /* void MainWindowGUI::makeGotoMenu(QVBoxLayout *layout) { QString iconFile(frontend->getIconsDirName()); gotoMenuWidget = new QWidget; gotoMenuWidget->setObjectName("gotoMenuWidget"); gotoMenuWidgetLayout = new QHBoxLayout; gotoMenuWidgetLayout->setSpacing(5); gotoMenuWidgetLayout->setMargin(0); gotoFrameLabel = new QLabel; gotoSpinner = new FlexibleSpinBox; gotoSpinner->setMaximumWidth(60); gotoSpinner->setRange(1, 1); gotoMenuCloseButton = new QPushButton; iconFile.append(QLatin1String("close.png")); gotoMenuCloseButton->setIcon(QPixmap(iconFile)); gotoMenuCloseButton->setFlat(true); gotoMenuCloseButton->setMinimumSize(16, 16); gotoMenuCloseButton->setMaximumSize(16, 16); connect(gotoMenuCloseButton, SIGNAL(clicked()), gotoMenuWidget, SLOT(hide())); gotoMenuWidgetLayout->addWidget(gotoFrameLabel); gotoMenuWidgetLayout->addWidget(gotoSpinner); gotoMenuWidgetLayout->addStretch(); gotoMenuWidgetLayout->addWidget(gotoMenuCloseButton); gotoMenuWidget->setLayout(gotoMenuWidgetLayout); layout->addWidget(gotoMenuWidget); gotoMenuWidget->hide(); } */ void MainWindowGUI::makeViews(QHBoxLayout *layout) { viewArea = new QWidget; viewArea->setObjectName("ViewArea"); viewAreaLayout = new QVBoxLayout; viewAreaLayout->setObjectName("ViewAreaLayout"); // viewAreaLayout->setSpacing(2); viewAreaLayout->setMargin(2); frameView = new FrameViewImage(frontend, this); // frameView = new FrameViewInterface(frontend, this); frameView->setMinimumSize(400, 270); frameView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); viewAreaLayout->addWidget(frameView); toolBar = new ToolBar(frontend, recordingTab); toolBar->setObjectName("ToolBar"); toolBar->setMinimumSize(400, 30); toolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); viewAreaLayout->addWidget(toolBar); // viewAreaLayout->addWidget(toolBar, 1, Qt::AlignJustify); viewArea->setLayout(viewAreaLayout); layout->addWidget(viewArea); } void MainWindowGUI::makeStatusBar() { projectLabel = new QLabel; projectLabel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); projectLabel->setMargin(0); this->statusBar()->addPermanentWidget(projectLabel); projectID = new QLabel; projectID->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); projectID->setMargin(0); this->statusBar()->addPermanentWidget(projectID); sceneLabel = new QLabel; sceneLabel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); sceneLabel->setMargin(0); this->statusBar()->addPermanentWidget(sceneLabel); sceneID = new QLabel; sceneID->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); sceneID->setMargin(0); this->statusBar()->addPermanentWidget(sceneID); takeLabel = new QLabel; takeLabel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); takeLabel->setMargin(0); this->statusBar()->addPermanentWidget(takeLabel); takeID = new QLabel; takeID->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); takeID->setMargin(0); this->statusBar()->addPermanentWidget(takeID); exposureLabel = new QLabel; exposureLabel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); exposureLabel->setMargin(0); this->statusBar()->addPermanentWidget(exposureLabel); exposureID = new QLabel; exposureID->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); exposureID->setMargin(0); this->statusBar()->addPermanentWidget(exposureID); } void MainWindowGUI::dragEnterEvent(QDragEnterEvent * /* event */) { qDebug() << "MainWindowGUI::dragEnterEvent --> Start (Empty)"; // TODO: New Implementation for Drag enter event /* if (event->mimeData()->hasUrls()) { event->accept(); } else { event->ignore(); } qDebug() << "MainWindowGUI::dragEnterEvent --> End"; */ } void MainWindowGUI::dropEvent(QDropEvent * /* event */) { qDebug() << "MainWindowGUI::dropEvent --> Start (Empty)"; // TODO: New Implementation for Drop event /* if (event->mimeData()->hasUrls()) { QStringList fileNames; QList urls = event->mimeData()->urls(); int numFrames = urls.size(); for (int i = 0; i < numFrames; ++i) { fileNames.append(urls[i].toLocalFile()); projectHandler->addFrames(fileNames); } } qDebug() << "MainWindowGUI::dropEvent --> End"; */ } void MainWindowGUI::keyReleaseEvent(QKeyEvent * k) { switch (k->key()) { case Key_Shift: { timeLine->setSelecting(false); break; } } } void MainWindowGUI::setMostRecentProject() { const QString newFirst = frontend->getProject()->getNewProjectFilePath(); Q_ASSERT(!newFirst.isEmpty()); PreferencesTool *pref = frontend->getPreferences(); pref->removeProject(newFirst); pref->addProject(newFirst); pref->flushPreferences(); // Update the most recent menu! updateMostRecentMenu(); } void MainWindowGUI::updateMostRecentMenu() { PreferencesTool *pref = frontend->getPreferences(); int ProjectFileIndex = 0; int MenuIndex = 0; mostRecentMenu->clear(); do { QString fileName(pref->getProject(ProjectFileIndex)); if (fileName.isEmpty()) break; if (QFile::exists(fileName)) { switch (MenuIndex) { case 0: mostRecentAct->setVisible(true); mostRecentAct->setText(Util::convertPathToOsSpecific(fileName)); mostRecentMenu->addAction(mostRecentAct); break; case 1: secondMostRecentAct->setVisible(true); secondMostRecentAct->setText(Util::convertPathToOsSpecific(fileName)); mostRecentMenu->addAction(secondMostRecentAct); break; case 2: thirdMostRecentAct->setVisible(true); thirdMostRecentAct->setText(Util::convertPathToOsSpecific(fileName)); mostRecentMenu->addAction(thirdMostRecentAct); break; case 3: fourthMostRecentAct->setVisible(true); fourthMostRecentAct->setText(Util::convertPathToOsSpecific(fileName)); mostRecentMenu->addAction(fourthMostRecentAct); break; } MenuIndex++; } else { // Project file didn't exist --> remove the entry from the preferences pref->removeProject(fileName); } ProjectFileIndex++; } while (1); } void MainWindowGUI::checkSaved() { // Last changes saved? bool b = frontend->getProject()->isProjectAnimationChanges() || frontend->getProject()->isProjectSettingsChanges(); if (b) { int save = frontend->askQuestion(tr("Unsaved changes"), tr("There are unsaved changes. Do you want to save?")); if (save == 0) { // user pressed button 0, which is 'yes' saveProject(); } } } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/timeline/exposurethumbview.h000644 000000 000000 00000010275 12654352322 030100 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef EXPOSURETHUMBVIEW_H #define EXPOSURETHUMBVIEW_H #include #include #include #include "frontends/qtfrontend/timeline/timeline.h" /** * Widget representing a frame in the animation. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ExposureThumbView : public ThumbView { public: /** * Creates and sets up the exposurethumbview. * @param line the timeline for communicating with it. * @param parent the parent widget. * @param number the number of this widget in the timeline. */ ExposureThumbView(TimeLine *line, QWidget *parent = 0, int number = 0, const char *name = 0); /** * Cleans up after the widget. */ ~ExposureThumbView(); /** * Overloaded event function to recieve mousepress-events. * @param e information about the mousepress-event. */ void mousePressEvent(QMouseEvent * e); /** * Overloaded event function to recieve mouserelease-events. * @param e information about the mouserelease-event. */ void mouseReleaseEvent(QMouseEvent * e); /** * Overloaded event function to recieve mouseMoveEvents. * @param me information about the mouseMoveEvent. */ void mouseMoveEvent(QMouseEvent *me); /** * Overloaded event function to recieve events when the user double clicks * in the thumbview. Double clicks here cause the preferences menu for this * frame to be shown. * @param e information about the mouseDoubleClickEvent. */ void mouseDoubleClickEvent(QMouseEvent * e); /** * Function to set the index of this ThumbView in the timeline * when the ThumbView change position. * @param index the new index for the ThumbView in the timeline. */ void setThumbIndex(int index); /** * Sets whether this thumbview should be selected. * @param selected whether this frame is selected. */ void setSelected(bool selected); /** * Notifies the exposurethumbview that a drop have happened inside its borders. * @param event information about the event. */ void contentsDropped(QDropEvent * event); protected: /** * Event function which paints the widget. */ void paintEvent(QPaintEvent *); private: QString stringNumber; /** The width the text should have. (Cached for efficiency reasons)*/ int textWidth; /** Specifies whether this frame is selected. */ bool selected; /** Starts an uri drag of the picture in this label. */ void startDrag(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/timeline/timeline.h000644 000000 000000 00000042052 12654352322 026077 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef TIMELINE_H #define TIMELINE_H #include #include #include #include #include #include #include #include "frontends/observer.h" // #include "domain/animation/animationproject.h" #include "domain/animation/exposure.h" #include "frontends/frontend.h" #include "frontends/qtfrontend/timeline/thumbview.h" class ThumbView; /** * The timeline widget for viewing the animation model. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class TimeLine : public QScrollArea, public Observer { Q_OBJECT public: /** * Creates and sets up the timeline. * @param parent the parent widget */ TimeLine(Frontend* f, QWidget *parent = 0); /** * Cleans up after the timeline. */ ~TimeLine(); /** * Get the frontend. * @return the frontend. */ Frontend* getFrontend(); /** * Set the frontend. * @param f the frontend. * void setFrontend(Frontend* f); */ /************************************************************************** * Animation notification functions **************************************************************************/ /** * Function to receive notification when the model is erased. */ void updateRemoveProject(); /** * Function to receive notification when a new Project is created. */ void updateNewProject(); /** * Function for receiving notification when a project is opened. */ virtual void updateOpenProject(); /** * Function to recieve notification when a sound of a scene is to be played. * @param sceneIndex the scene to be played */ void updatePlaySound(int sceneIndex); /** * Function to recieve notification when new mix mode is set. * @param newMixMode the new mix mode */ void updateMixMode(int newMixMode); /** * Function to recieve notification when new mix count is set. * @param newMixCount the new mix count */ void updateMixCount(int newMixCount); /** * Function to recieve notification when new live view frames per second value is set. * @param newFps the new frames per second value */ void updateLiveViewFps(int newFps); /** * Function to recieve notification when new video frames per second value is set. * @param newFps the new frames per second value */ void updateVideoFps(int newFps); /************************************************************************** * Scene notification functions **************************************************************************/ /** * Function to recieve notification when a new scene is added to the * model. * @param sceneIndex the index of the new scene. */ void updateAddScene(int sceneIndex); /** * Function to recieve notification when a new scene is inserted to the * model. * @param sceneIndex the index of the new scene. */ void updateInsertScene(int sceneIndex); /** * Function which recieves notification when a scene is selected as the * active scene in the animationmodel. */ void updateActivateScene(); /** * Function to recieve notification when a scene is removed from * the model. * @param sceneIndex the scene which has been removed from the model. */ void updateRemoveScene(int sceneIndex); /** * Function which recieves notification when a scene in the animation * has been moved and moves the icons in the timeline accordingly. * @param sceneNumber the scene which have been moved. * @param movePosition the position the scene has been moved to. */ void updateMoveScene(int sceneNumber, int movePosition); /************************************************************************** * Take notification functions **************************************************************************/ /** * Function to recieve notification when a new take is added to the * model. * @param sceneIndex the scene where the new take is added. * @param takeIndex the index of the new take. */ void updateAddTake(int sceneIndex, int takeIndex); /** * Function to recieve notification when a new take is inserted to the * model. * @param sceneIndex the scene where the new take is added. * @param takeIndex the index of the new take. */ void updateInsertTake(int sceneIndex, int takeIndex); /** * Function which recieves notification when a take is selected as the * active take in the animationmodel. */ void updateActivateTake(); /** * Function to recieve notification when a take is removed from * the model. * @param sceneIndex the scene of the take which has been removed from the model. * @param takeIndex the take which has been removed from the model. */ void updateRemoveTake(int sceneIndex, int takeIndex); /************************************************************************** * Exposure notification functions **************************************************************************/ /** * Function to recieve notification when a new exposure is added to the * model. * @param sceneIndex the scene of the take where the new exposure is added. * @param takeIndex the take where the new exposure is added. * @param exposureIndex the index of the new exposure. */ void updateAddExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Function to recieve notification when a new exposure is inserted to the * model. * @param sceneIndex the scene of the take where the new exposure is added. * @param takeIndex the take where the new exposure is added. * @param exposureIndex the index of the new exposure. */ void updateInsertExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Function to recieve notification when one exposure are deleted. * @param sceneIndex the scene index of the selected exposure. * @param takeIndex the take index of the selected exposure. * @param exposureIndex the index of the removed exposure. */ void updateRemoveExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Function to recieve notification when one or more frames are moved. */ void updateMoveExposures(int fromFrame, int toFrame, int movePosition); /** * Function to recieve notification when a new frame is selected. */ void updateActivateExposure(); /** * Function to recieve notification when the frame of an exposure has modifyed. * @param modSceneIndex The index of the scene of the modifyed exposure. * @param modTakeIndex The index of the take of the modifyed exposure. * @param modExposureIndex The index of the modifyed exposure. */ void updateModifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex); /************************************************************************** * Other functions **************************************************************************/ /** * Set whether the user is engaged selecting several frames or not (pressing * shift). * @param selecting true if the user is currently selecting multiple pictures */ void setSelecting(bool selecting); /** * Returns true if the user is currently selecting several thumbviews. * @return true if the user is currently selecting several thumbviews. */ bool isSelecting() const; /** * Returns the current selectionFrame * @return the current selectionFrame */ int getSelectionFrame() const; /** * Retrieves the value of the movingScene property specifying which scene * is currently being moved in the timeline. * @return the value of the movingScene property. */ int getMovingScene() const; /** * Sets the value of the movingScene property specifying which scene * is currently being moved in the timeline. * @param movingScene the new value of the movingScene property. */ void setMovingScene(int movingScene); int getFrameWidth() const; int getFrameHeight() const; int getSpace() const; protected: /** * Overloaded event function for when a drag enter occurs in the timeline * @param event information about the dragEnterEvent */ void dragEnterEvent(QDragEnterEvent *event); /** * Overloaded event function for when a drop event occurs in the timeline. * @param event information about the dropEvent */ void dropEvent(QDropEvent *event); void dragMoveEvent(QDragMoveEvent *event); void resizeEvent(QResizeEvent *event); public slots: /** * Recieves notification when the sounds in a frame has been changed. */ void frameSoundsChanged(); private slots: void scroll(); private: /** * Frontend of the application */ Frontend *frontend; static const int FRAME_HEIGHT = 88; static const int FRAME_WIDTH = 117; static const int SPACE = 2; /** Vector of thumbviews to keep track of the pictures in the timeline*/ QVectorthumbViews; /** Index of the active scene in the timeline */ int activeSceneIndex; /** Index of the active take in the timeline */ int activeTakeIndex; /** Index of the active exposure in the timeline*/ int activeExposureIndex; /** The scene which are being moved when draging a scene */ int movingScene; /** The other border frame in a selection together with activeFrame. * If only one is selected selectionFrame == activeFrame */ int selectionFrame; /** Direction to scroll when dragging. * -1 = scroll negative, 0 = no scroll, 1 = scroll positive */ int scrollDirection; int lowerScrollAreaX; int upperScrollAreaX; int lowerAccelScrollAreaX; int upperAccelScrollAreaX; int minScrollAreaX; int maxScrollAreaX; int minScrollAreaY; int maxScrollAreaY; /** * True if the user is currently holding down shift to select multiple frames */ bool selecting; QTimer *scrollTimer; QScrollBar *scrollBar; QWidget *mainWidget; /************************************************************************** * Private animation functions **************************************************************************/ /** * Delete all thumviews from the time line */ void clear(); /************************************************************************** * Private scene functions **************************************************************************/ /** * Creates a new scene and adds it to the timeline. * @param sceneIndex the location the new scene should be added at. */ void newScene(int sceneIndex); /** * Moves a scene in the timeline. * @param sceneNumber the scene that are moved. * @param movePosition the position the scene are moved to. */ void moveScene(int sceneNumber, int movePosition); /** * Sets a new scene as the active scene in the timeline and opens it. * @param sceneNumber the scene to set as the active scene. * frames to the scene. */ // void setNewActiveScene(int sceneNumber); /** * Sets a new scene as the active scene in the timeline and opens it. */ void activateScene(); /************************************************************************** * Private take functions **************************************************************************/ /** * Creates a new take and adds it to the timeline. * @param sceneIndex the scene the new take should be added at. * @param takeIndex the location the new take should be added at. */ void newTake(int sceneIndex, int takeIndex); /** * Sets a new take as the active take in the timeline and opens it. */ void activateTake(); /** * Delete all thumviews of the take from the time line */ void clearTake(); /************************************************************************** * Private exposure functions **************************************************************************/ /** * Creates a new exposure and adds it to the timeline. * @param sceneIndex the scene of the take the new exposure should be added at. * @param takeIndex the take the new exposure should be added at. * @param exposureIndex the location the new exposure should be added at. */ void newExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Adds the picture to the frame to the timeline at position index. * * @param frame the path of the frame to be added to the timeline. * @param index the place to add the frame. */ void addExposure(Exposure* frame, int index); /** * Adds the frames in the framesvector to the timeline. * @param frames the frames to be added to the timeline. * @param index the location to add the frames to.calc * progressbar. */ void addExposures(const QVector& frames, int index); /** * Removes a exposure from the timeline. * @param sceneIndex Index of the scene of the exposure to remove. * @param takeIndex Index of the take of the exposure to remove. * @param exposureIndex Index of the exposure to remove. */ void removeExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Removes all thumbviews from the timeline. */ void removeAllExposures(); /** * Move the frames from fromFrame (inclusive) to toFrame to movePosition. * @param fromFrame the first frame to move. * @param toFrame the last frame to move. * @param movePosition the position to move the frames to. */ void moveExposures(int fromFrame, int toFrame, int movePosition); /** * Sets the thumbview frameNumber in the timeline to be the active frame. * @param frameNumber the number of the new active frame */ // void setNewActiveExposure(int exposureIndex); /** * Sets the thumbview frameNumber in the timeline to be the active frame. */ void activateExposure(); /** * Loads the modifyed frame picture into the frameview. * @param modSceneIndex The index of the scene of the modifyed exposure. * @param modTakeIndex The index of the take of the modifyed exposure. * @param modExposureIndex The index of the modifyed exposure. */ void modifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex); /************************************************************************** * Other private functions **************************************************************************/ /** *Moves a thumbview in the thumbviews-vector from fromPosition to toPosition. *@param fromPosition the place in the vector the thumbview is moved from. *@param toPosition the place in the vector the thumbview is moved to. */ void moveThumbView(int fromPosition, int toPosition); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/timeline/thumbview.h000644 000000 000000 00000010077 13011043104 026264 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef THUMBVIEW_H #define THUMBVIEW_H #include "timeline.h" #include #include class TimeLine; /** * This abstract class represents the thumbviews in the timeline. It has * two subclasses: the ExposureThumbView and the SceneThumbView. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ThumbView : public QLabel { public: /** * Creates and sets up the thumbview class. * @param line the timeline for communicating. * @param parent the parent widget. * @param number the number of this thumbview in the timeline. */ ThumbView(TimeLine *line, QWidget *parent, int number, const char *name = 0); /** * Cleans up after the widget. */ virtual ~ThumbView(); /** * Function to set the index of this ThumbView in the timeline * when the ThumbView change position. * @param index the new index for the ThumbView in the timeline. */ virtual void setThumbIndex(int index); /** * Retrieves the index of this ThumbView in the timeline * @return the index for this ThumbView in the timeline */ int getThumbIndex() const; /** * Abstract function for telling a exposurethumbview that it has one or more sounds * attached to it. * @param hasSounds true if the frame has one or more sounds attached to it. */ virtual void setHasSounds(bool hasSounds); /** * Sets whether a exposurethumbview should be marked as selected. * @param selected whether this exposurethumbview should be showed as selected. */ virtual void setSelected(bool selected); /** * Abstract function for telling a scenethumbview whether the scene is opened or * closed * @param isOpened true if the scene is opened. */ virtual void setOpened(bool isOpened); /** * Notifies the thumbview that a drop have happened inside its borders. * * The reason it doesn't accept it itself is that the timeline need the information * so that it can autoscroll. * @param event information about the event. */ virtual void contentsDropped(QDropEvent * event); protected: /** * The timeline for communicating with it */ TimeLine *timeLine; /** * Coordinate for calculating when a drag should start to give some slack */ QPoint dragPos; /** * The index this thumb has in the timeline */ int thumbIndex; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/timeline/thumbview.cpp000644 000000 000000 00000004726 12654352322 026644 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "thumbview.h" #include #include #include #include "domain/domainfacade.h" ThumbView::ThumbView(TimeLine *line, QWidget *parent, int thumbIndex, const char *name) : QLabel(parent), timeLine(line), thumbIndex(thumbIndex) { // qDebug() << "ThumbView::Constructor --> Start"; setObjectName(name); // qDebug() << "ThumbView::Constructor --> End"; } ThumbView::~ThumbView() { } void ThumbView::setThumbIndex(int index) { qDebug() << "ThumbView::setNumber --> Start"; thumbIndex = index; qDebug() << "ThumbView::setNumber --> End"; } int ThumbView::getThumbIndex() const { return thumbIndex; } void ThumbView::setHasSounds(bool) {} void ThumbView::setOpened(bool) {} void ThumbView::setSelected(bool) {} void ThumbView::contentsDropped(QDropEvent *) {} qstopmotion-2.3.2-Source/src/frontends/qtfrontend/timeline/exposurethumbview.cpp000644 000000 000000 00000024310 12654352322 030426 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "exposurethumbview.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "domain/domainfacade.h" ExposureThumbView::ExposureThumbView(TimeLine *line, QWidget *parent, int number, const char *name) : ThumbView(line, parent, number, name) { // qDebug() << "ExposureThumbView::Constructor --> Start"); setObjectName("ExposureThumbView"); stringNumber = QString("%1").arg(number + 1); textWidth = 5 + stringNumber.length() * 8; selected = false; // qDebug() << "ExposureThumbView::Constructor --> End"); } ExposureThumbView::~ExposureThumbView() { } void ExposureThumbView::mousePressEvent(QMouseEvent * e) { qDebug() << "ExposureThumbView::mousePressEvent --> Empty"; /* if (e->button() == Qt::LeftButton) { if (!timeLine->isSelecting()) { int selectionFrame = timeLine->getSelectionFrame(); int activeFrame = timeLine->getFrontend()->getProject()->getActiveExposureIndex(); int highend = (selectionFrame > activeFrame) ? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame) ? selectionFrame : activeFrame; // If the user presses inside the selection area this shouldn't trigger // setActiveFrame before the mouse button is released. The reason for this is // to give the user a chance to drag the items. See mouseReleaseEvent(...) if (thumbIndex > highend || thumbIndex < lowend) { timeLine->getFrontend()->getProject()->setActiveExposureIndex(thumbIndex); } dragPos = e->pos(); } else { timeLine->setSelection(thumbIndex); } } qDebug() << "ExposureThumbView::mousePressEvent --> End"; */ } void ExposureThumbView::mouseReleaseEvent(QMouseEvent * e) { qDebug() << "ExposureThumbView::mouseReleaseEvent --> Start"; if (e->button() == Qt::LeftButton) { if (!timeLine->isSelecting()) { int selectionFrame = timeLine->getSelectionFrame(); int activeFrame = timeLine->getFrontend()->getProject()->getActiveExposureIndex(); if (selectionFrame == activeFrame) { // Click the avtive frame --> nothing to do! return; } int highend = (selectionFrame > activeFrame) ? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame) ? selectionFrame : activeFrame; if (thumbIndex <= highend || thumbIndex >= lowend) { timeLine->getFrontend()->getProject()->selectExposureToUndo(timeLine->getFrontend()->getProject()->getActiveSceneIndex(), timeLine->getFrontend()->getProject()->getActiveTakeIndex(), thumbIndex); } } } qDebug() << "ExposureThumbView::mouseReleaseEvent --> End"; } void ExposureThumbView::mouseMoveEvent(QMouseEvent *me) { qDebug() << "ExposureThumbView::mouseMoveEvent --> Start"; if (me->buttons() & Qt::LeftButton) { int distance = (me->pos() - dragPos).manhattanLength(); if (distance > QApplication::startDragDistance()) { startDrag(); } } QLabel::mouseMoveEvent(me); qDebug() << "ExposureThumbView::mouseMoveEvent --> End"; } void ExposureThumbView::mouseDoubleClickEvent(QMouseEvent *) { qDebug() << "ExposureThumbView::mouseDoubleClickEvent --> Start"; // timeLine->showPreferencesMenu(); qDebug() << "ExposureThumbView::mouseDoubleClickEvent --> End"; } void ExposureThumbView::paintEvent(QPaintEvent * paintEvent) { // qDebug() << "ExposureThumbView::paintEvent --> Start (Exposure: " << this->stringNumber << ", Type: " << paintEvent->type() << ")"; this->QLabel::paintEvent(paintEvent); QPainter painter(this); if (selected) { painter.fillRect(4, 5, textWidth, 14, QBrush(Qt::white)); painter.setPen(Qt::black); } else { painter.fillRect(4, 5, textWidth, 14, QBrush(Qt::black)); painter.setPen(Qt::white); } painter.drawText(5, 17, stringNumber); // qDebug() << "ExposureThumbView::paintEvent --> End (Exposure: " << this->stringNumber << ", Type: " << paintEvent->type() << ")"; } void ExposureThumbView::startDrag() { qDebug() << "ExposureThumbView::startDrag --> Start"; // If the drag ends on a scene this tells the scene that it is frames who are // being moved. timeLine->setMovingScene(-1); QList urls; int selectionFrame = timeLine->getSelectionFrame(); int activeScene = timeLine->getFrontend()->getProject()->getActiveSceneIndex(); int activeTake = timeLine->getFrontend()->getProject()->getActiveTakeIndex(); int activeFrame = timeLine->getFrontend()->getProject()->getActiveExposureIndex(); int highend = (selectionFrame > activeFrame) ? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame) ? selectionFrame : activeFrame; for (int i = lowend; i <= highend; ++i) { Exposure *exposure = timeLine->getFrontend()->getProject()->getExposure(activeScene, activeTake, i); urls.append(QUrl::fromLocalFile(exposure->getImagePath())); } QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setUrls(urls); drag->setMimeData(mimeData); drag->setPixmap(*pixmap()); //Qt::DropAction dropAction = drag->start(Qt::CopyAction | Qt::MoveAction); drag->start(Qt::MoveAction); qDebug() << "ExposureThumbView::startDrag --> End"; } void ExposureThumbView::setThumbIndex(int index) { qDebug() << "ExposureThumbView::setNumber --> Start"; this->thumbIndex = index; stringNumber = QString("%1").arg(index + 1); textWidth = 5 + stringNumber.length() * 8; update(); qDebug() << "ExposureThumbView::setNumber --> End"; } void ExposureThumbView::setSelected(bool selected) { qDebug() << "ExposureThumbView::setSelected --> Start (Exposure: " << this->stringNumber << ", Selected: " << selected << ")"; this->selected = selected; if (selected) { setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); setLineWidth(5); setMidLineWidth(6); } else { setFrameShape(QFrame::NoFrame); } qDebug() << "ExposureThumbView::setSelected --> End (Exposure: " << this->stringNumber << ", Selected: " << selected << ")"; } // TODO: Implement ExposureThumbView::contentsDropped() // This doesn't work between applications of this type because of the if-check (event->source() != 0). void ExposureThumbView::contentsDropped(QDropEvent * /* event */) { qDebug() << "ExposureThumbView::contentsDropped --> Start"; timeLine->getFrontend()->showInformation("Not Implemented", "ExposureThumbView::contentsDropped not implemented."); /* if ((event->source() != 0) && (timeLine->getMovingScene() == -1)) { qDebug() << "Moving picture"); int selectionFrame = timeLine->getSelectionFrame(); int activeFrame = timeLine->getFrontend()->getProject()->getActiveExposureIndex(); int highend = (selectionFrame > activeFrame) ? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame) ? selectionFrame : activeFrame; timeLine->getFrontend()->getProject()->moveFrames(lowend, highend, thumbIndex); } else { qDebug() << "Adding picture(s)"); timeLine->getFrontend()->getProject()->selectExposureToUndo(timeLine->getFrontend()->getProject()->getActiveSceneIndex(), timeLine->getFrontend()->getProject()->getActiveTakeIndex(), thumbIndex); if (event->mimeData()->hasUrls()) { QStringList fileNames; QList urls = event->mimeData()->urls(); int numFrames = urls.size(); for (int i = 0; i < numFrames; ++i) { fileNames.append(urls[i].toLocalFile()); } QVector fNames; QStringList::Iterator it = fileNames.begin(); while (it != fileNames.end()) { QString fileName = *it; fNames.append(fileName); ++it; } // timeLine->getFrontend()->getProject()->addFrames(fNames); } } */ qDebug() << "ExposureThumbView::contentsDropped --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/timeline/timeline.cpp000644 000000 000000 00000076457 13011043104 026431 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "timeline.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "domain/domainfacade.h" #include "frontends/qtfrontend/timeline/exposurethumbview.h" static QImage tryReadImage(const QString &filename) { // qDebug() << "TimeLine::tryReadImage --> Start"; if (filename.isEmpty()) { qWarning() << "Couldn't read image: Invalid file name"; qDebug() << "TimeLine::tryReadImage --> End"; return QImage(); } QImageReader imageReader(filename); const QImage image = imageReader.read(); if (!image.isNull()) { // qDebug() << "TimeLine::tryReadImage --> End"); return image; } if (imageReader.error() != QImageReader::UnsupportedFormatError && imageReader.error() != QImageReader::InvalidDataError) { qWarning() << "TimeLine::tryReadImage --> Couldn't read image:" << imageReader.errorString(); return image; } // At this point we most likely failed to read the image because the suffix // of the file was different from the actual image format. // Loop through all the supported formats and see if we can find a match. const QList supportedImageFormats = QImageReader::supportedImageFormats(); for (int i = 0; i < supportedImageFormats.size(); ++i) { QImageReader anotherImageReader(filename); anotherImageReader.setFormat(supportedImageFormats.at(i)); const QImage anotherImage = anotherImageReader.read(); if (!anotherImage.isNull()) { qDebug() << "TimeLine::tryReadImage --> End"; return anotherImage; } } qWarning() << "TimeLine::tryReadImage --> Couldn't read image:" << imageReader.errorString(); return image; } TimeLine::TimeLine(Frontend* f, QWidget *parent) : QScrollArea(parent) { qDebug() << "TimeLine::Constructor --> Start"; setObjectName("TimeLine"); frontend = f; activeSceneIndex = -10; activeTakeIndex = -10; activeExposureIndex = -10; movingScene = 0; selecting = false; selectionFrame = -10; scrollDirection = 0; lowerScrollAreaX = this->x() + FRAME_WIDTH; upperScrollAreaX = this->width() - FRAME_WIDTH; lowerAccelScrollAreaX = lowerScrollAreaX - (FRAME_WIDTH >> 1); upperAccelScrollAreaX = upperScrollAreaX + (FRAME_WIDTH >> 1); minScrollAreaX = lowerScrollAreaX - FRAME_WIDTH + 20; maxScrollAreaX = upperScrollAreaX + FRAME_WIDTH - 20; minScrollAreaY = this->y() + 20; maxScrollAreaY = this->y() + FRAME_HEIGHT - 20; scrollTimer = new QTimer(this); connect(scrollTimer, SIGNAL(timeout()), this, SLOT(scroll())); scrollBar = horizontalScrollBar(); mainWidget = new QWidget; mainWidget->setMinimumHeight(FRAME_HEIGHT); mainWidget->setMaximumHeight(FRAME_HEIGHT); mainWidget->setMinimumWidth(FRAME_WIDTH); mainWidget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); setWidget(mainWidget); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); setMaximumHeight(FRAME_HEIGHT + horizontalScrollBar()->height() - 5); setMinimumHeight(FRAME_HEIGHT + horizontalScrollBar()->height() - 5); setBackgroundRole(QPalette::Dark); setAcceptDrops(true); qDebug() << "TimeLine::Constructor --> TimeLine is attached to the model"; frontend->getView()->attach(this); qDebug() << "TimeLine::Constructor --> End"; } TimeLine::~TimeLine() { } Frontend* TimeLine::getFrontend() { Q_ASSERT(frontend != NULL); return frontend; } /* void TimeLine::setFrontend(Frontend* f) { frontend = f; } */ /************************************************************************** * Animation notification functions **************************************************************************/ void TimeLine::updateRemoveProject() { qDebug() << "TimeLine::updateRemoveProject --> Start"; clear(); qDebug() << "TimeLine::updateRemoveProject --> End"; } void TimeLine::updateNewProject() { qDebug() << "TimeLine::updateNewProject --> Start (Nothing)"; // newProject(); // qDebug() << "TimeLine::updateNewProject --> End"); } void TimeLine::updateOpenProject() { qDebug() << "TimeLine::updateOpenProject --> Start (Nothing)"; // openProject(); // qDebug() << "TimeLine::updateOpenProject --> End"); } void TimeLine::updatePlaySound(int) {} void TimeLine::updateMixMode(int) {} void TimeLine::updateMixCount(int) {} void TimeLine::updateLiveViewFps(int) {} void TimeLine::updateVideoFps(int) {} /************************************************************************** * Scene notification functions **************************************************************************/ void TimeLine::updateAddScene(int sceneIndex) { qDebug() << "TimeLine::updateAddScene --> Start"; this->newScene(sceneIndex); qDebug() << "TimeLine::updateAddScene --> End"; } void TimeLine::updateInsertScene(int sceneIndex) { qDebug() << "TimeLine::updateInsertScene --> Start"; this->newScene(sceneIndex); qDebug() << "TimeLine::updateInsertScene --> End"; } void TimeLine::updateActivateScene() { qDebug() << "TimeLine::updateActivateScene --> Start"; this->activateScene(); qDebug() << "TimeLine::updateActivateScene --> End"; } void TimeLine::updateRemoveScene(int sceneIndex) { qDebug() << "TimeLine::updateRemoveScene --> Start"; if (sceneIndex > activeSceneIndex) { // Nothing to do qDebug() << "TimeLine::updateRemoveScene --> End (Nothing)"; return; } if (sceneIndex < activeSceneIndex) { activeSceneIndex--; Q_ASSERT(-1 < activeSceneIndex); qDebug() << "TimeLine::updateRemoveScene --> End (Increment)"; return; } // Active scene removed this->clear(); this->activateScene(); this->activateTake(); this->activateExposure(); qDebug() << "TimeLine::updateRemoveScene --> End (Delete)"; } void TimeLine::updateMoveScene(int sceneNumber, int movePosition) { qDebug() << "TimeLine::updateMoveScene --> Start"; this->moveScene(sceneNumber, movePosition); qDebug() << "TimeLine::updateMoveScene --> End"; } /************************************************************************** * Take notification functions **************************************************************************/ void TimeLine::updateAddTake(int sceneIndex, int takeIndex) { qDebug() << "TimeLine::updateNewTake --> Start"; this->newTake(sceneIndex, takeIndex); qDebug() << "TimeLine::updateNewTake --> End"; } void TimeLine::updateInsertTake(int sceneIndex, int takeIndex) { qDebug() << "TimeLine::updateNewTake --> Start"; this->newTake(sceneIndex, takeIndex); qDebug() << "TimeLine::updateNewTake --> End"; } void TimeLine::updateActivateTake() { qDebug() << "TimeLine::updateActivateTake --> Start"; this->activateTake(); qDebug() << "TimeLine::updateActivateTake --> End"; } void TimeLine::updateRemoveTake(int sceneIndex, int takeIndex) { qDebug() << "TimeLine::updateRemoveTake --> Start"; if (sceneIndex != activeSceneIndex) { // Nothing to do qDebug() << "TimeLine::updateRemoveTake --> End (Nothing)"; return; } if (takeIndex > activeTakeIndex) { // Nothin to do qDebug() << "TimeLine::updateRemoveTake --> End (Nothing)"; return; } if (takeIndex < activeTakeIndex) { activeTakeIndex--; Q_ASSERT(-1 < activeTakeIndex); qDebug() << "TimeLine::updateRemoveTake --> End (Increment)"; return; } // Remove actual take this->clear(); this->activateScene(); this->activateTake(); this->activateExposure(); qDebug() << "TimeLine::updateRemoveTake --> End (Delete)"; } /************************************************************************** * Exposure notification functions **************************************************************************/ void TimeLine::updateAddExposure(int sceneIndex, int takeIndex, int exposureIndex) { // qDebug() << "TimeLine::updateAddExposure --> Start"; this->newExposure(sceneIndex, takeIndex, exposureIndex); // qDebug() << "TimeLine::updateAddExposure --> End"; } void TimeLine::updateInsertExposure(int sceneIndex, int takeIndex, int exposureIndex) { qDebug() << "TimeLine::updateInsertExposure --> Start"; this->newExposure(sceneIndex, takeIndex, exposureIndex); qDebug() << "TimeLine::updateInsertExposure --> End"; } void TimeLine::updateRemoveExposure(int sceneIndex, int takeIndex, int exposureIndex) { qDebug() << "TimeLine::updateRemoveExposure --> Start"; removeExposure(sceneIndex, takeIndex, exposureIndex); qDebug() << "TimeLine::updateRemoveExposure --> End"; } void TimeLine::updateMoveExposures(int fromFrame, int toFrame, int movePosition) { qDebug() << "TimeLine::updateMoveExposures --> Start"; moveExposures(fromFrame, toFrame, movePosition); qDebug() << "TimeLine::updateMoveExposures --> End"; } void TimeLine::updateActivateExposure() { qDebug() << "TimeLine::updateActivateExposure --> Start"; activateExposure(); qDebug() << "TimeLine::updateActivateExposure --> End"; } void TimeLine::updateModifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex) { qDebug() << "TimeLine::updateModifyExposure --> Start"; modifyExposure(modSceneIndex, modTakeIndex, modExposureIndex); qDebug() << "TimeLine::updateModifyExposure --> End"; } /************************************************************************** * Other functions **************************************************************************/ void TimeLine::moveThumbView(int fromPosition, int toPosition) { qDebug() << "TimeLine::moveThumbView --> Start"; ThumbView *f = thumbViews[fromPosition]; f->setThumbIndex(toPosition - 1); f->setSelected(false); thumbViews.erase(thumbViews.begin() + fromPosition); thumbViews.insert(thumbViews.begin() + toPosition, f); qDebug() << "TimeLine::moveThumbView --> End"; } void TimeLine::setSelecting(bool selecting) { qDebug() << "TimeLine::setSelecting --> Start"; this->selecting = selecting; qDebug() << "TimeLine::setSelecting --> End"; } bool TimeLine::isSelecting() const { return selecting; } int TimeLine::getSelectionFrame() const { return selectionFrame; } void TimeLine::frameSoundsChanged() { qDebug() << "TimeLine::frameSoundsChanged --> Start"; int activeFrame = frontend->getProject()->getActiveExposureIndex(); int activeThumb = activeFrame + frontend->getProject()->getActiveSceneIndex() + 1; Exposure *exposure = frontend->getProject()->getActiveExposure(); if (!exposure->isEmpty()) { // if (exposure->getNumberOfSounds() > 0) { thumbViews[activeThumb]->setHasSounds(true); // } else { // thumbViews[activeThumb]->setHasSounds(false); // } } qDebug() << "TimeLine::frameSoundsChanged --> End"; } /************************************************************************** * Private animation functions **************************************************************************/ /************************************************************************** * Private scene functions **************************************************************************/ void TimeLine::newScene(int sceneIndex) { qDebug() << "TimeLine::newScene --> Start"; qDebug() << "TimeLine::newScene --> Adding new scene thumb to timeline"; if (sceneIndex > activeSceneIndex) { // New Scene is inserted after the active scene --> Nothing to do qDebug() << "TimeLine::newScene --> End (Nothing)"; return; } activeSceneIndex++; qDebug() << "TimeLine::newScene --> End"; } void TimeLine::moveScene(int sceneNumber, int movePosition) { qDebug() << "TimeLine::moveScene --> Start"; if (thumbViews.size() <= 0) { qDebug() << "TimeLine::moveScene --> End (nothing to do)"; return; } if (movePosition < sceneNumber) { for (int i = movePosition; i < sceneNumber; ++i) { thumbViews[i]->move(thumbViews[i]->x() + (FRAME_WIDTH + SPACE), 0); thumbViews[i]->setThumbIndex(thumbViews[i]->getThumbIndex() + 1); } } else { for (int i = sceneNumber + 1; i <= movePosition; ++i) { thumbViews[i]->move(thumbViews[i]->x() - (FRAME_WIDTH + SPACE), 0); thumbViews[i]->setThumbIndex(thumbViews[i]->getThumbIndex() - 1); } } ThumbView *const tv = thumbViews[sceneNumber]; tv->move(tv->x() - (FRAME_WIDTH + SPACE) *(sceneNumber - movePosition), 0); tv->setThumbIndex(movePosition); thumbViews.erase(thumbViews.begin() + sceneNumber); thumbViews.insert(thumbViews.begin() + movePosition, tv); qDebug() << "TimeLine::moveScene --> End"; } void TimeLine::activateScene() { qDebug() << "TimeLine::activateScene --> Start"; int newActiveScene = frontend->getProject()->getActiveSceneIndex(); if (newActiveScene == activeSceneIndex) { // Nothing to do qDebug() << "TimeLine::activateScene --> End (Nothing)"; return; } if (0 <= activeTakeIndex) { this->removeAllExposures(); activeTakeIndex = -1; } activeSceneIndex = newActiveScene; qDebug() << "TimeLine::activateScene --> End"; } /************************************************************************** * Private take functions **************************************************************************/ void TimeLine::newTake(int sceneIndex, int takeIndex) { qDebug() << "TimeLine::newTake --> Start"; if (sceneIndex != activeSceneIndex) { // Not the active scene --> Nothing to do qDebug() << "TimeLine::newTake --> End (Nothing)"; return; } if (takeIndex > activeTakeIndex) { // New take is inserted after the activ take --> Nothing to do qDebug() << "TimeLine::newTake --> End (Nothing)"; return; } activeTakeIndex++; qDebug() << "TimeLine::newTake --> End"; } void TimeLine::activateTake() { qDebug() << "TimeLine::activateTake --> Start"; if (activeSceneIndex < 0) { // Nothing to do return; } int newActiveTake = frontend->getProject()->getActiveTakeIndex(); if (newActiveTake == activeTakeIndex) { // Nothing to do return; } if (activeTakeIndex >= 0) { this->removeAllExposures(); // thumbViews[activeTakeIndex]->setOpened(false); } activeTakeIndex = newActiveTake; if (activeTakeIndex >= 0) { // thumbViews[activeTakeIndex]->setOpened(true); Take *take = frontend->getProject()->getTake(activeSceneIndex, activeTakeIndex); if (take->getExposureSize() > 0) { QVector allExposures; take->getExposures(allExposures); this->addExposures(allExposures, 0); // activateExposure(); } } ensureVisible((FRAME_WIDTH + SPACE) * thumbViews.size() + FRAME_WIDTH, FRAME_HEIGHT); qDebug() << "TimeLine::activateTake --> End"; } /************************************************************************** * Private exposure functions **************************************************************************/ void TimeLine::newExposure(int sceneIndex, int takeIndex, int newExposureIndex) { // qDebug() << "TimeLine::newExposure --> Start"; Q_ASSERT(newExposureIndex >= 0); if (activeTakeIndex < 0) { // No active take in the timeline // qDebug() << "TimeLine::newExposure --> End (nothing)"; return; } Q_ASSERT(sceneIndex == activeSceneIndex); // Response to new sceneIndex not implemented Q_ASSERT(takeIndex == activeTakeIndex); // Response to new takeIndex not implemented ExposureThumbView *thumb = 0; Exposure *exposure = frontend->getProject()->getExposure(activeSceneIndex, activeTakeIndex, newExposureIndex); thumb = new ExposureThumbView(this, this, newExposureIndex); thumb->setMinimumSize(FRAME_WIDTH, FRAME_HEIGHT); thumb->setMaximumSize(FRAME_WIDTH, FRAME_HEIGHT); thumb->setScaledContents(true); thumb->setPixmap(QPixmap::fromImage(tryReadImage(exposure->getImagePath()).scaled(FRAME_WIDTH, FRAME_HEIGHT))); thumb->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); thumb->setParent(mainWidget); thumb->move((FRAME_WIDTH + SPACE) *newExposureIndex, 0); thumb->show(); // Sets the note icon on the respective frames. // if (exposure->getNumberOfSounds() > 0) { thumb->setHasSounds(true); // } thumbViews.insert(newExposureIndex, thumb); // Move all tumbs after the new tumb for (int thumbIndex = newExposureIndex + 1; thumbIndex < thumbViews.count(); thumbIndex++) { thumb = (ExposureThumbView*)thumbViews[thumbIndex]; thumb->setThumbIndex(thumbIndex); thumb->move((FRAME_WIDTH + SPACE) *thumbIndex, 0); thumb->show(); } mainWidget->resize((FRAME_WIDTH + SPACE) * thumbViews.size() - SPACE, FRAME_HEIGHT); if (newExposureIndex <= activeExposureIndex) { activeExposureIndex++; selectionFrame++; } // qDebug() << "TimeLine::newExposure --> End"; } void TimeLine::addExposures(const QVector& exposures, int index) { qDebug() << "TimeLine::addExposures --> Start"; int size = thumbViews.size(); int exposureSize = exposures.size(); int from = index; int to = size; int moveDistance = exposureSize - 1; if (exposureSize) // Move the frames behind the place we are inserting the new ones. for (int i = from; i < size; ++i) { qDebug() << "TimeLine::addExposures --> move frame"; thumbViews[i]->move(thumbViews[i]->x() + (FRAME_WIDTH + SPACE) * exposureSize, 0); if (i < to) { thumbViews[i]->setThumbIndex(i + moveDistance); } } ThumbView *thumb = 0; bool operationCanceled = false; int exposureIndex = 0; frontend->showProgress(tr("Load images to time line"), exposureSize); // Adds the new frames to the timeline for (; exposureIndex < exposureSize; ++exposureIndex) { qDebug() << "TimeLine::addExposures --> add frame"; Exposure *exposure = exposures[exposureIndex]; thumb = new ExposureThumbView(this, this, index + exposureIndex); thumb->setMinimumSize(FRAME_WIDTH, FRAME_HEIGHT); thumb->setMaximumSize(FRAME_WIDTH, FRAME_HEIGHT); thumb->setScaledContents(true); thumb->setPixmap(QPixmap::fromImage(tryReadImage(exposure->getImagePath()).scaled(FRAME_WIDTH, FRAME_HEIGHT))); thumb->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); thumb->setParent(mainWidget); thumb->move((FRAME_WIDTH + SPACE) *(index + exposureIndex), 0); thumb->show(); // Sets the note icon on the respective frames. // if (exposure->getNumberOfSounds() > 0) { thumb->setHasSounds(true); // } thumbViews.insert(index + exposureIndex, thumb); frontend->updateProgress(exposureIndex); if ((exposureIndex % 10) == 0) { frontend->processEvents(); } if (frontend->isOperationAborted()) { operationCanceled = true; break; } } frontend->hideProgress(); if (operationCanceled) { for (int j = index + exposureIndex, k = index; j < exposureIndex + size; ++j, ++k) { qDebug() << "TimeLine::addExposures --> move frame back"; thumbViews[j]->move(thumbViews[j]->x() - exposureSize * (FRAME_WIDTH + SPACE), 0); thumbViews[j]->setThumbIndex(k); } for (int j = index; j <= index + exposureIndex; ++j) { qDebug() << "TimeLine::addExposures --> delete frame"; delete thumbViews[index]; } thumbViews.erase(thumbViews.begin() + index, thumbViews.begin() + index + exposureIndex); } else { mainWidget->resize((FRAME_WIDTH + SPACE) * thumbViews.size() - SPACE, FRAME_HEIGHT); } qDebug() << "TimeLine::addExposures --> End"; } void TimeLine::removeExposure(int sceneIndex, int takeIndex, int exposureIndex) { qDebug() << "TimeLine::removeExposure --> Start"; if (this->activeSceneIndex != sceneIndex) { qDebug() << "TimeLine::removeExposure --> End (Nothing)"; return; } // The timeline is in the right scene if (this->activeTakeIndex != takeIndex) { qDebug() << "TimeLine::removeExposure --> End (Nothing)"; return; } // The timeline is in the right take int fromExposure = exposureIndex + 1; int numExposures = thumbViews.size(); // The exposure to be deleted are between other exposures if (fromExposure < numExposures) { // Move all exposures behind the deleted exposure forward. // int stop = numExposures - frontend->getProject()->getSceneSize() + 1; for (int k = fromExposure; k < numExposures; ++k) { thumbViews[k]->move(thumbViews[k]->x() - (FRAME_WIDTH + SPACE), 0); thumbViews[k]->setThumbIndex(k - 1); } } delete thumbViews[exposureIndex]; thumbViews.remove(exposureIndex); mainWidget->resize((FRAME_WIDTH + SPACE) * thumbViews.size(), FRAME_HEIGHT); // int newExposureIndex = activeExposureIndex; if (exposureIndex < activeExposureIndex) { activeExposureIndex--; } else { if (activeExposureIndex == thumbViews.size()) { activeExposureIndex--; } } if (-1 < activeExposureIndex) { thumbViews[activeExposureIndex]->setSelected(true); } qDebug() << "TimeLine::removeExposure --> End"; } void TimeLine::removeAllExposures() { qDebug() << "TimeLine::removeAllExposures --> Start"; int tumbSize = thumbViews.size(); for (int tumbIndex = tumbSize-1; tumbIndex >= 0; tumbIndex--) { delete thumbViews[tumbIndex]; thumbViews.remove(tumbIndex); } mainWidget->resize((FRAME_WIDTH + SPACE) * thumbViews.size(), FRAME_HEIGHT); activeExposureIndex = -1; qDebug() << "TimeLine::removeAllExposures --> End"; } void TimeLine::moveExposures(int fromFrame, int toFrame, int movePosition) { qDebug() << "TimeLine::moveExposures --> Start"; fromFrame += 1; toFrame += 1; movePosition += 1; if (movePosition < fromFrame) { for (int i = movePosition; i < fromFrame; ++i) { thumbViews[i]->move(thumbViews[i]->x() + (FRAME_WIDTH + SPACE) *(toFrame - fromFrame + 1), 0); thumbViews[i]->setThumbIndex(i + (toFrame - fromFrame)); } for (int j = fromFrame; j <= toFrame; ++j) { thumbViews[j]->move(thumbViews[j]->x() - (FRAME_WIDTH + SPACE) *(fromFrame - movePosition), 0); moveThumbView(j, j - (fromFrame - movePosition)); } } else if (movePosition > fromFrame) { for (int i = toFrame + 1; i <= movePosition; ++i) { thumbViews[i]->move(thumbViews[i]->x() - (FRAME_WIDTH + SPACE) *(toFrame - fromFrame + 1), 0); thumbViews[i]->setThumbIndex(i - (toFrame - fromFrame + 2)); } for (int j = fromFrame, k = toFrame; j <= toFrame; ++j, --k) { thumbViews[k]->move(thumbViews[k]->x() + (FRAME_WIDTH + SPACE) *(movePosition - toFrame), 0); moveThumbView(k, k + (movePosition - toFrame)); } } qDebug() << "TimeLine::moveExposures --> End"; } void TimeLine::activateExposure() { qDebug() << "TimeLine::activateExposure --> Start"; if (activeSceneIndex < 0) { // Nothing to do return; } if (activeTakeIndex < 0) { // Nothing to do return; } int newActiveExposure = frontend->getProject()->getActiveExposureIndex(); if (newActiveExposure == activeExposureIndex) { // Nothing to do return; } if (activeExposureIndex < thumbViews.size()) { if (activeExposureIndex >= 0) { thumbViews[activeExposureIndex]->setSelected(false); } } activeExposureIndex = newActiveExposure; if (activeExposureIndex > -1) { thumbViews[activeExposureIndex]->setSelected(true); int activeExposureX = activeExposureIndex * (FRAME_WIDTH + SPACE); if (this->width() < (activeExposureX + SPACE + FRAME_WIDTH)) { activeExposureX += SPACE + FRAME_WIDTH; } ensureVisible(activeExposureX, FRAME_HEIGHT); } selectionFrame = activeExposureIndex; this->selecting = false; qDebug() << "TimeLine::activateExposure --> End"; } void TimeLine::modifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex) { qDebug() << "TimeLine::modifyExposure --> Start"; if (activeSceneIndex != modSceneIndex) { // The scene of the modifyed exposure is not displayed in the frame view qDebug() << "TimeLine::modifyExposure --> End (Nothing)"; return; } if (activeTakeIndex != modTakeIndex) { // The take of the modifyed exposure is not displayed in the frame view qDebug() << "TimeLine::modifyExposure --> End (Nothing)"; return; } Exposure *exposure = frontend->getProject()->getExposure(activeSceneIndex, activeTakeIndex, modExposureIndex); thumbViews[modExposureIndex]->setPixmap(QPixmap::fromImage(tryReadImage(exposure->getImagePath()).scaled(FRAME_WIDTH, FRAME_HEIGHT))); qDebug() << "TimeLine::modifyExposure --> End"; } /************************************************************************** * Other private functions **************************************************************************/ int TimeLine::getMovingScene() const { return movingScene; } void TimeLine::setMovingScene(int movingScene) { this->movingScene = movingScene; } void TimeLine::dragEnterEvent(QDragEnterEvent *event) { qDebug() << "TimeLine::dragEnterEvent --> Start"; if (event->mimeData()->hasUrls()) { event->accept(); } else { event->ignore(); } qDebug() << "TimeLine::dragEnterEvent --> End"; } void TimeLine::dropEvent(QDropEvent *event) { qDebug() << "TimeLine::dropEvent --> Start"; scrollTimer->stop(); scrollDirection = 0; int index = (event->pos().x() + -mainWidget->pos().x()) / (FRAME_WIDTH + SPACE); if (index < static_cast(thumbViews.size())) { thumbViews[index]->contentsDropped(event); } qDebug() << "TimeLine::dropEvent --> End"; } void TimeLine::dragMoveEvent(QDragMoveEvent *event) { qDebug() << "TimeLine::dragMoveEvent --> Start"; int dragPosX = event->pos().x(); int dragPosY = event->pos().y(); if (dragPosX < lowerScrollAreaX || dragPosX > upperScrollAreaX) { if (!scrollTimer->isActive()) { scrollDirection = dragPosX < lowerScrollAreaX ? -1 : 1; scrollTimer->start(50); } // Increase speed else if (dragPosX < lowerAccelScrollAreaX || dragPosX > upperAccelScrollAreaX) { scrollTimer->setInterval(25); } // Decrease speed else { scrollTimer->setInterval(50); } } else { scrollTimer->stop(); scrollDirection = 0; } // Stop scrolling if we're dragging outside timeline bool outsideHorizontal = dragPosX < minScrollAreaX || dragPosX > maxScrollAreaX; bool outsideVertical = dragPosY < minScrollAreaY || dragPosY > maxScrollAreaY; if (outsideHorizontal || outsideVertical) { scrollTimer->stop(); scrollDirection = 0; } qDebug() << "TimeLine::dragMoveEvent --> End"; } void TimeLine::resizeEvent(QResizeEvent *event) { qDebug() << "TimeLine::resizeEvent --> Start"; lowerScrollAreaX = this->x() + FRAME_WIDTH; upperScrollAreaX = this->width() - FRAME_WIDTH; lowerAccelScrollAreaX = lowerScrollAreaX - (FRAME_WIDTH >> 1); upperAccelScrollAreaX = upperScrollAreaX + (FRAME_WIDTH >> 1); minScrollAreaX = lowerScrollAreaX - FRAME_WIDTH + 20; maxScrollAreaX = upperScrollAreaX + FRAME_WIDTH - 20; minScrollAreaY = this->y() + 20; maxScrollAreaY = this->y() + FRAME_HEIGHT - 20; QScrollArea::resizeEvent(event); qDebug() << "TimeLine::resizeEvent --> End"; } void TimeLine::scroll() { if (scrollDirection == -1) { scrollBar->setSliderPosition(scrollBar->sliderPosition() - 15); } else if (scrollDirection == 1) { scrollBar->setSliderPosition(scrollBar->sliderPosition() + 15); } } int TimeLine::getFrameWidth() const { return FRAME_WIDTH; } int TimeLine::getFrameHeight() const { return FRAME_HEIGHT; } int TimeLine::getSpace() const { return SPACE; } void TimeLine::clear() { qDebug() << "TimeLine::clear --> Start"; clearTake(); qDebug() << "TimeLine::clear --> End"; } void TimeLine::clearTake() { qDebug() << "TimeLine::clearTake --> Start"; int size = thumbViews.size(); for (int i = 0; i < size; ++i) { delete thumbViews[i]; } thumbViews.clear(); activeExposureIndex = -1; activeTakeIndex = -1; activeSceneIndex = -1; qDebug() << "TimeLine::clearTake --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/toolbar.h000644 000000 000000 00000013037 12751646113 024130 0ustar00rootroot000000 000000 /*************************************************************************** * Copyright (C) 2010-2016 by Ralf Lange * * ralf.lange@longsoft.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TOOLBAR_H #define TOOLBAR_H #include // #include #include #include #include #include #include #include "frontends/frontend.h" /** * The tool bar on the button of the preview window * @author Ralf Lange */ class ToolBar : public QWidget { Q_OBJECT public: enum toolBarFunction { toolBarNothing, toolBarCameraOff, toolBarCameraOn, toolBarPlaying, toolBarPause }; /** * Sets up the tab. * @param parent the parent of the this widget */ ToolBar(Frontend *f, QWidget *parent = 0); /** * Retranslate all GUI strings */ void retranslateStrings(); /** * Initializes the table and fills it with starting values. */ void initialize(); /** * Applies the settings in the import tab. */ void apply(); /** * Get the capture button of the tool bar * @return The capture button */ QPushButton* getCaptureButton(); /** * Set an new state to the tool bar. * @param newState The new tool bar state. */ void setActualState(int newState); /** * Get the overlay intensity value. * @return The overlay intensity value. */ int getOverlayIntensity(); /** * Set the overlay intensity value. * @param newOverlay The new overlay intensity value. */ void setOverlayIntensity(int newOverlay); /** * This function is called when the size of the model changes so that menuframe * menu options can be adjusted (activated/deactivated, etc). */ void toolBarStateChanged(); protected: // void resizeEvent(QResizeEvent *event); public slots: /** * Starts the animation if it isn't playing and stops it if it is. * * This function is provided for ease of use with keyaccelerators. */ void toggleRunning(); /** * Runs the animation as a sequence of pictures triggered by a timer */ void runAnimation(); /** * Stops the running of the animation. */ void stopAnimation(); /** * Freezes the running of the animation. */ void pauseAnimation(); /** * Selects the first scene. */ void selectFirstScene(); /** * Selects the previous scene. */ void selectPreviousScene(); /** * Selects the first take. */ void selectFirstTake(); /** * Selects the previous take. */ void selectPreviousTake(); /** * Selects the first frame in the take. */ void selectFirstFrame(); /** * Selects the previous frame. */ void selectPreviousFrame(); /** * Selects the next frame. */ void selectNextFrame(); /** * Selects the last frame in the take. */ void selectLastFrame(); /** * Selects the next scene. */ void selectNextTake(); /** * Selects the last scene. */ void selectLastTake(); /** * Selects the next scene. */ void selectNextScene(); /** * Selects the last scene. */ void selectLastScene(); /** * Toggles between looping the animation when it is running and closing it * when it reaches the end. */ void toggleLooping(); /** * Overlay slider has changed his value. */ void overlaySliderChanged(int value); /** * Slot for playing the next frame. This slot is triggered by the timer. */ void playNextFrame(); private: Frontend *frontend; QTimer *runAnimationTimer; int actualState; QLabel *framesIcon; QSlider *overlaySlider; QLabel *cameraIcon; QPushButton *toBeginButton; QPushButton *previousFrameButton; QPushButton *captureButton; QPushButton *playButton; QPushButton *nextFrameButton; QPushButton *toEndButton; int fps; int exposureCount; bool isLooping; int exposureIndex; void makeGUI(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/tooltabs/recordingtab.cpp000644 000000 000000 00000075515 12654352322 027322 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "recordingtab.h" #include #include #include #include #include "technical/grabber/imagegrabber.h" RecordingTab::RecordingTab(Frontend *f, ToolBar *tb, QWidget *parent) : QWidget(parent) { frontend = f; toolBar = tb; cameraOn = false; cameraTimer = NULL; recordingGroupBox = 0; recordingModeCombo = 0; cameraGroupBox = 0; videoSourceLabel = 0; videoSourceCombo = 0; resolutionLabel = 0; resolutionCombo = 0; cameraButton = 0; captureGroupBox = 0; mixModeCombo = 0; mixCountSliderCaption = 0; mixCountSlider = 0; // autoGroupBox = 0; // unitModeCombo = 0; mixAccel = 0; diffAccel = 0; playbackAccel = 0; this->setObjectName("RecordingTab"); PreferencesTool *pref = frontend->getPreferences(); if (pref->getIntegerPreference("preferences", "capturebutton", captureFunction) == false) { captureFunction = PreferencesTool::captureButtonAfter; } cameraTimer = new QTimer(this); cameraTimer->setSingleShot(true); QObject::connect(cameraTimer, SIGNAL(timeout()), this, SLOT(storeFrame())); makeGUI(); retranslateStrings(); createAccelerators(); } RecordingTab::~RecordingTab() { if (cameraTimer != NULL) { delete cameraTimer; } } void RecordingTab::makeGUI() { QString iconFile(frontend->getIconsDirName()); QVBoxLayout *tabLayout = new QVBoxLayout; QVector deviceNames = frontend->getDeviceNames(); int deviceSize = deviceNames.size(); // ======================================================================== // Recording group box recordingGroupBox = new QGroupBox("recordingGroupBox"); // recordingGroupBox->setFlat(true); recordingModeCombo = new QComboBox(); recordingModeCombo->setFocusPolicy(Qt::NoFocus); connect(recordingModeCombo, SIGNAL(activated(int)), this, SLOT(changeRecordingMode(int))); QVBoxLayout *recordingLayout = new QVBoxLayout; recordingLayout->setMargin(4); // recordingLayout->setSpacing(2); // recordingLayout->addStretch(1); recordingLayout->addWidget(recordingModeCombo); recordingLayout->addStretch(10); recordingGroupBox->setLayout(recordingLayout); // ======================================================================== // Camera group box cameraGroupBox = new QGroupBox("cameraGroupBox"); // cameraGroupBox->setFlat(true); videoSourceLabel = new QLabel("videoSourceLabel"); videoSourceCombo = new QComboBox(); videoSourceCombo->setFocusPolicy(Qt::NoFocus); connect(videoSourceCombo, SIGNAL(activated(int)), this, SLOT(changeVideoSource(int))); for (int deviceIndex = 0 ; deviceIndex < deviceSize ; deviceIndex++) { videoSourceCombo->addItem(deviceNames[deviceIndex].toLatin1()); } resolutionLabel = new QLabel("resolutionLabel"); resolutionCombo = new QComboBox(); connect(resolutionCombo, SIGNAL(activated(int)), this, SLOT(changeResolution(int))); // resolutionLabel->hide(); // resolutionCombo->hide(); cameraButton = new QPushButton; iconFile.append(QLatin1String("cameraon.png")); cameraButton->setIcon(QPixmap(iconFile)); // cameraButton->setFlat(true); cameraButton->setFocusPolicy(Qt::NoFocus); connect(cameraButton, SIGNAL(clicked()), this, SLOT(cameraButtonClicked())); // cameraButton->setEnabled(false); QVBoxLayout *cameraLayout = new QVBoxLayout; cameraLayout->setMargin(4); // cameraLayout->setSpacing(2); // cameraLayout->addStretch(1); cameraLayout->addWidget(videoSourceLabel); cameraLayout->addWidget(videoSourceCombo); cameraLayout->addWidget(resolutionLabel); cameraLayout->addWidget(resolutionCombo); cameraLayout->addWidget(cameraButton); cameraLayout->addStretch(10); cameraGroupBox->setLayout(cameraLayout); // ======================================================================== // Capture group box captureGroupBox = new QGroupBox("captureGroupBox"); // secondGroupBox->setFlat(true); mixModeCombo = new QComboBox(); mixModeCombo->setFocusPolicy(Qt::NoFocus); connect(mixModeCombo, SIGNAL(activated(int)), this, SLOT(changeMixMode(int))); mixCountSliderCaption = new QLabel(); mixCountSlider = new QSlider(Qt::Horizontal); mixCountSlider->setMinimum(0); mixCountSlider->setMaximum(5); mixCountSlider->setPageStep(1); mixCountSlider->setValue(2); mixCountSlider->setTickPosition(QSlider::TicksBelow); mixCountSlider->setFocusPolicy(Qt::NoFocus); connect(mixCountSlider, SIGNAL(valueChanged(int)), this, SLOT(changeMixCount(int))); QVBoxLayout *captureLayout = new QVBoxLayout; captureLayout->setMargin(4); // captureLayout->setSpacing(2); // captureLayout->addStretch(1); captureLayout->addWidget(mixModeCombo); captureLayout->addWidget(mixCountSliderCaption); captureLayout->addWidget(mixCountSlider); captureLayout->addStretch(10); captureGroupBox->setLayout(captureLayout); captureGroupBox->hide(); /* ======================================================================== // Auto group box autoGroupBox = new QGroupBox("autoGroupBox"); autoGroupBox->setFlat(true); unitModeChooseCombo = new QComboBox(); unitModeChooseCombo->setFocusPolicy(Qt::NoFocus); unitModeChooseCombo->setEnabled(false); connect(unitModeChooseCombo, SIGNAL(activated(int)), this, SLOT(changeUnitMode(int))); QVBoxLayout *autoLayout = new QVBoxLayout; autoLayout->setMargin(4); autoLayout->setSpacing(2); autoLayout->addStretch(1); autoLayout->addWidget(unitModeChooseCombo); */ // ======================================================================== // Tab layout tabLayout->setMargin(0); tabLayout->setSpacing(2); // tabLayout->addStretch(1); tabLayout->addWidget(recordingGroupBox); tabLayout->addWidget(cameraGroupBox); tabLayout->addWidget(captureGroupBox); // tabLayout->addWidget(autoGroupBox); tabLayout->addStretch(1); setLayout(tabLayout); connect(toolBar->getCaptureButton(), SIGNAL(clicked()), this, SLOT(captureFrame())); } void RecordingTab::retranslateStrings() { recordingGroupBox->setTitle(tr("Recording")); recordingModeCombo->clear(); recordingModeCombo->addItem(tr("Single frame capture")); // recordingModeCombo->addItem(tr("Automated recording")); cameraGroupBox->setTitle(tr("Camera")); videoSourceLabel->setText(tr("Video Source:")); resolutionLabel->setText(tr("Resolution:")); captureGroupBox->setTitle(tr("Capture")); mixModeCombo->clear(); mixModeCombo->addItem(tr("Mix")); mixModeCombo->addItem(tr("Diff")); mixModeCombo->addItem(tr("Playback")); /* autoGroupBox->setTitle(tr("Auto")); unitModeCombo->clear(); unitModeCombo->addItem(""); unitModeCombo->addItem(tr("Pr sec")); unitModeCombo->addItem(tr("Pr min")); unitModeCombo->addItem(tr("Pr hr")); unitModeCombo->setCurrentIndex(0); */ QString infoText = tr("

Toggle camera on/off (C)

" "

Click this button to toggle the camera on and off

"); cameraButton->setToolTip(infoText); cameraButton->setWhatsThis(infoText); mixCountSliderCaption->setText(tr("Number of images:")); infoText = tr("

Number of images

" "

By changing the value in this slidebar you can specify how many images " "backwards in the animation which should be mixed on top of the camera or " "if you are in playback mode: how many images to play.

" "

By mixing the previous image(s) onto the camera you can more easily see " "how the next shot will be in relation to the other, therby making a smoother " "stop motion animation!

"); mixCountSliderCaption->setWhatsThis(infoText); mixCountSlider->setWhatsThis(infoText); } void RecordingTab::initialize() { qDebug() << "RecordingTab::initialize --> Start"; /* int videoSource = frontend->getProject()->getAnimationProject()->getVideoSource(); this->videoSourceCombo->setCurrentIndex(videoSource); for (index = 0; index < grabberController->getResolutions().size(); index++) { resolution = grabberController->getResolutions().at(index); resolutionComboBox->addItem(QString("%1%2%3") .arg(resolution.getWidth()) .arg(QLatin1String(" x ")) .arg(resolution.getHeight())); } if (preferences->getIntegerPreference(deviceId, "resolutionwidth", width) == true) { if (preferences->getIntegerPreference(deviceId, "resolutionheight", height) == false) { // Internal problem qDebug() << "CameraControllerDialog::initialize --> Resolution height not found!"; } // Search resolution in the list of possible resolutions for (index = 0; index < grabberController->getResolutions().size(); index++) { resolution = grabberController->getResolutions().at(index); if ((resolution.getWidth() == width) && (resolution.getHeight() == height)) { resolutionIndex = index; break; } } } if (-1 == resolutionIndex) { // No predifined resolution - Use the maximum possible resolution for (index = 0; index < grabberController->getResolutions().size(); index++) { resolution = grabberController->getResolutions().at(index); if (resolution.getWidth() < (unsigned int)width) { continue; } if (resolution.getWidth() > (unsigned int)width) { width = resolution.getWidth(); height = resolution.getHeight(); resolutionIndex = index; continue; } if (resolution.getHeight() > (unsigned int)height) { height = resolution.getHeight(); resolutionIndex = index; } } } grabberController->setActiveResolution(resolutionIndex); resolutionComboBox->setCurrentIndex(resolutionIndex); int mixingMode = frontend->getProject()->getAnimationProject()->getMixingMode(); changeMixingMode(mixingMode); int unitMode = frontend->getProject()->getAnimationProject()->getUnitMode(); this->unitModeChooseCombo->setCurrentIndex(unitMode); */ qDebug() << "RecordingTab::initialize --> End"; } bool RecordingTab::isCameraOn() { return cameraOn; } void RecordingTab::checkCameraOff() { if (cameraOn) { // The camera is on --> switch off. cameraButtonClicked(); } } int RecordingTab::getRecordingMode() { return recordingModeCombo->currentIndex(); } void RecordingTab::setRecordingMode(int mode) { Q_ASSERT(mode >= 0); Q_ASSERT(mode < 1); recordingModeCombo->setCurrentIndex(mode); } int RecordingTab::getVideoSource() { return videoSourceCombo->currentIndex(); } bool RecordingTab::setVideoSource(int index) { Q_ASSERT(index >= 0); if (index >= videoSourceCombo->count()) { return false; } videoSourceCombo->setCurrentIndex(index); resolutionCombo->clear(); QVector resNames = frontend->getResolutionNames(index); int resSize = resNames.size(); if (0 < resSize) { for (int resIndex = 0 ; resIndex < resSize ; resIndex++) { resolutionCombo->addItem(resNames[resIndex]); } } else { resolutionCombo->addItem(tr("Not Supported")); } resolutionCombo->setCurrentIndex(0); return true; } int RecordingTab::getResolution() { return resolutionCombo->currentIndex(); } bool RecordingTab::setResolution(int index) { if (index < 0) { return false; } if (index >= resolutionCombo->count()) { return false; } resolutionCombo->setCurrentIndex(index); return true; } int RecordingTab::getMixMode() { return mixModeCombo->currentIndex(); } void RecordingTab::setMixMode(int mode) { Q_ASSERT(mode >= 0); Q_ASSERT(mode < 3); mixModeCombo->setCurrentIndex(mode); } int RecordingTab::getMixCount() { if (mixModeCombo->currentIndex() == 0) { return mixCountSlider->value(); } else { return frontend->getProject()->getMixCount(); } } void RecordingTab::setMixCount(int count) { Q_ASSERT(mixModeCombo->currentIndex() == 0); mixCountSlider->setValue(count); } int RecordingTab::getPlaybackCount() { if (mixModeCombo->currentIndex() == 2) { return mixCountSlider->value(); } else { return frontend->getProject()->getPlaybackCount(); } } void RecordingTab::setPlaybackCount(int count) { Q_ASSERT(mixModeCombo->currentIndex() == 2); mixCountSlider->setValue(count); } void RecordingTab::changeCaptureButtonFunction(PreferencesTool::captureButtonFunction newFunction) { // The function of the camera button is changed captureFunction = newFunction; } /* void RecordingTab::resizeEvent(QResizeEvent *event) { qDebug() << "RecordingTab::resizeEvent --> Start"); QWidget::resizeEvent(event); qDebug() << "RecordingTab::resizeEvent --> End"); } */ /* void RecordingTab::apply() { PreferencesTool *pref = PreferencesTool::get(); // Remove old preferences pref->removeAllEncoders(); // Set new preferences int numEncoders = encoderTable->rowCount(); if (numEncoders > 0) { pref->setNumberEncoders(numEncoders); pref->setActiveEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(encoderTable->currentRow())); for (int i = 0; i < numEncoders; ++i) { pref->setEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(i), encoderTable->item(i, 0)->text(), encoderTable->item(i, 1)->text(), startEncoderStrings[i], stopEncoderStrings[i], outputFiles[i]); } } else { pref->setNumberEncoders(0); pref->setActiveEncoder(QString()); } } */ void RecordingTab::setMixModeMixing() { changeMixMode(0); } void RecordingTab::setMixModeDiffing() { changeMixMode(1); } void RecordingTab::setMixModePlayback() { changeMixMode(2); } void RecordingTab::changeRecordingMode(int /*index*/) { qDebug() << "RecordingTab::changeRecordingMode --> Empty"; // qDebug() << "RecordingTab::changeRecordingMode --> End"; } void RecordingTab::changeVideoSource(int index) { qDebug() << "RecordingTab::changeSource --> Start"; frontend->getProject()->getAnimationProject()->setVideoSource(index); frontend->setVideoSource(index); qDebug() << "RecordingTab::changeSource --> End"; } void RecordingTab::changeResolution(int index) { qDebug() << "RecordingTab::changeResolution --> Start"; frontend->getProject()->getAnimationProject()->setResolution(index); frontend->setResolution(index); qDebug() << "RecordingTab::changeResolution --> End"; } /* void RecordingTab::changeResolution(int index, bool save) { qDebug() << "RecordingTab::changeResolution --> Start"; PreferencesTool *preferences = frontend->getPreferences(); long value = grabberController->getBrightnessCaps()->getMinimum() + (index * stepBrightness); long maxValue = grabberController->getBrightnessCaps()->getMaximum(); if (value > maxValue) { value = maxValue; } grabberController->setBrightness(value); if (save) { preferences->setIntegerPreference(deviceId, "brightness", index); } qDebug() << "RecordingTab::changeResolution --> End"; } */ void RecordingTab::cameraButtonClicked() { qDebug() << "RecordingTab::cameraButtonClicked --> Start"; if (cameraOn == false) { // Camera is off if (!frontend->getProject()->isActiveProject()) { // No active project frontend->showInformation(tr("Information"), tr("No active project. Please create a new project or open an existing project.")); return; } int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); if (-1 == activeSceneIndex) { // No scene selected frontend->showInformation(tr("Information"), tr("No scene and no take selected. Please select a scene and a take on the project tab.")); return; } int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); if (-1 == activeTakeIndex) { // No take selected frontend->showInformation(tr("Information"), tr("No take selected. Please select a take on the project tab.")); return; } qDebug() << "RecordingTab::cameraButtonClicked --> Start playing video from webcam"; cameraOn = frontend->startGrabber(); if (cameraOn) { videoSourceCombo->setEnabled(false); resolutionCombo->setEnabled(false); QString iconFile(frontend->getIconsDirName()); iconFile.append(QLatin1String("cameraoff.png")); cameraButton->setIcon(QIcon(iconFile)); switch (captureFunction) { // case PreferencesTool::captureButtonBevor: // break; // case PreferencesTool::captureButtonAfter: // break; case PreferencesTool::captureButtonAppend: int newExposureIndex = frontend->getProject()->getActiveTake()->getExposureSize() - 1; if (newExposureIndex != frontend->getProject()->getActiveExposureIndex()) { frontend->getProject()->selectExposureToUndo(frontend->getProject()->getActiveSceneIndex(), frontend->getProject()->getActiveTakeIndex(), newExposureIndex); } break; } } } else { // Camera is on qDebug() << "RecordingTab::cameraButtonClicked --> Stop playing video from webcam"; QString iconFile(frontend->getIconsDirName()); iconFile.append(QLatin1String("cameraon.png")); cameraButton->setIcon(QIcon(iconFile)); frontend->stopGrabber(); cameraOn = false; videoSourceCombo->setEnabled(true); resolutionCombo->setEnabled(true); } if (cameraOn) { initialize(); captureGroupBox->show(); toolBar->setActualState(ToolBar::toolBarCameraOn); } else { captureGroupBox->hide(); toolBar->setActualState(ToolBar::toolBarCameraOff); } qDebug() << "RecordingTab::cameraButtonClicked --> End"; } void RecordingTab::changeMixMode(int newMixMode) { qDebug() << "RecordingTab::changeMixMode --> Start"; frontend->getProject()->getAnimationProject()->setMixMode(newMixMode); frontend->getProject()->getView()->notifyNewMixMode(newMixMode); // mixingModeCombo->setCurrentIndex(newMixingMode); switch (newMixMode) { case 0: mixCountSliderCaption->setEnabled(true); mixCountSlider->setEnabled(true); mixCountSlider->setMaximum(5); mixCountSlider->setValue(frontend->getProject()->getAnimationProject()->getMixCount()); break; case 1: mixCountSliderCaption->setEnabled(false); mixCountSlider->setEnabled(false); mixCountSlider->setValue(1); break; case 2: mixCountSliderCaption->setEnabled(true); mixCountSlider->setEnabled(true); mixCountSlider->setMaximum(50); mixCountSlider->setValue(frontend->getProject()->getAnimationProject()->getPlaybackCount()); break; default: Q_ASSERT(newMixMode < 3); break; } qDebug() << "RecordingTab::changeMixMode --> End"; } void RecordingTab::changeMixCount(int newMixCount) { int mixMode = mixModeCombo->currentIndex(); switch (mixMode) { case 0: if (frontend->getProject()->getAnimationProject()->getMixCount() != newMixCount) { frontend->getProject()->getAnimationProject()->setMixCount(newMixCount); } break; case 1: break; case 2: if (frontend->getProject()->getAnimationProject()->getPlaybackCount() != newMixCount) { frontend->getProject()->getAnimationProject()->setPlaybackCount(newMixCount); } break; case 3: break; } frontend->getProject()->getView()->notifyNewMixCount(newMixCount); } /* void RecordingTab::changeUnitMode(int index) { qDebug() << "RecordingTab::changeUnitMode --> Start"; frontend->getProject()->getAnimationProject()->setUnitMode(index); int sliderValue = mixCountSlider->value(); if (sliderValue == 0 || index == 0) { if (autoCaptureTimer->isActive()) { autoCaptureTimer->stop(); } return; } int factor = 0; switch (index) { case 1: factor = 1000; break; case 2: factor = 60000; break; case 3: factor = 3600000; break; default: if (autoCaptureTimer->isActive()) { autoCaptureTimer->stop(); } break; } if (captureTimer->isActive() == false) { // Grab the first frame manually cameraHandler->captureFrame(); // then grab at the given interval autoCaptureTimer->start(factor / sliderValue); } else { autoCaptureTimer->setInterval(factor / sliderValue); } qDebug() << "RecordingTab::changeUnitMode --> End"; } void RecordingTab::changeFpuCount(int newFpuCount) { if (autoCaptureTimer->isActive() && newMixCount != 0) { int factor = 0; int unitMode = unitModeChooseCombo->currentIndex(); switch (unitMode) { case 1: factor = 1000; break; case 2: factor = 60000; break; case 3: factor = 3600000; break; } autoCaptureTimer->setInterval(factor / newMixCount); } int viewingMode = viewingModeChooseCombo->currentIndex(); switch (viewingMode) { case 0: frontend->getProject()->getAnimationProject()->setMixCount(newMixCount); break; case 1: break; case 2: frontend->getProject()->getAnimationProject()->setPlaybackCount(newMixCount); break; case 3: break; } frontend->getProject()->getView()->notifyNewMixCount(newMixCount); } */ void RecordingTab::createAccelerators() { /* mixAccel = new QShortcut(QKeySequence(Qt::Key_1), this); connect(mixAccel, SIGNAL(activated()), this, SLOT(setMixModeMixing())); diffAccel = new QShortcut(QKeySequence(Qt::Key_2), this); connect(diffAccel, SIGNAL(activated()), this, SLOT(setMixModeDiffing())); playbackAccel = new QShortcut(QKeySequence(Qt::Key_3), this); connect(playbackAccel, SIGNAL(activated()), this, SLOT(setMixModePlayback())); */ } void RecordingTab::captureFrame() { qDebug() << "RecordingTab::captureFrame --> Start"; toolBar->setActualState(ToolBar::toolBarNothing); // cameraTimer->start(60); storeFrame(); toolBar->setActualState(ToolBar::toolBarCameraOn); qDebug() << "RecordingTab::captureFrame --> End"; } void RecordingTab::storeFrame() { qDebug() << "RecordingTab::storeFrame --> Start"; QImage newImage = clipAndScale(frontend->getRawImage()); if (!newImage.isNull()) { int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); int activeExposureIndex = frontend->getProject()->getActiveExposureIndex(); int exposureSize = frontend->getProject()->getScene(activeSceneIndex)->getTake(activeTakeIndex)->getExposureSize(); int newExposureIndex = activeExposureIndex; switch (captureFunction) { case PreferencesTool::captureButtonBevor: if (-1 == newExposureIndex) { frontend->getProject()->addExposureToUndo(newImage, activeSceneIndex, activeTakeIndex); newExposureIndex++; } else { frontend->getProject()->insertExposureToUndo(newImage, activeSceneIndex, activeTakeIndex, activeExposureIndex); } frontend->getProject()->selectExposureToUndo(activeSceneIndex, activeTakeIndex, newExposureIndex); break; case PreferencesTool::captureButtonAfter: newExposureIndex++; if (newExposureIndex == exposureSize) { // actual exposure index is the last in the take frontend->getProject()->addExposureToUndo(newImage, activeSceneIndex, activeTakeIndex); } else { // actual exposure index is not the last in the take frontend->getProject()->insertExposureToUndo(newImage, activeSceneIndex, activeTakeIndex, newExposureIndex); } frontend->getProject()->selectExposureToUndo(activeSceneIndex, activeTakeIndex, newExposureIndex); break; case PreferencesTool::captureButtonAppend: frontend->getProject()->addExposureToUndo(newImage, activeSceneIndex, activeTakeIndex); frontend->getProject()->selectExposureToUndo(activeSceneIndex, activeTakeIndex, exposureSize); break; } }// else { // cameraTimer->start(60); // } qDebug() << "RecordingTab::storeFrame --> End"; } QImage RecordingTab::clipAndScale(QImage image) { QImage outputImage; QImage clipImage; double destWidth = 0; double destHeight = 0; double imageWidth = image.width(); double imageHeight = image.height(); double newImageWidth = 0; double newImageHeight = 0; int x = 0; int y = 0; double widthScale; double heightScale; int trans = frontend->getProject()->getImageTransformation(); switch (frontend->getProject()->getVideoSize()) { case ImageGrabber::qvgaSize: // QVGA destWidth = 320; destHeight = 240; break; case ImageGrabber::vgaSize: // VGA destWidth = 640; destHeight = 480; break; case ImageGrabber::svgaSize: // SVGA destWidth = 800; destHeight = 600; break; case ImageGrabber::paldSize: // PAL D destWidth = 704; destHeight = 576; break; case ImageGrabber::hdreadySize: // HD Ready destWidth = 1280; destHeight = 720; break; case ImageGrabber::fullhdSize: // Full HD destWidth = 1900; destHeight = 1080; break; default: // Camera image size destWidth = imageWidth; destHeight = imageHeight; break; } switch (trans) { case 0: // Scale the image to the output size widthScale = imageWidth / destWidth; heightScale = imageHeight / destHeight; if (widthScale > heightScale) { outputImage = image.scaledToWidth(destWidth); } else { outputImage = image.scaledToHeight(destHeight); } break; case 1: // Clip the image to the output size switch (frontend->getProject()->getImageAdjustment()) { case ImageGrabber::leftUp: case ImageGrabber::leftMiddle: case ImageGrabber::leftDown: x = 0; break; case ImageGrabber::centerUp: case ImageGrabber::centerMiddle: case ImageGrabber::centerDown: x = (int)((imageWidth-destWidth)/2); break; case ImageGrabber::rightUp: case ImageGrabber::rightMiddle: case ImageGrabber::rightDown: x = (int)(imageWidth-destWidth); break; } switch (frontend->getProject()->getImageAdjustment()) { case ImageGrabber::leftUp: case ImageGrabber::centerUp: case ImageGrabber::rightUp: y = 0; break; case ImageGrabber::leftMiddle: case ImageGrabber::centerMiddle: case ImageGrabber::rightMiddle: y = (int)((imageHeight-destHeight)/2); break; case ImageGrabber::leftDown: case ImageGrabber::centerDown: case ImageGrabber::rightDown: y = (int)(imageHeight-destHeight); break; } outputImage = image.copy(x, y, destWidth, destHeight); break; case 2: // Zoom the image int zoomValue = frontend->getProject()->getZoomValue(); // 1. Step: Clip the image to the output size newImageWidth = imageWidth - ((imageWidth - destWidth) * zoomValue / 100); newImageHeight = imageHeight - ((imageHeight - destHeight) * zoomValue / 100); x = (int)((imageWidth-newImageWidth)/2); y = (int)((imageHeight-newImageHeight)/2); clipImage = image.copy(x, y, newImageWidth, newImageHeight); // 2. Step: Scale up the image widthScale = newImageWidth / destWidth; heightScale = newImageHeight / destHeight; if (widthScale > heightScale) { outputImage = clipImage.scaledToWidth(destWidth); } else { outputImage = clipImage.scaledToHeight(destHeight); } break; } return outputImage; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/tooltabs/viewtab.cpp000644 000000 000000 00000017343 12654352322 026313 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "viewtab.h" #include #include #include #include #include "domain/domainfacade.h" ViewTab::ViewTab(Frontend *f, QWidget *parent) : QWidget(parent) { frontend = f; firstGroupBox = 0; firstIcon = 0; firstSlider = 0; firstButton = 0; secondGroupBox = 0; secondButton = 0; thirdGroupBox = 0; thirdButton = 0; this->setObjectName("ViewTab"); makeGUI(); } void ViewTab::makeGUI() { QString iconFile(frontend->getIconsDirName()); QVBoxLayout *tabLayout = new QVBoxLayout; firstGroupBox = new QGroupBox(QLatin1String("firstGroupBox")); // firstGroupBox->setFlat(true); firstIcon = new QLabel(); iconFile.append(QLatin1String("frames.png")); firstIcon->setPixmap(QPixmap(iconFile)); firstSlider = new QSlider(Qt::Horizontal); firstButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("tobegin.png")); firstButton->setIcon(QPixmap(iconFile)); // firstButton->setFlat(true); // firstButton->setFocusPolicy( Qt::NoFocus ); connect(firstButton, SIGNAL(clicked()), this, SLOT(firstSlot())); firstButton->setEnabled(false); QVBoxLayout *firstLayout = new QVBoxLayout; firstLayout->setMargin(4); // firstLayout->setSpacing(2); // firstLayout->addStretch(1); firstLayout->addWidget(firstIcon); firstLayout->addWidget(firstSlider); firstLayout->addStretch(10); firstLayout->addWidget(firstButton); firstLayout->addStretch(10); firstGroupBox->setLayout(firstLayout); secondGroupBox = new QGroupBox(QLatin1String("secondGroupBox")); // secondGroupBox->setFlat(true); secondButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("tobegin.png")); secondButton->setIcon(QPixmap(iconFile)); // secondButton->setFlat(true); // secondButton->setFocusPolicy( Qt::NoFocus ); connect(secondButton, SIGNAL(clicked()), this, SLOT(secondSlot())); secondButton->setEnabled(false); QVBoxLayout *secondLayout = new QVBoxLayout; secondLayout->setMargin(4); // secondLayout->setSpacing(2); // secondLayout->addStretch(1); secondLayout->addWidget(secondButton); secondLayout->addStretch(10); secondGroupBox->setLayout(secondLayout); thirdGroupBox = new QGroupBox(QLatin1String("thirdGroupBox")); // thirdGroupBox->setFlat(true); thirdButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("tobegin.png")); thirdButton->setIcon(QPixmap(iconFile)); // thirdButton->setFlat(true); // thirdButton->setFocusPolicy( Qt::NoFocus ); connect(thirdButton, SIGNAL(clicked()), this, SLOT(thirdSlot())); thirdButton->setEnabled(false); QVBoxLayout *thirdLayout = new QVBoxLayout; thirdLayout->setMargin(4); // thirdLayout->setSpacing(2); // thirdLayout->addStretch(1); thirdLayout->addWidget(thirdButton); thirdLayout->addStretch(10); thirdGroupBox->setLayout(thirdLayout); tabLayout->setMargin(0); tabLayout->setSpacing(2); // tabLayout->addStretch(1); tabLayout->addWidget(firstGroupBox); tabLayout->addWidget(secondGroupBox); tabLayout->addWidget(thirdGroupBox); tabLayout->addStretch(1); setLayout(tabLayout); } void ViewTab::retranslateStrings() { /* QString infoText = tr("

First Button

"); firstButton->setToolTip(infoText); firstButton->setWhatsThis(infoText); infoText = tr("

Second Button

"); secondButton->setToolTip(infoText); secondButton->setWhatsThis(infoText); infoText = tr("

Third Button

"); thirdButton->setToolTip(infoText); thirdButton->setWhatsThis(infoText); */ } void ViewTab::initialize() { /* PreferencesTool *pref = PreferencesTool::get(); int active = -1; int numEncoders = pref->getNumberEncoders(); encoderTable->setRowCount(numEncoders); if (numEncoders > 0 ) { QString activeId = pref->getActiveEncoder(); int idx = 0; for (int i = 0; i < numEncoders; ++i) { QString id(QString("%1%2").arg(QLatin1String("encoder")).arg(i)); QString name; QString desc; QString start; QString stop; QString filename; if ( pref->getEncoder(id, name, desc, start, stop, filename) ) { encoderTable->setItem(i, 0, new QTableWidgetItem(name) ); encoderTable->setItem(i, 1, new QTableWidgetItem(desc) ); startEncoderStrings.append(start); stopEncoderStrings.append(stop); outputFiles.append(filename); if ( id.compare(activeId) == 0 ) active = idx; idx++; } } } if (active > -1) { encoderTable->setCurrentCell(active, 0); } */ } /* void ViewTab::resizeEvent(QResizeEvent *event) { qDebug() << "ViewTab::resizeEvent --> Start"); QWidget::resizeEvent(event); qDebug() << "ViewTab::resizeEvent --> End"); } */ void ViewTab::apply() { /* PreferencesTool *pref = PreferencesTool::get(); // Remove old preferences pref->removeAllEncoders(); // Set new preferences int numEncoders = encoderTable->rowCount(); if (numEncoders > 0) { pref->setNumberEncoders(numEncoders); pref->setActiveEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(encoderTable->currentRow())); for (int i = 0; i < numEncoders; ++i) { pref->setEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(i), encoderTable->item(i, 0)->text(), encoderTable->item(i, 1)->text(), startEncoderStrings[i], stopEncoderStrings[i], outputFiles[i]); } } else { pref->setNumberEncoders(0); pref->setActiveEncoder(QString()); } */ } void ViewTab::firstSlot() { } void ViewTab::secondSlot() { } void ViewTab::thirdSlot() { } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/tooltabs/viewtab.h000644 000000 000000 00000005244 12654352322 025755 0ustar00rootroot000000 000000 /*************************************************************************** * Copyright (C) 2010-2015 by Ralf Lange * * ralf.lange@longsoft.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef VIEWTAB_H #define VIEWTAB_H #include #include #include #include #include #include #include "frontends/frontend.h" /** * The view tab on the right hand side of the preview window * @author Ralf Lange */ class ViewTab : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param parent the parent of the this widget */ ViewTab(Frontend *f, QWidget *parent = 0); /** * Retranslate all strings of the tab after changing the language setting */ void retranslateStrings(); /** * Initializes the table and fills it with starting values. */ void initialize(); /** * Applies the settings in the import tab. */ void apply(); protected: // void resizeEvent(QResizeEvent *event); private slots: void firstSlot(); void secondSlot(); void thirdSlot(); private: Frontend *frontend; QGroupBox *firstGroupBox; QLabel *firstIcon; QSlider *firstSlider; QPushButton *firstButton; QGroupBox *secondGroupBox; QPushButton *secondButton; QGroupBox *thirdGroupBox; QPushButton *thirdButton; void makeGUI(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/tooltabs/projecttab.cpp000644 000000 000000 00000156565 13011043104 027000 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "projecttab.h" #include #include #include #include #include #include #include #include #include #include #include "domain/domainfacade.h" #include "frontends/qtfrontend/dialogs/descriptiondialog.h" #include "technical/util.h" ProjectTab::ProjectTab(Frontend *f, const QString &lvd, QWidget *parent) : QWidget(parent) { qDebug() << "ProjectTab::Constructor --> Start"; frontend = f; if (!lvd.isEmpty()) { lastVisitedDir.append(lvd); } projectGroupBox = 0; projectTree = 0; scenesGroupBox = 0; insertSceneButton = 0; addSceneButton = 0; removeSceneButton = 0; takesGroupBox = 0; insertTakeButton = 0; addTakeButton = 0; removeTakeButton = 0; framesGroupBox = 0; insertFramesButton = 0; addFramesButton = 0; removeFramesButton = 0; editGroupBox = 0; editFrameButton = 0; activeSceneIndex = -1; activeTakeIndex = -1; activeExposureIndex = -1; gimpProcess = NULL; this->setObjectName("ProjectTab"); makeGUI(); retranslateStrings(); enableTab(); frontend->getView()->attach(this); qDebug() << "ProjectTab::Constructor --> End"; } ProjectTab::~ProjectTab() { qDebug() << "ProjectTab::Destructor --> Start"; if (NULL != gimpProcess) { gimpProcess->close(); delete gimpProcess; gimpProcess = NULL; } qDebug() << "ProjectTab::Destructor --> End"; } void ProjectTab::makeGUI() { qDebug() << "ProjectTab::makeGUI --> Start"; QString iconFile(frontend->getIconsDirName()); QVBoxLayout *tabLayout = new QVBoxLayout; // ======================================================================== // Project tree projectGroupBox = new QGroupBox("projectGroupBox"); // projectGroupBox->setFlat(true); projectTree = new QTreeWidget(); projectTree->setColumnCount(1); projectTree->setHeaderHidden(true); connect(projectTree, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(itemClicked(QTreeWidgetItem*,int))); // connect(projectTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(itemDoubleClicked(QTreeWidgetItem*,int))); // connect(projectTree, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged())); QHBoxLayout *projectLayout = new QHBoxLayout; projectLayout->setMargin(4); // projectLayout->setSpacing(2); // projectLayout->addStretch(1); projectLayout->addWidget(projectTree); // projectLayout->addWidget(xxxx); // projectLayout->addStretch(10); projectGroupBox->setLayout(projectLayout); // ======================================================================== // Scene buttons scenesGroupBox = new QGroupBox("scenesGroupBox"); // scenesGroupBox->setFlat(true); insertSceneButton = new QPushButton; iconFile.append(QLatin1String("insertscene.png")); insertSceneButton->setIcon(QPixmap(iconFile)); // insertSceneButton->setFlat(true); // insertSceneButton->setFocusPolicy( Qt::NoFocus ); connect(insertSceneButton, SIGNAL(clicked()), this, SLOT(insertSceneSlot())); addSceneButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("appendscene.png")); addSceneButton->setIcon(QPixmap(iconFile)); // addSceneButton->setFlat(true); // addSceneButton->setFocusPolicy( Qt::NoFocus ); connect(addSceneButton, SIGNAL(clicked()), this, SLOT(addSceneSlot())); removeSceneButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("removescene.png")); removeSceneButton->setIcon(QPixmap(iconFile)); // removeSceneButton->setFlat(true); // removeSceneButton->setFocusPolicy( Qt::NoFocus ); connect(removeSceneButton, SIGNAL(clicked()), this, SLOT(removeSceneSlot())); QHBoxLayout *sceneLayout = new QHBoxLayout; sceneLayout->setMargin(4); // sceneLayout->setSpacing(2); // sceneLayout->addStretch(1); sceneLayout->addWidget(insertSceneButton); sceneLayout->addWidget(addSceneButton); sceneLayout->addWidget(removeSceneButton); // sceneLayout->addStretch(10); scenesGroupBox->setLayout(sceneLayout); // ======================================================================== // Take buttons takesGroupBox = new QGroupBox("takesGroupBox"); // takesGroupBox->setFlat(true); insertTakeButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("inserttake.png")); insertTakeButton->setIcon(QPixmap(iconFile)); // insertTakeButton->setFlat(true); // insertTakeButton->setFocusPolicy( Qt::NoFocus ); connect(insertTakeButton, SIGNAL(clicked()), this, SLOT(insertTakeSlot())); addTakeButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("appendtake.png")); addTakeButton->setIcon(QPixmap(iconFile)); // addTakeButton->setFlat(true); // addTakeButton->setFocusPolicy( Qt::NoFocus ); connect(addTakeButton, SIGNAL(clicked()), this, SLOT(addTakeSlot())); removeTakeButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("removetake.png")); removeTakeButton->setIcon(QPixmap(iconFile)); // removeTakeButton->setFlat(true); // removeTakeButton->setFocusPolicy( Qt::NoFocus ); connect(removeTakeButton, SIGNAL(clicked()), this, SLOT(removeTakeSlot())); QHBoxLayout *takeLayout = new QHBoxLayout; takeLayout->setMargin(4); // takeLayout->setSpacing(2); // takeLayout->addStretch(1); takeLayout->addWidget(insertTakeButton); takeLayout->addWidget(addTakeButton); takeLayout->addWidget(removeTakeButton); // takeLayout->addStretch(10); takesGroupBox->setLayout(takeLayout); // ======================================================================== // Frame buttons framesGroupBox = new QGroupBox("framesGroupBox"); // framesGroupBox->setFlat(true); insertFramesButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("insertframes.png")); insertFramesButton->setIcon(QPixmap(iconFile)); // insertFramesButton->setFlat(true); // insertFramesButton->setFocusPolicy( Qt::NoFocus ); connect(insertFramesButton, SIGNAL(clicked()), this, SLOT(insertFramesSlot())); addFramesButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("appendframes.png")); addFramesButton->setIcon(QPixmap(iconFile)); // addFramesButton->setFlat(true); // addFramesButton->setFocusPolicy( Qt::NoFocus ); connect(addFramesButton, SIGNAL(clicked()), this, SLOT(addFramesSlot())); removeFramesButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("removeframes.png")); removeFramesButton->setIcon(QPixmap(iconFile)); // removeFramesButton->setFlat(true); // removeFramesButton->setFocusPolicy( Qt::NoFocus ); connect(removeFramesButton, SIGNAL(clicked()), this, SLOT(removeFramesSlot())); QHBoxLayout *frameLayout = new QHBoxLayout; frameLayout->setMargin(4); // frameLayout->setSpacing(2); // frameLayout->addStretch(1); frameLayout->addWidget(insertFramesButton); frameLayout->addWidget(addFramesButton); frameLayout->addWidget(removeFramesButton); // frameLayout->addStretch(10); framesGroupBox->setLayout(frameLayout); // ======================================================================== // Edit buttons editGroupBox = new QGroupBox("editGroupBox"); // editGroupBox->setFlat(true); editFrameButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("launchgimp.png")); editFrameButton->setIcon(QPixmap(iconFile)); // editFrameButton->setFlat(true); // editFrameButton->setFocusPolicy( Qt::NoFocus ); connect(editFrameButton, SIGNAL(clicked()), this, SLOT(editFrameSlot())); QVBoxLayout *editLayout = new QVBoxLayout; editLayout->setMargin(4); // editLayout->setSpacing(2); // editLayout->addStretch(1); editLayout->addWidget(editFrameButton); // editLayout->addStretch(10); editGroupBox->setLayout(editLayout); // ======================================================================== // Tab layout tabLayout->setMargin(0); tabLayout->setSpacing(2); // tabLayout->addStretch(1); tabLayout->addWidget(projectGroupBox); tabLayout->addWidget(scenesGroupBox); tabLayout->addWidget(takesGroupBox); tabLayout->addWidget(framesGroupBox); tabLayout->addWidget(editGroupBox); // tabLayout->addStretch(1); setLayout(tabLayout); qDebug() << "ProjectTab::makeGUI --> End"; } void ProjectTab::retranslateStrings() { qDebug() << "ProjectTab::retranslateStrings --> Start"; projectGroupBox->setTitle(tr("Project Tree")); scenesGroupBox->setTitle(tr("Scenes")); QString infoText = tr("

Insert new Scene (CTRL+E)

" "

Click this button to create a new scene " "and insert it bevor the selected scene.

"); insertSceneButton->setToolTip(infoText); insertSceneButton->setWhatsThis(infoText); infoText = tr("

Append new Scene (CTRL+E)

" "

Click this button to create a new scene " "and append it at the end of the animation.

"); addSceneButton->setToolTip(infoText); addSceneButton->setWhatsThis(infoText); infoText = tr("

Remove Scene (SHIFT+Delete)

" "

Click this button to remove the selected scene " "from the animation.

"); removeSceneButton->setToolTip(infoText); removeSceneButton->setWhatsThis(infoText); takesGroupBox->setTitle(tr("Takes")); infoText = tr("

Insert new Take (CTRL+E)

" "

Click this button to create a new take " "and insert it bevor the selected take.

"); insertTakeButton->setToolTip(infoText); insertTakeButton->setWhatsThis(infoText); infoText = tr("

Append new Take (CTRL+E)

" "

Click this button to create a new take " "and append it to the end of the scene.

"); addTakeButton->setToolTip(infoText); addTakeButton->setWhatsThis(infoText); infoText = tr("

Remove Take (SHIFT+Delete)

" "

Click this button to remove the selected take " "from the animation.

"); removeTakeButton->setToolTip(infoText); removeTakeButton->setWhatsThis(infoText); framesGroupBox->setTitle(tr("Frames")); infoText = tr("

Insert Frames (CTRL+F)

" "

Click on this button to insert frames " "bevor the selected frame.

"); insertFramesButton->setToolTip(infoText); insertFramesButton->setWhatsThis(infoText); infoText = tr("

Append Frames (CTRL+F)

" "

Click on this button to append frames at the " "end of the take.

"); addFramesButton->setToolTip(infoText); addFramesButton->setWhatsThis(infoText); infoText = tr("

Remove Frame (Delete)

" "

Click this button to remove the selected frame " "from the take.

"); removeFramesButton->setToolTip(infoText); removeFramesButton->setWhatsThis(infoText); editGroupBox->setTitle(tr("Edit")); infoText = tr("

Launch Photo Editor

" "

Click this button to open the active frame in the photo editor

" "

Note that you can also drag images from the frame bar and drop them on the photo editor

"); editFrameButton->setToolTip(infoText); editFrameButton->setWhatsThis(infoText); qDebug() << "ProjectTab::retranslateStrings --> End"; } void ProjectTab::initialize() { qDebug() << "ProjectTab::initialize --> Start"; /* PreferencesTool *pref = PreferencesTool::get(); int active = -1; int numEncoders = pref->getNumberEncoders(); encoderTable->setRowCount(numEncoders); if (numEncoders > 0 ) { QString activeId = pref->getActiveEncoder(); int idx = 0; for (int i = 0; i < numEncoders; ++i) { QString id(QString("%1%2").arg(QLatin1String("encoder")).arg(i)); QString name; QString desc; QString start; QString stop; QString filename; if ( pref->getEncoder(id, name, desc, start, stop, filename) ) { encoderTable->setItem(i, 0, new QTableWidgetItem(name) ); encoderTable->setItem(i, 1, new QTableWidgetItem(desc) ); startEncoderStrings.append(start); stopEncoderStrings.append(stop); outputFiles.append(filename); if ( id.compare(activeId) == 0 ) active = idx; idx++; } } } if (active > -1) { encoderTable->setCurrentCell(active, 0); } */ qDebug() << "ProjectTab::initialize --> End"; } void ProjectTab::enableTab() { insertSceneButton->setEnabled(true); addSceneButton->setEnabled(true); removeSceneButton->setEnabled(true); insertTakeButton->setEnabled(true); addTakeButton->setEnabled(true); removeTakeButton->setEnabled(true); insertFramesButton->setEnabled(true); addFramesButton->setEnabled(true); removeFramesButton->setEnabled(true); editFrameButton->setEnabled(true); tabEnabled = true; } void ProjectTab::disableTab() { insertSceneButton->setEnabled(false); addSceneButton->setEnabled(false); removeSceneButton->setEnabled(false); insertTakeButton->setEnabled(false); addTakeButton->setEnabled(false); removeTakeButton->setEnabled(false); insertFramesButton->setEnabled(false); addFramesButton->setEnabled(false); removeFramesButton->setEnabled(false); editFrameButton->setEnabled(false); tabEnabled = false; } /* void ProjectTab::resizeEvent(QResizeEvent *event) { qDebug() << "ProjectTab::resizeEvent --> Start"); QWidget::resizeEvent(event); qDebug() << "ProjectTab::resizeEvent --> End"); } */ void ProjectTab::apply() { qDebug() << "ProjectTab::apply --> Start"; /* PreferencesTool *pref = PreferencesTool::get(); // Remove old preferences pref->removeAllEncoders(); // Set new preferences int numEncoders = encoderTable->rowCount(); if (numEncoders > 0) { pref->setNumberEncoders(numEncoders); pref->setActiveEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(encoderTable->currentRow())); for (int i = 0; i < numEncoders; ++i) { pref->setEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(i), encoderTable->item(i, 0)->text(), encoderTable->item(i, 1)->text(), startEncoderStrings[i], stopEncoderStrings[i], outputFiles[i]); } } else { pref->setNumberEncoders(0); pref->setActiveEncoder(QString()); } */ qDebug() << "ProjectTab::apply --> End"; } /************************************************************************** * Animation notification functions **************************************************************************/ void ProjectTab::updateRemoveProject() { qDebug() << "ProjectTab::updateRemoveProject --> Start"; projectTree->clear(); activeSceneIndex = -1; activeTakeIndex = -1; activeExposureIndex = -1; qDebug() << "ProjectTab::updateRemoveProject --> End"; } void ProjectTab::updateNewProject() { qDebug() << "ProjectTab::updateNewProject --> Start"; QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(projectTree); topLevelItem->setText(0, this->frontend->getProject()->getProjectDescription()); topLevelItem->setFlags(Qt::ItemIsEnabled); projectTree->insertTopLevelItem(0, topLevelItem); qDebug() << "ProjectTab::updateNewProject --> End"; } void ProjectTab::updateOpenProject() { qDebug() << "ProjectTab::updateOpenProject --> Start"; QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(projectTree); int sceneCount = frontend->getProject()->getSceneSize(); topLevelItem->setText(0, frontend->getProject()->getProjectDescription()); topLevelItem->setFlags(Qt::ItemIsEnabled); projectTree->insertTopLevelItem(0, topLevelItem); for (int sceneIndex = 0; sceneIndex < sceneCount ; sceneIndex++) { updateAddScene(sceneIndex); int takeCount = frontend->getProject()->getSceneTakeSize(sceneIndex); for (int takeIndex = 0; takeIndex < takeCount ; takeIndex++) { updateAddTake(sceneIndex, takeIndex); int exposureCount = frontend->getProject()->getSceneTakeExposureSize(sceneIndex, takeIndex); for (int exposureIndex = 0; exposureIndex < exposureCount ; exposureIndex++) { updateAddExposure(sceneIndex, takeIndex, exposureIndex); } } } qDebug() << "ProjectTab::updateOpenProject --> End"; } void ProjectTab::updatePlaySound(int) {} void ProjectTab::updateMixMode(int) {} void ProjectTab::updateMixCount(int) {} void ProjectTab::updateLiveViewFps(int) {} void ProjectTab::updateVideoFps(int) {} /************************************************************************** * Scene notification functions **************************************************************************/ void ProjectTab::updateAddScene(int sceneIndex) { qDebug() << "ProjectTab::updateAddScene --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); Scene *scene = frontend->getProject()->getScene(sceneIndex); if (scene->getDescription().isEmpty()) { newItem->setText(0, scene->getId()); } else { newItem->setText(0, scene->getDescription()); } newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->projectTree->topLevelItem(0)->addChild(newItem); qDebug() << "ProjectTab::updateAddScene --> End"; } void ProjectTab::updateInsertScene(int sceneIndex) { qDebug() << "ProjectTab::updateInsertScene --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); Scene *scene = frontend->getProject()->getScene(sceneIndex); if (scene->getDescription().isEmpty()) { newItem->setText(0, scene->getId()); } else { newItem->setText(0, scene->getDescription()); } newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->projectTree->topLevelItem(0)->insertChild(sceneIndex, newItem); activeSceneIndex++; qDebug() << "ProjectTab::updateInsertScene --> End"; } /* void ProjectTab::updateSetNewActiveScene(int sceneIndex) { qDebug() << "ProjectTab::updatSeteNewActiveScene --> Start"); this->setNewActiveScene(sceneIndex); qDebug() << "ProjectTab::updatSeteNewActiveScene --> End"); } */ void ProjectTab::updateActivateScene() { qDebug() << "ProjectTab::updateActivateScene --> Start"; int newSceneIndex = frontend->getProject()->getActiveSceneIndex(); Q_ASSERT(newSceneIndex != activeSceneIndex); this->unsetActiveItems(); activeSceneIndex = newSceneIndex; activeTakeIndex = -1; activeExposureIndex = -1; this->setActiveItems(); qDebug() << "ProjectTab::updateActivateScene --> End"; } void ProjectTab::updateRemoveScene(int sceneIndex) { qDebug() << "ProjectTab::updateRemoveScene --> Start"; this->unsetActiveItems(); QTreeWidgetItem *topLevelItem = this->projectTree->topLevelItem(0); Q_ASSERT(sceneIndex < topLevelItem->childCount()); this->removeScene(sceneIndex); if (sceneIndex < activeSceneIndex) { activeSceneIndex--; Q_ASSERT(-1 < activeSceneIndex); } if (-1 == activeSceneIndex) { activeTakeIndex = -1; activeExposureIndex = -1; } else { activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); if (-1 == activeTakeIndex) { activeExposureIndex = -1; } else { activeExposureIndex = frontend->getProject()->getActiveExposureIndex(); } } this->setActiveItems(); qDebug() << "ProjectTab::updateRemoveScene --> End"; } void ProjectTab::updateMoveScene(int sceneNumber, int movePosition) { qDebug() << "ProjectTab::updateMoveScene --> Start"; // this->moveScene(sceneNumber, movePosition); qDebug() << "ProjectTab::updateMoveScene --> End"; } /************************************************************************** * Take notification functions **************************************************************************/ void ProjectTab::updateAddTake(int sceneIndex, int takeIndex) { qDebug() << "ProjectTab::updateAddTake --> Start"; QTreeWidgetItem *sceneItem = this->projectTree->topLevelItem(0)->child(sceneIndex); QTreeWidgetItem *newItem = new QTreeWidgetItem(); Take *take = frontend->getProject()->getScene(sceneIndex)->getTake(takeIndex); if (take->getDescription().isEmpty()) { newItem->setText(0, take->getId()); } else { newItem->setText(0, take->getDescription()); } newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); sceneItem->addChild(newItem); qDebug() << "ProjectTab::updateAddTake --> End"; } void ProjectTab::updateInsertTake(int sceneIndex, int takeIndex) { qDebug() << "ProjectTab::updateInsertTake --> Start"; QTreeWidgetItem *sceneItem = this->projectTree->topLevelItem(0)->child(sceneIndex); QTreeWidgetItem *newItem = new QTreeWidgetItem(); Take *take = frontend->getProject()->getScene(sceneIndex)->getTake(takeIndex); if (take->getDescription().isEmpty()) { newItem->setText(0, take->getId()); } else { newItem->setText(0, take->getDescription()); } newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); sceneItem->insertChild(takeIndex, newItem); activeTakeIndex++; qDebug() << "ProjectTab::updateInsertTake --> End"; } /* void ProjectTab::updateSetNewActiveTake(int takeIndex) { qDebug() << "ProjectTab::updateSetNewActiveTake --> Start"; this->setSetNewActiveTake(takeIndex); qDebug() << "ProjectTab::updateSetNewActiveTake --> End"; } */ void ProjectTab::updateActivateTake() { qDebug() << "ProjectTab::updateActivateTake --> Start"; int newTakeIndex = frontend->getProject()->getActiveTakeIndex(); Q_ASSERT(newTakeIndex != activeTakeIndex); this->unsetActiveItems(); activeTakeIndex = newTakeIndex; activeExposureIndex = -1; this->setActiveItems(); qDebug() << "ProjectTab::updateActivateTake --> End"; } void ProjectTab::updateRemoveTake(int sceneIndex, int takeIndex) { qDebug() << "ProjectTab::updateRemoveTake --> Start"; this->unsetActiveItems(); QTreeWidgetItem *topLevelItem = this->projectTree->topLevelItem(0); Q_ASSERT(sceneIndex < topLevelItem->childCount()); QTreeWidgetItem *activeSceneItem = topLevelItem->child(sceneIndex); this->removeTake(activeSceneItem, takeIndex); if (sceneIndex == activeSceneIndex) { // One of the takes of the active scene are removed if (takeIndex < activeTakeIndex) { activeTakeIndex--; Q_ASSERT(-1 < activeTakeIndex); } if (-1 == activeTakeIndex) { activeExposureIndex = -1; } else { activeExposureIndex = frontend->getProject()->getActiveExposureIndex(); } } this->setActiveItems(); qDebug() << "ProjectTab::updateRemoveTake --> End"; } /************************************************************************** * Exposure notification functions **************************************************************************/ void ProjectTab::updateAddExposure(int sceneIndex, int takeIndex, int exposureIndex) { // qDebug() << "ProjectTab::updateAddExposure --> Start"; Exposure *exposure = frontend->getProject()->getScene(sceneIndex)->getTake(takeIndex)->getExposure(exposureIndex); QTreeWidgetItem *topLevelItem = this->projectTree->topLevelItem(0); Q_ASSERT(sceneIndex < topLevelItem->childCount()); QTreeWidgetItem *sceneItem = topLevelItem->child(sceneIndex); Q_ASSERT(takeIndex < sceneItem->childCount()); QTreeWidgetItem *takeItem = sceneItem->child(takeIndex); QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, exposure->getId()); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); takeItem->addChild(newItem); // qDebug() << "ProjectTab::updateAddExposure --> End"; } void ProjectTab::updateInsertExposure(int sceneIndex, int takeIndex, int exposureIndex) { qDebug() << "ProjectTab::updateInsertExposure --> Start"; // Q_ASSERT(-1 < activeExposureIndex); Exposure *exposure = frontend->getProject()->getScene(sceneIndex)->getTake(takeIndex)->getExposure(exposureIndex); QTreeWidgetItem *takeItem = this->projectTree->topLevelItem(0)->child(sceneIndex)->child(takeIndex); QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, exposure->getId()); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); takeItem->insertChild(exposureIndex, newItem); if (exposureIndex <= activeExposureIndex) { activeExposureIndex++; } qDebug() << "ProjectTab::updateInsertExposure --> End"; } void ProjectTab::updateRemoveExposure(int sceneIndex, int takeIndex, int exposureIndex) { qDebug() << "ProjectTab::updateRemoveExposure --> Start"; unsetActiveItems(); QTreeWidgetItem *activeSceneItem = this->projectTree->topLevelItem(0)->child(sceneIndex); QTreeWidgetItem *activeTakeItem = activeSceneItem->child(takeIndex); QTreeWidgetItem *activeExposureItem = activeTakeItem->child(exposureIndex); activeTakeItem->removeChild(activeExposureItem); delete activeExposureItem; if (sceneIndex == activeSceneIndex) { if (takeIndex == activeTakeIndex) { if (exposureIndex < activeExposureIndex) { activeExposureIndex--; } } } setActiveItems(); qDebug() << "ProjectTab::updateRemoveExposure --> End"; } void ProjectTab::updateMoveExposures(int fromFrame, int toFrame, int movePosition) { qDebug() << "ProjectTab::updateMoveExposures --> Start"; // moveExposures(fromFrame, toFrame, movePosition); qDebug() << "ProjectTab::updateMoveExposures --> End"; } /* void ProjectTab::updateSetNewActiveExposure(int exposureIndex) { qDebug() << "ProjectTab::updateSetNewActiveExposure --> Start"; setActiveFrame(exposureIndex); if (preferencesMenu->isVisible()) { if (exposureIndex >= 0) { showPreferencesMenu(); } else { preferencesMenu->close(); } } // For writing the frame number in the frame number display emit newActiveFrame(tr("Exposure number: ") + QString("%1").arg(exposureIndex + 1)); // For setting the value in the spinbox in the gotomenu emit newActiveFrame(exposureIndex + 1); qDebug() << "ProjectTab::updateSetNewActiveExposure --> End"; } */ void ProjectTab::updateActivateExposure() { qDebug() << "ProjectTab::updateActivateExposure --> Start"; int newExposureIndex = frontend->getProject()->getActiveExposureIndex(); Q_ASSERT(newExposureIndex != activeExposureIndex); this->unsetActiveItems(); activeExposureIndex = newExposureIndex; this->setActiveItems(); qDebug() << "ProjectTab::updateActivateExposure --> End"; } void ProjectTab::updateModifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex) { qDebug() << "ProjectTab::updateModifyExposure --> Start"; // modifyExposure(); qDebug() << "ProjectTab::updateModifyExposure --> End"; } /************************************************************************** * Other functions **************************************************************************/ void ProjectTab::unsetActiveItems() { qDebug() << "ProjectTab::unsetActiveExposure --> Start"; QList selectedItems = this->projectTree->selectedItems(); int selectedItemsCount = selectedItems.count(); int selectedItemsIndex; for (selectedItemsIndex = 0 ; selectedItemsIndex < selectedItemsCount ; selectedItemsIndex++) { selectedItems[selectedItemsIndex]->setSelected(false); // selectedItems[selectedItemsIndex]->setExpanded(false); // projectTree->collapseItem(selectedItems[selectedItemsIndex]); } projectTree->collapseAll(); qDebug() << "ProjectTab::unsetActiveExposure --> End"; } void ProjectTab::setActiveItems() { qDebug() << "ProjectTab::setActiveExposure --> Start"; QTreeWidgetItem *newExposureItem = NULL; QTreeWidgetItem *newTakeItem = NULL; QTreeWidgetItem *newSceneItem = NULL; QTreeWidgetItem *newProjectItem = projectTree->topLevelItem(0); newProjectItem->setExpanded(true); newProjectItem->setSelected(true); if (0 > activeSceneIndex) { qDebug() << "ProjectTab::setActiveExposure --> End (Only project)"; return; } newSceneItem = newProjectItem->child(activeSceneIndex); newSceneItem->setExpanded(true); newSceneItem->setSelected(true); projectTree->scrollToItem(newSceneItem); if (0 > activeTakeIndex) { qDebug() << "ProjectTab::setActiveExposure --> End (Up to scene)"; return; } newTakeItem = newSceneItem->child(activeTakeIndex); newTakeItem->setExpanded(true); newTakeItem->setSelected(true); projectTree->scrollToItem(newTakeItem); if (0 > activeExposureIndex) { qDebug() << "ProjectTab::setActiveExposure --> End (Up to take)"; return; } newExposureItem = newTakeItem->child(activeExposureIndex); newExposureItem->setSelected(true); projectTree->scrollToItem(newExposureItem); qDebug() << "ProjectTab::setActiveExposure --> End (All)"; } void ProjectTab::itemClicked(QTreeWidgetItem * /*exposureItem*/, int /*column*/) { qDebug() << "ProjectTab::itemClicked --> Start"; int newSceneIndex; int newTakeIndex; int newExposureIndex; Scene *scene = NULL; Take *take = NULL; if (!getSelectedItems(newSceneIndex, newTakeIndex, newExposureIndex)) { // Project item selected setActiveItems(); return; } if (activeSceneIndex != newSceneIndex) { frontend->getProject()->selectSceneToUndo(newSceneIndex); activeTakeIndex = -1; activeExposureIndex = -1; } scene = frontend->getProject()->getScene(activeSceneIndex); if (-1 == newTakeIndex) { // Scene item selected newTakeIndex = scene->getActiveTakeIndex(); } if (activeTakeIndex != newTakeIndex) { if (newTakeIndex != frontend->getProject()->getActiveTakeIndex()) { frontend->getProject()->selectTakeToUndo(newSceneIndex, newTakeIndex); qDebug() << "ProjectTab::itemClicked --> End (Scene or Take selected)"; return; } activeTakeIndex = newTakeIndex; activeExposureIndex = -1; } if (-1 == newExposureIndex) { if (0 <= newTakeIndex) { // Take item selected take = scene->getTake(newTakeIndex); newExposureIndex = take->getActiveExposureIndex(); } } if (activeExposureIndex != newExposureIndex) { if (newExposureIndex != frontend->getProject()->getActiveExposureIndex()) { frontend->getProject()->selectExposureToUndo(newSceneIndex, newTakeIndex, newExposureIndex); qDebug() << "ProjectTab::itemClicked --> End (Scene, Take or exposure selected)"; return; } activeExposureIndex = newExposureIndex; } this->setActiveItems(); qDebug() << "ProjectTab::itemClicked --> End (Nothing new selected)"; } void ProjectTab::itemDoubleClicked(QTreeWidgetItem* /*exposureItem*/, int /*column*/) { qDebug() << "ProjectTab::itemDoubleClicked --> Start"; int sceneIndex; int takeIndex; int exposureIndex; getSelectedItems(sceneIndex, takeIndex, exposureIndex); if (-1 == exposureIndex) { // Clicked item is not a exposure item return; } frontend->getProject()->selectExposureToUndo(sceneIndex, takeIndex, exposureIndex); qDebug() << "ProjectTab::itemDoubleClicked --> End"; } void ProjectTab::itemSelectionChanged() { qDebug() << "ProjectTab::itemSelectionChanged --> Start"; /* int sceneIndex; int takeIndex; int exposureIndex; getSelectedItems(sceneIndex, takeIndex, exposureIndex); if (-1 == exposureIndex) { // Clicked item is not a exposure item return; } */ qDebug() << "ProjectTab::itemSelectionChanged --> End"; } void ProjectTab::insertSceneSlot() { qDebug() << "ProjectTab::insertSceneSlot --> Start"; DescriptionDialog *dialog = new DescriptionDialog(frontend, DescriptionDialog::SceneDescription); dialog->setProjectDescription(frontend->getProject()->getProjectDescription()); dialog->setSceneDescription(tr("Scene 000")); dialog->setTakeDescription(tr("Take 00")); int ret = dialog->exec(); if (ret == QDialog::Rejected) { // The user canceled the input dialog qDebug() << "ProjectTab::addTakeSlot --> End (cancel)"; return; } QString sceneDescription = dialog->getSceneDescription(); QString takeDescription = dialog->getTakeDescription(); delete(dialog); int newSceneIndex = activeSceneIndex; if (-1 == newSceneIndex) { frontend->getProject()->addSceneToUndo(sceneDescription); newSceneIndex = 0; } else { frontend->getProject()->insertSceneToUndo(sceneDescription, newSceneIndex); } frontend->getProject()->addTakeToUndo(takeDescription, newSceneIndex); qDebug() << "ProjectTab::insertSceneSlot --> End"; } void ProjectTab::addSceneSlot() { qDebug() << "ProjectTab::addSceneSlot --> Start"; DescriptionDialog *dialog = new DescriptionDialog(frontend, DescriptionDialog::SceneDescription); dialog->setProjectDescription(frontend->getProject()->getProjectDescription()); dialog->setSceneDescription(tr("Scene 000")); dialog->setTakeDescription(tr("Take 00")); int ret = dialog->exec(); if (ret == QDialog::Rejected) { // The user canceled the input dialog qDebug() << "ProjectTab::addTakeSlot --> End (cancel)"; return; } QString sceneDescription = dialog->getSceneDescription(); QString takeDescription = dialog->getTakeDescription(); delete(dialog); int newSceneIndex = frontend->getProject()->getSceneSize(); frontend->getProject()->addSceneToUndo(sceneDescription); frontend->getProject()->addTakeToUndo(takeDescription, newSceneIndex); qDebug() << "ProjectTab::addSceneSlot --> End"; } void ProjectTab::removeSceneSlot() { qDebug() << "ProjectTab::removeSceneSlot --> Start"; if (-1 == activeSceneIndex) { // No scene selected qDebug() << "ProjectTab::removeSceneSlot --> End (Nothing)"; return; } DomainFacade *animationProject = frontend->getProject(); if (-1 == animationProject->getActiveScene()->getActiveTakeIndex()) { // There is no active take in this scene removeSceneTakes(activeSceneIndex); } else { // There is a active take in this scene // Remove of all exposures using the remove frame slot while (-1 < activeTakeIndex) { removeTakeSlot(); } } int removeSceneIndex = activeSceneIndex; // The activeSceneIndex will be changed by the selectSceneToUndo call if (removeSceneIndex == (animationProject->getSceneSize()-1)) { // Last scene of the project selected animationProject->selectSceneToUndo(removeSceneIndex-1); } else { // Not the last scene of the project selected animationProject->selectSceneToUndo(removeSceneIndex+1); } frontend->getProject()->removeSceneToUndo(removeSceneIndex); qDebug() << "ProjectTab::removeSceneSlot --> End"; } void ProjectTab::removeSceneTakes(int removeSceneIndex) { qDebug() << "ProjectTab::removeSceneTakes --> Start"; DomainFacade *animationProject = frontend->getProject(); // Remove of all takes for (int removeTakeIndex = animationProject->getSceneTakeSize(removeSceneIndex)-1 ; 0 <= removeTakeIndex ; removeTakeIndex--) { removeTakeExposures(removeSceneIndex, removeTakeIndex); animationProject->removeTakeToUndo(removeSceneIndex, removeTakeIndex); } qDebug() << "ProjectTab::removeSceneTakes --> End"; } void ProjectTab::insertTakeSlot() { qDebug() << "ProjectTab::insertTakeSlot --> Start"; if (0 > activeSceneIndex) { // No scene selected frontend->showInformation(tr("Insert Take"), tr("No scene selected. Please select a scene in the project tree.")); return; } DescriptionDialog *dialog = new DescriptionDialog(frontend, DescriptionDialog::TakeDescription); dialog->setProjectDescription(frontend->getProject()->getProjectDescription()); dialog->setSceneDescription(frontend->getProject()->getActiveScene()->getDescription()); dialog->setTakeDescription(tr("Take 00")); int ret = dialog->exec(); if (ret == QDialog::Rejected) { // The user canceled the input dialog qDebug() << "ProjectTab::addTakeSlot --> End (cancel)"; return; } QString takeDescription = dialog->getTakeDescription(); delete(dialog); if (-1 == activeTakeIndex) { frontend->getProject()->addTakeToUndo(takeDescription, activeSceneIndex); } else { frontend->getProject()->insertTakeToUndo(takeDescription, activeSceneIndex, activeTakeIndex); } qDebug() << "ProjectTab::insertTakeSlot --> End"; } void ProjectTab::addTakeSlot() { qDebug() << "ProjectTab::addTakeSlot --> Start"; if (0 > activeSceneIndex) { // No scene selected frontend->showInformation(tr("Add Take"), tr("No scene selected. Please select a scene in the project tree.")); return; } DescriptionDialog *dialog = new DescriptionDialog(frontend, DescriptionDialog::TakeDescription); dialog->setProjectDescription(frontend->getProject()->getProjectDescription()); dialog->setSceneDescription(frontend->getProject()->getActiveScene()->getDescription()); dialog->setTakeDescription(tr("Take 00")); int ret = dialog->exec(); if (ret == QDialog::Rejected) { // The user canceled the input dialog qDebug() << "ProjectTab::addTakeSlot --> End (cancel)"; return; } QString takeDescription = dialog->getTakeDescription(); delete(dialog); frontend->getProject()->addTakeToUndo(takeDescription, activeSceneIndex); qDebug() << "ProjectTab::addTakeSlot --> End"; } void ProjectTab::removeTakeSlot() { qDebug() << "ProjectTab::removeTakeSlot --> Start"; if (-1 == activeTakeIndex) { // No take selected qDebug() << "ProjectTab::removeTakeSlot --> End (Nothing)"; return; } DomainFacade *animationProject = frontend->getProject(); if (-1 == animationProject->getActiveTake()->getActiveExposureIndex()) { // There is no active exposure in this take removeTakeExposures(activeSceneIndex, activeTakeIndex); } else { // There is a active exposure in this take // Remove of all exposures using the remove frame slot while (-1 < activeExposureIndex) { removeFramesSlot(); } } int removeTakeIndex = activeTakeIndex; // The activeTakeIndex will be changed by the selectTakeToUndo call if (removeTakeIndex == (animationProject->getSceneTakeSize(activeSceneIndex)-1)) { // Last take of the scene selected animationProject->selectTakeToUndo(activeSceneIndex, removeTakeIndex-1); } else { // Not the last take of the scene selected animationProject->selectTakeToUndo(activeSceneIndex, removeTakeIndex+1); } frontend->getProject()->removeTakeToUndo(activeSceneIndex, removeTakeIndex); qDebug() << "ProjectTab::removeTakeSlot --> End"; } void ProjectTab::removeTakeExposures(int removeSceneIndex, int removeTakeIndex) { qDebug() << "ProjectTab::removeTakeExposures --> Start"; DomainFacade *animationProject = frontend->getProject(); // Remove of all exposures for (int removeExposureIndex = animationProject->getSceneTakeExposureSize(removeSceneIndex, removeTakeIndex)-1 ; 0 <= removeExposureIndex ; removeExposureIndex--) { animationProject->removeExposureToUndo(removeSceneIndex, removeTakeIndex, removeExposureIndex); } qDebug() << "ProjectTab::removeTakeExposures --> End"; } void ProjectTab::insertFramesSlot() { qDebug() << "ProjectTab::insertFramesSlot --> Start"; if (0 > activeSceneIndex) { // No scene selected frontend->showInformation(tr("Insert Frames"), tr("No scene selected. Please select a scene in the project tree.")); return; } if (0 > activeTakeIndex) { // No scene selected frontend->showInformation(tr("Insert Frames"), tr("No take selected. Please select a take in the project tree.")); return; } QStringList selectedFiles = selectFiles(); int selectedFilesCount = selectedFiles.count(); if (0 == selectedFilesCount) { // The user didn't select one ore more files qDebug() << "ProjectTab::addFrameSlot --> End (no file selected)"; return; } int selectedFilesIndex; for (selectedFilesIndex = 0 ; selectedFilesIndex < selectedFilesCount ; selectedFilesIndex++) { // insert the selected files QImage rawImage(selectedFiles[selectedFilesIndex]); if (-1 == activeExposureIndex) { frontend->getProject()->addExposureToUndo(rawImage, activeSceneIndex, activeTakeIndex); } else { frontend->getProject()->insertExposureToUndo(rawImage, activeSceneIndex, activeTakeIndex, activeExposureIndex); } } qDebug() << "ProjectTab::insertFramesSlot --> End"; } void ProjectTab::addFramesSlot() { qDebug() << "ProjectTab::addFramesSlot --> Start"; if (0 > activeSceneIndex) { // No scene selected frontend->showInformation(tr("Add Frames"), tr("No scene selected. Please select a scene in the project tree.")); return; } if (0 > activeTakeIndex) { // No scene selected frontend->showInformation(tr("Add Frames"), tr("No take selected. Please select a take in the project tree.")); return; } QStringList selectedFiles = selectFiles(); int selectedFilesCount = selectedFiles.count(); if (0 == selectedFilesCount) { // The user didn't select one ore more files qDebug() << "ProjectTab::addFrameSlot --> End (no file selected)"; return; } int selectedFilesIndex; for (selectedFilesIndex = 0 ; selectedFilesIndex < selectedFilesCount ; selectedFilesIndex++) { // Add the selected files QImage rawImage(selectedFiles[selectedFilesIndex]); frontend->getProject()->addExposureToUndo(rawImage, activeSceneIndex, activeTakeIndex); } qDebug() << "ProjectTab::addFramesSlot --> End"; } void ProjectTab::removeFramesSlot() { qDebug() << "ProjectTab::removeFramesSlot --> Start"; if (-1 == activeExposureIndex) { // No exposure selected qDebug() << "ProjectTab::removeFramesSlot --> End (Nothing)"; return; } DomainFacade *animationProject = frontend->getProject(); int removeExposureIndex = activeExposureIndex; // The activeExposureIndex will be changed by the selectExposureToUndo call if (removeExposureIndex == (animationProject->getTakeExposureSize(activeSceneIndex, activeTakeIndex)-1)) { // Last exposure of the take selected animationProject->selectExposureToUndo(activeSceneIndex, activeTakeIndex, removeExposureIndex-1); } else { // Not the last exposure of the take selected animationProject->selectExposureToUndo(activeSceneIndex, activeTakeIndex, removeExposureIndex+1); } // TODO: Optinaly save the image to remove in a separate directory animationProject->removeExposureToUndo(activeSceneIndex, activeTakeIndex, removeExposureIndex); qDebug() << "ProjectTab::removeFramesSlot --> End"; } void ProjectTab::editFrameSlot() { qDebug() << "ProjectTab::editFrameSlot --> Start"; // Determine the active scene and active frame. if (activeSceneIndex < 0 || activeTakeIndex < 0 || activeExposureIndex < 0) { frontend->showWarning(tr("Warning"), tr("There is no active frame to open")); return; } Exposure *exposure = frontend->getProject()->getExposure(activeSceneIndex, activeTakeIndex, activeExposureIndex); if (exposure->isEmpty()) { frontend->showWarning(tr("Warning"), tr("The active frame is corrupt")); return; } QString exposureImagePath(exposure->getImagePath()); frontend->addFileToMonitoring(exposureImagePath); if (NULL == gimpProcess) { startGimpProcess(exposureImagePath); } qDebug() << "ProjectTab::editFrameSlot --> End"; } void ProjectTab::gimpProcessStarted() { qDebug() << "ProjectTab::gimpProcessStarted --> Start (Nothing)"; // qDebug() << "ProjectTab::gimpProcessStarted --> End"; } void ProjectTab::gimpProcessError(QProcess::ProcessError error) { qDebug() << "ProjectTab::gimpProcessError --> Start (Nothing)"; // qDebug() << "ProjectTab::gimpProcessError --> End"; } void ProjectTab::gimpProcessFinished(int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/) { qDebug() << "ProjectTab::gimpProcessFinished --> Start"; stopGimpProcess(); frontend->removeAllFilesFromMonitoring(); qDebug() << "ProjectTab::gimpProcessFinished --> End"; } void ProjectTab::chooseFrame() { } bool ProjectTab::getSelectedItems(int &sceneIndex, int &takeIndex, int &exposureIndex) { qDebug() << "ProjectTab::getSelectedItems --> Start"; QTreeWidgetItem *projectItem = NULL; QTreeWidgetItem *exposureItem = NULL; QTreeWidgetItem *takeItem = NULL; QTreeWidgetItem *sceneItem = NULL; QList selectedItems = projectTree->selectedItems(); if (0 == selectedItems.count()) { return false; } if (1 == selectedItems.count()) { if (NULL == selectedItems[0]->parent()->parent()) { sceneItem = selectedItems[0]; } else { if (NULL == selectedItems[0]->parent()->parent()->parent()) { takeItem = selectedItems[0]; } else { exposureItem = selectedItems[0]; takeItem = exposureItem->parent(); } sceneItem = takeItem->parent(); } } else { // The first selected item must be a scene item Q_ASSERT(NULL == selectedItems[0]->parent()->parent()); sceneItem = selectedItems[0]; if (1 < selectedItems.count()) { // The second selected item must be a take item Q_ASSERT(NULL == selectedItems[1]->parent()->parent()->parent()); takeItem = selectedItems[1]; if (2 < selectedItems.count()) { // The third selected item is a exposure item exposureItem = selectedItems[2]; } } } projectItem = sceneItem->parent(); sceneIndex = projectItem->indexOfChild(sceneItem); if (NULL == takeItem) { takeIndex = -1; } else { takeIndex = sceneItem->indexOfChild(takeItem); } if (NULL == exposureItem) { exposureIndex = -1; } else { exposureIndex = takeItem->indexOfChild(exposureItem); } qDebug() << "ProjectTab::getSelectedItems --> End"; return true; } void ProjectTab::removeScene(int sceneIndex) { qDebug() << "ProjectTab::removeScene --> Start"; QTreeWidgetItem *projectItem = projectTree->topLevelItem(0); Q_ASSERT(sceneIndex < projectItem->childCount()); QTreeWidgetItem *sceneItem = projectItem->child(sceneIndex); int takeCount = sceneItem->childCount(); int takeIndex; for (takeIndex = takeCount - 1 ; takeIndex >= 0 ; takeIndex--) { removeTake(sceneItem, takeIndex); } projectItem->removeChild(sceneItem); delete sceneItem; qDebug() << "ProjectTab::removeScene --> End"; } void ProjectTab::removeTake(QTreeWidgetItem *sceneItem, int takeIndex) { qDebug() << "ProjectTab::removeTake --> Start"; Q_ASSERT(takeIndex < sceneItem->childCount()); QTreeWidgetItem *takeItem = sceneItem->child(takeIndex); int exposureCount = takeItem->childCount(); int exposureIndex; QTreeWidgetItem *exposureItem; for (exposureIndex = exposureCount - 1 ; exposureIndex >= 0 ; exposureIndex--) { exposureItem = takeItem->child(exposureIndex); takeItem->removeChild(exposureItem); delete exposureItem; } sceneItem->removeChild(takeItem); delete takeItem; qDebug() << "ProjectTab::removeTake --> End"; } QStringList ProjectTab::selectFiles() { qDebug() << "ProjectTab::selectFiles --> Start"; QFileDialog fileDialog(this, tr("Choose frames to add"), lastVisitedDir); QStringList filters; filters << "Images (*.bmp *.png *.jpg *.tif *.gif *.BMP *.PNG *.JPG *.TIF *.GIF)" << "Windows Bitmap (*.bmp *.BMP)" << "Graphic Interchange Format (*.gif *.GIF)" << "Joint Photographic Experts Group (*.jpg *.jpeg *.JPG *.JPEG)" << "Portable Network Graphics (*.png *.PNG)" << "Portable Bitmap (*.pbm *.PBM)" << "Portable Pixmap (*.ppm *.PPM)" << "Tagged Image File Format (*.tif *.tiff *.TIF *.TIFF)" << "X11 Bitmap (*.xbm *.XBM)" << "X11 Pixmap (*.xpm *.XPM)" << "All files (*)"; fileDialog.setNameFilters(filters); fileDialog.setAcceptMode(QFileDialog::AcceptOpen); fileDialog.setFileMode(QFileDialog::ExistingFiles); //PicturePreview* p = new PicturePreview(fileDialog); // QObject::connect(fileDialog, SIGNAL(filesSelected(const QStringList &)), // this, SLOT(addFrames(const QStringList &))); int ret = fileDialog.exec(); if (ret == QDialog::Rejected) { // The user canceled the file dialog qDebug() << "ProjectTab::addFrameSlot --> End (dialog cancel)"; return QStringList(); } lastVisitedDir.append(fileDialog.directory().path()); qDebug() << "ProjectTab::selectFiles --> End"; return fileDialog.selectedFiles(); } void ProjectTab::startGimpProcess(const QString &exposureImagePath) { qDebug() << "ProjectTab::startGimpProcess --> Start"; Q_ASSERT(NULL == gimpProcess); #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version const QString gimpCommand(Util::checkCommand("gimp-?.?")); #else // Linux and Apple OS X version const QString gimpCommand = Util::checkCommand("gimp"); #endif if (gimpCommand.isEmpty()) { frontend->showWarning(tr("Warning"), tr("You do not have Gimp installed on your system")); return; } QStringList argList; // arg0 are the options, and arg1 is the path of the frame. // Start Gimp without splash screen. argList.append(QLatin1String("--no-splash")); argList.append(exposureImagePath); /* // Start the process with communication. gimpProcess = new QProcess(this); connect(gimpProcess, SIGNAL(started()), this, SLOT(gimpProcessStarted())); connect(gimpProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(gimpProcessError(QProcess::ProcessError))); connect(gimpProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(gimpProcessFinished(int, QProcess::ExitStatus))); gimpProcess->start(gimpCommand, argList); gimpProcess->waitForStarted(); switch(gimpProcess->state()) { case QProcess::NotRunning: qDebug() << "ProjectTab::startGimpProcess --> Gimp Process not running"); break; case QProcess::Starting: qDebug() << "ProjectTab::startGimpProcess --> Gimp Process starting"); break; case QProcess::Running: qDebug() << "ProjectTab::startGimpProcess --> Gimp process running"); break; } */ QProcess process; if (!process.startDetached(gimpCommand, argList)) { frontend->showWarning(tr("Warning"), tr("Failed to start Gimp!")); frontend->removeFileFromMonitoring(exposureImagePath); qDebug() << "ProjectTab::startGimpProcess --> End (Error)"; return; } qDebug() << "ProjectTab::startGimpProcess --> End"; } void ProjectTab::stopGimpProcess() { qDebug() << "ProjectTab::stopGimpProcess --> Start"; /* Q_ASSERT(NULL != gimpProcess); gimpProcess->close(); delete gimpProcess; gimpProcess = NULL; */ qDebug() << "ProjectTab::stopGimpProcess --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/tooltabs/compositingtab.cpp000644 000000 000000 00000017624 12654352322 027676 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "compositingtab.h" #include #include #include #include #include "domain/domainfacade.h" // #include "technical/preferencestool.h" CompositingTab::CompositingTab(Frontend *f, QWidget *parent) : QWidget(parent) { frontend = f; firstGroupBox = 0; firstIcon = 0; firstSlider = 0; firstButton = 0; secondGroupBox = 0; secondButton = 0; thirdGroupBox = 0; thirdButton = 0; this->setObjectName("CompositingTab"); makeGUI(); retranslateStrings(); } void CompositingTab::makeGUI() { QVBoxLayout *tabLayout = new QVBoxLayout; QString iconFile(frontend->getIconsDirName()); firstGroupBox = new QGroupBox(QLatin1String("firstGroupBox")); // firstGroupBox->setFlat(true); firstIcon = new QLabel(); iconFile.append(QLatin1String("frames.png")); firstIcon->setPixmap(QPixmap(iconFile)); firstSlider = new QSlider(Qt::Horizontal); firstButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("tobegin.png")); firstButton->setIcon(QPixmap(iconFile)); // firstButton->setFlat(true); // firstButton->setFocusPolicy( Qt::NoFocus ); connect(firstButton, SIGNAL(clicked()), this, SLOT(firstSlot())); firstButton->setEnabled(false); QVBoxLayout *firstLayout = new QVBoxLayout; firstLayout->setMargin(4); // firstLayout->setSpacing(2); // firstLayout->addStretch(1); firstLayout->addWidget(firstIcon); firstLayout->addWidget(firstSlider); firstLayout->addStretch(10); firstLayout->addWidget(firstButton); firstLayout->addStretch(10); firstGroupBox->setLayout(firstLayout); secondGroupBox = new QGroupBox(QLatin1String("secondGroupBox")); // secondGroupBox->setFlat(true); secondButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("tobegin.png")); secondButton->setIcon(QPixmap(iconFile)); // secondButton->setFlat(true); // secondButton->setFocusPolicy( Qt::NoFocus ); connect(secondButton, SIGNAL(clicked()), this, SLOT(secondSlot())); secondButton->setEnabled(false); QVBoxLayout *secondLayout = new QVBoxLayout; secondLayout->setMargin(4); // secondLayout->setSpacing(2); // secondLayout->addStretch(1); secondLayout->addWidget(secondButton); secondLayout->addStretch(10); secondGroupBox->setLayout(secondLayout); thirdGroupBox = new QGroupBox(QLatin1String("thirdGroupBox")); // thirdGroupBox->setFlat(true); thirdButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("tobegin.png")); thirdButton->setIcon(QPixmap(iconFile)); // thirdButton->setFlat(true); // thirdButton->setFocusPolicy( Qt::NoFocus ); connect(thirdButton, SIGNAL(clicked()), this, SLOT(thirdSlot())); thirdButton->setEnabled(false); QVBoxLayout *thirdLayout = new QVBoxLayout; thirdLayout->setMargin(4); // thirdLayout->setSpacing(2); // thirdLayout->addStretch(1); thirdLayout->addWidget(thirdButton); thirdLayout->addStretch(10); thirdGroupBox->setLayout(thirdLayout); tabLayout->setMargin(0); tabLayout->setSpacing(2); // tabLayout->addStretch(1); tabLayout->addWidget(firstGroupBox); tabLayout->addWidget(secondGroupBox); tabLayout->addWidget(thirdGroupBox); tabLayout->addStretch(1); setLayout(tabLayout); } void CompositingTab::retranslateStrings() { /* QString infoText = tr("

First Button

"); firstButton->setToolTip(infoText); firstButton->setWhatsThis(infoText); infoText = tr("

Second Button

"); secondButton->setToolTip(infoText); secondButton->setWhatsThis(infoText); infoText = tr("

Third Button

"); thirdButton->setToolTip(infoText); thirdButton->setWhatsThis(infoText); */ } void CompositingTab::initialize() { /* PreferencesTool *pref = PreferencesTool::get(); int active = -1; int numEncoders = pref->getNumberEncoders(); encoderTable->setRowCount(numEncoders); if (numEncoders > 0 ) { QString activeId = pref->getActiveEncoder(); int idx = 0; for (int i = 0; i < numEncoders; ++i) { QString id(QString("%1%2").arg(QLatin1String("encoder")).arg(i)); QString name; QString desc; QString start; QString stop; QString filename; if ( pref->getEncoder(id, name, desc, start, stop, filename) ) { encoderTable->setItem(i, 0, new QTableWidgetItem(name) ); encoderTable->setItem(i, 1, new QTableWidgetItem(desc) ); startEncoderStrings.append(start); stopEncoderStrings.append(stop); outputFiles.append(filename); if ( id.compare(activeId) == 0 ) active = idx; idx++; } } } if (active > -1) { encoderTable->setCurrentCell(active, 0); } */ } /* void CompositingTab::resizeEvent(QResizeEvent *event) { qDebug() << "CompositingTab::resizeEvent --> Start"; QWidget::resizeEvent(event); qDebug() << "CompositingTab::resizeEvent --> End"; } */ void CompositingTab::apply() { /* PreferencesTool *pref = PreferencesTool::get(); // Remove old preferences pref->removeAllEncoders(); // Set new preferences int numEncoders = encoderTable->rowCount(); if (numEncoders > 0) { pref->setNumberEncoders(numEncoders); pref->setActiveEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(encoderTable->currentRow())); for (int i = 0; i < numEncoders; ++i) { pref->setEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(i), encoderTable->item(i, 0)->text(), encoderTable->item(i, 1)->text(), startEncoderStrings[i], stopEncoderStrings[i], outputFiles[i]); } } else { pref->setNumberEncoders(0); pref->setActiveEncoder(QString()); } */ } void CompositingTab::firstSlot() { } void CompositingTab::secondSlot() { } void CompositingTab::thirdSlot() { } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/tooltabs/recordingtab.h000644 000000 000000 00000017661 12654352322 026765 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef RECORDINGTAB_H #define RECORDINGTAB_H #include #include #include #include #include #include #include #include #include #include "frontends/frontend.h" #include "frontends/qtfrontend/toolbar.h" /** * The recording tab on the right hand side of the preview window * @author Ralf Lange */ class RecordingTab : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param df the domain facade of the application * @param tb the tool bar * @param parent the parent of the this widget */ RecordingTab(Frontend *f, ToolBar *tb, QWidget *parent = 0); /** * Destructor */ ~RecordingTab(); /** * Retranslate all strings of the tab after changing the language setting */ void retranslateStrings(); /** * Initializes the table and fills it with starting values. */ void initialize(); /** * Is the camera switched on. * @return true if the camera is on. */ bool isCameraOn(); /** * Check that the camera is switched off. * If not the camera is switched off. */ void checkCameraOff(); /** * Get the recording mode. * @return The recording mode. */ int getRecordingMode(); /** * Set the recording mode. * @param mode The new recording mode. */ void setRecordingMode(int mode); /** * Get the video source index. * @return video source index */ int getVideoSource(); /** * Set the video source index. * @param index Index of the new video source * @return true if the new index is set, false else. */ bool setVideoSource(int index); /** * Get the video resolution index. * @return video resolution index */ int getResolution(); /** * Set the video resolution index. * @param index Index of the new video resolution * @return true if the new index is set, false else. */ bool setResolution(int index); /** * Get the mix mode. * @return The mix mode. */ int getMixMode(); /** * Set the mix mode. * @param mode The new mix mode */ void setMixMode(int mode); /** * Get the mix count. * @return The mix count. */ int getMixCount(); /** * Set the mix count. * @param count The new mix count. */ void setMixCount(int count); /** * Get the playback count. * @return The playback count. */ int getPlaybackCount(); /** * Set the playback count. * @param count The new playback count. */ void setPlaybackCount(int count); /** * Applies the settings in the import tab. */ // void apply(); /** * A new capture button function is selected in the preferences menu. * @param newFunction New selected function. */ void changeCaptureButtonFunction(PreferencesTool::captureButtonFunction newFunction); private: /** * Create the GUI of the tab */ void makeGUI(); /** * Creates key accelerators (keyboard shortcuts) * More can be found in the function MainWindowGUI::createAccelerators(). */ void createAccelerators(); /** * Clip and scale the raw image to the project image size * @param image The image to clip and scale * @return The cliped and scaled image */ QImage clipAndScale(QImage image); protected: // void resizeEvent(QResizeEvent *event); public slots: /** * */ void captureFrame(); /** * Slot for notified the recording tab when the recording mode changes, so that widgets * can be updated. * @param index the new viewing mode. */ void changeRecordingMode(int index); /** * Slot for notified the recording tab when the grabber source changes, so that grabber * can be updated. * @param index the new viewing mode. */ void changeVideoSource(int index); /** * Slot for notified the camera controller when the resolution changes, * so that resolution can be updated. * @param index the new resolution value. */ void changeResolution(int index); /** * Slot for notified the recording tab when the camera button is pressed. */ void cameraButtonClicked(); /** * Slot for notified the recording tab when the mix mode changes, so that widgets * can be updated. * @param index the new mix mode. */ void changeMixMode(int index); /** * Slot for updating the slider value when running in automatic mode. * @param value the new slider value. */ void changeMixCount(int value); /** * Slot for setting the mix mode to Mixing. * Used by the shortcut key. */ void setMixModeMixing(); /** * Slot for setting the mix mode to Diffing. * Used by the shortcut key. */ void setMixModeDiffing(); /** * Slot for setting the mix mode to Playback. * Used by the shortcut key. */ void setMixModePlayback(); /** * Slot for notified the recording tab when the unit mode changes. * @param index the new unit mode. */ // void changeUnitMode(int index); /** * Slot for updating the slider value when running in automatic mode. * @param newFpuCount the new slider value. */ // void changeFpuCount(int newFpuCount); private: Frontend *frontend; ToolBar *toolBar; bool cameraOn; QTimer *cameraTimer; int captureFunction; QShortcut *mixAccel; QShortcut *diffAccel; QShortcut *playbackAccel; QGroupBox *recordingGroupBox; QComboBox *recordingModeCombo; QGroupBox *cameraGroupBox; QLabel *videoSourceLabel; QComboBox *videoSourceCombo; QLabel *resolutionLabel; QComboBox *resolutionCombo; QPushButton *cameraButton; QGroupBox *captureGroupBox; QComboBox *mixModeCombo; QLabel *mixCountSliderCaption; QSlider *mixCountSlider; // QGroupBox *autoGroupBox; // QComboBox *unitChooseCombo; // QLabel *fpuSliderCaption; // Frames per unit // QSlider *fpuSlider; // QTimer *autoCaptureTimer; private slots: /** * Slot called by the cameraTimer which checks if the frame has been fully captured. */ void storeFrame(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/tooltabs/compositingtab.h000644 000000 000000 00000005306 12654352322 027335 0ustar00rootroot000000 000000 /*************************************************************************** * Copyright (C) 2010-2015 by Ralf Lange * * ralf.lange@longsoft.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMPOSITINGTAB_H #define COMPOSITINGTAB_H #include #include #include #include #include #include #include "frontends/frontend.h" /** * The view tab on the right hand side of the preview window * @author Ralf Lange */ class CompositingTab : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param parent the parent of the this widget */ CompositingTab(Frontend *f, QWidget *parent = 0); /** * Retranslate all strings of the tab after changing the language setting */ void retranslateStrings(); /** * Initializes the table and fills it with starting values. */ void initialize(); /** * Applies the settings in the import tab. */ void apply(); protected: // void resizeEvent(QResizeEvent *event); private slots: void firstSlot(); void secondSlot(); void thirdSlot(); private: Frontend *frontend; QGroupBox *firstGroupBox; QLabel *firstIcon; QSlider *firstSlider; QPushButton *firstButton; QGroupBox *secondGroupBox; QPushButton *secondButton; QGroupBox *thirdGroupBox; QPushButton *thirdButton; void makeGUI(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/tooltabs/projecttab.h000644 000000 000000 00000033523 12654352322 026452 0ustar00rootroot000000 000000 /*************************************************************************** * Copyright (C) 2010-2015 by Ralf Lange * * ralf.lange@longsoft.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PROJECTTAB_H #define PROJECTTAB_H #include #include #include #include #include #include "frontends/frontend.h" #include "frontends/observer.h" /** * The project tab on the right hand side of the preview window * @author Ralf Lange */ class ProjectTab : public QWidget, public Observer { Q_OBJECT public: /** * Sets up the tab. * @param f the frontend of the application * @param lvd the last visited directory * @param parent the parent of the this widget */ ProjectTab(Frontend *f, const QString &lvd, QWidget *parent = 0); /** * Descructor */ ~ProjectTab(); /** * Retranslate all GUI strings */ void retranslateStrings(); /** * Initializes the table and fills it with starting values. */ void initialize(); /** * Applies the settings in the import tab. */ void apply(); /** * Enable all functionality of the tab */ void enableTab(); /** * Disable all functionality of the tab */ void disableTab(); /************************************************************************** * Animation notification functions **************************************************************************/ /** * Function to receive notification when the model is erased. */ void updateRemoveProject(); /** * Function to receive notification when a new project is created. */ void updateNewProject(); /** * Function for receiving notification when a project is opened. */ virtual void updateOpenProject(); /** * Function to recieve notification when a sound of a scene is to be played. * @param sceneIndex the scene to be played */ void updatePlaySound(int sceneIndex); /** * Function to recieve notification when new mix mode is set. * @param newMixMode the new mix mode */ void updateMixMode(int newMixMode); /** * Function to recieve notification when new mix count is set. * @param newMixCount the new mix count */ void updateMixCount(int newMixCount); /** * Function to recieve notification when new live view frames per second value is set. * @param newFps the new frames per second value */ void updateLiveViewFps(int newFps); /** * Function to recieve notification when new video frames per second value is set. * @param newFps the new frames per second value */ void updateVideoFps(int newFps); /************************************************************************** * Scene notification functions **************************************************************************/ /** * Function to recieve notification when a new scene is added to the * model. * @param sceneIndex the index of the new scene. */ void updateAddScene(int sceneIndex); /** * Function to recieve notification when a new scene is added to the * model. * @param sceneIndex the index of the new scene. */ void updateInsertScene(int sceneIndex); /** * Function which recieves notification when a scene is selected as the * active scene in the animationmodel. */ void updateActivateScene(); /** * Function to recieve notification when a scene is removed from * the model. * @param sceneIndex the scene which has been removed from the model. */ void updateRemoveScene(int sceneIndex); /** * Function which recieves notification when a scene in the animation * has been moved and moves the icons in the timeline accordingly. * @param sceneNumber the scene which have been moved. * @param movePosition the position the scene has been moved to. */ void updateMoveScene(int sceneNumber, int movePosition); /************************************************************************** * Take notification functions **************************************************************************/ /** * Function to recieve notification when a new take is added to the * model. * @param sceneIndex the scene where the new take is added. * @param takeIndex the index of the new take. */ void updateAddTake(int sceneIndex, int takeIndex); /** * Function to recieve notification when a new take is inserted to the * model. * @param sceneIndex the scene where the new take is inserted. * @param takeIndex the index of the new take. */ void updateInsertTake(int sceneIndex, int takeIndex); /** * Function which recieves notification when a take is selected as the * active take in the animationmodel. */ void updateActivateTake(); /** * Function to recieve notification when a take is removed from * the model. * @param sceneIndex The scene of the take which has been removed from the model. * @param takeIndex The take which has been removed from the model. */ void updateRemoveTake(int sceneIndex, int takeIndex); /************************************************************************** * Exposure notification functions **************************************************************************/ /** * Function to recieve notification when a new exposure is added to the * model. * @param sceneIndex the scene of the take where the new exposure is added. * @param takeIndex the take where the new exposure is added. * @param exposureIndex the index of the new exposure. */ void updateAddExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Function to recieve notification when a new exposure is inserted to the * model. * @param sceneIndex the scene of the take where the new exposure is inserted. * @param takeIndex the take where the new exposure is inserted. * @param exposureIndex the index of the new exposure. */ void updateInsertExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Function to recieve notification when one exposure are deleted. * @param sceneIndex the scene index of the selected exposure. * @param takeIndex the take index of the selected exposure. * @param exposureIndex the index of the removed exposure. */ void updateRemoveExposure(int sceneIndex, int takeIndex, int exposureIndex); /** * Function to recieve notification when one or more frames are moved. */ void updateMoveExposures(int fromFrame, int toFrame, int movePosition); /** * Function to recieve notification when a new frame is selected. */ void updateActivateExposure(); /** * Function to recieve notification when the frame of an exposure has modifyed. * @param modSceneIndex The index of the scene of the modifyed exposure. * @param modTakeIndex The index of the take of the modifyed exposure. * @param modExposureIndex The index of the modifyed exposure. */ void updateModifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex); public slots: /** * Insert scene butten pressed. */ void insertSceneSlot(); /** * Add scene butten pressed. */ void addSceneSlot(); /** * Remove scene button pressed. */ void removeSceneSlot(); /** * Insert take butten pressed. */ void insertTakeSlot(); /** * Add take butten pressed. */ void addTakeSlot(); /** * Remove take button pressed. */ void removeTakeSlot(); /** * Insert frames button pressed. */ void insertFramesSlot(); /** * Add frames button pressed. */ void addFramesSlot(); /** * Remove frames button pressed. */ void removeFramesSlot(); protected: // void resizeEvent(QResizeEvent *event); private: /** * Get the selected item indexes for scene, take and exposure. * @param sceneIndex the index of the selected scene. * @param takeIndex the index of the selected take or -1 if only a scene is selected. * @param exposureIndex the index of the selected exposure or -1 if only a scene/take is selected. * @return True if some items selected, false if not. */ bool getSelectedItems(int &sceneIndex, int &takeIndex, int &exposureIndex); /** * Remove take with all exposures from scene item. * @param sceneIndex The index of the scene to remove. */ void removeScene(int sceneIndex); /** * Remove all takes of the scene using the undo functions * @param removeSceneIndex Index of the scene of the takes are to remove */ void removeSceneTakes(int removeSceneIndex); /** * Remove take with all exposures from scene item. * @param sceneItem The item of the scene to remove the take * @param takeIndex The index of the take to remove. */ void removeTake(QTreeWidgetItem *sceneItem, int takeIndex); /** * Remove all takes of the scene using the undo functions * @param removeSceneIndex Index of the scene of the take of the exposures are to remove * @param removeTakeIndex Index of the take the exposures are to remove */ void removeTakeExposures(int removeSceneIndex, int removeTakeIndex); /** * Unset the active exposure in the project tree. */ void unsetActiveItems(); /** * Set a new active exposure in the project tree. */ void setActiveItems(); /** * Select the graphic files to insert or append * @return List with selected files */ QStringList selectFiles(); /** * Create all GUI elements. */ void makeGUI(); /** * Start the gimp process. * @param exposureImagePath The path to the first image to edit. */ void startGimpProcess(const QString &exposureImagePath); /** * Stop the gimp process. */ void stopGimpProcess(); private slots: /** * Click in the project tree * @param exposureItem The specified item is the item that was clicked, or 0 if no item was clicked. * @param column The column is the item's column that was clicked. */ void itemClicked(QTreeWidgetItem *exposureItem, int column); /** * Double click in the project tree * @param exposureItem The specified item is the item that was clicked, or 0 if no item was clicked. * @param column The column is the item's column that was clicked. */ void itemDoubleClicked(QTreeWidgetItem *exposureItem, int column); /** * Double click in the project tree */ void itemSelectionChanged(); /** * Launch the photo editor button pressed */ void editFrameSlot(); /** * Brings up a dialog so that the user can choose a file to load. */ void chooseFrame(); /** * */ void gimpProcessStarted(); /** * */ void gimpProcessError(QProcess::ProcessError error); /** * */ void gimpProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); private: Frontend *frontend; QString lastVisitedDir; bool tabEnabled; /** The active scene in the projecttree */ int activeSceneIndex; /** The active take in the timeline */ int activeTakeIndex; /** The active exposure in the timeline*/ int activeExposureIndex; QGroupBox *projectGroupBox; QTreeWidget *projectTree; QGroupBox *scenesGroupBox; QPushButton *insertSceneButton; QPushButton *addSceneButton; QPushButton *removeSceneButton; QGroupBox *takesGroupBox; QPushButton *insertTakeButton; QPushButton *addTakeButton; QPushButton *removeTakeButton; QGroupBox *framesGroupBox; QPushButton *insertFramesButton; QPushButton *addFramesButton; QPushButton *removeFramesButton; QGroupBox *editGroupBox; QPushButton *editFrameButton; QProcess *gimpProcess; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/cameracontrollerdialog.h000644 000000 000000 00000056327 12670474563 030645 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef CAMERACONTROLLERDIALOG_H #define CAMERACONTROLLERDIALOG_H #include #include #include #include #include #include #include #include "frontends/frontend.h" #include "technical/grabber/grabbercontroller.h" #include "technical/grabber/imagegrabberdevice.h" class CameraControllerDialog : public QDialog { Q_OBJECT public: /** * Constructor */ CameraControllerDialog(Frontend *f, ImageGrabberDevice *device, QWidget *parent = 0); /** * Create the GUI elements */ void makeGUI(); /** * Retranslate all strings of the tab after changing the language setting */ void retranslateStrings(); /** * Initialize the dialog */ void initialize(); /** * Set up the controller. * @return true on success, false otherwise */ bool setUp(); /** * Tear down the controller. * @return true on success, false otherwise */ bool tearDown(); private slots: /** * Slot for notified the camera contoller when automatic brightness is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoBrightness(int newState); /** * Slot for notified the camera contoller when automatic brightness is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoBrightness(int newState, bool save); /** * Slot for notified the camera controller when the brightness changes, * so that brightness can be updated. * @param value the new brightness value. */ void changeBrightness(int value); /** * Slot for notified the camera controller when the brightness changes, * so that brightness can be updated. * @param value the new brightness value. * @param save If true than the new value is saved in the preferences file. */ void changeBrightness(int value, bool save); /** * Slot for notified the camera contoller when automatic contrast is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoContrast(int newState); /** * Slot for notified the camera contoller when automatic contrast is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoContrast(int newState, bool save); /** * Slot for notified the camera controller when the contrast changes, * so that contrast can be updated. * @param value the new contrast value. */ void changeContrast(int value); /** * Slot for notified the camera controller when the contrast changes, * so that contrast can be updated. * @param value the new contrast value. * @param save If true than the new value is saved in the preferences file. */ void changeContrast(int value, bool save); /** * Slot for notified the camera contoller when automatic saturation is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoSaturation(int newState); /** * Slot for notified the camera contoller when automatic saturation is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoSaturation(int newState, bool save); /** * Slot for notified the camera controller when the saturation changes, * so that saturation can be updated. * @param value the new saturation value. */ void changeSaturation(int value); /** * Slot for notified the camera controller when the saturation changes, * so that saturation can be updated. * @param value the new saturation value. * @param save If true than the new value is saved in the preferences file. */ void changeSaturation(int value, bool save); /** * Slot for notified the camera contoller when automatic hue is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoHue(int newState); /** * Slot for notified the camera contoller when automatic hue is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoHue(int newState, bool save); /** * Slot for notified the camera controller when the hue changes, * so that hue can be updated. * @param value the new hue value. */ void changeHue(int value); /** * Slot for notified the camera controller when the hue changes, * so that hue can be updated. * @param value the new hue value. * @param save If true than the new value is saved in the preferences file. */ void changeHue(int value, bool save); /** * Slot for notified the camera contoller when automatic gamma is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoGamma(int newState); /** * Slot for notified the camera contoller when automatic gamma is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoGamma(int newState, bool save); /** * Slot for notified the camera controller when the gamma changes, * so that gamma can be updated. * @param value the new gamma value. */ void changeGamma(int value); /** * Slot for notified the camera controller when the gamma changes, * so that gamma can be updated. * @param value the new gamma value. * @param save If true than the new value is saved in the preferences file. */ void changeGamma(int value, bool save); /** * Slot for notified the camera contoller when automatic sharpness is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoSharpness(int newState); /** * Slot for notified the camera contoller when automatic sharpness is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoSharpness(int newState, bool save); /** * Slot for notified the camera controller when the sharpness changes, * so that sharpness can be updated. * @param value the new sharpness value. */ void changeSharpness(int value); /** * Slot for notified the camera controller when the sharpness changes, * so that sharpness can be updated. * @param value the new sharpness value. * @param save If true than the new value is saved in the preferences file. */ void changeSharpness(int value, bool save); /** * Slot for notified the camera contoller when automatic backlight is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoBacklight(int newState); /** * Slot for notified the camera contoller when automatic backlight is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoBacklight(int newState, bool save); /** * Slot for notified the camera controller when the backlight compensation changes, * so that backlight compensation can be updated. * @param value the new backlight compensation value. */ void changeBacklight(int value); /** * Slot for notified the camera controller when the backlight compensation changes, * so that backlight compensation can be updated. * @param value the new backlight compensation value. * @param save If true than the new value is saved in the preferences file. */ void changeBacklight(int value, bool save); /** * Slot for notified the camera contoller when automatic gain is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoGain(int newState); /** * Slot for notified the camera contoller when automatic gain is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoGain(int newState, bool save); /** * Slot for notified the camera controller when the gain changes, * so that gain can be updated. * @param value the new gain value. */ void changeGain(int value); /** * Slot for notified the camera controller when the gain changes, * so that gain can be updated. * @param value the new gain value. * @param save If true than the new value is saved in the preferences file. */ void changeGain(int value, bool save); /** * Slot for notified the camera contoller when automatic color enable is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoColor(int newState); /** * Slot for notified the camera contoller when automatic color enable is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoColor(int newState, bool save); /** * Slot for notified the camera controller when the color enable changes, * so that color enable can be updated. * @param value the new white balance value. */ void changeColor(int value); /** * Slot for notified the camera controller when the color enable changes, * so that color enable can be updated. * @param value the new white balance value. * @param save If true than the new value is saved in the preferences file. */ void changeColor(int value, bool save); /** * Slot for notified the camera contoller when automatic white balance is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoWhite(int newState); /** * Slot for notified the camera contoller when automatic white balance is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoWhite(int newState, bool save); /** * Slot for notified the camera controller when the white balance changes, * so that white balance can be updated. * @param value the new white balance value. */ void changeWhite(int value); /** * Slot for notified the camera controller when the white balance changes, * so that white balance can be updated. * @param value the new white balance value. * @param save If true than the new value is saved in the preferences file. */ void changeWhite(int value, bool save); /** * Slot for notified the camera contoller when automatic exposure is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoExposure(int newState); /** * Slot for notified the camera contoller when automatic exposure is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoExposure(int newState, bool save); /** * Slot for notified the camera controller when the exposure changes, * so that exposure can be updated. * @param value the new exposure value. */ void changeExposure(int value); /** * Slot for notified the camera controller when the exposure changes, * so that exposure can be updated. * @param value the new exposure value. * @param save If true than the new value is saved in the preferences file. */ void changeExposure(int value, bool save); /** * Slot for notified the camera contoller when automatic zoom is changed, so that * camera contoller can be updaten. * @param newStateb The new state of the check box */ void changeAutoZoom(int newState); /** * Slot for notified the camera contoller when automatic zoom is changed, so that * camera contoller can be updaten. * @param newStateb The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoZoom(int newState, bool save); /** * Slot for notified the camera controller when the zoom changes, * so that zoom can be updated. * @param value the new zoo value. */ void changeZoom(int value); /** * Slot for notified the camera controller when the zoom changes, * so that zoom can be updated. * @param value The new zoo value. * @param save If true than the new value is saved in the preferences file. */ void changeZoom(int value, bool save); /** * Slot for notified the camera contoller when automatic focus is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoFocus(int newState); /** * Slot for notified the camera contoller when automatic focus is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoFocus(int newState, bool save); /** * Slot for notified the camera controller when the focus changes, * so that focus can be updated. * @param value the new focus value. */ void changeFocus(int value); /** * Slot for notified the camera controller when the focus changes, * so that focus can be updated. * @param value the new focus value. * @param save If true than the new value is saved in the preferences file. */ void changeFocus(int value, bool save); /** * Slot for notified the camera contoller when automatic pan is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoPan(int newState); /** * Slot for notified the camera contoller when automatic pan is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoPan(int newState, bool save); /** * Slot for notified the camera controller when the pan changes, * so that pan can be updated. * @param value the new pan value. */ void changePan(int value); /** * Slot for notified the camera controller when the pan changes, * so that pan can be updated. * @param value the new pan value. * @param save If true than the new value is saved in the preferences file. */ void changePan(int value, bool save); /** * Slot for notified the camera contoller when automatic tilt is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoTilt(int newState); /** * Slot for notified the camera contoller when automatic tilt is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoTilt(int newState, bool save); /** * Slot for notified the camera controller when the tilt changes, * so that tilt can be updated. * @param value the new tilt value. */ void changeTilt(int value); /** * Slot for notified the camera controller when the tilt changes, * so that tilt can be updated. * @param value the new tilt value. * @param save If true than the new value is saved in the preferences file. */ void changeTilt(int value, bool save); /** * Slot for notified the camera contoller when automatic iris is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoIris(int newState); /** * Slot for notified the camera contoller when automatic iris is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoIris(int newState, bool save); /** * Slot for notified the camera controller when the iris changes, * so that iris can be updated. * @param value the new iris value. */ void changeIris(int value); /** * Slot for notified the camera controller when the iris changes, * so that iris can be updated. * @param value the new iris value. * @param save If true than the new value is saved in the preferences file. */ void changeIris(int value, bool save); /** * Slot for notified the camera contoller when automatic roll is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box */ void changeAutoRoll(int newState); /** * Slot for notified the camera contoller when automatic roll is changed, so that * camera contoller can be updaten. * @param newState The new state of the check box * @param save If true than the new sate is saved in the preferences file. */ void changeAutoRoll(int newState, bool save); /** * Slot for notified the camera controller when the roll changes, * so that iris can be updated. * @param value the new roll value. */ void changeRoll(int value); /** * Slot for notified the camera controller when the roll changes, * so that iris can be updated. * @param value the new roll value. * @param save If true than the new value is saved in the preferences file. */ void changeRoll(int value, bool save); /** * Slot for notified the camera controller to reset to the default values. */ void reset(); /** * Slot for notified the camera controller to close the dialog. * * @brief close */ void close(); private: /** * Configure the slider with the values. * @param slider The slider to configure. * @param controlCaps The control capabilities. * @param value The actual value of the slider. * @return The step lengt for the values of the slider. */ void configureSlider(QSlider *slider, GrabberControlCapabilities *controlCaps, int value); Frontend *frontend; ImageGrabberDevice *grabberDevice; QString deviceId; GrabberController *grabberController; QGroupBox *qualityGroupBox; int qualityCount; QCheckBox *brightnessCheckBox; QLabel *brightnessLabel; QSlider *brightnessSlider; QCheckBox *contrastCheckBox; QLabel *contrastLabel; QSlider *contrastSlider; QCheckBox *saturationCheckBox; QLabel *saturationLabel; QSlider *saturationSlider; QCheckBox *hueCheckBox; QLabel *hueLabel; QSlider *hueSlider; QCheckBox *gammaCheckBox; QLabel *gammaLabel; QSlider *gammaSlider; QCheckBox *sharpnessCheckBox; QLabel *sharpnessLabel; QSlider *sharpnessSlider; QCheckBox *backlightCheckBox; QLabel *backlightLabel; QSlider *backlightSlider; QCheckBox *whiteCheckBox; QLabel *whiteLabel; QSlider *whiteSlider; QCheckBox *gainCheckBox; QLabel *gainLabel; QSlider *gainSlider; QCheckBox *colorCheckBox; QLabel *colorLabel; QSlider *colorSlider; QGroupBox *controlGroupBox; int controlCount; QCheckBox *exposureCheckBox; QLabel *exposureLabel; QSlider *exposureSlider; QCheckBox *zoomCheckBox; QLabel *zoomLabel; QSlider *zoomSlider; QCheckBox *focusCheckBox; QLabel *focusLabel; QSlider *focusSlider; QCheckBox *panCheckBox; QLabel *panLabel; QSlider *panSlider; QCheckBox *tiltCheckBox; QLabel *tiltLabel; QSlider *tiltSlider; QCheckBox *irisCheckBox; QLabel *irisLabel; QSlider *irisSlider; QCheckBox *rollCheckBox; QLabel *rollLabel; QSlider *rollSlider; QVBoxLayout *mainLayout; QPushButton *resetButton; QPushButton *closeButton; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/cameracontrollerdialog.cpp000644 000000 000000 00000234433 12670474563 031174 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "cameracontrollerdialog.h" #include #include #include #include #include "technical/preferencestool.h" CameraControllerDialog::CameraControllerDialog(Frontend *f, ImageGrabberDevice *device, QWidget *parent) : QDialog(parent) { qDebug() << "CameraControllerDialog::Constructor --> Start"; frontend = f; grabberDevice = device; deviceId = grabberDevice->getDeviceId(); deviceId.remove(QLatin1Char(' ')); // Remove all spaces (Windows) deviceId.remove(QLatin1Char('/')); // Remove all slashs (Linux) grabberController = device->getController(); makeGUI(); retranslateStrings(); qDebug() << "CameraControllerDialog::Constructor --> End"; } void CameraControllerDialog::makeGUI() { qDebug() << "CameraControllerDialog::makeGUI --> Start"; setWindowTitle("windowTitle"); setMinimumSize(200, 500); // Enable help window for modal dialoges this->setAttribute(Qt::WA_GroupLeader); qualityGroupBox = new QGroupBox("qualityGroupBox"); QVBoxLayout *qualityLayout = new QVBoxLayout; qualityGroupBox->setLayout(qualityLayout); qualityCount = 0; brightnessCheckBox = new QCheckBox("brightnessCheckBox"); brightnessCheckBox->setChecked(false); connect(brightnessCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoBrightness(int))); brightnessCheckBox->hide(); brightnessLabel = new QLabel("brightnessLabel"); brightnessSlider = new QSlider(Qt::Horizontal); connect(brightnessSlider, SIGNAL(valueChanged(int)), this, SLOT(changeBrightness(int))); brightnessLabel->hide(); brightnessSlider->hide(); contrastCheckBox = new QCheckBox("contrastCheckBox"); contrastCheckBox->setChecked(false); connect(contrastCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoContrast(int))); contrastCheckBox->hide(); contrastLabel = new QLabel("contrastLabel"); contrastSlider = new QSlider(Qt::Horizontal); connect(contrastSlider, SIGNAL(valueChanged(int)), this, SLOT(changeContrast(int))); contrastLabel->hide(); contrastSlider->hide(); saturationCheckBox = new QCheckBox("saturationCheckBox"); saturationCheckBox->setChecked(false); connect(saturationCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoSaturation(int))); saturationCheckBox->hide(); saturationLabel = new QLabel("saturationLabel"); saturationSlider = new QSlider(Qt::Horizontal); connect(saturationSlider, SIGNAL(valueChanged(int)), this, SLOT(changeSaturation(int))); saturationLabel->hide(); saturationSlider->hide(); hueCheckBox = new QCheckBox("hueCheckBox"); hueCheckBox->setChecked(false); connect(hueCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoHue(int))); hueCheckBox->hide(); hueLabel = new QLabel("hueLabel"); hueSlider = new QSlider(Qt::Horizontal); connect(hueSlider, SIGNAL(valueChanged(int)), this, SLOT(changeHue(int))); hueLabel->hide(); hueSlider->hide(); gammaCheckBox = new QCheckBox("gammaCheckBox"); gammaCheckBox->setChecked(false); connect(gammaCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoGamma(int))); gammaCheckBox->hide(); gammaLabel = new QLabel("gammaLabel"); gammaSlider = new QSlider(Qt::Horizontal); connect(gammaSlider, SIGNAL(valueChanged(int)), this, SLOT(changeGamma(int))); gammaLabel->hide(); gammaSlider->hide(); sharpnessCheckBox = new QCheckBox("sharpnessCheckBox"); sharpnessCheckBox->setChecked(false); connect(sharpnessCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoSharpness(int))); sharpnessCheckBox->hide(); sharpnessLabel = new QLabel("sharpnessLabel"); sharpnessSlider = new QSlider(Qt::Horizontal); connect(sharpnessSlider, SIGNAL(valueChanged(int)), this, SLOT(changeSharpness(int))); sharpnessLabel->hide(); sharpnessSlider->hide(); backlightCheckBox = new QCheckBox("backlightCheckBox"); backlightCheckBox->setChecked(false); connect(backlightCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoBacklight(int))); backlightCheckBox->hide(); backlightLabel = new QLabel("backlightLabel"); backlightSlider = new QSlider(Qt::Horizontal); connect(backlightSlider, SIGNAL(valueChanged(int)), this, SLOT(changeBacklight(int))); backlightLabel->hide(); backlightSlider->hide(); whiteCheckBox = new QCheckBox("whiteCheckBox"); whiteCheckBox->setChecked(false); connect(whiteCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoWhite(int))); whiteCheckBox->hide(); whiteLabel = new QLabel("whiteLabel"); whiteSlider = new QSlider(Qt::Horizontal); connect(whiteSlider, SIGNAL(valueChanged(int)), this, SLOT(changeWhite(int))); whiteLabel->hide(); whiteSlider->hide(); gainCheckBox = new QCheckBox("gainCheckBox"); gainCheckBox->setChecked(false); connect(gainCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoGain(int))); gainCheckBox->hide(); gainLabel = new QLabel("gainLabel"); gainSlider = new QSlider(Qt::Horizontal); connect(gainSlider, SIGNAL(valueChanged(int)), this, SLOT(changeGain(int))); gainLabel->hide(); gainSlider->hide(); colorCheckBox = new QCheckBox("colorCheckBox"); colorCheckBox->setChecked(false); connect(colorCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoColor(int))); colorCheckBox->hide(); colorLabel = new QLabel("colorLabel"); colorSlider = new QSlider(Qt::Horizontal); connect(colorSlider, SIGNAL(valueChanged(int)), this, SLOT(changeColor(int))); colorLabel->hide(); colorSlider->hide(); controlGroupBox = new QGroupBox("controlGroupBox"); QVBoxLayout *controlLayout = new QVBoxLayout; controlGroupBox->setLayout(controlLayout); controlCount = 0; exposureCheckBox = new QCheckBox("exposureCheckBox"); exposureCheckBox->setChecked(false); connect(exposureCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoExposure(int))); exposureCheckBox->hide(); exposureLabel = new QLabel("exposureLabel"); exposureSlider = new QSlider(Qt::Horizontal); connect(exposureSlider, SIGNAL(valueChanged(int)), this, SLOT(changeExposure(int))); exposureLabel->hide(); exposureSlider->hide(); zoomCheckBox = new QCheckBox("zoomCheckBox"); zoomCheckBox->setChecked(false); connect(zoomCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoZoom(int))); zoomCheckBox->hide(); zoomLabel = new QLabel("zoomLabel"); zoomSlider = new QSlider(Qt::Horizontal); connect(zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(changeZoom(int))); zoomLabel->hide(); zoomSlider->hide(); focusCheckBox = new QCheckBox("focusCheckBox"); focusCheckBox->setChecked(false); connect(focusCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoFocus(int))); focusCheckBox->hide(); focusLabel = new QLabel("focusLabel"); focusSlider = new QSlider(Qt::Horizontal); connect(focusSlider, SIGNAL(valueChanged(int)), this, SLOT(changeFocus(int))); focusLabel->hide(); focusSlider->hide(); panCheckBox = new QCheckBox("panCheckBox"); panCheckBox->setChecked(false); connect(panCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoPan(int))); panCheckBox->hide(); panLabel = new QLabel("panLabel"); panSlider = new QSlider(Qt::Horizontal); connect(panSlider, SIGNAL(valueChanged(int)), this, SLOT(changePan(int))); panLabel->hide(); panSlider->hide(); tiltCheckBox = new QCheckBox("tiltCheckBox"); tiltCheckBox->setChecked(false); connect(tiltCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoTilt(int))); tiltCheckBox->hide(); tiltLabel = new QLabel("tiltLabel"); tiltSlider = new QSlider(Qt::Horizontal); connect(tiltSlider, SIGNAL(valueChanged(int)), this, SLOT(changeTilt(int))); tiltLabel->hide(); tiltSlider->hide(); irisCheckBox = new QCheckBox("irisCheckBox"); irisCheckBox->setChecked(false); connect(irisCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoIris(int))); irisCheckBox->hide(); irisLabel = new QLabel("irisLabel"); irisSlider = new QSlider(Qt::Horizontal); connect(irisSlider, SIGNAL(valueChanged(int)), this, SLOT(changeIris(int))); irisLabel->hide(); irisSlider->hide(); rollCheckBox = new QCheckBox("rollCheckBox"); rollCheckBox->setChecked(false); connect(rollCheckBox, SIGNAL(stateChanged(int)), this, SLOT(changeAutoRoll(int))); rollCheckBox->hide(); rollLabel = new QLabel("rollLabel"); rollSlider = new QSlider(Qt::Horizontal); connect(rollSlider, SIGNAL(valueChanged(int)), this, SLOT(changeRoll(int))); rollLabel->hide(); rollSlider->hide(); resetButton = new QPushButton("resetButton"); connect(resetButton, SIGNAL(clicked()), this, SLOT(reset())); closeButton = new QPushButton("closeButton"); connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); QVBoxLayout *bottomLayout = new QVBoxLayout; bottomLayout->addWidget(resetButton); // bottomLayout->addStretch(); bottomLayout->addWidget(closeButton); mainLayout = new QVBoxLayout; // mainLayout->addLayout(topLayout); qualityLayout->addWidget(brightnessCheckBox); qualityLayout->addWidget(brightnessLabel); qualityLayout->addWidget(brightnessSlider); qualityLayout->addWidget(contrastCheckBox); qualityLayout->addWidget(contrastLabel); qualityLayout->addWidget(contrastSlider); qualityLayout->addWidget(saturationCheckBox); qualityLayout->addWidget(saturationLabel); qualityLayout->addWidget(saturationSlider); qualityLayout->addWidget(hueCheckBox); qualityLayout->addWidget(hueLabel); qualityLayout->addWidget(hueSlider); qualityLayout->addWidget(gammaCheckBox); qualityLayout->addWidget(gammaLabel); qualityLayout->addWidget(gammaSlider); qualityLayout->addWidget(sharpnessCheckBox); qualityLayout->addWidget(sharpnessLabel); qualityLayout->addWidget(sharpnessSlider); qualityLayout->addWidget(backlightCheckBox); qualityLayout->addWidget(backlightLabel); qualityLayout->addWidget(backlightSlider); qualityLayout->addWidget(whiteCheckBox); qualityLayout->addWidget(whiteLabel); qualityLayout->addWidget(whiteSlider); qualityLayout->addWidget(gainCheckBox); qualityLayout->addWidget(gainLabel); qualityLayout->addWidget(gainSlider); qualityLayout->addWidget(colorCheckBox); qualityLayout->addWidget(colorLabel); qualityLayout->addWidget(colorSlider); qualityLayout->addStretch(); controlLayout->addWidget(exposureCheckBox); controlLayout->addWidget(exposureLabel); controlLayout->addWidget(exposureSlider); controlLayout->addWidget(zoomCheckBox); controlLayout->addWidget(zoomLabel); controlLayout->addWidget(zoomSlider); controlLayout->addWidget(focusCheckBox); controlLayout->addWidget(focusLabel); controlLayout->addWidget(focusSlider); controlLayout->addWidget(panCheckBox); controlLayout->addWidget(panLabel); controlLayout->addWidget(panSlider); controlLayout->addWidget(tiltCheckBox); controlLayout->addWidget(tiltLabel); controlLayout->addWidget(tiltSlider); controlLayout->addWidget(irisCheckBox); controlLayout->addWidget(irisLabel); controlLayout->addWidget(irisSlider); controlLayout->addWidget(rollCheckBox); controlLayout->addWidget(rollLabel); controlLayout->addWidget(rollSlider); controlLayout->addStretch(); mainLayout->addWidget(qualityGroupBox); mainLayout->addWidget(controlGroupBox); mainLayout->addLayout(bottomLayout); this->setLayout(mainLayout); qDebug() << "CameraControllerDialog::makeGUI --> End"; } void CameraControllerDialog::retranslateStrings() { qDebug() << "CameraControllerDialog::retranslateStrings --> Start"; setWindowTitle(tr("qStopMotion Camera Controller")); qualityGroupBox->setTitle(tr("Video Quality")); brightnessCheckBox->setText(tr("Automatic Brightness")); brightnessLabel->setText(tr("Brightness:")); contrastCheckBox->setText(tr("Automatic Contrast")); contrastLabel->setText(tr("Contrast:")); saturationCheckBox->setText(tr("Automatic Saturation")); saturationLabel->setText(tr("Saturation:")); hueCheckBox->setText(tr("Automatic Hue")); hueLabel->setText(tr("Hue:")); gammaCheckBox->setText(tr("Automatic Gamma")); gammaLabel->setText(tr("Gamma:")); sharpnessCheckBox->setText(tr("Automatic Sharpness")); sharpnessLabel->setText(tr("Sharpness:")); backlightCheckBox->setText(tr("Automatic Backlight Compensation")); backlightLabel->setText(tr("Backlight Compensation:")); whiteCheckBox->setText(tr("Automatic White Balance")); whiteLabel->setText(tr("White Balance:")); gainCheckBox->setText(tr("Automatic Gain")); gainLabel->setText(tr("Gain:")); colorCheckBox->setText(tr("Automatic Color Enable")); colorLabel->setText(tr("Color Enable:")); controlGroupBox->setTitle(tr("Camera Control")); exposureCheckBox->setText(tr("Automatic Exposure")); exposureLabel->setText(tr("Exposure:")); zoomCheckBox->setText(tr("Automatic Zoom")); zoomLabel->setText(tr("Zoom:")); focusCheckBox->setText(tr("Automatic Focus")); focusLabel->setText(tr("Focus:")); panCheckBox->setText(tr("Automatic Pan")); panLabel->setText(tr("Pan:")); tiltCheckBox->setText(tr("Automatic Tilt")); tiltLabel->setText(tr("Tilt:")); irisCheckBox->setText(tr("Automatic Iris")); irisLabel->setText(tr("Iris:")); rollCheckBox->setText(tr("Automatic Roll")); rollLabel->setText(tr("Roll:")); resetButton->setText(tr("&Reset to Default")); closeButton->setText(tr("&Close")); qDebug() << "CameraControllerDialog::retranslateStrings --> End"; } void CameraControllerDialog::initialize() { qDebug() << "CameraControllerDialog::initialize --> Start"; PreferencesTool *preferences = frontend->getPreferences(); GrabberControlCapabilities *capabilities; bool checked; int value; capabilities = grabberController->getBrightnessCaps(); if (capabilities->isAutomatic()) { qualityCount++; brightnessCheckBox->show(); brightnessCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticbrightness", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } brightnessCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; brightnessLabel->show(); brightnessSlider->show(); brightnessSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "brightness", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(brightnessSlider, capabilities, value); } capabilities = grabberController->getContrastCaps(); if (capabilities->isAutomatic()) { qualityCount++; contrastCheckBox->show(); contrastCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticcontrast", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } contrastCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; contrastLabel->show(); contrastSlider->show(); contrastSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "contrast", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(contrastSlider, capabilities, value); } capabilities = grabberController->getSaturationCaps(); if (capabilities->isAutomatic()) { qualityCount++; saturationCheckBox->show(); saturationCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticsaturation", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } saturationCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; saturationLabel->show(); saturationSlider->show(); saturationSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "saturation", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(saturationSlider, capabilities, value); } capabilities = grabberController->getHueCaps(); if (capabilities->isAutomatic()) { qualityCount++; hueCheckBox->show(); hueCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automatichue", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } hueCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; hueLabel->show(); hueSlider->show(); hueSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "hue", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(hueSlider, capabilities, value); } capabilities = grabberController->getGammaCaps(); if (capabilities->isAutomatic()) { qualityCount++; gammaCheckBox->show(); gammaCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticgamma", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } gammaCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; gammaLabel->show(); gammaSlider->show(); gammaSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "gamma", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(gammaSlider, capabilities, value); } capabilities = grabberController->getSharpnessCaps(); if (capabilities->isAutomatic()) { qualityCount++; sharpnessCheckBox->show(); sharpnessCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticsharpness", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } sharpnessCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; sharpnessLabel->show(); sharpnessSlider->show(); sharpnessSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "sharpness", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(sharpnessSlider, capabilities, value); } capabilities = grabberController->getBacklightCaps(); if (capabilities->isAutomatic()) { qualityCount++; backlightCheckBox->show(); backlightCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticbacklight", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } backlightCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; backlightLabel->show(); backlightSlider->show(); backlightSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "backlight", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(backlightSlider, capabilities, value); } capabilities = grabberController->getWhiteCaps(); if (capabilities->isAutomatic()) { qualityCount++; whiteCheckBox->show(); whiteCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticwhite", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } whiteCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; whiteLabel->show(); whiteSlider->show(); whiteSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "white", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(whiteSlider, capabilities, value); } capabilities = grabberController->getGainCaps(); if (capabilities->isAutomatic()) { qualityCount++; gainCheckBox->show(); gainCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticgain", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } gainCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; gainLabel->show(); gainSlider->show(); gainSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "gain", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(gainSlider, capabilities, value); } capabilities = grabberController->getColorCaps(); if (capabilities->isAutomatic()) { qualityCount++; colorCheckBox->show(); colorCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticcolor", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } colorCheckBox->setChecked(checked); } if (capabilities->isCapability()) { qualityCount++; colorLabel->show(); colorSlider->show(); colorSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "color", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(colorSlider, capabilities, value); } // TODO: This will not work mainLayout->setStretchFactor(qualityGroupBox, qualityCount); if (qualityCount == 0) { qualityGroupBox->hide(); } capabilities = grabberController->getExposureCaps(); if (capabilities->isAutomatic()) { controlCount++; exposureCheckBox->show(); exposureCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticexposure", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } exposureCheckBox->setChecked(checked); } if (capabilities->isCapability()) { controlCount++; exposureLabel->show(); exposureSlider->show(); exposureSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "exposure", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(exposureSlider, capabilities, value); } capabilities = grabberController->getZoomCaps(); if (capabilities->isAutomatic()) { controlCount++; zoomCheckBox->show(); zoomCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticzoom", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } zoomCheckBox->setChecked(checked); } if (capabilities->isCapability()) { controlCount++; zoomLabel->show(); zoomSlider->show(); zoomSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "zoom", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(zoomSlider, capabilities, value); } capabilities = grabberController->getFocusCaps(); if (capabilities->isAutomatic()) { controlCount++; focusCheckBox->show(); focusCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticfocus", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } focusCheckBox->setChecked(checked); } if (capabilities->isCapability()) { controlCount++; focusLabel->show(); focusSlider->show(); focusSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "focus", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(focusSlider, capabilities, value); } capabilities = grabberController->getPanCaps(); if (capabilities->isAutomatic()) { controlCount++; panCheckBox->show(); panCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticpan", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } panCheckBox->setChecked(checked); } if (capabilities->isCapability()) { controlCount++; panLabel->show(); panSlider->show(); panSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "pan", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(panSlider, capabilities, value); } capabilities = grabberController->getTiltCaps(); if (capabilities->isAutomatic()) { controlCount++; tiltCheckBox->show(); tiltCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automatictilt", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } tiltCheckBox->setChecked(checked); } if (capabilities->isCapability()) { controlCount++; tiltLabel->show(); tiltSlider->show(); tiltSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "tilt", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(tiltSlider, capabilities, value); } capabilities = grabberController->getIrisCaps(); if (capabilities->isAutomatic()) { controlCount++; irisCheckBox->show(); irisCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticiris", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } irisCheckBox->setChecked(checked); } if (capabilities->isCapability()) { controlCount++; irisLabel->show(); irisSlider->show(); irisSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "iris", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(irisSlider, capabilities, value); } capabilities = grabberController->getRollCaps(); if (capabilities->isAutomatic()) { controlCount++; rollCheckBox->show(); rollCheckBox->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "automaticroll", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } rollCheckBox->setChecked(checked); } if (capabilities->isCapability()) { controlCount++; rollLabel->show(); rollSlider->show(); rollSlider->setEnabled(false); if (preferences->getIntegerPreference(deviceId, "roll", value) == false) { // Calculate default value value = capabilities->getDefault(); } configureSlider(rollSlider, capabilities, value); } // TODO: This will not work mainLayout->setStretchFactor(controlGroupBox, controlCount); if (controlCount == 0) { controlGroupBox->hide(); } closeButton->setFocus(); qDebug() << "CameraControllerDialog::initialize --> End"; } bool CameraControllerDialog::setUp() { qDebug() << "CameraControllerDialog::setUp --> Start"; PreferencesTool *preferences = frontend->getPreferences(); GrabberControlCapabilities *capabilities; bool checked; int value; int progressMax = 17; int progressValue = 0; QProgressDialog progress(tr("Restore Camera Settings..."), QString(), 0, progressMax); progress.setWindowModality(Qt::WindowModal); progress.show(); grabberController->setUp(); progress.setValue(progressValue++); capabilities = grabberController->getBrightnessCaps(); if (capabilities->isAutomatic()) { brightnessCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticbrightness", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoBrightness(checked, false); } if (capabilities->isCapability()) { brightnessSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "brightness", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeBrightness(value, false); } qDebug() << "CameraControllerDialog::setUp --> Brightness enabeled:" << brightnessSlider->isEnabled(); progress.setValue(progressValue++); capabilities = grabberController->getContrastCaps(); if (capabilities->isAutomatic()) { contrastCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticcontrast", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoContrast(checked, false); } if (capabilities->isCapability()) { contrastSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "contrast", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeContrast(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getSaturationCaps(); if (capabilities->isAutomatic()) { saturationCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticsaturation", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoSaturation(checked, false); } if (capabilities->isCapability()) { saturationSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "saturation", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeSaturation(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getHueCaps(); if (capabilities->isAutomatic()) { hueCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automatichue", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoHue(checked, false); } if (capabilities->isCapability()) { hueSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "hue", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeHue(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getGammaCaps(); if (capabilities->isAutomatic()) { gammaCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticgamma", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoGamma(checked, false); } if (capabilities->isCapability()) { gammaSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "gamma", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeGamma(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getSharpnessCaps(); if (capabilities->isAutomatic()) { sharpnessCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticsharpness", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoSharpness(checked, false); } if (capabilities->isCapability()) { sharpnessSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "sharpness", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeSharpness(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getBacklightCaps(); if (capabilities->isAutomatic()) { backlightCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticbacklight", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoBacklight(checked, false); } if (capabilities->isCapability()) { backlightSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "backlight", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeBacklight(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getWhiteCaps(); if (capabilities->isAutomatic()) { whiteCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticwhite", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoWhite(checked, false); } if (capabilities->isCapability()) { whiteSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "white", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeWhite(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getGainCaps(); if (capabilities->isAutomatic()) { gainCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticgain", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoGain(checked, false); } if (capabilities->isCapability()) { gainSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "gain", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeGain(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getColorCaps(); if (capabilities->isAutomatic()) { colorCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticcolor", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoColor(checked, false); } if (capabilities->isCapability()) { colorSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "color", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeColor(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getExposureCaps(); if (capabilities->isAutomatic()) { exposureCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticexposure", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoExposure(checked, false); } if (capabilities->isCapability()) { exposureSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "exposure", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeExposure(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getZoomCaps(); if (capabilities->isAutomatic()) { zoomCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticzoom", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoZoom(checked, false); } if (capabilities->isCapability()) { zoomSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "zoom", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeZoom(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getFocusCaps(); if (capabilities->isAutomatic()) { focusCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticfocus", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoFocus(checked, false); } if (capabilities->isCapability()) { focusSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "focus", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeFocus(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getPanCaps(); if (capabilities->isAutomatic()) { panCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticpan", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoPan(checked, false); } if (capabilities->isCapability()) { panSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "pan", value) == false) { // Calculate default value value = capabilities->getDefault(); } changePan(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getTiltCaps(); if (capabilities->isAutomatic()) { tiltCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automatictilt", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoTilt(checked, false); } if (capabilities->isCapability()) { tiltSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "tilt", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeTilt(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getIrisCaps(); if (capabilities->isAutomatic()) { irisCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticiris", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoIris(checked, false); } if (capabilities->isCapability()) { irisSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "iris", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeIris(value, false); } progress.setValue(progressValue++); capabilities = grabberController->getRollCaps(); if (capabilities->isAutomatic()) { rollCheckBox->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "automaticroll", value)) { if (value == 1) { checked = true; } else { checked = false; } } else { checked = false; } changeAutoRoll(checked, false); } if (capabilities->isCapability()) { rollSlider->setEnabled(true); if (preferences->getIntegerPreference(deviceId, "roll", value) == false) { // Calculate default value value = capabilities->getDefault(); } changeRoll(value, false); } progress.setValue(progressValue); progress.hide(); qDebug() << "CameraControllerDialog::setUp --> End"; return true; } bool CameraControllerDialog::tearDown() { qDebug() << "CameraControllerDialog::tearDown --> Start"; GrabberControlCapabilities *capabilities; capabilities = grabberController->getBrightnessCaps(); if (capabilities->isAutomatic()) { brightnessCheckBox->setEnabled(false); } if (capabilities->isCapability()) { brightnessSlider->setEnabled(false); } capabilities = grabberController->getContrastCaps(); if (capabilities->isAutomatic()) { contrastCheckBox->setEnabled(false); } if (capabilities->isCapability()) { contrastSlider->setEnabled(false); } capabilities = grabberController->getSaturationCaps(); if (capabilities->isAutomatic()) { saturationCheckBox->setEnabled(false); } if (capabilities->isCapability()) { saturationSlider->setEnabled(false); } capabilities = grabberController->getHueCaps(); if (capabilities->isAutomatic()) { hueCheckBox->setEnabled(false); } if (capabilities->isCapability()) { hueSlider->setEnabled(false); } capabilities = grabberController->getGammaCaps(); if (capabilities->isAutomatic()) { gammaCheckBox->setEnabled(false); } if (capabilities->isCapability()) { gammaSlider->setEnabled(false); } capabilities = grabberController->getSharpnessCaps(); if (capabilities->isAutomatic()) { sharpnessCheckBox->setEnabled(false); } if (capabilities->isCapability()) { sharpnessSlider->setEnabled(false); } capabilities = grabberController->getBacklightCaps(); if (capabilities->isAutomatic()) { backlightCheckBox->setEnabled(false); } if (capabilities->isCapability()) { backlightSlider->setEnabled(false); } capabilities = grabberController->getWhiteCaps(); if (capabilities->isAutomatic()) { whiteCheckBox->setEnabled(false); } if (capabilities->isCapability()) { whiteSlider->setEnabled(false); } capabilities = grabberController->getGainCaps(); if (capabilities->isAutomatic()) { gainCheckBox->setEnabled(false); } if (capabilities->isCapability()) { gainSlider->setEnabled(false); } capabilities = grabberController->getColorCaps(); if (capabilities->isAutomatic()) { colorCheckBox->setEnabled(false); } if (capabilities->isCapability()) { colorSlider->setEnabled(false); } capabilities = grabberController->getExposureCaps(); if (capabilities->isAutomatic()) { exposureCheckBox->setEnabled(false); } if (capabilities->isCapability()) { exposureSlider->setEnabled(false); } capabilities = grabberController->getZoomCaps(); if (capabilities->isAutomatic()) { zoomCheckBox->setEnabled(false); } if (capabilities->isCapability()) { zoomSlider->setEnabled(false); } capabilities = grabberController->getFocusCaps(); if (capabilities->isAutomatic()) { focusCheckBox->setEnabled(false); } if (capabilities->isCapability()) { focusSlider->setEnabled(false); } capabilities = grabberController->getPanCaps(); if (capabilities->isAutomatic()) { panCheckBox->setEnabled(false); } if (capabilities->isCapability()) { panSlider->setEnabled(false); } capabilities = grabberController->getTiltCaps(); if (capabilities->isAutomatic()) { tiltCheckBox->setEnabled(false); } if (capabilities->isCapability()) { tiltSlider->setEnabled(false); } capabilities = grabberController->getIrisCaps(); if (capabilities->isAutomatic()) { irisCheckBox->setEnabled(false); } if (capabilities->isCapability()) { irisSlider->setEnabled(false); } capabilities = grabberController->getRollCaps(); if (capabilities->isAutomatic()) { rollCheckBox->setEnabled(false); } if (capabilities->isCapability()) { rollSlider->setEnabled(false); } grabberController->tearDown(); qDebug() << "CameraControllerDialog::tearDown --> End"; return true; } /************************************************************************** ************************************************************************** * Camera capabilities ************************************************************************** **************************************************************************/ void CameraControllerDialog::changeAutoBrightness(int newState) { changeAutoBrightness(newState, true); } void CameraControllerDialog::changeAutoBrightness(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoBrightness --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { brightnessSlider->setEnabled(false); grabberController->setAutomaticBrightness(true); } else { brightnessSlider->setEnabled(true); grabberController->setAutomaticBrightness(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticbrightness", newState); } qDebug() << "CameraControllerDialog::changeAutoBrightness --> End"; } void CameraControllerDialog::changeBrightness(int value) { brightnessSlider->setToolTip(QString::number(value)); changeBrightness(value, true); } void CameraControllerDialog::changeBrightness(int value, bool save) { qDebug() << "CameraControllerDialog::changeBrightness --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setBrightness(value); if (save) { preferences->setIntegerPreference(deviceId, "brightness", value); } qDebug() << "CameraControllerDialog::changeBrightness --> End"; } void CameraControllerDialog::changeAutoContrast(int newState) { changeAutoContrast(newState, true); } void CameraControllerDialog::changeAutoContrast(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoContrast --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { contrastSlider->setEnabled(false); grabberController->setAutomaticContrast(true); } else { contrastSlider->setEnabled(true); grabberController->setAutomaticContrast(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticcontrast", newState); } qDebug() << "CameraControllerDialog::changeAutoContrast --> End"; } void CameraControllerDialog::changeContrast(int value) { contrastSlider->setToolTip(QString::number(value)); changeContrast(value, true); } void CameraControllerDialog::changeContrast(int value, bool save) { qDebug() << "CameraControllerDialog::changeContrast --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setContrast(value); if (save) { preferences->setIntegerPreference(deviceId, "contrast", value); } qDebug() << "CameraControllerDialog::changeContrast --> End"; } void CameraControllerDialog::changeAutoSaturation(int newState) { changeAutoSaturation(newState, true); } void CameraControllerDialog::changeAutoSaturation(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoSaturation --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { saturationSlider->setEnabled(false); grabberController->setAutomaticSaturation(true); } else { saturationSlider->setEnabled(true); grabberController->setAutomaticSaturation(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticsaturation", newState); } qDebug() << "CameraControllerDialog::changeAutoSaturation --> End"; } void CameraControllerDialog::changeSaturation(int value) { saturationSlider->setToolTip(QString::number(value)); changeSaturation(value, true); } void CameraControllerDialog::changeSaturation(int value, bool save) { qDebug() << "CameraControllerDialog::changeSaturation --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setSaturation(value); if (save) { preferences->setIntegerPreference(deviceId, "saturation", value); } qDebug() << "CameraControllerDialog::changeSaturation --> End"; } void CameraControllerDialog::changeAutoHue(int newState) { changeAutoHue(newState, true); } void CameraControllerDialog::changeAutoHue(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoHue --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { hueSlider->setEnabled(false); grabberController->setAutomaticHue(true); } else { hueSlider->setEnabled(true); grabberController->setAutomaticHue(false); } if (save) { preferences->setIntegerPreference(deviceId, "automatichue", newState); } qDebug() << "CameraControllerDialog::changeAutoHue --> End"; } void CameraControllerDialog::changeHue(int value) { hueSlider->setToolTip(QString::number(value)); changeHue(value, true); } void CameraControllerDialog::changeHue(int value, bool save) { qDebug() << "CameraControllerDialog::changeHue --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setHue(value); if (save) { preferences->setIntegerPreference(deviceId, "hue", value); } qDebug() << "CameraControllerDialog::changeHue --> End"; } void CameraControllerDialog::changeAutoGamma(int newState) { changeAutoGamma(newState, true); } void CameraControllerDialog::changeAutoGamma(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoGamma --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { gammaSlider->setEnabled(false); grabberController->setAutomaticGamma(true); } else { gammaSlider->setEnabled(true); grabberController->setAutomaticGamma(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticgamma", newState); } qDebug() << "CameraControllerDialog::changeAutoGamma --> End"; } void CameraControllerDialog::changeGamma(int value) { gammaSlider->setToolTip(QString::number(value)); changeGamma(value, true); } void CameraControllerDialog::changeGamma(int value, bool save) { qDebug() << "CameraControllerDialog::changeGamma --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setGamma(value); if (save) { preferences->setIntegerPreference(deviceId, "gamma", value); } qDebug() << "CameraControllerDialog::changeGamma --> End"; } void CameraControllerDialog::changeAutoSharpness(int newState) { changeAutoSharpness(newState, true); } void CameraControllerDialog::changeAutoSharpness(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoSharpness --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { sharpnessSlider->setEnabled(false); grabberController->setAutomaticSharpness(true); } else { sharpnessSlider->setEnabled(true); grabberController->setAutomaticSharpness(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticsharpness", newState); } qDebug() << "CameraControllerDialog::changeAutoSharpness --> End"; } void CameraControllerDialog::changeSharpness(int value) { sharpnessSlider->setToolTip(QString::number(value)); changeSharpness(value, true); } void CameraControllerDialog::changeSharpness(int value, bool save) { qDebug() << "CameraControllerDialog::changeSharpness --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setSharpness(value); if (save) { preferences->setIntegerPreference(deviceId, "sharpness", value); } qDebug() << "CameraControllerDialog::changeSharpness --> End"; } void CameraControllerDialog::changeAutoBacklight(int newState) { changeAutoBacklight(newState, true); } void CameraControllerDialog::changeAutoBacklight(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoBacklight --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { backlightSlider->setEnabled(false); grabberController->setAutomaticBacklight(true); } else { backlightSlider->setEnabled(true); grabberController->setAutomaticBacklight(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticbacklight", newState); } qDebug() << "CameraControllerDialog::changeAutoBacklight --> End"; } void CameraControllerDialog::changeBacklight(int value) { backlightSlider->setToolTip(QString::number(value)); changeBacklight(value, true); } void CameraControllerDialog::changeBacklight(int value, bool save) { qDebug() << "CameraControllerDialog::changeBacklight --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setBacklight(value); if (save) { preferences->setIntegerPreference(deviceId, "backlight", value); } qDebug() << "CameraControllerDialog::changeBacklight --> End"; } void CameraControllerDialog::changeAutoWhite(int newState) { changeAutoWhite(newState, true); } void CameraControllerDialog::changeAutoWhite(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoWhite --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { whiteSlider->setEnabled(false); grabberController->setAutomaticWhite(true); } else { whiteSlider->setEnabled(true); grabberController->setAutomaticWhite(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticwhite", newState); } qDebug() << "CameraControllerDialog::changeAutoWhite --> End"; } void CameraControllerDialog::changeWhite(int value) { whiteSlider->setToolTip(QString::number(value)); changeWhite(value, true); } void CameraControllerDialog::changeWhite(int value, bool save) { qDebug() << "CameraControllerDialog::changeWhite --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setWhite(value); if (save) { preferences->setIntegerPreference(deviceId, "white", value); } qDebug() << "CameraControllerDialog::changeWhite --> End"; } void CameraControllerDialog::changeAutoGain(int newState) { changeAutoGain(newState, true); } void CameraControllerDialog::changeAutoGain(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoGain --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { gainSlider->setEnabled(false); grabberController->setAutomaticGain(true); } else { gainSlider->setEnabled(true); grabberController->setAutomaticGain(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticgain", newState); } qDebug() << "CameraControllerDialog::changeAutoGain --> End"; } void CameraControllerDialog::changeGain(int value) { gainSlider->setToolTip(QString::number(value)); changeGain(value, true); } void CameraControllerDialog::changeGain(int value, bool save) { qDebug() << "CameraControllerDialog::changeGain --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setGain(value); if (save) { preferences->setIntegerPreference(deviceId, "gain", value); } qDebug() << "CameraControllerDialog::changeGain --> End"; } void CameraControllerDialog::changeAutoColor(int newState) { changeAutoColor(newState, true); } void CameraControllerDialog::changeAutoColor(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoColor --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { colorSlider->setEnabled(false); grabberController->setAutomaticColor(true); } else { colorSlider->setEnabled(true); grabberController->setAutomaticColor(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticcolor", newState); } qDebug() << "CameraControllerDialog::changeAutoColor --> End"; } void CameraControllerDialog::changeColor(int value) { colorSlider->setToolTip(QString::number(value)); changeColor(value, true); } void CameraControllerDialog::changeColor(int value, bool save) { qDebug() << "CameraControllerDialog::changeColor --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setColor(value); if (save) { preferences->setIntegerPreference(deviceId, "color", value); } qDebug() << "CameraControllerDialog::changeColor --> End"; } void CameraControllerDialog::changeAutoExposure(int newState) { changeAutoExposure(newState, true); } void CameraControllerDialog::changeAutoExposure(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoExposure --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { exposureSlider->setEnabled(false); grabberController->setAutomaticExposure(true); } else { exposureSlider->setEnabled(true); grabberController->setAutomaticExposure(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticexposure", newState); } qDebug() << "CameraControllerDialog::changeAutoExposure --> End"; } void CameraControllerDialog::changeExposure(int value) { exposureSlider->setToolTip(QString::number(value)); changeExposure(value, true); } void CameraControllerDialog::changeExposure(int value, bool save) { qDebug() << "CameraControllerDialog::changeExposure --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setExposure(value); if (save) { preferences->setIntegerPreference(deviceId, "exposure", value); } qDebug() << "CameraControllerDialog::changeExposure --> End"; } void CameraControllerDialog::changeAutoZoom(int newState) { changeAutoZoom(newState, true); } void CameraControllerDialog::changeAutoZoom(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoZoo --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { zoomSlider->setEnabled(false); grabberController->setAutomaticZoom(true); } else { zoomSlider->setEnabled(true); grabberController->setAutomaticZoom(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticzoom", newState); } qDebug() << "CameraControllerDialog::changeAutoZoo --> End"; } void CameraControllerDialog::changeZoom(int value) { zoomSlider->setToolTip(QString::number(value)); changeZoom(value, true); } void CameraControllerDialog::changeZoom(int value, bool save) { qDebug() << "CameraControllerDialog::changeZoo --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setZoom(value); if (save) { preferences->setIntegerPreference(deviceId, "zoom", value); } qDebug() << "CameraControllerDialog::changeZoo --> End"; } void CameraControllerDialog::changeAutoFocus(int newState) { changeAutoFocus(newState, true); } void CameraControllerDialog::changeAutoFocus(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoFocus --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { focusSlider->setEnabled(false); grabberController->setAutomaticFocus(true); } else { focusSlider->setEnabled(true); grabberController->setAutomaticFocus(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticfocus", newState); } qDebug() << "CameraControllerDialog::changeAutoFocus --> End"; } void CameraControllerDialog::changeFocus(int value) { focusSlider->setToolTip(QString::number(value)); changeFocus(value, true); } void CameraControllerDialog::changeFocus(int value, bool save) { qDebug() << "CameraControllerDialog::changeFocus --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setFocus(value); if (save) { preferences->setIntegerPreference(deviceId, "focus", value); } qDebug() << "CameraControllerDialog::changeFocus --> End"; } void CameraControllerDialog::changeAutoPan(int newState) { changeAutoPan(newState, true); } void CameraControllerDialog::changeAutoPan(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoPan --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { panSlider->setEnabled(false); grabberController->setAutomaticPan(true); } else { panSlider->setEnabled(true); grabberController->setAutomaticPan(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticpan", newState); } qDebug() << "CameraControllerDialog::changeAutoPan --> End"; } void CameraControllerDialog::changePan(int value) { panSlider->setToolTip(QString::number(value)); changePan(value, true); } void CameraControllerDialog::changePan(int value, bool save) { qDebug() << "CameraControllerDialog::changePan --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setPan(value); if (save) { preferences->setIntegerPreference(deviceId, "pan", value); } qDebug() << "CameraControllerDialog::changePan --> End"; } void CameraControllerDialog::changeAutoTilt(int newState) { changeAutoTilt(newState, true); } void CameraControllerDialog::changeAutoTilt(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoTilt --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { tiltSlider->setEnabled(false); grabberController->setAutomaticTilt(true); } else { tiltSlider->setEnabled(true); grabberController->setAutomaticTilt(false); } if (save) { preferences->setIntegerPreference(deviceId, "automatictilt", newState); } qDebug() << "CameraControllerDialog::changeAutoTilt --> End"; } void CameraControllerDialog::changeTilt(int value) { tiltSlider->setToolTip(QString::number(value)); changeTilt(value, true); } void CameraControllerDialog::changeTilt(int value, bool save) { qDebug() << "CameraControllerDialog::changeTilt --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setTilt(value); if (save) { preferences->setIntegerPreference(deviceId, "tilt", value); } qDebug() << "CameraControllerDialog::changeTilt --> End"; } void CameraControllerDialog::changeAutoIris(int newState) { changeAutoIris(newState, true); } void CameraControllerDialog::changeAutoIris(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoIris --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { irisSlider->setEnabled(false); grabberController->setAutomaticIris(true); } else { irisSlider->setEnabled(true); grabberController->setAutomaticIris(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticiris", newState); } qDebug() << "CameraControllerDialog::changeAutoIris --> End"; } void CameraControllerDialog::changeIris(int value) { irisSlider->setToolTip(QString::number(value)); changeIris(value, true); } void CameraControllerDialog::changeIris(int value, bool save) { qDebug() << "CameraControllerDialog::changeIris --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setIris(value); if (save) { preferences->setIntegerPreference(deviceId, "iris", value); } qDebug() << "CameraControllerDialog::changeIris --> End"; } void CameraControllerDialog::changeAutoRoll(int newState) { changeAutoRoll(newState, true); } void CameraControllerDialog::changeAutoRoll(int newState, bool save) { qDebug() << "CameraControllerDialog::changeAutoRoll --> Start"; PreferencesTool *preferences = frontend->getPreferences(); if (newState) { rollSlider->setEnabled(false); grabberController->setAutomaticRoll(true); } else { rollSlider->setEnabled(true); grabberController->setAutomaticRoll(false); } if (save) { preferences->setIntegerPreference(deviceId, "automaticroll", newState); } qDebug() << "CameraControllerDialog::changeAutoRoll --> End"; } void CameraControllerDialog::changeRoll(int value) { rollSlider->setToolTip(QString::number(value)); changeRoll(value, true); } void CameraControllerDialog::changeRoll(int value, bool save) { qDebug() << "CameraControllerDialog::changeRoll --> Start"; PreferencesTool *preferences = frontend->getPreferences(); grabberController->setRoll(value); if (save) { preferences->setIntegerPreference(deviceId, "roll", value); } qDebug() << "CameraControllerDialog::changeRoll --> End"; } void CameraControllerDialog::configureSlider(QSlider *slider, GrabberControlCapabilities *controlCaps, int value) { slider->setMinimum(controlCaps->getMinimum()); slider->setMaximum(controlCaps->getMaximum()); slider->setSingleStep(controlCaps->getStep()); slider->setPageStep(controlCaps->getStep()/10); slider->setValue(value); slider->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); slider->setTracking(true); slider->setTickInterval(10); slider->setTickPosition(QSlider::TicksBelow); slider->setFocusPolicy(Qt::NoFocus); } void CameraControllerDialog::reset() { qDebug() << "CameraControllerDialog::reset --> Start"; GrabberControlCapabilities *capabilities; int value; int progressMax = 17; int progressValue = 0; QProgressDialog progress(tr("Reset Camera Settings..."), tr("Abort Reset"), 0, progressMax); progress.setWindowModality(Qt::WindowModal); progress.show(); progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getBrightnessCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); brightnessSlider->setValue(value); changeBrightness(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getContrastCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); contrastSlider->setValue(value); changeContrast(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getSaturationCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); saturationSlider->setValue(value); changeSaturation(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getHueCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); hueSlider->setValue(value); changeHue(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getGammaCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); gammaSlider->setValue(value); changeGamma(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getSharpnessCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); sharpnessSlider->setValue(value); changeSharpness(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getBacklightCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); backlightSlider->setValue(value); changeBacklight(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getGainCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); gainSlider->setValue(value); changeGain(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getColorCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); colorSlider->setValue(value); changeColor(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getWhiteCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); whiteSlider->setValue(value); changeWhite(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getExposureCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); exposureSlider->setValue(value); changeExposure(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getZoomCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); zoomSlider->setValue(value); changeZoom(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getFocusCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); focusSlider->setValue(value); changeFocus(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getPanCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); panSlider->setValue(value); changePan(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getTiltCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); tiltSlider->setValue(value); changeTilt(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getIrisCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); irisSlider->setValue(value); changeIris(value, true); } progress.setValue(progressValue++); if (progress.wasCanceled()) { return; } capabilities = grabberController->getRollCaps(); if (capabilities->isCapability()) { value = capabilities->getDefault(); rollSlider->setValue(value); changeRoll(value, true); } progress.setValue(progressMax); progress.hide(); qDebug() << "CameraControllerDialog::reset --> End"; } void CameraControllerDialog::close() { qDebug() << "CameraControllerDialog::close --> Start"; setFocus(); // Disable the controlls an the tear down the grabber controller tearDown(); this->hide(); qDebug() << "CameraControllerDialog::close --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/aboutdialog.h000644 000000 000000 00000003723 12751646113 026403 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H #include #include #include "frontends/frontend.h" class AboutDialog : public QDialog { Q_OBJECT; public: AboutDialog(Frontend *f, QWidget *parent = 0); private: Frontend *frontend; QTabWidget *tabWidget; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/helpbrowser.h000644 000000 000000 00000004224 12654352322 026440 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef HELPBROWSER_H #define HELPBROWSER_H #include #include #include #include #include "frontends/frontend.h" class HelpBrowser : public QDialog { Q_OBJECT public: HelpBrowser(Frontend *f, QWidget *parent = 0); private: Frontend *frontend; QPushButton *backwardButton; QPushButton *homeButton; QPushButton *forwardButton; QLineEdit *searchEdit; QTextBrowser *textBrowser; QPushButton *closeButton; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/descriptiondialog.h000644 000000 000000 00000007017 12654352322 027612 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef DESCRIPTIONDIALOG_H #define DESCRIPTIONDIALOG_H #include #include #include #include #include "frontends/frontend.h" class DescriptionDialog : public QDialog { Q_OBJECT; public: enum descriptionType { ProjectDescription, SceneDescription, TakeDescription }; /** * Constructor * @param f The frontend of the application * @param type Type of the dialog * @param parent Parent of the dialog */ DescriptionDialog(Frontend *f, descriptionType type, QWidget *parent = 0); /** * Get the content of the project description edit line. * @return Project description text. */ const QString getProjectDescription(); /** * Set the content of the project description edit line. * @param descr Description of the project. */ void setProjectDescription(const QString &descr); /** * Get the content of the scene description edit line. * @return Scene description text. */ const QString getSceneDescription(); /** * Set the content of the scene description edit line. * @param descr Description of the scene. */ void setSceneDescription(const QString &descr); /** * Get the content of the take description edit line. * @return Take description text. */ const QString getTakeDescription(); /** * Set the content of the take description edit line. * @param descr Description of the take. */ void setTakeDescription(const QString &descr); private slots: void checkProjectText(const QString &text); void checkSceneText(const QString &text); void checkTakeText(const QString &text); private: Frontend *frontend; QLabel *projectDescrLabel; QLineEdit *projectDescrEdit; QLabel *sceneDescrLabel; QLineEdit *sceneDescrEdit; QLabel *takeDescrLabel; QLineEdit *takeDescrEdit; QPushButton *okButton; QPushButton *cancelButton; }; #endif // DESCRIPTIONDIALOG_H qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/descriptiondialog.cpp000644 000000 000000 00000013632 13011043104 030124 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "descriptiondialog.h" #include #include #include #include DescriptionDialog::DescriptionDialog(Frontend *f, descriptionType type, QWidget *parent) : QDialog(parent) { frontend = f; projectDescrLabel = new QLabel(tr("&Project Description:")); projectDescrEdit = new QLineEdit; projectDescrLabel->setBuddy(projectDescrEdit); sceneDescrLabel = new QLabel(tr("&Scene Description:")); sceneDescrEdit = new QLineEdit; sceneDescrLabel->setBuddy(sceneDescrEdit); takeDescrLabel = new QLabel(tr("&Take Description:")); takeDescrEdit = new QLineEdit; takeDescrLabel->setBuddy(takeDescrEdit); okButton = new QPushButton(tr("&OK")); cancelButton = new QPushButton(tr("&Cancel")); connect(projectDescrEdit, SIGNAL(textChanged(const QString &)), this, SLOT(checkProjectText(const QString &))); connect(sceneDescrEdit, SIGNAL(textChanged(const QString &)), this, SLOT(checkSceneText(const QString &))); connect(takeDescrEdit, SIGNAL(textChanged(const QString &)), this, SLOT(checkTakeText(const QString &))); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); QGridLayout *inputLayout = new QGridLayout; inputLayout->addWidget(projectDescrLabel, 0, 0); inputLayout->addWidget(projectDescrEdit, 0, 1); inputLayout->addWidget(sceneDescrLabel, 1, 0); inputLayout->addWidget(sceneDescrEdit, 1, 1); inputLayout->addWidget(takeDescrLabel, 2, 0); inputLayout->addWidget(takeDescrEdit, 2, 1); QVBoxLayout *buttonLayout = new QVBoxLayout; buttonLayout->addWidget(okButton); buttonLayout->addWidget(cancelButton); buttonLayout->addStretch(); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addLayout(inputLayout); mainLayout->addLayout(buttonLayout); this->setLayout(mainLayout); switch (type) { case ProjectDescription: setWindowTitle(tr("Project Description")); projectDescrEdit->setEnabled(true); sceneDescrEdit->setEnabled(true); takeDescrEdit->setEnabled(true); break; case SceneDescription: setWindowTitle(tr("Scene Description")); projectDescrEdit->setEnabled(false); sceneDescrEdit->setEnabled(true); takeDescrEdit->setEnabled(true); break; case TakeDescription: setWindowTitle(tr("Take Description")); projectDescrEdit->setEnabled(false); sceneDescrEdit->setEnabled(false); takeDescrEdit->setEnabled(true); break; default: break; } setFixedHeight(sizeHint().height()); } const QString DescriptionDialog::getProjectDescription() { QString text = projectDescrEdit->text(); text.replace('|', '_'); return text; } void DescriptionDialog::setProjectDescription(const QString &descr) { this->projectDescrEdit->setText(descr); } const QString DescriptionDialog::getSceneDescription() { QString text = sceneDescrEdit->text(); text.replace('|', '_'); return text; } void DescriptionDialog::setSceneDescription(const QString &descr) { this->sceneDescrEdit->setText(descr); } const QString DescriptionDialog::getTakeDescription() { QString text = takeDescrEdit->text(); text.replace('|', '_'); return text; } void DescriptionDialog::setTakeDescription(const QString &descr) { this->takeDescrEdit->setText(descr); } void DescriptionDialog::checkProjectText(const QString &text) { int position = text.indexOf('|'); if (position != -1) { frontend->showInformation(tr("Information"), tr("The character '|' is not allowed in the project description.")); QString newText(text); projectDescrEdit->setText(newText.remove('|')); } } void DescriptionDialog::checkSceneText(const QString &text) { int position = text.indexOf('|'); if (position != -1) { frontend->showInformation(tr("Information"), tr("The character '|' is not allowed in the scene description.")); QString newText(text); sceneDescrEdit->setText(newText.remove('|')); } } void DescriptionDialog::checkTakeText(const QString &text) { int position = text.indexOf('|'); if (position != -1) { frontend->showInformation(tr("Information"), tr("The character '|' is not allowed in the take description.")); QString newText(text); takeDescrEdit->setText(newText.remove('|')); } } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/licence.h000644 000000 000000 00000050432 12536560630 025512 0ustar00rootroot000000 000000 QString licence = " GNU GENERAL PUBLIC LICENSE\n" " Version 2, June 1991\n" "\n" " Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n" " 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" " Everyone is permitted to copy and distribute verbatim copies\n" " of this license document, but changing it is not allowed.\n" "" " Preamble\n" "\n" " The licenses for most software are designed to take away your\n" "freedom to share and change it. By contrast, the GNU General Public\n" "License is intended to guarantee your freedom to share and change free\n" "software--to make sure the software is free for all its users. This\n" "General Public License applies to most of the Free Software\n" "Foundation's software and to any other program whose authors commit to\n" "using it. (Some other Free Software Foundation software is covered by\n" "the GNU Library General Public License instead.) You can apply it to\n" "your programs, too.\n" "\n" " When we speak of free software, we are referring to freedom, not\n" "price. Our General Public Licenses are designed to make sure that you\n" "have the freedom to distribute copies of free software (and charge for\n" "this service if you wish), that you receive source code or can get it\n" "if you want it, that you can change the software or use pieces of it\n" "in new free programs; and that you know you can do these things.\n" "\n" " To protect your rights, we need to make restrictions that forbid\n" "anyone to deny you these rights or to ask you to surrender the rights.\n" "These restrictions translate to certain responsibilities for you if you\n" "distribute copies of the software, or if you modify it.\n" "\n" " For example, if you distribute copies of such a program, whether\n" "gratis or for a fee, you must give the recipients all the rights that\n" "you have. You must make sure that they, too, receive or can get the\n" "source code. And you must show them these terms so they know their\n" "rights.\n" "\n" " We protect your rights with two steps: (1) copyright the software, and\n" "(2) offer you this license which gives you legal permission to copy,\n" "distribute and/or modify the software.\n" "\n" " Also, for each author's protection and ours, we want to make certain\n" "that everyone understands that there is no warranty for this free\n" "software. If the software is modified by someone else and passed on, we\n" "want its recipients to know that what they have is not the original, so\n" "that any problems introduced by others will not reflect on the original\n" "authors' reputations.\n" "\n" " Finally, any free program is threatened constantly by software\n" "patents. We wish to avoid the danger that redistributors of a free\n" "program will individually obtain patent licenses, in effect making the\n" "program proprietary. To prevent this, we have made it clear that any\n" "patent must be licensed for everyone's free use or not licensed at all.\n" "\n" " The precise terms and conditions for copying, distribution and\n" "modification follow.\n" "\n" " GNU GENERAL PUBLIC LICENSE\n" " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" "\n" " 0. This License applies to any program or other work which contains\n" "a notice placed by the copyright holder saying it may be distributed\n" "under the terms of this General Public License. The \"Program\", below,\n" "refers to any such program or work, and a \"work based on the Program\"\n" "means either the Program or any derivative work under copyright law:\n" "that is to say, a work containing the Program or a portion of it,\n" "either verbatim or with modifications and/or translated into another\n" "language. (Hereinafter, translation is included without limitation in\n" "the term \"modification\".) Each licensee is addressed as \"you\".\n" "\n" "Activities other than copying, distribution and modification are not\n" "covered by this License; they are outside its scope. The act of\n" "running the Program is not restricted, and the output from the Program\n" "is covered only if its contents constitute a work based on the\n" "Program (independent of having been made by running the Program).\n" "Whether that is true depends on what the Program does.\n" "\n" " 1. You may copy and distribute verbatim copies of the Program's\n" "source code as you receive it, in any medium, provided that you\n" "conspicuously and appropriately publish on each copy an appropriate\n" "copyright notice and disclaimer of warranty; keep intact all the\n" "notices that refer to this License and to the absence of any warranty;\n" "and give any other recipients of the Program a copy of this License\n" "along with the Program.\n" "\n" "You may charge a fee for the physical act of transferring a copy, and\n" "you may at your option offer warranty protection in exchange for a fee.\n" "\n" " 2. You may modify your copy or copies of the Program or any portion\n" "of it, thus forming a work based on the Program, and copy and\n" "distribute such modifications or work under the terms of Section 1\n" "above, provided that you also meet all of these conditions:\n" "\n" " a) You must cause the modified files to carry prominent notices\n" " stating that you changed the files and the date of any change.\n" "\n" " b) You must cause any work that you distribute or publish, that in\n" " whole or in part contains or is derived from the Program or any\n" " part thereof, to be licensed as a whole at no charge to all third\n" " parties under the terms of this License.\n" "\n" " c) If the modified program normally reads commands interactively\n" " when run, you must cause it, when started running for such\n" " interactive use in the most ordinary way, to print or display an\n" " announcement including an appropriate copyright notice and a\n" " notice that there is no warranty (or else, saying that you provide\n" " a warranty) and that users may redistribute the program under\n" " these conditions, and telling the user how to view a copy of this\n" " License. (Exception: if the Program itself is interactive but\n" " does not normally print such an announcement, your work based on\n" " the Program is not required to print an announcement.)\n" "\n" "These requirements apply to the modified work as a whole. If\n" "identifiable sections of that work are not derived from the Program,\n" "and can be reasonably considered independent and separate works in\n" "themselves, then this License, and its terms, do not apply to those\n" "sections when you distribute them as separate works. But when you\n" "distribute the same sections as part of a whole which is a work based\n" "on the Program, the distribution of the whole must be on the terms of\n" "this License, whose permissions for other licensees extend to the\n" "entire whole, and thus to each and every part regardless of who wrote it.\n" "\n" "Thus, it is not the intent of this section to claim rights or contest\n" "your rights to work written entirely by you; rather, the intent is to\n" "exercise the right to control the distribution of derivative or\n" "collective works based on the Program.\n" "\n" "In addition, mere aggregation of another work not based on the Program\n" "with the Program (or with a work based on the Program) on a volume of\n" "a storage or distribution medium does not bring the other work under\n" "the scope of this License.\n" "\n" " 3. You may copy and distribute the Program (or a work based on it,\n" "under Section 2) in object code or executable form under the terms of\n" "Sections 1 and 2 above provided that you also do one of the following:\n" "\n" " a) Accompany it with the complete corresponding machine-readable\n" " source code, which must be distributed under the terms of Sections\n" " 1 and 2 above on a medium customarily used for software interchange; or,\n" "\n" " b) Accompany it with a written offer, valid for at least three\n" " years, to give any third party, for a charge no more than your\n" " cost of physically performing source distribution, a complete\n" " machine-readable copy of the corresponding source code, to be\n" " distributed under the terms of Sections 1 and 2 above on a medium\n" " customarily used for software interchange; or,\n" "\n" " c) Accompany it with the information you received as to the offer\n" " to distribute corresponding source code. (This alternative is\n" " allowed only for noncommercial distribution and only if you\n" " received the program in object code or executable form with such\n" " an offer, in accord with Subsection b above.)\n" "\n" "The source code for a work means the preferred form of the work for\n" "making modifications to it. For an executable work, complete source\n" "code means all the source code for all modules it contains, plus any\n" "associated interface definition files, plus the scripts used to\n" "control compilation and installation of the executable. However, as a\n" "special exception, the source code distributed need not include\n" "anything that is normally distributed (in either source or binary\n" "form) with the major components (compiler, kernel, and so on) of the\n" "operating system on which the executable runs, unless that component\n" "itself accompanies the executable.\n" "\n" "If distribution of executable or object code is made by offering\n" "access to copy from a designated place, then offering equivalent\n" "access to copy the source code from the same place counts as\n" "distribution of the source code, even though third parties are not\n" "compelled to copy the source along with the object code.\n" "\n" " 4. You may not copy, modify, sublicense, or distribute the Program\n" "except as expressly provided under this License. Any attempt\n" "otherwise to copy, modify, sublicense or distribute the Program is\n" "void, and will automatically terminate your rights under this License.\n" "However, parties who have received copies, or rights, from you under\n" "this License will not have their licenses terminated so long as such\n" "parties remain in full compliance.\n" "\n" " 5. You are not required to accept this License, since you have not\n" "signed it. However, nothing else grants you permission to modify or\n" "distribute the Program or its derivative works. These actions are\n" "prohibited by law if you do not accept this License. Therefore, by\n" "modifying or distributing the Program (or any work based on the\n" "Program), you indicate your acceptance of this License to do so, and\n" "all its terms and conditions for copying, distributing or modifying\n" "the Program or works based on it.\n" "\n" " 6. Each time you redistribute the Program (or any work based on the\n" "Program), the recipient automatically receives a license from the\n" "original licensor to copy, distribute or modify the Program subject to\n" "these terms and conditions. You may not impose any further\n" "restrictions on the recipients' exercise of the rights granted herein.\n" "You are not responsible for enforcing compliance by third parties to\n" "this License.\n" "\n" " 7. If, as a consequence of a court judgment or allegation of patent\n" "infringement or for any other reason (not limited to patent issues),\n" "conditions are imposed on you (whether by court order, agreement or\n" "otherwise) that contradict the conditions of this License, they do not\n" "excuse you from the conditions of this License. If you cannot\n" "distribute so as to satisfy simultaneously your obligations under this\n" "License and any other pertinent obligations, then as a consequence you\n" "may not distribute the Program at all. For example, if a patent\n" "license would not permit royalty-free redistribution of the Program by\n" "all those who receive copies directly or indirectly through you, then\n" "the only way you could satisfy both it and this License would be to\n" "refrain entirely from distribution of the Program.\n" "\n" "If any portion of this section is held invalid or unenforceable under\n" "any particular circumstance, the balance of the section is intended to\n" "apply and the section as a whole is intended to apply in other\n" "circumstances.\n" "\n" "It is not the purpose of this section to induce you to infringe any\n" "patents or other property right claims or to contest validity of any\n" "such claims; this section has the sole purpose of protecting the\n" "integrity of the free software distribution system, which is\n" "implemented by public license practices. Many people have made\n" "generous contributions to the wide range of software distributed\n" "through that system in reliance on consistent application of that\n" "system; it is up to the author/donor to decide if he or she is willing\n" "to distribute software through any other system and a licensee cannot\n" "impose that choice.\n" "\n" "This section is intended to make thoroughly clear what is believed to\n" "be a consequence of the rest of this License.\n" "\n" " 8. If the distribution and/or use of the Program is restricted in\n" "certain countries either by patents or by copyrighted interfaces, the\n" "original copyright holder who places the Program under this License\n" "may add an explicit geographical distribution limitation excluding\n" "those countries, so that distribution is permitted only in or among\n" "countries not thus excluded. In such case, this License incorporates\n" "the limitation as if written in the body of this License.\n" "\n" " 9. The Free Software Foundation may publish revised and/or new versions\n" "of the General Public License from time to time. Such new versions will\n" "be similar in spirit to the present version, but may differ in detail to\n" "address new problems or concerns.\n" "\n" "Each version is given a distinguishing version number. If the Program\n" "specifies a version number of this License which applies to it and \"any\n" "later version\", you have the option of following the terms and conditions\n" "either of that version or of any later version published by the Free\n" "Software Foundation. If the Program does not specify a version number of\n" "this License, you may choose any version ever published by the Free Software\n" "Foundation.\n" "\n" " 10. If you wish to incorporate parts of the Program into other free\n" "programs whose distribution conditions are different, write to the author\n" "to ask for permission. For software which is copyrighted by the Free\n" "Software Foundation, write to the Free Software Foundation; we sometimes\n" "make exceptions for this. Our decision will be guided by the two goals\n" "of preserving the free status of all derivatives of our free software and\n" "of promoting the sharing and reuse of software generally.\n" "\n" " NO WARRANTY\n" "\n" " 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n" "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n" "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n" "PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n" "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n" "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n" "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n" "REPAIR OR CORRECTION.\n" "\n" " 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n" "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n" "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n" "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n" "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n" "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n" "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n" "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n" "POSSIBILITY OF SUCH DAMAGES.\n" "\n" " END OF TERMS AND CONDITIONS\n" "\n" " How to Apply These Terms to Your New Programs\n" "\n" " If you develop a new program, and you want it to be of the greatest\n" "possible use to the public, the best way to achieve this is to make it\n" "free software which everyone can redistribute and change under these terms.\n" "\n" " To do so, attach the following notices to the program. It is safest\n" "to attach them to the start of each source file to most effectively\n" "convey the exclusion of warranty; and each file should have at least\n" "the \"copyright\" line and a pointer to where the full notice is found.\n" "\n" " \n" " Copyright (C) \n" "\n" " This program is free software; you can redistribute it and/or modify\n" " it under the terms of the GNU General Public License as published by\n" " the Free Software Foundation; either version 2 of the License, or\n" " (at your option) any later version.\n" "\n" " This program is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" " GNU General Public License for more details.\n" "\n" " You should have received a copy of the GNU General Public License\n" " along with this program; if not, write to the Free Software\n" " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "\n" "\n" "Also add information on how to contact you by electronic and paper mail.\n" "\n" "If the program is interactive, make it output a short notice like this\n" "when it starts in an interactive mode:\n" "\n" " Gnomovision version 69, Copyright (C) year name of author\n" " Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n" " This is free software, and you are welcome to redistribute it\n" " under certain conditions; type `show c' for details.\n" "\n" "The hypothetical commands `show w' and `show c' should show the appropriate\n" "parts of the General Public License. Of course, the commands you use may\n" "be called something other than `show w' and `show c'; they could even be\n" "mouse-clicks or menu items--whatever suits your program.\n" "\n" "You should also get your employer (if you work as a programmer) or your\n" "school, if any, to sign a \"copyright disclaimer\" for the program, if\n" "necessary. Here is a sample; alter the names:\n" "\n" " Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n" " `Gnomovision' (which makes passes at compilers) written by James Hacker.\n" "\n" " , 1 April 1989\n" " Ty Coon, President of Vice\n" "\n" "This General Public License does not permit incorporating your program into\n" "proprietary programs. If your program is a subroutine library, you may\n" "consider it more useful to permit linking proprietary applications with the\n" "library. If this is what you want to do, use the GNU Library General\n" "Public License instead of this License.\n" ; qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/externalcommanddialog.h000644 000000 000000 00000004751 12654352322 030452 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef EXTERNALCOMMANDDIALOG_H #define EXTERNALCOMMANDDIALOG_H #include #include #include #include #include #include #include #include class ExternalCommandDialog : public QWidget { Q_OBJECT public: ExternalCommandDialog(QWidget *parent = 0); void run(const QString &command, const QStringList &arguments); private slots: void readFromStandardOutput(); void readFromStandardError(); void submitInputToProgram(); void displayExitStatus(int exitCode, QProcess::ExitStatus exitStatus); private: QVBoxLayout *vboxLayout; QTextBrowser *textBrowser; QHBoxLayout *hboxLayout; QLabel *label; QLineEdit *lineEdit; QPushButton *submitButton; QPushButton *closeButton; QProcess *process; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/aboutdialog.cpp000755 000000 000000 00000023500 12751646113 026734 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "aboutdialog.h" #include #include #include #include #include #include "licence.h" #include "technical/preferencestool.h" AboutDialog::AboutDialog(Frontend *f, QWidget *parent) : QDialog(parent) { frontend = f; QString iconFile(frontend->getGraphicsDirName()); iconFile.append(QLatin1String("qstopmotion_logo_60.png")); tabWidget = new QTabWidget; QWidget *aboutWidget = new QWidget; QVBoxLayout *aboutLayout = new QVBoxLayout; QLabel *logoLabel = new QLabel; logoLabel->setPixmap(QPixmap(iconFile)); logoLabel->setScaledContents(true); aboutLayout->addWidget(logoLabel); aboutLayout->addWidget(new QLabel( "

" + tr("This is the qStopMotion application for creating stop motion animations.") + "

" "

" + tr("Version: ") + PreferencesTool::applicationVersion + "

" "

© 2010-" + PreferencesTool::applicationYear + ", Ralf Lange, longsoft.de

" "
")); aboutLayout->addWidget(new QLabel( "

" + tr("qStopMotion is a fork of stopmotion for linux.") + "

" "

http://developer.skolelinux.no/info/studentgrupper/2005-hig-stopmotion/index.php

" "

" + tr("Version: ") + "0.6.2

" "

© 2005-2008, Bjørn Erik Nilsen " + tr("and") + " Fredrik Berg Kjølstad

")); aboutWidget->setLayout(aboutLayout); tabWidget->addTab(aboutWidget, tr("&About")); QTextEdit *autorsText = new QTextEdit; autorsText->setHtml( "

" + tr("Main developers") + " - qStopMotion
" "Ralf Lange <ralf.lange@longsoft.de>
" "

" + tr("Main developers") + " - stopmotion for Linux
" "Bjørn Erik Nilsen <bjoern.nilsen@bjoernen.com>
" "Fredrik Berg Kjølstad <fredrikbk@hotmail.com>
" "

" + tr("Contributors") + " - stopmotion for Linux
" "Eric Stolten <stoltene2@gmail.com>
" "Josh Green <josh@resonance.org>
" "

" ); autorsText->setReadOnly(true); autorsText->setBackgroundRole(backgroundRole()); tabWidget->addTab(autorsText, tr("A&uthors")); QTextEdit *thanksText = new QTextEdit; thanksText->setHtml( "

" + tr("Translation") + "
" "Norma Klinsmann (" + tr("French") + " - qStopMotion)
" "Guillaume B <littletux@zarb.org> (" + tr("French") + " - stopmotion for Linux)
" "David Lamhauge <davidlamhauge@gmail.com> (" + tr("Danish") + ")
" "David Rylander <david@rylanderanimation.se> (" + tr("Swedish") + ")
" "Ralf Lange <ralf.lange@longsoft.de> (" + tr("German") + ")
" "Pavel Fric <pavelfric@seznam.cz> (" + tr("Czech") + ")
" /* "Gorazd Bizjak and Matej Lavreni <info@zapstudio.net> (" + tr("Slovenian") + ")
" "José Jorge <jjorge@free.fr> (" + tr("Portuguese") + ")
" "Manuel Quiñones <manuel.por.aca@gmail.com> (" + tr("Spanish") + ")
" "Koray Löker <loker@pardus.org.tr> (" + tr("Turkish") + ")
" "Diego Giordano <fusion_machine@tin.it> (" + tr("Italian") + ")
" "Matteo Comisso <teomatteo8.9@hotmail.it> (" + tr("Italian") + ")
" "

" "

" + tr("Logo") + "
" "Gorazd Bizjak <gorazd@zapstudio.net>
" "

" + tr("Coordinating") + "
" "Herman Robak <herman@skolelinux.no>
" "Øyvind Kolås <pippin@gimp.org>

" "

" + tr("Testing") + "
" "Tore Sinding Bekkedal <toresbe@ifi.uio.no>
" "Finn Arne Johansen <faj@bzz.no>
" "Halvor Borgen <halvor.borgen@hig.no>
" "Bjørn Are Hansen <post@bahansen.net>
" "John Steinar Bildøy <johnsbil@haldenfriskole.no>
" "Ole-Anders Andreassen <ole-anders.andreassen@sunndal.kommune.no>
" */ "

" ); thanksText->setReadOnly(true); thanksText->setBackgroundRole(backgroundRole()); tabWidget->addTab(thanksText, tr("&Thanks To")); QWidget *licenceWidget = new QWidget; QVBoxLayout *licenceLayout = new QVBoxLayout; licenceLayout->addWidget(new QLabel(tr("This program is distributed under the terms of the GPL v2."))); QTextEdit *licenceText = new QTextEdit; licenceText->setReadOnly(true); licenceText->setPlainText(licence); licenceLayout->addWidget(licenceText); licenceWidget->setLayout(licenceLayout); tabWidget->addTab(licenceWidget, tr("&Licence Agreement")); QString version; QWidget *systemWidget = new QWidget; QVBoxLayout *systemLayout = new QVBoxLayout; // Add line contaning the Qt version number systemLayout->addWidget(new QLabel(tr("Qt runtime version: ") + qVersion())); // Add line containing the OS version number version.append(tr("Operating system name and version: ")); #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version switch(QSysInfo::WindowsVersion) { case QSysInfo::WV_NT: version.append("Windows NT (4.0)"); break; case QSysInfo::WV_2000: version.append("Windows 2000 (5.0)"); break; case QSysInfo::WV_XP: version.append("Windows XP (5.1)"); break; case QSysInfo::WV_2003: version.append("Windows 2003 (5.2)"); break; case QSysInfo::WV_VISTA: version.append("Windows Vista (6.0)"); break; case QSysInfo::WV_WINDOWS7: version.append("Windows 7 (6.1)"); break; case QSysInfo::WV_WINDOWS8: version.append("Windows 8 (6.2)"); break; case QSysInfo::WV_WINDOWS8_1: version.append("Windows 8.1 (6.3)"); break; default: version.append(tr("Unknown Windows OS")); break; } #endif #ifdef Q_OS_OSX // Apple OS X version switch(QSysInfo::MacintoshVersion) { case QSysInfo::MV_10_3: version.append("Mac OS X 10.3 (Panther)"); break; case QSysInfo::MV_10_4: version.append("Mac OS X 10.4 (Tiger)"); break; case QSysInfo::MV_10_5: version.append("Mac OS X 10.5 (Leopard)"); break; case QSysInfo::MV_10_6: version.append("Mac OS X 10.6 (Snowleopard)"); break; case QSysInfo::MV_10_7: version.append("Mac OS X 10.7 (Lion)"); break; case QSysInfo::MV_10_8: version.append("Mac OS X 10.8 (Mountainlion)"); break; case QSysInfo::MV_10_9: version.append("Mac OS X 10.9 (Mavericks)"); break; default: version.append(tr("Unknown Mac OS")); break; } #endif #ifdef Q_OS_LINUX // Linux version QProcess uname; uname.start("uname -ro"); if (uname.waitForStarted()) { if (uname.waitForFinished()) { version.append(uname.readAll()); } } #endif systemLayout->addWidget(new QLabel(version)); QString buildTime(QString(tr("Build time: %1 %2")).arg(__DATE__).arg(__TIME__)); systemLayout->addWidget(new QLabel(buildTime)); systemLayout->addStretch(); systemWidget->setLayout(systemLayout); tabWidget->addTab(systemWidget, tr("&System Info")); QPushButton *okButton = new QPushButton(tr("OK"), this); connect(okButton, SIGNAL(clicked()), this, SLOT(close())); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(1); buttonLayout->addWidget(okButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setAttribute(Qt::WA_DeleteOnClose); setWindowTitle(tr("About")); setMinimumWidth(550); } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/helpbrowser.cpp000644 000000 000000 00000007727 12654352322 027006 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "helpbrowser.h" #include #include #include #include HelpBrowser::HelpBrowser(Frontend *f, QWidget *parent) : QDialog(parent) { QUrl url; frontend = f; this->setWindowTitle(tr("qStopMotion Help Browser")); this->setMinimumSize(500, 300); // Enable help window for modal dialoges this->setAttribute(Qt::WA_GroupLeader); backwardButton = new QPushButton(tr("&Backward")); homeButton = new QPushButton(tr("&Home")); forwardButton = new QPushButton(tr("&Forward")); searchEdit = new QLineEdit; textBrowser = new QTextBrowser; closeButton = new QPushButton(tr("&Close")); connect(backwardButton, SIGNAL(clicked()), textBrowser, SLOT(backward())); connect(homeButton, SIGNAL(clicked()), textBrowser, SLOT(home())); connect(forwardButton, SIGNAL(clicked()), textBrowser, SLOT(forward())); connect(closeButton, SIGNAL(clicked()), this, SLOT(reject())); QHBoxLayout *topLayout = new QHBoxLayout; topLayout->addWidget(backwardButton); topLayout->addWidget(homeButton); topLayout->addWidget(forwardButton); topLayout->addWidget(searchEdit); QHBoxLayout *bottomLayout = new QHBoxLayout; bottomLayout->addStretch(); bottomLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(topLayout); mainLayout->addWidget(textBrowser); mainLayout->addLayout(bottomLayout); this->setLayout(mainLayout); QString activeLocale; frontend->getPreferences()->getStringPreference("preferences", "language", activeLocale); QString localeManualFile(frontend->getManualDirName()); // localeManualFile.append("/"); localeManualFile.append(activeLocale); localeManualFile.append("/"); localeManualFile.append(QLatin1String("index.html")); if (QFile::exists(localeManualFile)) { // A translation of the manual for the selected language exists url = QUrl::fromLocalFile(localeManualFile); } else { // Use the english manual as default QString defaultManualFile(frontend->getManualDirName()); defaultManualFile.append("/"); defaultManualFile.append(QLatin1String("index.html")); url = QUrl::fromLocalFile(defaultManualFile); } textBrowser->setSource(url); } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/startdialog.h000644 000000 000000 00000005420 12654352322 026420 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef STARTDIALOG_H #define STARTDIALOG_H #include #include #include #include #include "frontends/frontend.h" #include "frontends/qtfrontend/elements/clickablelabel.h" class StartDialog : public QDialog { Q_OBJECT public: enum descriptionType { ProjectDescription, SceneDescription, TakeDescription }; /** * Constructor * @param lastProjectPath Path of the last project * @param parent Parent of the dialog */ StartDialog(Frontend *f, QString lastProjectPath, QWidget *parent = 0); /** * Get the choice of the user. * @return Choice of the user. */ int getSelectedPossibility(); private slots: void newClick(); void lastClick(); void openClick(); private: Frontend *frontend; QLabel *newProjectImage; ClickableLabel *newProjectLabel; QLabel *lastProjectImage; ClickableLabel *lastProjectLabel; QLabel *openProjectImage; ClickableLabel *openProjectLabel; QPushButton *okButton; QPushButton *closeButton; int selectedPossibility; int defaultFrameStyle; QString lastProjectPath; }; #endif // STARTDIALOG_H qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/startdialog.cpp000644 000000 000000 00000016342 12654352322 026760 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "startdialog.h" #include #include #include #include #include StartDialog::StartDialog(Frontend *f, QString lpp, QWidget *parent) : QDialog(parent) { frontend = f; selectedPossibility = 1; lastProjectPath.append(lpp); QGridLayout *inputLayout = new QGridLayout; inputLayout->setSpacing(0); QString iconFile(frontend->getGraphicsDirName()); QLabel *logoImage = new QLabel; iconFile.append(QLatin1String("qstopmotion_logo_60.png")); logoImage->setPixmap(QPixmap(iconFile)); logoImage->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); newProjectImage = new QLabel; iconFile.clear(); iconFile.append(frontend->getPicturesDirName()); iconFile.append(QLatin1String("filenew.png")); newProjectImage->setPixmap(QPixmap(iconFile)); newProjectImage->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); newProjectLabel = new ClickableLabel(this); newProjectLabel->setText(tr("

Create a new Project

") + tr("Start a new Project.")); // newProjectLabel->setBuddy(newProjectImage); newProjectImage->setFixedHeight(80); newProjectImage->setFixedWidth(80); newProjectLabel->setFixedHeight(80); newProjectLabel->setFixedWidth(400); connect(newProjectLabel, SIGNAL(clicked()), SLOT(newClick())); inputLayout->addWidget(newProjectImage, 0, 0); inputLayout->addWidget(newProjectLabel, 0, 1); if (!lastProjectPath.isEmpty()) { lastProjectImage = new QLabel; iconFile.clear(); iconFile.append(frontend->getPicturesDirName()); iconFile.append(QLatin1String("project1.png")); lastProjectImage->setPixmap(QPixmap(iconFile)); lastProjectImage->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); lastProjectLabel = new ClickableLabel(this); lastProjectLabel->setText(tr("

Open last Project

") + tr("Project path: ") + lastProjectPath ); // lastProjectLabel->setBuddy(lastProjectImage); lastProjectImage->setFixedHeight(80); lastProjectImage->setFixedWidth(80); lastProjectLabel->setFixedHeight(80); lastProjectLabel->setFixedWidth(400); connect(lastProjectLabel, SIGNAL(clicked()), SLOT(lastClick())); inputLayout->addWidget(lastProjectImage, 1, 0); inputLayout->addWidget(lastProjectLabel, 1, 1); } openProjectImage = new QLabel; iconFile.clear(); iconFile.append(frontend->getPicturesDirName()); iconFile.append(QLatin1String("fileopen.png")); openProjectImage->setPixmap(QPixmap(iconFile)); openProjectImage->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); openProjectLabel = new ClickableLabel(); openProjectLabel->setText(tr("

Open project file

") + tr("Open and continue a existing project.")); // openProjectLabel->setBuddy(openProjectImage); openProjectImage->setFixedHeight(80); openProjectImage->setFixedWidth(80); openProjectLabel->setFixedHeight(80); openProjectLabel->setFixedWidth(400); connect(openProjectLabel, SIGNAL(clicked()), SLOT(openClick())); okButton = new QPushButton(tr("&OK")); closeButton = new QPushButton(tr("&Close")); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(closeButton, SIGNAL(clicked()), this, SLOT(reject())); inputLayout->addWidget(openProjectImage, 2, 0); inputLayout->addWidget(openProjectLabel, 2, 1); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); buttonLayout->addWidget(okButton); buttonLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(logoImage); mainLayout->addLayout(inputLayout); mainLayout->addLayout(buttonLayout); this->setLayout(mainLayout); this->newClick(); } void StartDialog::newClick() { qDebug() << "StartDialog::newClick --> Start"; newProjectImage->setFrameStyle(QFrame::Panel | QFrame::Sunken); newProjectLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken); if (!lastProjectPath.isEmpty()) { lastProjectImage->setFrameStyle(QFrame::StyledPanel); lastProjectLabel->setFrameStyle(QFrame::StyledPanel); } openProjectImage->setFrameStyle(QFrame::StyledPanel); openProjectLabel->setFrameStyle(QFrame::StyledPanel); selectedPossibility = 1; qDebug() << "StartDialog::newClick --> End"; } void StartDialog::lastClick() { qDebug() << "StartDialog::lastClick --> Start"; newProjectImage->setFrameStyle(QFrame::StyledPanel); newProjectLabel->setFrameStyle(QFrame::StyledPanel); if (!lastProjectPath.isEmpty()) { lastProjectImage->setFrameStyle(QFrame::Panel | QFrame::Sunken); lastProjectLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken); } openProjectImage->setFrameStyle(QFrame::StyledPanel); openProjectLabel->setFrameStyle(QFrame::StyledPanel); selectedPossibility = 2; qDebug() << "StartDialog::lastClick --> End"; } void StartDialog::openClick() { qDebug() << "StartDialog::openClick --> Start"; newProjectImage->setFrameStyle(QFrame::StyledPanel); newProjectLabel->setFrameStyle(QFrame::StyledPanel); if (!lastProjectPath.isEmpty()) { lastProjectImage->setFrameStyle(QFrame::StyledPanel); lastProjectLabel->setFrameStyle(QFrame::StyledPanel); } openProjectImage->setFrameStyle(QFrame::Panel | QFrame::Sunken); openProjectLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken); selectedPossibility = 3; qDebug() << "StartDialog::openClick --> End"; } int StartDialog::getSelectedPossibility() { return this->selectedPossibility; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/dialogs/externalcommanddialog.cpp000644 000000 000000 00000012020 13011043104 030750 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "externalcommanddialog.h" #include #include #include #include #include "technical/util.h" ExternalCommandDialog::ExternalCommandDialog(QWidget *parent) : QWidget(parent) { vboxLayout = new QVBoxLayout(this); vboxLayout->setSpacing(6); vboxLayout->setMargin(9); textBrowser = new QTextBrowser(this); vboxLayout->addWidget(textBrowser); hboxLayout = new QHBoxLayout(); hboxLayout->setSpacing(6); hboxLayout->setMargin(0); label = new QLabel(this); label->setText(tr("Input to program:")); hboxLayout->addWidget(label); lineEdit = new QLineEdit(this); connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(submitInputToProgram())); lineEdit->setEchoMode(QLineEdit::Normal); hboxLayout->addWidget(lineEdit); submitButton = new QPushButton(this); connect(submitButton, SIGNAL(clicked()), this, SLOT(submitInputToProgram())); submitButton->setText(tr("Submit")); hboxLayout->addWidget(submitButton); closeButton = new QPushButton(this); connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); closeButton->setEnabled(false); closeButton->setText(tr("Close")); hboxLayout->addWidget(closeButton); vboxLayout->addLayout(hboxLayout); process = new QProcess(this); connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(readFromStandardOutput())); connect(process, SIGNAL(readyReadStandardError()), this, SLOT(readFromStandardError())); connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(displayExitStatus(int, QProcess::ExitStatus))); resize(QSize(593, 363).expandedTo(minimumSizeHint())); setAttribute(Qt::WA_DeleteOnClose); setWindowTitle(tr("Output from external command")); } void ExternalCommandDialog::run(const QString &command, const QStringList &arguments) { qDebug() << "ExternalCommandDialog::run --> Start"; QString osCommand(Util::convertPathToOsSpecific(command)); qDebug() << "ExternalCommandDialog::run --> Command"; qDebug() << osCommand; process->start(osCommand, arguments); qDebug() << "ExternalCommandDialog::run --> End"; } void ExternalCommandDialog::readFromStandardOutput() { textBrowser->ensureCursorVisible(); QTextCursor curs = textBrowser->textCursor(); curs.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor); curs.insertText(process->readAllStandardOutput()); } void ExternalCommandDialog::readFromStandardError() { textBrowser->ensureCursorVisible(); QTextCursor curs = textBrowser->textCursor(); curs.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor); curs.insertText(process->readAllStandardError()); } void ExternalCommandDialog::submitInputToProgram() { if (lineEdit->isModified()) { process->write(lineEdit->text().toStdString().c_str()); lineEdit->setText(""); } } void ExternalCommandDialog::displayExitStatus(int exitCode, QProcess::ExitStatus) { if (exitCode != 0) { QMessageBox::warning(this, tr("Result"), tr("Failed!")); } else { QMessageBox::information(this, tr("Result"), tr("Successful!")); } lineEdit->setEnabled(false); submitButton->setEnabled(false); closeButton->setEnabled(true); } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/qtfrontend.cpp000644 000000 000000 00000071057 13011043104 025170 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include #include #include #include #include #include #include #include "qtfrontend.h" #include "domain/animation/projectserializer.h" #include "frontends/viewfacade.h" #include "frontends/qtfrontend/dialogs/externalcommanddialog.h" #include "technical/util.h" #include "technical/preferencestool.h" #include // #include Q_LOGGING_CATEGORY(qstopmotion, "qtfrontend.qstopmotion") QtFrontend::QtFrontend(int &argc, char **argv) { qCDebug(qstopmotion) << "QtFrontend::Constructor --> Start"; qCDebug(qstopmotion) << "QtFrontend::Constructor Date:" << QDate::currentDate(); domainFacade = NULL; viewFacade = NULL; mw = NULL; preferencesTool = NULL; stApp = new QApplication(argc, argv); // #if QT_VERSION == 0x040400 // stApp->setAttribute(Qt::AA_NativeWindows); // #endif /* #if QT_VERSION<0x050000 // der Codec der Quelltexte ist UTF-8, // Die Standardkonvertierung von char* in Unicode geht jedoch von Latin-1 aus (bis QT4.8): QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // f"ur tr() QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); // const char* in QString QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); // f"ur locale #endif */ qCDebug(qstopmotion) << "QtFrontend::Constructor --> End"; } QtFrontend::~QtFrontend() { qDebug() << "QtFrontend::Destructor --> Start"; // Save the size and position of the application QSize appSize = mw->size(); QPoint appPos = mw->pos(); preferencesTool->setIntegerPreference("preferences", "applicationsizeheight", appSize.height()); preferencesTool->setIntegerPreference("preferences", "applicationsizewidth", appSize.width()); preferencesTool->setIntegerPreference("preferences", "applicationposx", appPos.x()); preferencesTool->setIntegerPreference("preferences", "applicationposy", appPos.y()); // Cleanup the memory delete mw; mw = NULL; if (domainFacade != NULL) { delete domainFacade; domainFacade = NULL; } if (viewFacade != NULL) { delete viewFacade; viewFacade = NULL; } if(preferencesTool != NULL) { delete preferencesTool; preferencesTool = NULL; } delete stApp; stApp = NULL; qDebug() << "QtFrontend::Destructor --> End"; } bool QtFrontend::checkApplicationDirectory(char *binDirName) { qDebug() << "QtFrontend::checkApplicationDirectory --> Start"; qDebug() << "QtFrontend::checkApplicationDirectory --> Call command:" << binDirName; bool hasCorrectPermissions = true; QDir homeDir = QDir::home(); QString userDirName; QString otherDirName; // Check if ~./qstopmotion directory exists, create it if not bool prefsFileExists = homeDir.exists(PreferencesTool::applicationDirectory); if (prefsFileExists == false) { if (!homeDir.mkdir(PreferencesTool::applicationDirectory)) { // Can't create application directory showCritical(tr("Create directory"), tr("You do not have the necessary permissions to run qStopMotion.\n" "You need permission to create the .qstopmotion directory in your home directory.")); qDebug() << "QtFrontend::checkApplicationDirectory --> End (Error)"; return 1; } } homeDir.cd(PreferencesTool::applicationDirectory); if (homeDir.isReadable() == false) { // TODO: Writable and executable test necessary hasCorrectPermissions = false; } if (!hasCorrectPermissions) { // Set the rigth permissions QFile appDir(homeDir.absolutePath()); hasCorrectPermissions = appDir.setPermissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner); if (!hasCorrectPermissions) { // Set the permissions was not successful! showCritical(tr("Check Permissions"), tr("You do not have the necessary permissions to run qStopMotion.\n" "You need permission to read, write and execute on the .qstopmotion directory.")); qDebug() << "QtFrontend::checkApplicationDirectory --> End (Error)"; return 1; } } userDirName.append(homeDir.absolutePath()); appUserDirName.append(userDirName); userDirName.append(QLatin1String("/")); otherDirName.append(userDirName); otherDirName.append(PreferencesTool::tempDirectory); appTempDirName.append(otherDirName); QString absoluteAppName = Util::convertPathFromOsSpecific(QString(binDirName)); int pathLength = absoluteAppName.lastIndexOf("/bin/"); if (pathLength == -1) { QString command = Util::checkCommand(binDirName); qDebug() << "QtFrontend::checkApplicationDirectory --> Check command:" << command; absoluteAppName = Util::convertPathFromOsSpecific(QString(command)); pathLength = absoluteAppName.lastIndexOf("/bin/"); } if (pathLength == -1) { // The binDirName is only the application name --> use default values #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version appApplicationDirName.append("C:/Program Files/qstopmotion/"); #else // Linux and Apple OS X version appApplicationDirName.append("/usr/"); #endif otherDirName.clear(); otherDirName.append(appApplicationDirName); otherDirName.append(QLatin1String("bin/")); appBinDirName.append(otherDirName); } else { // The binDirName is a full qualified application name appApplicationDirName.append(absoluteAppName.left(pathLength + 1)); pathLength = absoluteAppName.lastIndexOf("/"); appBinDirName.append(absoluteAppName.left(pathLength + 1)); } qDebug() << "QtFrontend::checkApplicationDirectory --> Application Directory:" << appApplicationDirName; qDebug() << "QtFrontend::checkApplicationDirectory --> Application Binary Directory:" << appBinDirName; #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Windows version otherDirName.clear(); otherDirName.append(appApplicationDirName); otherDirName.append(PreferencesTool::manualDirectory); otherDirName.append(QLatin1String("/")); appManualDirName.append(otherDirName); otherDirName.clear(); otherDirName.append(appApplicationDirName); otherDirName.append(PreferencesTool::translationsDirectory); otherDirName.append(QLatin1String("/")); appTranslationsDirName.append(otherDirName); otherDirName.clear(); otherDirName.append(appApplicationDirName); otherDirName.append(PreferencesTool::graphicsDirectory); otherDirName.append(QLatin1String("/")); appGraphicsDirName.append(otherDirName); #else // Linux and Apple OS X version otherDirName.clear(); otherDirName.append(appApplicationDirName); otherDirName.append(QLatin1String("share/doc/")); otherDirName.append(PreferencesTool::applicationName); otherDirName.append(QLatin1String("/")); // otherDirName.append(PreferencesTool::manualDirectory); // otherDirName.append(QLatin1String("/")); appManualDirName.append(otherDirName); otherDirName.clear(); otherDirName.append(appApplicationDirName); otherDirName.append(QLatin1String("share/")); otherDirName.append(PreferencesTool::applicationName); otherDirName.append(QLatin1String("/")); otherDirName.append(PreferencesTool::translationsDirectory); otherDirName.append(QLatin1String("/")); appTranslationsDirName.append(otherDirName); otherDirName.clear(); otherDirName.append(appApplicationDirName); otherDirName.append(QLatin1String("share/")); otherDirName.append(PreferencesTool::applicationName); otherDirName.append(QLatin1String("/")); otherDirName.append(PreferencesTool::graphicsDirectory); otherDirName.append(QLatin1String("/")); appGraphicsDirName.append(otherDirName); #endif qDebug() << "QtFrontend::checkApplicationDirectory --> Application Manual Directory:" << appManualDirName; qDebug() << "QtFrontend::checkApplicationDirectory --> Application Translations Directory:" << appTranslationsDirName; qDebug() << "QtFrontend::checkApplicationDirectory --> Application Graphics Directory:" << appGraphicsDirName; otherDirName.clear(); otherDirName.append(appGraphicsDirName); otherDirName.append(PreferencesTool::iconsDirectory); otherDirName.append(QLatin1String("/")); appIconsDirName.append(otherDirName); qDebug() << "QtFrontend::checkApplicationDirectory --> Application Icon Directory:" << appIconsDirName; otherDirName.clear(); otherDirName.append(appGraphicsDirName); otherDirName.append(PreferencesTool::picturesDirectory); otherDirName.append(QLatin1String("/")); appPicturesDirName.append(otherDirName); qDebug() << "QtFrontend::checkApplicationDirectory --> Application Pictures Directory:" << appPicturesDirName; qDebug() << "QtFrontend::checkApplicationDirectory --> End"; return 0; } void QtFrontend::init() { qDebug() << "QtFrontend::init --> Start"; QString iconFile(getGraphicsDirName()); iconFile.append(QLatin1String("qstopmotion_splash_screen.png")); QSplashScreen *splash = new QSplashScreen; splash->setPixmap(QPixmap(iconFile)); splash->show(); Qt::Alignment bottomRight = Qt::AlignBottom | Qt::AlignRight; splash->showMessage(PreferencesTool::applicationShowName + " - " + PreferencesTool::applicationVersion, bottomRight, Qt::black); // Need to call this here to get the locale for the language // which is used by the translator created in mainWindowGUI preferencesTool = new PreferencesTool(this); initializePreferences(); // returns a pointer to the domain facade (allocated with new) domainFacade = new DomainFacade(this); // returns a pointer to the facade (allocated with new) viewFacade = new ViewFacade(this); mw = new MainWindowGUI(stApp, this); mw->initialize(); // Restore the size and position of the application QSize appSize; QPoint appPos; int value; if (preferencesTool->getIntegerPreference("preferences", "applicationsizeheight", value) == false) { value = 593; } appSize.setHeight(value); if (preferencesTool->getIntegerPreference("preferences", "applicationsizewidth", value) == false) { value = 751; } appSize.setWidth(value); if (preferencesTool->getIntegerPreference("preferences", "applicationposx", value) == false) { value = 80; } appPos.setX(value); if (preferencesTool->getIntegerPreference("preferences", "applicationposy", value) == false) { value = 20; } appPos.setY(value); // Was the last position on a not existing second screen? if (appPos.x() > QApplication::desktop()->width()) { appPos.setX(80); } if (appPos.y() > QApplication::desktop()->height()) { appPos.setY(20); } mw->resize(appSize); mw->move(appPos); // this->testMainWidget(); mw->show(); splash->finish(mw); delete splash; // this->testMainWidget(); qDebug() << "QtFrontend::init --> End"; } bool QtFrontend::handleArguments(int argc, char **argv) { qDebug() << "QtFrontend::handleArguments --> Start"; if (argc < 2) { // No arguments qDebug() << "QtFrontend::handleArguments --> End (false)"; return false; } if (QFileInfo(argv[1]).isReadable()) { mw->openProject(argv[1]); qDebug() << "QtFrontend::handleArguments --> End (true)"; return true; } qDebug() << "QtFrontend::handleArguments --> End (false)"; return false; } int QtFrontend::run(int, char **) { stApp->connect(stApp, SIGNAL(lastWindowClosed()), stApp, SLOT(quit())); return stApp->exec(); } void QtFrontend::finalize() { this->removeApplicationFiles(); this->removeApplicationDirectories(); } DomainFacade* QtFrontend::getProject() { return domainFacade; } ViewFacade* QtFrontend::getView() { return viewFacade; } PreferencesTool* QtFrontend::getPreferences() { return preferencesTool; } const QString QtFrontend::getUserDirName() { return this->appUserDirName; } const QString QtFrontend::getTempDirName() { return this->appTempDirName; } const QString QtFrontend::getApplicationDirName() { return this->appApplicationDirName; } const QString QtFrontend::getBinDirName() { return this->appBinDirName; } const QString QtFrontend::getManualDirName() { return this->appManualDirName; } const QString QtFrontend::getTranslationsDirName() { return this->appTranslationsDirName; } const QString QtFrontend::getGraphicsDirName() { return this->appGraphicsDirName; } const QString QtFrontend::getIconsDirName() { return this->appIconsDirName; } const QString QtFrontend::getPicturesDirName() { return this->appPicturesDirName; } const QVector QtFrontend::getLanguages() { return mw->getLanguages(); } const QVector QtFrontend::getLocales() { return mw->getLocales(); } void QtFrontend::changeLanguage(int newIndex) { mw->changeLanguage(newIndex); } void QtFrontend::changeCaptureButtonFunction(int newFunction) { mw->changeCaptureButtonFunction((PreferencesTool::captureButtonFunction)newFunction); } bool QtFrontend::getVerticalGrid() { return mw->getVerticalGrid(); } void QtFrontend::setVerticalGrid(bool newState) { mw->setVerticalGrid(newState); } int QtFrontend::getVerticalSpin() { return mw->getVerticalSpin(); } void QtFrontend::setVerticalSpin(int newSpin) { mw->setVerticalSpin(newSpin); } bool QtFrontend::getHorizontalGrid() { return mw->getHorizontalGrid(); } void QtFrontend::setHorizontalGrid(bool newState) { mw->setHorizontalGrid(newState); } int QtFrontend::getHorizontalSpin() { return mw->getHorizontalSpin(); } void QtFrontend::setHorizontalSpin(int newSpin) { mw->setHorizontalSpin(newSpin); } void QtFrontend::getGridColorRGB(int *r, int *g, int *b, int *a) { mw->getGridColorRGB(r, g, b, a); } void QtFrontend::setGridColorRGB(int r, int g, int b, int a) { mw->setGridColorRGB(r, g, b, a); } void QtFrontend::showProgress(const QString &operation, unsigned int numOperations) { mw->showProgress(operation, numOperations); } void QtFrontend::hideProgress() { mw->hideProgress(); } void QtFrontend::updateProgress(int numOperationsDone) { mw->updateProgress(numOperationsDone); } void QtFrontend::increaseProgress() { mw->increaseProgress(); } void QtFrontend::setProgressInfo(const QString infoText) { mw->setProgressInfo(infoText); } void QtFrontend::showMessage(const QString &message, int timeout) { mw->showMessage(message, timeout); } void QtFrontend::clearMessage() { mw->clearMessage(); } void QtFrontend::setProjectID(const QString id) { mw->setProjectID(id); } void QtFrontend::setSceneID(const QString id) { mw->setSceneID(id); } void QtFrontend::setTakeID(const QString id) { mw->setTakeID(id); } void QtFrontend::setExposureID(const QString id) { mw->setExposureID(id); } bool QtFrontend::isOperationAborted() { return mw->isOperationAborted(); } void QtFrontend::processEvents() { stApp->processEvents(); } void QtFrontend::initializePreferences() { qDebug() << "QtFrontend::initializePreferences --> Start"; QDir homeDir = QDir::home(); QString preferencesFile = homeDir.absolutePath(); preferencesFile.append(QLatin1String("/")); preferencesFile.append(PreferencesTool::applicationDirectory); preferencesFile.append(QLatin1String("/")); preferencesFile.append(PreferencesTool::preferencesName); preferencesFile.append(QLatin1String(".")); preferencesFile.append(PreferencesTool::preferencesSuffix); if (!preferencesTool->setPreferencesFile(preferencesFile, PreferencesTool::preferencesVersion)) { // File doesn't exist or is corrupt setDefaultPreferences(); } qDebug() << "QtFrontend::initializePreferences --> End"; } void QtFrontend::setDefaultPreferences() { qDebug() << "QtFrontend::setDefaultPreferences --> Start"; preferencesTool->setVersion(PreferencesTool::preferencesVersion); preferencesTool->setBasicPreferenceDefaults(); // preferencesTool->setEncoderDefaults(); qDebug() << "QtFrontend::setDefaultPreferences --> End"; } int QtFrontend::askQuestion(const QString title, const QString &question) { QMessageBox msgBox; msgBox.setWindowTitle(title); msgBox.setText(question); // msgBox.setInformativeText(information); msgBox.setStandardButtons(QMessageBox::NoButton); msgBox.setDefaultButton(QMessageBox::NoButton); QPushButton *yesButton = msgBox.addButton(tr("&Yes"), QMessageBox::YesRole); QPushButton *noButton = msgBox.addButton(tr("&No"), QMessageBox::NoRole); msgBox.setIcon(QMessageBox::Question); msgBox.exec(); if (msgBox.clickedButton() == yesButton) { return 0; } return 1; } void QtFrontend::showInformation(const QString title, const QString &info) { QMessageBox msgBox; msgBox.setWindowTitle(title); msgBox.setText(info); // msgBox.setInformativeText(information); msgBox.setStandardButtons(QMessageBox::NoButton); msgBox.setDefaultButton(QMessageBox::NoButton); msgBox.addButton(tr("&OK"), QMessageBox::AcceptRole); msgBox.setIcon(QMessageBox::Information); msgBox.exec(); } void QtFrontend::showWarning(const QString title, const QString &warning) { QMessageBox msgBox; msgBox.setWindowTitle(title); msgBox.setText(warning); // msgBox.setInformativeText(information); msgBox.setStandardButtons(QMessageBox::NoButton); msgBox.setDefaultButton(QMessageBox::NoButton); msgBox.addButton(tr("&OK"), QMessageBox::AcceptRole); msgBox.setIcon(QMessageBox::Warning); msgBox.exec(); } void QtFrontend::showCritical(const QString title, const QString &message) { QMessageBox msgBox; msgBox.setWindowTitle(title); msgBox.setText(message); // msgBox.setInformativeText(information); msgBox.setStandardButtons(QMessageBox::NoButton); msgBox.setDefaultButton(QMessageBox::NoButton); msgBox.addButton(tr("&OK"), QMessageBox::AcceptRole); msgBox.setIcon(QMessageBox::Critical); msgBox.exec(); Q_ASSERT(0); } int QtFrontend::runExternalCommand(const QString &command, const QStringList &arguments) { ExternalCommandDialog *ec = new ExternalCommandDialog; ec->show(); ec->run(command, arguments); return 0; } bool QtFrontend::startGrabber() { bool ret; qDebug() << "QtFrontend::startGrabber --> Start"; ret = mw->startGrabber(); qDebug() << "QtFrontend::startGrabber --> End"; return ret; } bool QtFrontend::isGrabberInited() { bool ret; qDebug() << "QtFrontend::on --> Start"; ret = mw->isGrabberInited(); qDebug() << "QtFrontend::on --> End"; return ret; } void QtFrontend::stopGrabber() { qDebug() << "QtFrontend::stopGrabber --> Start"; mw->stopGrabber(); qDebug() << "QtFrontend::stopGrabber --> End"; } const QVector QtFrontend::getDevices() { return mw->getDevices(); } ImageGrabberDevice* QtFrontend::getDevice(int deviceIndex) { return mw->getDevice(deviceIndex); } const QVector QtFrontend::getDeviceNames() { return mw->getDeviceNames(); } const QVector QtFrontend::getResolutionNames(int deviceIndex) { return mw->getResolutionNames(deviceIndex); } const QImage QtFrontend::getLiveImage() { return mw->getLiveImage(); } const QImage QtFrontend::getRawImage() { return mw->getRawImage(); } void QtFrontend::nextAnimationFrame(int exposureIndex) { mw->nextAnimationFrame(exposureIndex); } bool QtFrontend::removeContentInDirectory(const QString &dirPath) { bool ret = true; QDir aDir(dirPath); if (!(aDir.exists())) { return false; } QFileInfoList entries = aDir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files); int count = entries.size(); for (int idx = 0; ((idx < count) && (ret)); idx++) { QFileInfo entryInfo = entries[idx]; QString path = entryInfo.absoluteFilePath(); if (entryInfo.isDir()) { // This entry is a directory ret = removeContentInDirectory(path); if (!ret) { continue; } if (!aDir.rmdir(path)) { ret = false; } } else { // This entry is a file if (!aDir.remove(path)) { ret = false; } } } return(ret); } void QtFrontend::makeApplicationDirectories() { QDir homeDir = QDir::home(); bool ret; ret = homeDir.mkpath(getTempDirName()); Q_ASSERT(ret == true); // QFile appDir(homeDir.absolutePath() and temp subdirectory); // hasCorrectPermissions = appDir.setPermissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner); } void QtFrontend::removeApplicationDirectories() { QDir homeDir(getUserDirName()); bool ret; ret = homeDir.rmdir(getTempDirName()); Q_ASSERT(ret == true); } void QtFrontend::removeApplicationFiles() { bool ret; ret = removeContentInDirectory(getTempDirName()); Q_ASSERT(ret == true); getProject()->removeHistoryFile(); } bool QtFrontend::isRecoveryMode() { qDebug() << "QtFrontend::isRecoveryMode --> Start"; if (QFile::exists(getTempDirName()) == false) { qDebug() << "QtFrontend::isRecoveryMode --> End (False)"; return false; } // Everything is intact and we have to run in recovery mode qDebug() << "QtFrontend::isRecoveryMode --> End (True)"; return true; } bool QtFrontend::recoverProject() { qDebug() << "QtFrontend::recoverProject --> Start"; int ret = askQuestion(tr("Recovery"), tr("Something caused qStopmotion to exit abnormally\n" "last time it was run. Do you want to recover?")); // The user wants to recover if (ret != 0) { qDebug() << "QtFrontend::recoverProject --> End (False)"; return false; } mw->setWindowTitle(tr("qStopMotion - Recovered Project")); bool recovered = getProject()->recoverProject(); qDebug() << "QtFrontend::recoverProject --> End"; return recovered; } void QtFrontend::startDialog() { qDebug() << "QtFrontend::startDialog --> Start"; mw->startDialog(); qDebug() << "QtFrontend::startDialog --> End"; } void QtFrontend::setToolBarState(int newState) { qDebug() << "MainWindowGUI::setToolBarState --> Start"; mw->setToolBarState(newState); qDebug() << "MainWindowGUI::setToolBarState --> End"; } int QtFrontend::getRecordingMode() { return mw->getRecordingMode(); } void QtFrontend::setRecordingMode(int mode) { mw->setRecordingMode(mode); } int QtFrontend::getVideoSource() { return mw->getVideoSource(); } bool QtFrontend::setVideoSource(int index) { return mw->setVideoSource(index); } int QtFrontend::getResolution() { return mw->getResolution(); } bool QtFrontend::setResolution(int index) { return mw->setResolution(index); } const GrabberResolution QtFrontend::getResolution(int Index) { return mw->getResolution(Index); } bool QtFrontend::convertImages(int newFormat, int newQuality) { return mw->convertImages(newFormat, newQuality); } int QtFrontend::getMixMode() { return mw->getMixMode(); } void QtFrontend::setMixMode(int mode) { mw->setMixMode(mode); } int QtFrontend::getMixCount() { return mw->getMixCount(); } void QtFrontend::setMixCount(int count) { mw->setMixCount(count); } int QtFrontend::getPlaybackCount() { return mw->getPlaybackCount(); } void QtFrontend::setPlaybackCount(int count) { mw->setPlaybackCount(count); } int QtFrontend::getOverlayIntensity() { return mw->getOverlayIntensity(); } void QtFrontend::setOverlayIntensity(int overlay) { mw->setOverlayIntensity(overlay); } void QtFrontend::setupDirectoryMonitoring() { mw->setupDirectoryMonitoring(); } void QtFrontend::addDirectoryToMonitoring(const QString &directory) { mw->addDirectoryToMonitoring(directory); } void QtFrontend::removeDirectoryFromMonitoring(const QString &directory) { mw->removeDirectoryFromMonitoring(directory); } void QtFrontend::removeAllDirectoriesFromMonitoring() { mw->removeAllDirectoriesFromMonitoring(); } void QtFrontend::addFileToMonitoring(const QString &file) { mw->addFileToMonitoring(file); } void QtFrontend::removeFileFromMonitoring(const QString &file) { mw->removeFileFromMonitoring(file); } void QtFrontend::removeAllFilesFromMonitoring() { mw->removeAllFilesFromMonitoring(); } void QtFrontend::test(QWidget *parentWidget, int level) { QDebug(QtDebugMsg) << "QtFrontend::test of level: " << level << " --> Start <<<<<<<<<<<<<<<======================="; QObjectList testList = parentWidget->children(); int testSize = testList.size(); if (testSize == 0) { QDebug(QtDebugMsg) << "QtFrontend::test of level: " << level << " --> End (no children) <<<<<<<<<<<<<<<======================="; return; } QDebug(QtDebugMsg) << "QtFrontend::test of level: " << level << " --> testSize: " << testSize; for (int testIndex = 0 ; testIndex < testSize ; testIndex++ ) { if ((level == 1) && (testIndex > 3)) { QDebug(QtDebugMsg) << "QtFrontend::test: ++++++++++++++++++++++ Break +++++++++++++++++"; } QObject *testObject = testList.at(testIndex); if (testObject == 0) { QDebug(QtDebugMsg) << "QtFrontend::test of level: " << level << " index: " << testIndex << " --> Widget korrupt !!!"; continue; } if (testObject->objectName().isEmpty()) { QDebug(QtDebugMsg) << "QtFrontend::test of level: " << level << " index: " << testIndex << " --> testObject.className: " << testObject->metaObject()->className(); } else { QDebug(QtDebugMsg) << "QtFrontend::test of level: " << level << " index: " << testIndex << " --> testObject.objectName: " << testObject->objectName(); } if (testObject->parent() != parentWidget) { QDebug(QtDebugMsg) << "QtFrontend::test: ?????????????? Parent different ?????????????"; } QWidget *testWidget = qobject_cast(testObject); if (testWidget == 0) { QDebug(QtDebugMsg) << "QtFrontend::test of level: " << level << " index: " << testIndex << " --> no Widget !!!"; continue; } QDebug(QtDebugMsg) << "QtFrontend::test of level: " << level << " index: " << testIndex << " --> testWidget.winID: " << testWidget->winId(); this->test(testWidget, (level+1)); } QDebug(QtDebugMsg) << "QtFrontend::test of level: " << level << " --> End <<<<<<<<<<<<<<<======================="; } void QtFrontend::testMainWidget() { QDebug(QtDebugMsg) << "QtFrontend::testMainWidget --> Start"; test(this->mw, 0); QDebug(QtDebugMsg) << "QtFrontend::testMainWidget --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/toolbar.cpp000644 000000 000000 00000050000 12751646113 024452 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "frontends/qtfrontend/toolbar.h" #include #include #include #include ToolBar::ToolBar(Frontend *f, QWidget *parent) : QWidget(parent) { frontend = f; actualState = toolBarNothing; runAnimationTimer = NULL; framesIcon = 0; overlaySlider = 0; cameraIcon = 0; toBeginButton = 0; previousFrameButton = 0; captureButton = 0; playButton = 0; nextFrameButton = 0; toEndButton = 0; fps = 0; exposureCount = 0; exposureIndex = -1; isLooping = false; setObjectName("ToolBar"); makeGUI(); retranslateStrings(); runAnimationTimer = new QTimer(this); QObject::connect(runAnimationTimer, SIGNAL(timeout()), this, SLOT(playNextFrame())); } void ToolBar::makeGUI() { QString iconFile(frontend->getIconsDirName()); // Overlay slider framesIcon = new QLabel(); iconFile.append(QLatin1String("frames.png")); framesIcon->setPixmap(QPixmap(iconFile)); overlaySlider = new QSlider(Qt::Horizontal); connect(overlaySlider, SIGNAL(valueChanged(int)), this, SLOT(overlaySliderChanged(int))); overlaySlider->setMinimum(0); overlaySlider->setMaximum(255); overlaySlider->setValue(100); cameraIcon = new QLabel(); iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("camera.png")); cameraIcon->setPixmap(QPixmap(iconFile)); // Contol buttons toBeginButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("firstexposure.png")); toBeginButton->setIcon(QPixmap(iconFile)); // toBeginButton->setFlat(true); // toBeginButton->setFocusPolicy( Qt::NoFocus ); connect(toBeginButton, SIGNAL(clicked()), this, SLOT(selectFirstFrame())); toBeginButton->setEnabled(false); previousFrameButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("previousexposure.png")); previousFrameButton->setIcon(QPixmap(iconFile)); // previousFrameButton->setFlat(true); connect(previousFrameButton, SIGNAL(clicked()), this, SLOT(selectPreviousFrame())); previousFrameButton->setEnabled(false); captureButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("capture.png")); captureButton->setIcon(QPixmap(iconFile)); // captureButton->setFlat(true); // captureButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); captureButton->setEnabled(false); playButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("play.png")); playButton->setIcon(QPixmap(iconFile)); // playButton->setFlat(true); connect(playButton, SIGNAL(clicked()), this, SLOT(runAnimation())); playButton->setEnabled(false); nextFrameButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("nextexposure.png")); nextFrameButton->setIcon(QPixmap(iconFile)); // nextFrameButton->setFlat(true); // nextFrameButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); connect(nextFrameButton, SIGNAL(clicked()), this, SLOT(selectNextFrame())); nextFrameButton->setEnabled(false); toEndButton = new QPushButton; iconFile.clear(); iconFile.append(frontend->getIconsDirName()); iconFile.append(QLatin1String("lastexposure.png")); toEndButton->setIcon(QPixmap(iconFile)); // toEndButton->setFlat(true); // toEndButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); connect(toEndButton, SIGNAL(clicked()), this, SLOT(selectLastFrame())); toEndButton->setEnabled(false); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->setMargin(0); buttonLayout->setSpacing(2); // buttonLayout->addStretch(1); buttonLayout->addWidget(framesIcon); buttonLayout->addWidget(overlaySlider); buttonLayout->addWidget(cameraIcon); buttonLayout->addStretch(10); buttonLayout->addWidget(toBeginButton); buttonLayout->addWidget(previousFrameButton); buttonLayout->addWidget(captureButton); buttonLayout->addWidget(playButton); buttonLayout->addWidget(nextFrameButton); buttonLayout->addWidget(toEndButton); buttonLayout->addStretch(10); setLayout(buttonLayout); } void ToolBar::retranslateStrings() { QString infoText = tr("

Play animation (K, P)

"); playButton->setToolTip(infoText); /* infoText = tr("

Previous scene (I)

"); previousSceneButton->setToolTip(infoText); infoText = tr("

Previous scene (I)

"); previousTakeButton->setToolTip(infoText); */ infoText = tr("

First frame of the take (J, Left)

"); toBeginButton->setToolTip(infoText); infoText = tr("

Previous frame (J, Left)

"); previousFrameButton->setToolTip(infoText); infoText = tr("

Previous frame (J, Left)

"); previousFrameButton->setToolTip(infoText); infoText = tr("

Next frame (L, Right)

"); nextFrameButton->setToolTip(infoText); infoText = tr("

Last frame of the take (L, Right)

"); toEndButton->setToolTip(infoText); /* infoText = tr("

Next take (O)

"); nextTakeButton->setToolTip(infoText); infoText = tr("

Next scene (O)

"); nextSceneButton->setToolTip(infoText); */ infoText = tr("

Capture Frame (Space)

" "

Click on this button to capture a frame from the " "camera an put it in the animation

This can also be " "done by pressing the Space key

"); captureButton->setWhatsThis(infoText); captureButton->setToolTip(infoText); } void ToolBar::initialize() { /* PreferencesTool *pref = PreferencesTool::get(); int active = -1; int numEncoders = pref->getNumberEncoders(); encoderTable->setRowCount(numEncoders); if (numEncoders > 0 ) { QString activeId = pref->getActiveEncoder(); int idx = 0; for (int i = 0; i < numEncoders; ++i) { QString id(QString("%1%2").arg(QLatin1String("encoder")).arg(i)); QString name; QString desc; QString start; QString stop; QString filename; if ( pref->getEncoder(id, name, desc, start, stop, filename) ) { encoderTable->setItem(i, 0, new QTableWidgetItem(name) ); encoderTable->setItem(i, 1, new QTableWidgetItem(desc) ); startEncoderStrings.append(start); stopEncoderStrings.append(stop); outputFiles.append(filename); if ( id.compare(activeId) == 0 ) active = idx; idx++; } } } if (active > -1) { encoderTable->setCurrentCell(active, 0); } */ } /* void ToolBar::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); } */ void ToolBar::apply() { /* PreferencesTool *pref = PreferencesTool::get(); // Remove old preferences pref->removeAllEncoders(); // Set new preferences int numEncoders = encoderTable->rowCount(); if (numEncoders > 0) { pref->setNumberEncoders(numEncoders); pref->setActiveEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(encoderTable->currentRow())); for (int i = 0; i < numEncoders; ++i) { pref->setEncoder(QString("%1%2").arg(QLatin1String("encoder")).arg(i), encoderTable->item(i, 0)->text(), encoderTable->item(i, 1)->text(), startEncoderStrings[i], stopEncoderStrings[i], outputFiles[i]); } } else { pref->setNumberEncoders(0); pref->setActiveEncoder(QString()); } */ } QPushButton* ToolBar::getCaptureButton() { return captureButton; } void ToolBar::setActualState(int newState) { actualState = newState; toolBarStateChanged(); } int ToolBar::getOverlayIntensity() { return overlaySlider->value(); } void ToolBar::setOverlayIntensity(int newOverlay) { overlaySlider->setValue(newOverlay); } void ToolBar::toggleRunning() { if (runAnimationTimer->isActive()) { stopAnimation(); } else { runAnimation(); } } void ToolBar::runAnimation() { qDebug() << "ToolBar::runAnimation --> Start"; int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); exposureCount = frontend->getProject()->getTakeExposureSize(activeSceneIndex, activeTakeIndex); fps = frontend->getProject()->getVideoFps(); if (activeSceneIndex >= 0) { if (exposureCount > 0) { // frontend->getProject()->initAudioDevice(); QString iconFile(frontend->getIconsDirName()); iconFile.append(QLatin1String("pause.png")); playButton->setIcon(QPixmap(iconFile)); QObject::disconnect(playButton, SIGNAL(clicked()), this, SLOT(runAnimation())); QObject::connect(playButton, SIGNAL(clicked()), this, SLOT(pauseAnimation())); //playButton->setToggleButton(true); playButton->setChecked(true); playButton->toggle(); exposureIndex = frontend->getProject()->getActiveExposureIndex(); if (exposureIndex == (exposureCount - 1)) { // Nothing to play, start at the beginning exposureIndex = 0; } frontend->showMessage(tr("Running animation"), 0); runAnimationTimer->start(1000 / fps); runAnimationTimer->setSingleShot(false); } } qDebug() << "ToolBar::runAnimation --> End"; } void ToolBar::stopAnimation() { if (runAnimationTimer->isActive()) { QString iconFile(frontend->getIconsDirName()); iconFile.append(QLatin1String("play.png")); playButton->setIcon(QPixmap(iconFile)); QObject::disconnect(playButton, SIGNAL(clicked()), this, SLOT(pauseAnimation())); QObject::connect(playButton, SIGNAL(clicked()), this, SLOT(runAnimation())); // frontend->shutdownAudioDevice(); if (playButton->isChecked()) { playButton->toggle(); } playButton->setChecked(false); frontend->clearMessage(); runAnimationTimer->stop(); exposureIndex = -1; } } void ToolBar::pauseAnimation() { if (runAnimationTimer->isActive()) { QString iconFile(frontend->getIconsDirName()); iconFile.append(QLatin1String("play.png")); playButton->setIcon(QPixmap(iconFile)); QObject::disconnect(playButton, SIGNAL(clicked()), this, SLOT(pauseAnimation())); QObject::connect(playButton, SIGNAL(clicked()), this, SLOT(runAnimation())); // frontend->shutdownAudioDevice(); if (playButton->isChecked()) { playButton->toggle(); } playButton->setChecked(false); frontend->clearMessage(); runAnimationTimer->stop(); } } // TODO: No selectFirstScene button, no implementation void ToolBar::selectFirstScene() { /* int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); if (activeSceneIndex > 0) { frontend->getProject()->setActiveSceneIndex(activeSceneIndex - 1); } */ } // TODO: No selectPreviousScene button, no implementation void ToolBar::selectPreviousScene() { /* int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); if (activeSceneIndex > 0) { frontend->getProject()->setActiveSceneIndex(activeSceneIndex - 1); } */ } // TODO: No selectFirstTake button, no implementation void ToolBar::selectFirstTake() { /* int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); if (activeSceneIndex > 0) { frontend->getProject()->setActiveSceneIndex(activeSceneIndex - 1); } */ } // TODO: No selectPreviousTake button, no implementation void ToolBar::selectPreviousTake() { /* int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); if (activeSceneIndex > 0) { frontend->getProject()->setActiveSceneIndex(activeSceneIndex - 1); } */ } void ToolBar::selectFirstFrame() { int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); int activeExposureIndex = frontend->getProject()->getActiveExposureIndex(); if (activeExposureIndex > 0) { frontend->getProject()->selectExposureToUndo(activeSceneIndex, activeTakeIndex, 0); } } void ToolBar::selectPreviousFrame() { int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); int activeExposureIndex = frontend->getProject()->getActiveExposureIndex(); if (activeExposureIndex > 0) { frontend->getProject()->selectExposureToUndo(activeSceneIndex, activeTakeIndex, activeExposureIndex - 1); } } void ToolBar::selectNextFrame() { int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); int activeExposureIndex = frontend->getProject()->getActiveExposureIndex(); int exposureCount = frontend->getProject()->getTakeExposureSize(activeSceneIndex, activeTakeIndex); if ((activeExposureIndex > -1) && (activeExposureIndex < exposureCount - 1)) { frontend->getProject()->selectExposureToUndo(activeSceneIndex, activeTakeIndex, activeExposureIndex + 1); } } void ToolBar::selectLastFrame() { int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int activeTakeIndex = frontend->getProject()->getActiveTakeIndex(); int exposureCount = frontend->getProject()->getTakeExposureSize(activeSceneIndex, activeTakeIndex); if (0 < exposureCount) { frontend->getProject()->selectExposureToUndo(activeSceneIndex, activeTakeIndex, exposureCount - 1); } } // TODO: No selectNextTake button, no implementation void ToolBar::selectNextTake() { /* int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int sceneCount = frontend->getProject()->getSceneSize(); if ((activeSceneIndex > -1) && (activeSceneIndex < sceneCount - 1)) { frontend->getProject()->setActiveSceneIndex(activeSceneIndex + 1); } */ } // TODO: No selectLastTake button, no implementation void ToolBar::selectLastTake() { /* int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int sceneCount = frontend->getProject()->getSceneSize(); if ((activeSceneIndex > -1) && (activeSceneIndex < sceneCount - 1)) { frontend->getProject()->setActiveSceneIndex(activeSceneIndex + 1); } */ } // TODO: No selectNextScene button, no implementation void ToolBar::selectNextScene() { /* int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int sceneCount = frontend->getProject()->getSceneSize(); if ((activeSceneIndex > -1) && (activeSceneIndex < sceneCount - 1)) { frontend->getProject()->setActiveSceneIndex(activeSceneIndex + 1); } */ } // TODO: No selectLastScene button, no implementation void ToolBar::selectLastScene() { /* int activeSceneIndex = frontend->getProject()->getActiveSceneIndex(); int sceneCount = frontend->getProject()->getSceneSize(); if ((activeSceneIndex > -1) && (activeSceneIndex < sceneCount - 1)) { frontend->getProject()->setActiveSceneIndex(activeSceneIndex + 1); } */ } void ToolBar::toggleLooping() { isLooping = !isLooping; } void ToolBar::overlaySliderChanged(int value) { frontend->getProject()->setOverlayIntensity(value); } void ToolBar::playNextFrame() { // qDebug() << "ToolBar::playNextFrame --> Start"; if (frontend->getProject()->getActiveSceneIndex() >= 0) { // frontend->playSound(frameNr); // frontend->getView()->notifyPlaySound(sceneIndex); if (isLooping) { exposureIndex = (exposureIndex < exposureCount - 1) ? exposureIndex + 1 : 0; frontend->nextAnimationFrame(exposureIndex); } else { if (exposureIndex < exposureCount) { frontend->nextAnimationFrame(exposureIndex); exposureIndex++; } else { this->stopAnimation(); } } } else { stopAnimation(); } // qDebug() << "ToolBar::playNextFrame --> End"; } void ToolBar::toolBarStateChanged() { qDebug() << "ToolBar::toolBarStateChanged --> Start"; switch (actualState) { case toolBarNothing: previousFrameButton->setEnabled(false); nextFrameButton->setEnabled(false); captureButton->setEnabled(false); playButton->setEnabled(false); toEndButton->setEnabled(false); toBeginButton->setEnabled(false); break; case toolBarCameraOff: previousFrameButton->setEnabled(true); nextFrameButton->setEnabled(true); captureButton->setEnabled(false); playButton->setEnabled(true); toEndButton->setEnabled(true); toBeginButton->setEnabled(true); break; case toolBarCameraOn: previousFrameButton->setEnabled(false); nextFrameButton->setEnabled(false); captureButton->setEnabled(true); playButton->setEnabled(false); toEndButton->setEnabled(false); toBeginButton->setEnabled(false); break; case toolBarPlaying: previousFrameButton->setEnabled(false); nextFrameButton->setEnabled(false); captureButton->setEnabled(false); playButton->setEnabled(true); toEndButton->setEnabled(false); toBeginButton->setEnabled(false); break; case toolBarPause: previousFrameButton->setEnabled(false); nextFrameButton->setEnabled(false); captureButton->setEnabled(true); playButton->setEnabled(true); toEndButton->setEnabled(false); toBeginButton->setEnabled(false); break; } qDebug() << "ToolBar::toolBarStateChanged --> End"; } /* void ToolBar::toBegin() { } void ToolBar::previousFrame() { } void ToolBar::play() { } void ToolBar::capture() { } void ToolBar::nextFrame() { } void ToolBar::toEnd() { } */ qstopmotion-2.3.2-Source/src/frontends/qtfrontend/elements/flexiblelineedit.h000644 000000 000000 00000004522 12654352322 027607 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef FLEXIBLELINEEDIT_H #define FLEXIBLELINEEDIT_H #include #include /** * An extended line edit class. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class FlexibleLineEdit : public QLineEdit { Q_OBJECT public: /** * Constructs and initializes the line edit object. * @param parent the parent widget */ FlexibleLineEdit(QWidget *parent = 0); /** * Checks what kind of key event the user has requested and * does actions based on this. * @param k the key event */ void keyPressEvent(QKeyEvent * k); signals: /** * Emitted if editing was canceled. */ void lineEditCanceled(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/elements/flexiblespinbox.cpp000644 000000 000000 00000004625 12654352322 030033 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2010 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "flexiblespinbox.h" #include FlexibleSpinBox::FlexibleSpinBox(QWidget *parent) : QSpinBox(parent) { } void FlexibleSpinBox::setMaximumValue(int maxValue) { this->setMaximum(maxValue); if (maxValue > 0) { setEnabled(true); } else { setEnabled(false); } } void FlexibleSpinBox::keyPressEvent(QKeyEvent * k) { switch (k->key()) { case Qt::Key_Return: case Qt::Key_Enter: { emit spinBoxTriggered(this->value() - 1); break; } case Qt::Key_Escape: { emit spinBoxCanceled(); break; } default: { QSpinBox::keyPressEvent(k); break; } } } void FlexibleSpinBox::showEvent(QShowEvent *) { this->setFocus(); this->selectAll(); } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/elements/clickablelabel.cpp000644 000000 000000 00000003372 12654352322 027545 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "clickablelabel.h" void ClickableLabel::mousePressEvent(QMouseEvent*) { pressed = true; } void ClickableLabel::mouseReleaseEvent(QMouseEvent* e) { if(pressed && rect().contains(e->pos())) { emit clicked(); } pressed = false; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/elements/flexiblelineedit.cpp000644 000000 000000 00000004227 12654352322 030144 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "flexiblelineedit.h" #include FlexibleLineEdit::FlexibleLineEdit(QWidget *parent) : QLineEdit(parent) { } void FlexibleLineEdit::keyPressEvent(QKeyEvent * k) { switch (k->key()) { case Qt::Key_Return: case Qt::Key_Enter: { emit returnPressed(); break; } case Qt::Key_Escape: { emit lineEditCanceled(); k->ignore(); break; } default: { QLineEdit::keyPressEvent(k); k->ignore(); break; } } } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/elements/flexiblespinbox.h000644 000000 000000 00000005505 12536560630 027500 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2010 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef FLEXIBLESPINBOX_H #define FLEXIBLESPINBOX_H #include #include /** * An extended spin box class. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class FlexibleSpinBox : public QSpinBox { Q_OBJECT public: /** * Constructs and initializes the object. * @param parent the parent widget */ FlexibleSpinBox(QWidget *parent = 0); /** * Checks what kind of key event the user has requested and * does actions based on this. * @param k the key event */ void keyPressEvent(QKeyEvent * k); public slots: /** * Sets a limit for the maximum value. This is based on the * the thumbnails displayed in the timeline. * @param maxValue maximum value (index of the last exposure in timeline) */ void setMaximumValue(int maxValue); signals: /** * Emits this signal when pressing enter. * @param frameNumber the choosen frame number in this spinbox */ void spinBoxTriggered(int frameNumber); /** * Emits this signal when getting an escape event (Key_Escape). */ void spinBoxCanceled(); protected: void showEvent(QShowEvent * event); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/elements/clickablelabel.h000755 000000 000000 00000003575 12654352322 027222 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef CLICKABLELABEL_H #define CLICKABLELABEL_H #include #include class ClickableLabel : public QLabel { Q_OBJECT bool pressed; signals: void clicked(); protected: void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent* e); public: ClickableLabel(QWidget* parent=0) : QLabel(parent), pressed(false) {} }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/importwidget.h000644 000000 000000 00000010442 12654352322 027500 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef IMPORTWIDGET_H #define IMPORTWIDGET_H #include "frontends/frontend.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /** * The image import tab in the preferences menu * @author Ralf Lange */ class ImportWidget : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param f frontend of the application * @param parent the parent of the this widget */ ImportWidget(Frontend *f, bool type, QWidget *parent = 0); /** * Applies the settings in the import tab. */ void apply(); /** * Reset the settings in the import tab. */ void reset(); /** * Initializes the table and fills it with starting values. */ void initialize(); protected: // void resizeEvent(QResizeEvent *event); private slots: // image import preferences /** * Slot for notified the image import tab when the image format changes, * so that image import preferences can be updated. * @param index the new image format. */ void changeImageFormat(int index); /** * Slot for notified the image import tab when the image quality changes, * so that image import preferences can be updated. */ void changeImageQuality(); /** * Slot for notified the image import tab when the image size changes, * so that image import preferences can be updated. * @param index the new image size. */ void changeImageSize(int index); /** * Slot for notified the image import tab when the live view fps changes, * so that image import preferences can be updated. */ void changeLiveViewFps(); private: Frontend *frontend; /** * Type of the tab: true = general dialog tab, false = project dialog tab */ bool tabType; QTextEdit *infoText; QTableWidget *encoderTable; // Image preferences QGroupBox *imagePrefs; QLabel *imageFormatLabel; QComboBox *imageFormatCombo; int activeImageFormat; QLabel *imageQualityLabel; QSlider *imageQualitySlider; int activeImageQuality; QLabel *qualityMinimumLabel; QLabel *qualityMaximumLabel; QLabel *imageSizeLabel; QComboBox *imageSizeCombo; int activeImageSize; // Live view preferences QGroupBox *liveViewPrefs; QLabel *liveViewFpsLabel; QSlider *liveViewFpsSlider; int activeLiveViewFps; QLabel *fpsMinimumLabel; QLabel *fpsMaximumLabel; void makeGUI(); void enableQuality(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/generaldialog.cpp000644 000000 000000 00000026500 12751646113 030116 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "generaldialog.h" #include #include #include "technical/preferencestool.h" #define MIN_TREE_WIDTH 240 #define MAX_TREE_WIDTH MIN_TREE_WIDTH #define MIN_PAGE_WIDTH 560 #define MIN_PAGE_HEIGHT 400 #define MAX_PAGE_WIDTH MIN_PAGE_WIDTH #define MAX_PAGE_HEIGHT MIN_PAGE_HEIGHT GeneralDialog::GeneralDialog(Frontend *f, QWidget *parent) : QDialog(parent, Qt::Dialog) { qDebug() << "GeneralDialog::Constructor --> Start"; frontend = f; pageTree = 0; pageLayout = 0; generalSettingsPage = 0; projectValuePage = 0; imageImportPage = 0; imageTransformationPage = 0; videoExportPage = 0; grabberSelectPage = 0; pageTree = new QTreeWidget(); pageTree->setColumnCount(1); pageTree->setHeaderHidden(true); pageTree->setMinimumWidth(MIN_TREE_WIDTH); pageTree->setMaximumWidth(MAX_TREE_WIDTH); connect(pageTree, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(itemClicked(QTreeWidgetItem*,int))); QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(pageTree); topLevelItem->setText(0, tr("Preferences")); topLevelItem->setFlags(Qt::ItemIsEnabled); topLevelItem->setExpanded(true); pageTree->insertTopLevelItem(0, topLevelItem); pageLayout = new QHBoxLayout; pageLayout->addWidget(pageTree); applyButton = new QPushButton(tr("Apply"), this); applyButton->setDefault(true); connect(applyButton, SIGNAL(clicked()), this, SLOT(apply())); closeButton = new QPushButton(tr("Close"), this); closeButton->setDefault(true); connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(this, SIGNAL(finished(int)), this, SLOT(finish(int))); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(1); buttonLayout->addWidget(applyButton); buttonLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(pageLayout); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setWindowTitle(tr("qStopMotion Preferences")); setModal(false); setMaximumSize(20+MAX_TREE_WIDTH+MAX_PAGE_WIDTH, 40+MAX_PAGE_HEIGHT); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); makeGeneralSettingsPage(); makeProjectValuePage(); makeImageImportPage(); makeImageTransformPage(); makeVideoExportPage(); makeGrabberSelectPage(); pageLayout->addStretch(1); qDebug() << "GeneralDialog::Constructor --> End"; } void GeneralDialog::makeGeneralSettingsPage() { qDebug() << "GeneralDialog::makeGeneralSettingsPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("General Settings")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); generalSettingsPage = new GeneralWidget(frontend); generalSettingsPage->initialize(); generalSettingsPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); generalSettingsPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); pageLayout->addWidget(generalSettingsPage); generalSettingsPage->setVisible(true); qDebug() << "GeneralDialog::makeGeneralSettingsPage --> End"; } void GeneralDialog::makeProjectValuePage() { qDebug() << "GeneralDialog::makeProjectValuePage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("New Project Values")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); projectValuePage = new ProjectWidget(frontend, true); projectValuePage->initialize(); projectValuePage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); projectValuePage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); pageLayout->addWidget(projectValuePage); projectValuePage->setVisible(false); qDebug() << "GeneralDialog::makeProjectValuePage --> End"; } void GeneralDialog::makeImageImportPage() { qDebug() << "GeneralDialog::makeImageImportPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("Image Import")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); imageImportPage = new ImportWidget(frontend, true); imageImportPage->initialize(); imageImportPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); imageImportPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); pageLayout->addWidget(imageImportPage); imageImportPage->setVisible(false); qDebug() << "GeneralDialog::makeImageImportPage --> End"; } void GeneralDialog::makeImageTransformPage() { qDebug() << "GeneralDialog::makeImageTransformPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("Image Transformation")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); imageTransformationPage = new TransformWidget(frontend, true); imageTransformationPage->initialize(); imageTransformationPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); imageTransformationPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); pageLayout->addWidget(imageTransformationPage); imageTransformationPage->setVisible(false); qDebug() << "GeneralDialog::makeImageTransformPage --> End"; } void GeneralDialog::makeVideoExportPage() { qDebug() << "GeneralDialog::makeVideoExportPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("Video Export")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); videoExportPage = new ExportWidget(frontend, true); videoExportPage->initialize(); videoExportPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); videoExportPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); videoExportPage->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); pageLayout->addWidget(videoExportPage); videoExportPage->setVisible(false); qDebug() << "GeneralDialog::makeVideoExportPage --> End"; } void GeneralDialog::makeGrabberSelectPage() { qDebug() << "GeneralDialog::makeGrabberSelectPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("Grabber")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); grabberSelectPage = new GrabberWidget(frontend); grabberSelectPage->initialize(); grabberSelectPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); grabberSelectPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); grabberSelectPage->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); pageLayout->addWidget(grabberSelectPage); grabberSelectPage->setVisible(false); qDebug() << "GeneralDialog::makeGrabberSelectPage --> End"; } void GeneralDialog::itemClicked(QTreeWidgetItem *pageItem, int /*column*/) { qDebug() << "GeneralDialog::itemClicked --> Start"; int itemIndex = 0; if (NULL != pageItem->parent()) { itemIndex = pageItem->parent()->indexOfChild(pageItem); } generalSettingsPage->setVisible(false); projectValuePage->setVisible(false); imageImportPage->setVisible(false); imageTransformationPage->setVisible(false); videoExportPage->setVisible(false); grabberSelectPage->setVisible(false); switch (itemIndex) { default: case 0: // General settings generalSettingsPage->setVisible(true); break; case 1: // New project values projectValuePage->setVisible(true); break; case 2: // Image import settings imageImportPage->setVisible(true); break; case 3: // Image transformation settings imageTransformationPage->setVisible(true); break; case 4: // Video export settings videoExportPage->setVisible(true); break; case 5: // Grabber settings grabberSelectPage->setVisible(true); break; } qDebug() << "GeneralDialog::itemClicked --> End"; } void GeneralDialog::apply() { qDebug() << "GeneralDialog::apply --> Start"; setFocus(); this->generalSettingsPage->apply(); this->projectValuePage->apply(); this->imageImportPage->apply(); this->imageTransformationPage->apply(); this->videoExportPage->apply(); this->grabberSelectPage->apply(); frontend->getPreferences()->flushPreferences(); this->setResult(QDialog::Accepted); this->hide(); qDebug() << "GeneralDialog::apply --> End"; } void GeneralDialog::close() { qDebug() << "GeneralDialog::close --> Start"; setFocus(); this->generalSettingsPage->reset(); this->projectValuePage->reset(); this->imageImportPage->reset(); this->imageTransformationPage->reset(); this->videoExportPage->reset(); this->grabberSelectPage->reset(); this->hide(); qDebug() << "GeneralDialog::close --> End"; } void GeneralDialog::finish(int result) { qDebug() << "GeneralDialog::finish --> Start"; setFocus(); if (result == 0) { generalSettingsPage->reset(); projectValuePage->reset(); imageImportPage->reset(); imageTransformationPage->reset(); videoExportPage->reset(); grabberSelectPage->reset(); } this->hide(); qDebug() << "GeneralDialog::finish --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/projectwidget.h000644 000000 000000 00000010406 12751646113 027636 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef PROJECTWIDGET_H #define PROJECTWIDGET_H #include #include #include #include #include #include "frontends/frontend.h" /** * The project widget in the preferences menu * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad & Ralf Lange */ class ProjectWidget : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param f frontend of the application * @param parent the parent of the this widget */ ProjectWidget(Frontend *f, bool type, QWidget *parent = 0); /** * Applies the settings in the import tab. */ void apply(); /** * Reset the settings in the import tab. */ void reset(); /** * Initializes the table and fills it with starting values. */ void initialize(); private: /** * Create the GUI of the tab */ void makeGUI(); /** * Set the image grabber source in the combo box. * @param newSource The new image grabber source */ void setImageGrabberSource(int newSource); protected: // void resizeEvent(QResizeEvent *event); private slots: /** * Slot for notified the default tab when the recording mode changes, so that widgets * can be updated. * @param index the new recording mode. */ void changeRecordingMode(int index); /** * Slot for notified the default tab when the grabber source changes, so that grabber * can be updated. * @param index the new viewing mode. */ void changeGrabberSource(int index); /** * Slot for notified the default tab when the mix mode changes, so that widgets * can be updated. * @param index the new mix mode. */ void changeMixMode(int index); /** * Slot for updating the mix count slider value. * @param value the new slider value. */ void changeMixCount(int value); /** * Slot for notified the default tab when the unit mode changes. * @param index the new unit mode. */ // void changeUnitMode(int index); private: Frontend *frontend; /** * Type of the tab: true = general dialog tab, false = project dialog tab */ bool tabType; QGroupBox *recordingGroupBox; QComboBox *recordingModeCombo; QGroupBox *grabberGroupBox; QComboBox *grabberSourceCombo; QGroupBox *captureGroupBox; QComboBox *mixModeCombo; QLabel *mixCountSliderCaption; QSlider *mixCountSlider; // QGroupBox *autoGroupBox; // QComboBox *unitModeCombo; int defaultRecordingMode; int defaultGrabberSource; int defaultMixMode; int defaultMixCount; int defaultPlaybackCount; // int defaultUnitMode; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/transformwidget.cpp000644 000000 000000 00000041452 12654352322 030541 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "transformwidget.h" #include #include #include #include #include #include #include #include #include "domain/domainfacade.h" #include "frontends/qtfrontend/elements/flexiblelineedit.h" #include "technical/preferencestool.h" #include "technical/grabber/imagegrabber.h" TransformWidget::TransformWidget(Frontend *f, bool type, QWidget *parent) : QWidget(parent) { qDebug() << "TransformWidget::Constructor --> Start"; frontend = f; tabType = type; infoText = 0; // Transformation preferences transformPrefs = 0; scaleButton = 0; clipButton = 0; zoomButton = 0; activeTransform = 0; // Adjustment preferences adjustmentPrefs = 0; leftUpButton = 0; centerUpButton = 0; rightUpButton = 0; leftMiddleButton = 0; centerMiddleButton = 0; rightMiddleButton = 0; leftDownButton = 0; centerDownButton = 0; rightDownButton = 0; activeImageAdjustment = ImageGrabber::centerDown; // Zoomw preferences zoomPrefs = 0; zoomLabel = 0; zoomSlider = 0; activeZoomValue = 20; zoomMinimumLabel = 0; zoomMaximumLabel = 0; this->setObjectName("TransformWidget"); makeGUI(); qDebug() << "TransformWidget::Constructor --> End"; } void TransformWidget::makeGUI() { qDebug() << "TransformWidget::makeGUI --> Start"; infoText = new QTextEdit; infoText->setReadOnly(true); if (tabType) { infoText->setHtml( "

" + tr("Below you can set which image transformation should be used for " "importing images to a new project. If you select " "clip a part of the image set also the adjustment for cliping.") + "

"); } else { infoText->setHtml( "

" + tr("Below you can set which image transformation should be used for " "importing images to the currently active project. If you select " "clip a part of the image set also the adjustment for cliping.") + "

"); } infoText->setMinimumWidth(440); infoText->setMinimumHeight(100); infoText->setMaximumHeight(100); infoText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); // Transformation preferences transformPrefs = new QGroupBox; transformPrefs->setMinimumSize(440, 300); transformPrefs->setTitle(tr("Transformation settings")); scaleButton = new QRadioButton(tr("Scale the whole image")); scaleButton->setChecked(true); scaleButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(scaleButton, SIGNAL(clicked()), this, SLOT(setScaleButtonOn())); clipButton = new QRadioButton(tr("Clip a part of the image")); clipButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); clipButton->setChecked(false); connect(clipButton, SIGNAL(clicked()), this, SLOT(setClipButtonOn())); zoomButton = new QRadioButton(tr("Zoom the image")); zoomButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); zoomButton->setChecked(false); connect(zoomButton, SIGNAL(clicked()), this, SLOT(setZoomButtonOn())); adjustmentPrefs = new QGroupBox; adjustmentPrefs->setMinimumSize(200, 100); // adjustmentPrefs->setStyleSheet("border-width = 2px"); // adjustmentPrefs->setStyleSheet("border-color = black"); // adjustmentPrefs->setStyleSheet("border = 2px solid black"); // adjustmentPrefs->setStyle("plastique"); // QPalette p = adjustmentPrefs->palette(); // p.setColor(adjustmentPrefs->backgroundRole(), QColor(0, 255, 255)); // adjustmentPrefs->setPalette(p); // adjustmentPrefs->setTitle(tr("Adjustment settings")); leftUpButton = new QRadioButton(); leftUpButton->setChecked(false); leftUpButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); centerUpButton = new QRadioButton(); centerUpButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); centerUpButton->setChecked(false); rightUpButton = new QRadioButton(); rightUpButton->setChecked(false); rightUpButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); leftMiddleButton = new QRadioButton(); leftMiddleButton->setChecked(false); leftMiddleButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); centerMiddleButton = new QRadioButton(); centerMiddleButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); centerMiddleButton->setChecked(false); rightMiddleButton = new QRadioButton(); rightMiddleButton->setChecked(false); rightMiddleButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); leftDownButton = new QRadioButton(); leftDownButton->setChecked(false); leftDownButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); centerDownButton = new QRadioButton(); centerDownButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); centerDownButton->setChecked(false); rightDownButton = new QRadioButton(); rightDownButton->setChecked(false); rightDownButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); QVBoxLayout *adjustmentPrefsLayout = new QVBoxLayout; QHBoxLayout *hbLayout = new QHBoxLayout; hbLayout->addWidget(leftUpButton); hbLayout->addStretch(1); hbLayout->addWidget(centerUpButton); hbLayout->addStretch(1); hbLayout->addWidget(rightUpButton); adjustmentPrefsLayout->addLayout(hbLayout); adjustmentPrefsLayout->addStretch(1); hbLayout = new QHBoxLayout; hbLayout->addWidget(leftMiddleButton); hbLayout->addStretch(1); hbLayout->addWidget(centerMiddleButton); hbLayout->addStretch(1); hbLayout->addWidget(rightMiddleButton); adjustmentPrefsLayout->addLayout(hbLayout); adjustmentPrefsLayout->addStretch(1); hbLayout = new QHBoxLayout; hbLayout->addWidget(leftDownButton); hbLayout->addStretch(1); hbLayout->addWidget(centerDownButton); hbLayout->addStretch(1); hbLayout->addWidget(rightDownButton); adjustmentPrefsLayout->addLayout(hbLayout); adjustmentPrefs->setLayout(adjustmentPrefsLayout); // Zoom preferences zoomPrefs = new QGroupBox; zoomPrefs->setTitle(tr("Zoom settings")); zoomLabel = new QLabel(tr("Zoom value:")); zoomSlider = new QSlider(); zoomSlider->setMaximum(1); zoomSlider->setMaximum(100); zoomSlider->setOrientation(Qt::Horizontal); zoomSlider->setMinimumWidth(300); zoomSlider->setMaximumWidth(300); zoomSlider->setTickPosition(QSlider::TicksBelow); zoomSlider->setTickInterval(5); zoomSlider->setSingleStep(5); zoomSlider->setPageStep(20); connect(zoomSlider, SIGNAL(sliderReleased()), this, SLOT(changeZoom())); zoomMinimumLabel = new QLabel(tr("0%")); zoomMaximumLabel = new QLabel(tr("100%")); QHBoxLayout *zoomLayout = new QHBoxLayout; zoomLayout->addWidget(zoomMinimumLabel, 0, Qt::AlignLeft); zoomLayout->addStretch(); zoomLayout->addWidget(zoomMaximumLabel, 0, Qt::AlignRight); QGridLayout *zoomPrefsLayout = new QGridLayout; zoomPrefsLayout->setColumnStretch(0, 1); zoomPrefsLayout->addWidget(zoomLabel, 1, 0, Qt::AlignLeft); zoomPrefsLayout->addWidget(zoomSlider, 1, 1, Qt::AlignRight); zoomPrefsLayout->addLayout(zoomLayout, 2, 1, Qt::AlignRight); zoomPrefs->setLayout(zoomPrefsLayout); // Transform preferences QVBoxLayout *transformPrefsLayout = new QVBoxLayout; hbLayout = new QHBoxLayout; hbLayout->setMargin(0); hbLayout->setSpacing(0); hbLayout->addStretch(1); transformPrefsLayout->addLayout(hbLayout); QVBoxLayout *vbLayout; vbLayout = new QVBoxLayout; vbLayout->addStretch(1); vbLayout->addWidget(scaleButton); vbLayout->addStretch(1); vbLayout->addWidget(clipButton); vbLayout->addStretch(1); vbLayout->addWidget(zoomButton); vbLayout->addStretch(1); transformPrefsLayout->addLayout(vbLayout); hbLayout = new QHBoxLayout; hbLayout->addStretch(1); hbLayout->addWidget(adjustmentPrefs); hbLayout->addStretch(1); transformPrefsLayout->addLayout(hbLayout); hbLayout = new QHBoxLayout; hbLayout->addStretch(1); hbLayout->addWidget(zoomPrefs); hbLayout->addStretch(1); transformPrefsLayout->addLayout(hbLayout); transformPrefsLayout->addStretch(1); transformPrefs->setLayout(transformPrefsLayout); // Widget layout QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(infoText); mainLayout->addWidget(transformPrefs); mainLayout->addStretch(1); setLayout(mainLayout); qDebug() << "TransformWidget::makeGUI --> End"; } void TransformWidget::initialize() { qDebug() << "TransformWidget::initialize --> Start"; PreferencesTool *pref = frontend->getPreferences(); int value; // Read eEncoder preferences if (tabType) { // This is a general dialog tab if (pref->getIntegerPreference("preferences", "defaulttransformation", value) == false) { value = 0; } activeTransform = value; if (pref->getIntegerPreference("preferences", "defaultimageadjustment", value) == false) { value = ImageGrabber::centerDown; } activeImageAdjustment = value; if (pref->getIntegerPreference("preferences", "defaultzoomvalue", value) == false) { value = 25; } activeZoomValue = value; } else { // This is a project dialog tab activeTransform = frontend->getProject()->getImageTransformation(); activeImageAdjustment = frontend->getProject()->getImageAdjustment(); activeZoomValue = frontend->getProject()->getZoomValue(); } // Transformation preferences switch (activeTransform) { case 0: setScaleButtonOn(); break; case 1: setClipButtonOn(); break; case 2: setZoomButtonOn(); break; } setAdjustment(activeImageAdjustment); zoomSlider->setValue(activeZoomValue); qDebug() << "TransformWidget::initialize --> End"; } /* void TransformWidget::resizeEvent(QResizeEvent *event) { qDebug() << "TransformWidget::resizeEvent --> Start"; QWidget::resizeEvent(event); qDebug() << "TransformWidget::resizeEvent --> End"; } */ void TransformWidget::apply() { qDebug() << "TransformWidget::apply --> Start"; PreferencesTool *pref = frontend->getPreferences(); int index; int value; bool changings = false; if (scaleButton->isChecked()) { if (activeTransform != 0) { activeTransform = 0; changings = true; } } else { if (clipButton->isChecked()) { if (activeTransform != 1) { activeTransform = 1; changings = true; } } else { if (activeTransform != 2) { activeTransform = 2; changings = true; } } } if (leftUpButton->isChecked()) { index = ImageGrabber::leftUp; } if (centerUpButton->isChecked()) { index = ImageGrabber::centerUp; } if (rightUpButton->isChecked()) { index = ImageGrabber::rightUp; } if (leftMiddleButton->isChecked()) { index = ImageGrabber::leftMiddle; } if (centerMiddleButton->isChecked()) { index = ImageGrabber::centerMiddle; } if (rightMiddleButton->isChecked()) { index = ImageGrabber::rightMiddle; } if (leftDownButton->isChecked()) { index = ImageGrabber::leftDown; } if (centerDownButton->isChecked()) { index = ImageGrabber::centerDown; } if (rightDownButton->isChecked()) { index = ImageGrabber::rightDown; } if (activeImageAdjustment != index) { activeImageAdjustment = index; changings = true; } value = zoomSlider->value(); if (activeZoomValue != value) { activeZoomValue = value; changings = true; } if (changings) { if (tabType) { // This is a general dialog tab pref->setIntegerPreference("preferences", "defaulttransformation", activeTransform); pref->setIntegerPreference("preferences", "defaultimageadjustment", activeImageAdjustment); pref->setIntegerPreference("preferences", "defaultzoomvalue", activeZoomValue); } else { // This is a project dialog tab frontend->getProject()->setImageTransformation(activeTransform); frontend->getProject()->setImageAdjustment(activeImageAdjustment); frontend->getProject()->setZoomValue(activeZoomValue); } } qDebug() << "TransformWidget::apply --> End"; } void TransformWidget::reset() { qDebug() << "TransformWidget::reset --> Start"; switch (activeTransform) { case 0: setScaleButtonOn(); break; case 1: setClipButtonOn(); break; case 2: setZoomButtonOn(); break; } setAdjustment(activeImageAdjustment); zoomSlider->setValue(activeZoomValue); qDebug() << "TransformWidget::reset --> End"; } void TransformWidget::setAdjustment(int newAdjustment) { qDebug() << "TransformWidget::setAdjustment --> Start"; switch (newAdjustment) { case ImageGrabber::leftUp: leftUpButton->setChecked(true); break; case ImageGrabber::centerUp: centerUpButton->setChecked(true); break; case ImageGrabber::rightUp: rightUpButton->setChecked(true); break; case ImageGrabber::leftMiddle: leftMiddleButton->setChecked(true); break; case ImageGrabber::centerMiddle: centerMiddleButton->setChecked(true); break; case ImageGrabber::rightMiddle: rightMiddleButton->setChecked(true); break; case ImageGrabber::leftDown: leftDownButton->setChecked(true); break; case ImageGrabber::centerDown: centerDownButton->setChecked(true); break; case ImageGrabber::rightDown: rightDownButton->setChecked(true); break; } qDebug() << "TransformWidget::setAdjustment --> End"; } void TransformWidget::setScaleButtonOn() { scaleButton->setChecked(true); clipButton->setChecked(false); zoomButton->setChecked(false); adjustmentPrefs->setVisible(false); zoomPrefs->setVisible(false); } void TransformWidget::setClipButtonOn() { clipButton->setChecked(true); scaleButton->setChecked(false); zoomButton->setChecked(false); adjustmentPrefs->setVisible(true); zoomPrefs->setVisible(false); } void TransformWidget::setZoomButtonOn() { zoomButton->setChecked(true); scaleButton->setChecked(false); clipButton->setChecked(false); adjustmentPrefs->setVisible(false); zoomPrefs->setVisible(true); } void TransformWidget::changeZoom() { qDebug() << "TransformWidget::changeZoom --> Start"; int value = zoomSlider->value(); if (activeZoomValue == value) { return; } /* if (!tabType) { // Project settings are changed } */ qDebug() << "TransformWidget::changeZoom --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/exportwidget.cpp000644 000000 000000 00000041043 12751646113 030045 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "exportwidget.h" #include #include #include #include #include #include #include "domain/domainfacade.h" #include "frontends/qtfrontend/elements/flexiblelineedit.h" #include "technical/preferencestool.h" #include "technical/videoencoder/videoencoder.h" ExportWidget::ExportWidget(Frontend *f, bool type, QWidget *parent) : QWidget(parent) { qDebug() << "ExportWidget::Constructor --> Start"; frontend = f; tabType = type; infoText = 0; encoderTable = 0; // Encoder preferences encoderPrefs = 0; encoderApplicationLabel = 0; encoderApplicationCombo = 0; activeEncoderApplication = VideoEncoder::noneApplication; videoFormatLabel = 0; videoFormatCombo = 0; activeVideoFormat = VideoEncoder::mp4Format; videoSizeLabel = 0; videoSizeCombo = 0; activeVideoSize = VideoEncoder::defaultSize; videoFpsLabel = 0; videoFpsChooser = 0; activeVideoFps = 12; // Output file preferences outputPrefs = 0; askForOutputLabel = 0; yesButton = 0; noButton = 0; activeEncoderApplication = 0; defaultOutputLabel = 0; defaultOutputEdit = 0; activeDefaultOutputFileName.clear(); browseOutputButton = 0; activeUseDefaultOutputFile = false; this->setObjectName("ExportWidget"); makeGUI(); qDebug() << "ExportWidget::Constructor --> End"; } void ExportWidget::makeGUI() { qDebug() << "ExportWidget::makeGUI --> Start"; infoText = new QTextEdit; infoText->setReadOnly(true); if (tabType) { infoText->setHtml( "

" + tr("Below you can set which program should be used " "for encoding a new project to a video file.") + "

"); } else { infoText->setHtml( "

" + tr("Below you can set which program should be used " "for encoding the currently active project to a video file.") + "

"); } infoText->setMinimumWidth(440); infoText->setMaximumHeight(52); infoText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); // Encoder preferences encoderPrefs = new QGroupBox; encoderPrefs->setTitle(tr("Encoder settings")); encoderApplicationLabel = new QLabel(tr("Encoder Application:")); encoderApplicationCombo = new QComboBox(); encoderApplicationLabel->setBuddy(encoderApplicationCombo); encoderApplicationCombo->setFocusPolicy(Qt::NoFocus); connect(encoderApplicationCombo, SIGNAL(activated(int)), this, SLOT(changeEncoderApplication(int))); encoderApplicationCombo->addItem(tr("ffmpeg")); encoderApplicationCombo->addItem(tr("libav")); videoFormatLabel = new QLabel(tr("Video Format:")); videoFormatCombo = new QComboBox(); videoFormatLabel->setBuddy(videoFormatCombo); videoFormatCombo->setFocusPolicy(Qt::NoFocus); connect(videoFormatCombo, SIGNAL(activated(int)), this, SLOT(changeVideoFormat(int))); videoFormatCombo->addItem(tr("AVI")); videoFormatCombo->addItem(tr("MP4")); videoSizeLabel = new QLabel(tr("Video Size:")); videoSizeCombo = new QComboBox(); videoSizeLabel->setBuddy(videoSizeCombo); videoSizeCombo->setFocusPolicy(Qt::NoFocus); connect(videoSizeCombo, SIGNAL(activated(int)), this, SLOT(changeVideoSize(int))); videoSizeCombo->addItem(tr("Frame Size")); videoSizeCombo->addItem(tr("QVGA (320x240)")); videoSizeCombo->addItem(tr("VGA (640x480)")); videoSizeCombo->addItem(tr("SVGA (800x600)")); videoSizeCombo->addItem(tr("PAL D (704x576)")); videoSizeCombo->addItem(tr("HD Ready (1280x720)")); videoSizeCombo->addItem(tr("Full HD (1900x1080)")); videoFpsLabel = new QLabel(tr("Frames per Second:")); videoFpsChooser = new QSpinBox(); QString whatsThis = tr("

FPS chooser

" "

By changing the value in this " "chooser you set which speed the " "animation in the FrameView " "should run at.

" "

To start an animation press the " "Run Animation button.

"); videoFpsLabel->setWhatsThis(whatsThis); videoFpsChooser->setWhatsThis(whatsThis); videoFpsChooser->setMinimum(1); videoFpsChooser->setMaximum(30); videoFpsChooser->setValue(1); videoFpsChooser->setFocusPolicy(Qt::NoFocus); connect(videoFpsChooser, SIGNAL(valueChanged(int)), this, SLOT(changeFps(int))); videoFpsLabel->setBuddy(videoFpsChooser); // Output file preferences outputPrefs = new QGroupBox; outputPrefs->setTitle(tr("Output file settings")); askForOutputLabel = new QLabel( tr("Do you want to be asked for an output file everytime you choose to export?")); askForOutputLabel->setWordWrap(true); yesButton = new QRadioButton(tr("Yes")); yesButton->setChecked(true); yesButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(yesButton, SIGNAL(clicked()), this, SLOT(setYesButtonOn())); noButton = new QRadioButton(tr("No")); noButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); noButton->setChecked(false); connect(noButton, SIGNAL(clicked()), this, SLOT(setNoButtonOn())); defaultOutputLabel = new QLabel(tr("Set default output file:")); defaultOutputEdit = new FlexibleLineEdit; defaultOutputEdit->setEnabled(false); connect(defaultOutputEdit, SIGNAL(textChanged(const QString &)), this, SLOT(changeDefaultOutput(const QString &))); browseOutputButton = new QPushButton(tr("Browse")); browseOutputButton->setEnabled(false); browseOutputButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(browseOutputButton, SIGNAL(clicked()), this, SLOT(browseOutputFiles())); // Encoder preferences QGridLayout *encoderPrefsLayout = new QGridLayout; encoderPrefsLayout->addWidget(encoderApplicationLabel, 0, 0); encoderPrefsLayout->addWidget(encoderApplicationCombo, 0, 1); encoderPrefsLayout->addWidget(videoFormatLabel, 1, 0); encoderPrefsLayout->addWidget(videoFormatCombo, 1, 1); encoderPrefsLayout->addWidget(videoSizeLabel, 2, 0); encoderPrefsLayout->addWidget(videoSizeCombo, 2, 1); encoderPrefsLayout->addWidget(videoFpsLabel, 3, 0); encoderPrefsLayout->addWidget(videoFpsChooser, 3, 1); encoderPrefs->setLayout(encoderPrefsLayout); // Output file preferences QVBoxLayout *outputPrefsLayout = new QVBoxLayout; outputPrefsLayout->addWidget(askForOutputLabel); QHBoxLayout *hbLayout = new QHBoxLayout; hbLayout->addWidget(yesButton); hbLayout->addWidget(noButton); hbLayout->addStretch(1); outputPrefsLayout->addLayout(hbLayout); if (!tabType) { outputPrefsLayout->addWidget(defaultOutputLabel); hbLayout = new QHBoxLayout; hbLayout->addWidget(defaultOutputEdit); hbLayout->addWidget(browseOutputButton); outputPrefsLayout->addLayout(hbLayout); } outputPrefs->setLayout(outputPrefsLayout); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(infoText); mainLayout->addWidget(encoderPrefs); mainLayout->addWidget(outputPrefs); mainLayout->addStretch(1); setLayout(mainLayout); qDebug() << "ExportWidget::makeGUI --> End"; } void ExportWidget::initialize() { qDebug() << "ExportWidget::initialize --> Start"; PreferencesTool *pref = frontend->getPreferences(); int value; // Read eEncoder preferences if (tabType) { // This is a general dialog tab if (pref->getIntegerPreference("preferences", "defaultencoderapplication", value) == false) { value = VideoEncoder::noneApplication; } activeEncoderApplication = value; if (pref->getIntegerPreference("preferences", "defaultvideoformat", value) == false) { value = VideoEncoder::noneFormat; } activeVideoFormat = value; if (pref->getIntegerPreference("preferences", "defaultvideosize", value) == false) { value = VideoEncoder::defaultSize; } activeVideoSize = value; if (pref->getIntegerPreference("preferences", "defaultvideofps", value) == false) { value = 12; } activeVideoFps = value; if (pref->getIntegerPreference("preferences", "defaultusedefaultoutputfile", value) == false) { value = 0; } if (0 == value) { activeUseDefaultOutputFile = false; } else { activeUseDefaultOutputFile = true; } } else { // This is a project dialog tab activeEncoderApplication = frontend->getProject()->getEncoderApplication(); activeVideoFormat = frontend->getProject()->getVideoFormat(); activeVideoSize = frontend->getProject()->getVideoSize(); activeVideoFps = frontend->getProject()->getVideoFps(); activeUseDefaultOutputFile = frontend->getProject()->getUseDefaultOutputFile(); activeDefaultOutputFileName = frontend->getProject()->getDefaultOutputFileName(); } if (activeEncoderApplication == VideoEncoder::noneApplication) { encoderApplicationCombo->setCurrentIndex(0); } else { encoderApplicationCombo->setCurrentIndex(activeEncoderApplication); } if (activeVideoFormat == VideoEncoder::noneFormat) { videoFormatCombo->setCurrentIndex(0); } else { videoFormatCombo->setCurrentIndex(activeVideoFormat); } if (activeVideoSize == VideoEncoder::defaultSize) { videoSizeCombo->setCurrentIndex(0); } else { videoSizeCombo->setCurrentIndex(activeVideoSize); } this->videoFpsChooser->setValue(activeVideoFps); // Output file preferences if (true == activeUseDefaultOutputFile) { setNoButtonOn(); } else { setYesButtonOn(); } defaultOutputEdit->setText(activeDefaultOutputFileName); qDebug() << "ExportWidget::initialize --> End"; } /* void ExportWidget::resizeEvent(QResizeEvent *event) { qDebug() << "ExportWidget::resizeEvent --> Start"); QWidget::resizeEvent(event); qDebug() << "ExportWidget::resizeEvent --> End");qDebug() << " } */ void ExportWidget::apply() { qDebug() << "ExportWidget::apply --> Start"; PreferencesTool *pref = frontend->getPreferences(); int index; bool changings = false; index = encoderApplicationCombo->currentIndex(); if (activeEncoderApplication != index) { activeEncoderApplication = index; changings = true; } index = videoFormatCombo->currentIndex(); if (activeVideoFormat != index) { activeVideoFormat = index; changings = true; } index = videoSizeCombo->currentIndex(); if (activeVideoSize != index) { activeVideoSize = index; changings = true; } index = videoFpsChooser->value(); if (activeVideoFps != index) { activeVideoFps = index; changings = true; } if (noButton->isChecked()) { if (false == activeUseDefaultOutputFile) { activeUseDefaultOutputFile = true; changings = true; } } else { if (true == activeUseDefaultOutputFile) { activeUseDefaultOutputFile = false; changings = true; } } if (activeDefaultOutputFileName.compare(defaultOutputEdit->text()) != 0) { activeDefaultOutputFileName.clear(); activeDefaultOutputFileName.append(defaultOutputEdit->text()); changings = true; } if (changings) { if (tabType) { // This is a general dialog tab pref->setIntegerPreference("preferences", "defaultencoderapplication", activeEncoderApplication); pref->setIntegerPreference("preferences", "defaultvideoformat", activeVideoFormat); pref->setIntegerPreference("preferences", "defaultvideosize", activeVideoSize); pref->setIntegerPreference("preferences", "defaultvideofps", activeVideoFps); pref->setIntegerPreference("preferences", "defaultusedefaultoutputfile", (true == activeUseDefaultOutputFile ? 1 : 0)); } else { // This is a project dialog tab frontend->getProject()->setEncoderApplication(activeEncoderApplication); frontend->getProject()->setVideoFormat(activeVideoFormat); frontend->getProject()->setVideoSize(activeVideoSize); frontend->getProject()->setVideoFps(activeVideoFps); frontend->getProject()->setUseDefaultOutputFile(activeUseDefaultOutputFile); frontend->getProject()->setDefaultOutputFileName(activeDefaultOutputFileName); } } qDebug() << "ExportWidget::apply --> End"; } void ExportWidget::reset() { qDebug() << "ExportWidget::reset --> Start"; encoderApplicationCombo->setCurrentIndex(activeEncoderApplication); videoFormatCombo->setCurrentIndex(activeVideoFormat); videoSizeCombo->setCurrentIndex(activeVideoSize); videoFpsChooser->setValue(activeVideoFps); if (activeUseDefaultOutputFile) { setYesButtonOn(); } else { setNoButtonOn(); } defaultOutputEdit->setText(activeDefaultOutputFileName); qDebug() << "ExportWidget::reset --> End"; } void ExportWidget::changeEncoderApplication(int /*index*/) { // qDebug() << "ExportWidget::changeEncoderApplication --> Start"; // qDebug() << "ExportWidget::changeEncoderApplication --> End"; } void ExportWidget::changeVideoFormat(int /*index*/) { // qDebug() << "ExportWidget::changeVideoFormat --> Start"; // qDebug() << "ExportWidget::changeVideoFormat --> End"; } void ExportWidget::changeVideoSize(int /*index*/) { // qDebug() << "ExportWidget::changeVideoSize --> Start"; // qDebug() << "ExportWidget::changeVideoSize --> End"; } void ExportWidget::changeFps(int newFps) { } void ExportWidget::setYesButtonOn() { yesButton->setChecked(true); noButton->setChecked(false); if (!tabType) { defaultOutputEdit->setEnabled(false); browseOutputButton->setEnabled(false); } } void ExportWidget::setNoButtonOn() { noButton->setChecked(true); yesButton->setChecked(false); if (!tabType) { defaultOutputEdit->setEnabled(true); browseOutputButton->setEnabled(true); } } void ExportWidget::changeDefaultOutput(const QString &fileName) { qDebug() << "ExportWidget::setDefaultOutput --> Start"; qDebug() << "ExportWidget::setDefaultOutput --> End"; } void ExportWidget::browseOutputFiles() { QDir homeDir = QDir::home(); QString outputFile = QFileDialog::getSaveFileName(this, tr("Choose output file"), homeDir.absolutePath()); if (!outputFile.isEmpty()) { defaultOutputEdit->setText(outputFile); } } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/generalwidget.h000644 000000 000000 00000011323 12654352322 027602 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2010-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef GENERALWIDGET_H #define GENERALWIDGET_H #include "frontends/frontend.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * The export tab in the preferences menu * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class GeneralWidget : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param f frontend of the application * @param parent the parent of the this widget */ GeneralWidget(Frontend *f, QWidget *parent = 0); /** * Applies the settings in the import tab. */ void apply(); /** * Reset the settings in the import tab. */ void reset(); /** * Initializes the table and fills it with starting values. */ void initialize(); private: /** * Create the GUI of the tab */ void makeGUI(); protected: // void resizeEvent(QResizeEvent *event); private slots: /** * Slot for notified the application when the language changes. * @param index the new language. */ void changeLanguage(int index); /** * Slot for notified the general tab when bevor button is selected, so that * general preferences can be updated. */ void setBevorButtonOn(); /** * Slot for notified the general tab when after button is selected, so that * general preferences can be updated. */ void setAfterButtonOn(); /** * Slot for notified the general tab when append button is selected, so that * general preferences can be updated. */ void setAppendButtonOn(); /** * Slot for notified the general tab when vertical grid is (de)selected, so that * general preferences can be updated. * @param newState The new state of the check box */ void changeVerticalGridState(int newState); /** * Slot for notified the general tab when horizontal grid is (de)selected, so that * general preferences can be updated. * @param newState The new state of the check box */ void changeHorizontalGridState(int newState); /** * Slot for notified the general tab when grid color button is clicked, so that * general preferences can be updaten. */ void clickedGridColorButton(); private: Frontend *frontend; QGroupBox *languageGroupBox; QComboBox *languageCombo; QGroupBox *captureGroupBox; QRadioButton *bevorButton; QRadioButton *afterButton; QRadioButton *appendButton; QGroupBox *gridGroupBox; QCheckBox *verticalGridCheck; QSpinBox *verticalGridSpin; QCheckBox *horizontalGridCheck; QSpinBox *horizontalGridSpin; QLabel *gridColorLabel; QPushButton *gridColorButton; int actualLanguage; int actualButtonFunction; bool actualVerticalGrid; int actualVerticalSpin; bool actualHorizontalGrid; int actualHorizontalSpin; QColor actualGridColor; QColor newGridColor; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/grabberwidget.h000644 000000 000000 00000010106 12751646113 027571 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2014-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef GRABBERWIDGET_H #define GRABBERWIDGET_H #include "frontends/frontend.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * The export tab in the preferences menu * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class GrabberWidget : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param f frontend of the application * @param parent the parent of the this widget */ GrabberWidget(Frontend *f, QWidget *parent = 0); /** * Applies the settings in the import tab. */ void apply(); /** * Reset the settings in the import tab. */ void reset(); /** * Initializes the table and fills it with starting values. */ void initialize(); private: /** * Create the GUI of the tab */ void makeGUI(); protected: // void resizeEvent(QResizeEvent *event); private slots: /** * Slot for notified the grabber tab when the state of the * v4l2Grabber checkbox are changed, * so that general preferences can be updated. * @param newState The new state of the check box */ void changeV4L2GrabberCheckState(int newState); /** * Slot for notified the grabber tab when the state of the * mediaFoundationGrabber checkbox are changed, * so that general preferences can be updated. * @param newState The new state of the check box */ void changeMediaFoundationGrabberCheckState(int newState); /** * Slot for notified the grabber tab when the state of the * gphoto2Grabber checkbox are changed, * so that general preferences can be updated. * @param newState The new state of the check box */ void changeGphoto2GrabberCheckState(int newState); private: Frontend *frontend; QTextEdit *infoText; QGroupBox *grabberGroupBox; QCheckBox *v4l2GrabberCheck; QCheckBox *v4l2ControllerCheck; QCheckBox *mediaFoundationGrabberCheck; QCheckBox *mediaFoundationControllerCheck; QCheckBox *gphoto2GrabberCheck; QCheckBox *gphoto2ControllerCheck; bool actualV4L2Grabber; bool actualV4L2Controller; bool actualMediaFoundationGrabber; bool actualMediaFoundationController; bool actualGphoto2Grabber; bool actualGphoto2Controller; }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/projectdialog.cpp000644 000000 000000 00000026065 12751646113 030155 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "projectdialog.h" #include #include #include "technical/preferencestool.h" #define MIN_TREE_WIDTH 200 #define MAX_TREE_WIDTH MIN_TREE_WIDTH #define MIN_PAGE_WIDTH 560 #define MIN_PAGE_HEIGHT 400 #define MAX_PAGE_WIDTH MIN_PAGE_WIDTH #define MAX_PAGE_HEIGHT MIN_PAGE_HEIGHT ProjectDialog::ProjectDialog(Frontend *f, QWidget *parent) : QDialog(parent, Qt::Dialog) { qDebug() << "ProjectDialog::Constructor --> Start"; frontend = f; pageTree = 0; pageLayout = 0; // generalSettingsPage = 0; // projectValuePage = 0; imageImportPage = 0; imageTransformationPage = 0; videoExportPage = 0; // grabberSelectPage = 0; pageTree = new QTreeWidget(); pageTree->setColumnCount(1); pageTree->setHeaderHidden(true); pageTree->setMinimumWidth(MIN_TREE_WIDTH); pageTree->setMaximumWidth(MAX_TREE_WIDTH); connect(pageTree, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(itemClicked(QTreeWidgetItem*,int))); QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(pageTree); topLevelItem->setText(0, tr("Properties")); topLevelItem->setFlags(Qt::ItemIsEnabled); topLevelItem->setExpanded(true); pageTree->insertTopLevelItem(0, topLevelItem); pageLayout = new QHBoxLayout; pageLayout->addWidget(pageTree); applyButton = new QPushButton(tr("Apply"), this); applyButton->setDefault(true); connect(applyButton, SIGNAL(clicked()), this, SLOT(apply())); closeButton = new QPushButton(tr("Close"), this); closeButton->setDefault(true); connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(this, SIGNAL(finished(int)), this, SLOT(finish(int))); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(1); buttonLayout->addWidget(applyButton); buttonLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(pageLayout); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setWindowTitle(tr("Animation Project Properties")); setModal(false); setMaximumSize(20+MAX_TREE_WIDTH+MAX_PAGE_WIDTH, 40+MAX_PAGE_HEIGHT); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); // makeGeneralSettingsPage(); // makeProjectValuePage(); makeImageImportPage(); makeImageTransformPage(); makeVideoExportPage(); // makeGrabberSelectPage(); qDebug() << "ProjectDialog::Constructor --> End"; } /* void ProjectDialog::makeGeneralSettingsPage() { qDebug() << "ProjectDialog::makeGeneralSettingsPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("General Settings")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); generalSettingsPage = new GeneralWidget(frontend); generalSettingsPage->initialize(); generalSettingsPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); generalSettingsPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); pageLayout->addWidget(generalSettingsPage); generalSettingsPage->setVisible(true); qDebug() << "ProjectDialog::makeGeneralSettingsPage --> End"; } void ProjectDialog::makeProjectValuePage() { qDebug() << "ProjectDialog::makeDefaultValuePage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("New Project Values")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); projectValuePage = new ProjectWidget(frontend, false); projectValuePage->initialize(); projectValuePage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); projectValuePage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); pageLayout->addWidget(projectValuePage); projectValuePage->setVisible(false); qDebug() << "ProjectDialog::makeDefaultValuePage --> End"; } */ void ProjectDialog::makeImageImportPage() { qDebug() << "ProjectDialog::makeImageImportPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("Image Import")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); imageImportPage = new ImportWidget(frontend, false); imageImportPage->initialize(); imageImportPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); imageImportPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); pageLayout->addWidget(imageImportPage); imageImportPage->setVisible(true); qDebug() << "ProjectDialog::makeImageImportPage --> End"; } void ProjectDialog::makeImageTransformPage() { qDebug() << "ProjectDialog::makeImageTransformPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("Image Transformation")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); imageTransformationPage = new TransformWidget(frontend, false); imageTransformationPage->initialize(); imageTransformationPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); imageTransformationPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); pageLayout->addWidget(imageTransformationPage); imageTransformationPage->setVisible(false); qDebug() << "ProjectDialog::makeImageTransformPage --> End"; } void ProjectDialog::makeVideoExportPage() { qDebug() << "ProjectDialog::makeVideoExportPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("Video Export")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); videoExportPage = new ExportWidget(frontend, false); videoExportPage->initialize(); videoExportPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); videoExportPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); videoExportPage->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); pageLayout->addWidget(videoExportPage); videoExportPage->setVisible(false); qDebug() << "ProjectDialog::makeVideoExportPage --> End"; } /* void GeneralDialog::makeGrabberSelectPage() { qDebug() << "GeneralDialog::makeGrabberSelectPage --> Start"; QTreeWidgetItem *newItem = new QTreeWidgetItem(); newItem->setText(0, tr("Grabber")); newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); this->pageTree->topLevelItem(0)->addChild(newItem); grabberSelectPage = new GrabberWidget(frontend); grabberSelectPage->initialize(); grabberSelectPage->setMinimumSize(MIN_PAGE_WIDTH, MIN_PAGE_HEIGHT); grabberSelectPage->setMaximumSize(MAX_PAGE_WIDTH, MAX_PAGE_HEIGHT); grabberSelectPage->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); pageLayout->addWidget(grabberSelectPage); grabberSelectPage->setVisible(false); qDebug() << "GeneralDialog::makeGrabberSelectPage --> End"; } */ void ProjectDialog::itemClicked(QTreeWidgetItem *pageItem, int /*column*/) { qDebug() << "ProjectDialog::itemClicked --> Start"; int itemIndex = 0; if (NULL != pageItem->parent()) { itemIndex = pageItem->parent()->indexOfChild(pageItem); } // generalSettingsPage->setVisible(false); // projectValuePage->setVisible(false); imageImportPage->setVisible(false); imageTransformationPage->setVisible(false); videoExportPage->setVisible(false); // grabberSelectPage->setVisible(false); switch (itemIndex) { default: case 0: // Image import settings imageImportPage->setVisible(true); break; case 1: // Image transformation settings imageTransformationPage->setVisible(true); break; case 2: // Video export settings videoExportPage->setVisible(true); break; } qDebug() << "ProjectDialog::itemClicked --> End"; } void ProjectDialog::apply() { qDebug() << "ProjectDialog::apply --> Start"; setFocus(); // this->generalSettingsPage->apply(); // this->projectValuePage->apply(); this->imageImportPage->apply(); this->imageTransformationPage->apply(); this->videoExportPage->apply(); // this->grabberSelectPage->apply(); frontend->getPreferences()->flushPreferences(); this->setResult(QDialog::Accepted); this->hide(); qDebug() << "ProjectDialog::apply --> End"; } void ProjectDialog::close() { qDebug() << "ProjectDialog::close --> Start"; setFocus(); // this->generalSettingsPage->reset(); // this->projectValuePage->reset(); this->imageImportPage->reset(); this->imageTransformationPage->reset(); this->videoExportPage->reset(); // this->grabberSelectPage->reset(); this->hide(); qDebug() << "ProjectDialog::close --> End"; } void ProjectDialog::finish(int result) { qDebug() << "ProjectDialog::finish --> Start"; setFocus(); if (result == 0) { // generalSettingsPage->reset(); // projectValuePage->reset(); imageImportPage->reset(); imageTransformationPage->reset(); videoExportPage->reset(); // grabberSelectPage->reset(); } this->hide(); qDebug() << "ProjectDialog::finish --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/exportwidget.h000644 000000 000000 00000012502 12654352322 027506 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef EXPORTWIDGET_H #define EXPORTWIDGET_H #include "frontends/frontend.h" #include #include #include #include #include #include #include #include #include #include #include #include /** * The export tab in the preferences menu * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ExportWidget : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param f frontend of the application * @param parent the parent of the this widget */ ExportWidget(Frontend *f, bool type, QWidget *parent = 0); /** * Applies the settings in the import tab. */ void apply(); /** * Reset the settings in the import tab. */ void reset(); /** * Initializes the table and fills it with starting values. */ void initialize(); protected: // void resizeEvent(QResizeEvent *event); private slots: // Encoder preferences /** * Slot for notified the export tab when the encoder application changes, * so that encoder preferences can be updated. * @param index the new encoder application. */ void changeEncoderApplication(int index); /** * Slot for notified the export tab when the video format changes, * so that encoder preferences can be updated. * @param index the new video format. */ void changeVideoFormat(int index); /** * Slot for notified the export tab when the video size changes, * so that encoder preferences can be updated. * @param index the new video size. */ void changeVideoSize(int index); /** * Slot for updating the frames per second value. * @param value the new slider value. */ void changeFps(int value); // Output file preferences /** * Slot for notified the export tab when yes button is selected, so that * encoder preferences can be updated. */ void setYesButtonOn(); /** * Slot for notified the export tab when no button is selected, so that * encoder preferences can be updated. */ void setNoButtonOn(); /** * Slot for notified the export tab when an new default output file name * is selected. * @param txt the new default output file name. */ void changeDefaultOutput(const QString &fileName); /** * Slot for notified the export tab when browse output button is selected, * so that encoder preferences can be updated. */ void browseOutputFiles(); private: Frontend *frontend; /** * Type of the tab: true = general dialog tab, false = project dialog tab */ bool tabType; QTextEdit *infoText; QTableWidget *encoderTable; // Encoder preferences QGroupBox *encoderPrefs; QLabel *encoderApplicationLabel; QComboBox *encoderApplicationCombo; int activeEncoderApplication; QLabel *videoFormatLabel; QComboBox *videoFormatCombo; int activeVideoFormat; QLabel *videoSizeLabel; QComboBox *videoSizeCombo; int activeVideoSize; QLabel *videoFpsLabel; QSpinBox *videoFpsChooser; int activeVideoFps; // Output file preferences QGroupBox *outputPrefs; QRadioButton *yesButton; QRadioButton *noButton; bool activeUseDefaultOutputFile; QLabel *askForOutputLabel; QLabel *defaultOutputLabel; QLineEdit *defaultOutputEdit; QString activeDefaultOutputFileName; QPushButton *browseOutputButton; void makeGUI(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/projectdialog.h000644 000000 000000 00000006761 12654352322 027621 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef PROJECTDIALOG_H #define PROJECTDIALOG_H #include #include #include "frontends/frontend.h" #include "frontends/qtfrontend/preferences/exportwidget.h" // #include "frontends/qtfrontend/preferences/generalwidget.h" // #include "frontends/qtfrontend/preferences/grabberwidget.h" #include "frontends/qtfrontend/preferences/importwidget.h" // #include "frontends/qtfrontend/preferences/projectwidget.h" #include "frontends/qtfrontend/preferences/transformwidget.h" /** * The project preferences dialog. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ProjectDialog : public QDialog { Q_OBJECT public: /** * Sets up the filepreview-label. * @param f frontend of the application. * @param parent the parent of the widget. */ ProjectDialog(Frontend *f, QWidget *parent = 0); private: Frontend *frontend; QTreeWidget *pageTree; QHBoxLayout *pageLayout; // GeneralWidget *generalSettingsPage; // ProjectWidget *projectValuePage; ImportWidget *imageImportPage; TransformWidget *imageTransformationPage; ExportWidget *videoExportPage; // GrabberWidget *grabberSelectPage; QPushButton *applyButton; QPushButton *closeButton; // void makeGeneralSettingsPage(); // void makeProjectValuePage(); void makeImageImportPage(); void makeImageTransformPage(); void makeVideoExportPage(); // void makeGrabberSelectPage(); private slots: /** * Click in the page tree * @param pageItem The specified item is the item that was clicked, or 0 if no item was clicked. * @param column The column is the item's column that was clicked. */ void itemClicked(QTreeWidgetItem *pageItem, int column); void apply(); void close(); void finish(int result); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/generalwidget.cpp000644 000000 000000 00000033130 12654352322 030135 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "generalwidget.h" #include #include #include #include #include #include #include "domain/domainfacade.h" #include "frontends/qtfrontend/elements/flexiblelineedit.h" #include "technical/preferencestool.h" GeneralWidget::GeneralWidget(Frontend *f, QWidget *parent) : QWidget(parent) { qDebug() << "GeneralWidget::Constructor --> Start"; frontend = f; languageGroupBox = 0; languageCombo = 0; actualLanguage = 0; captureGroupBox = 0; bevorButton = 0; afterButton = 0; appendButton = 0; actualButtonFunction = PreferencesTool::captureButtonAfter; gridGroupBox = 0; verticalGridCheck = 0; actualVerticalGrid = false; verticalGridSpin = 0; actualVerticalSpin = 10; horizontalGridCheck = 0; actualHorizontalGrid = false; horizontalGridSpin = 0; actualHorizontalSpin = 10; gridColorLabel = 0; gridColorButton = 0; actualGridColor = Qt::black; this->setObjectName("GeneralWidget"); makeGUI(); qDebug() << "GeneralWidget::Constructor --> End"; } void GeneralWidget::makeGUI() { // QString iconPath(qstopmotion::graphicsDirectory); // iconPath.append(QLatin1String("/icons/")); // QString iconFile(iconPath); languageGroupBox = new QGroupBox(tr("Language")); // languageGroupBox->setFlat(true); languageCombo = new QComboBox(); languageCombo->setFocusPolicy(Qt::NoFocus); connect(languageCombo, SIGNAL(activated(int)), this, SLOT(changeLanguage(int))); // Add all possible languages QVector languages = frontend->getLanguages(); for (int index = 0 ; index < languages.count() ; index++) { languageCombo->addItem(languages[index]); } QVBoxLayout *languageLayout = new QVBoxLayout; // languageLayout->setMargin(0); // languageLayout->setSpacing(2); // languageLayout->addStretch(1); languageLayout->addWidget(languageCombo); languageLayout->addStretch(10); languageGroupBox->setLayout(languageLayout); captureGroupBox = new QGroupBox; captureGroupBox->setTitle(tr("Capture Button Functionality")); bevorButton = new QRadioButton(tr("Insert new frame bevor selected frame")); bevorButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); bevorButton->setChecked(false); connect(bevorButton, SIGNAL(clicked()), this, SLOT(setBevorButtonOn())); afterButton = new QRadioButton(tr("Insert new frame after selected frame")); afterButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); afterButton->setChecked(true); connect(afterButton, SIGNAL(clicked()), this, SLOT(setAfterButtonOn())); appendButton = new QRadioButton(tr("Append new frame at the end of the take")); appendButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); appendButton->setChecked(false); connect(appendButton, SIGNAL(clicked()), this, SLOT(setAppendButtonOn())); QVBoxLayout *captureLayout = new QVBoxLayout; // captureLayout->setMargin(0); // captureLayout->setSpacing(2); // captureLayout->addStretch(1); captureLayout->addWidget(bevorButton); captureLayout->addWidget(afterButton); captureLayout->addWidget(appendButton); captureLayout->addStretch(10); captureGroupBox->setLayout(captureLayout); gridGroupBox = new QGroupBox; gridGroupBox->setTitle(tr("Grid Functionality")); verticalGridCheck = new QCheckBox(tr("Vertical Lines")); verticalGridCheck->setChecked(false); connect(verticalGridCheck, SIGNAL(stateChanged(int)), this, SLOT(changeVerticalGridState(int))); verticalGridSpin = new QSpinBox(); verticalGridSpin->setMinimum(1); verticalGridSpin->setMaximum(30); verticalGridSpin->setValue(5); verticalGridSpin->setFocusPolicy(Qt::NoFocus); verticalGridSpin->setEnabled(false); horizontalGridCheck = new QCheckBox(tr("Horizontal Lines")); horizontalGridCheck->setChecked(false); connect(horizontalGridCheck, SIGNAL(stateChanged(int)), this, SLOT(changeHorizontalGridState(int))); horizontalGridSpin = new QSpinBox(); horizontalGridSpin->setMinimum(1); horizontalGridSpin->setMaximum(30); horizontalGridSpin->setValue(5); horizontalGridSpin->setFocusPolicy(Qt::NoFocus); horizontalGridSpin->setEnabled(false); gridColorLabel = new QLabel(tr("Grid Color:")); gridColorButton = new QPushButton(tr("Color")); connect(gridColorButton,SIGNAL(clicked()), this, SLOT(clickedGridColorButton())); QGridLayout *gridLayout = new QGridLayout; gridLayout->addWidget(verticalGridCheck, 0, 0); gridLayout->addWidget(verticalGridSpin, 0, 1); gridLayout->addWidget(horizontalGridCheck, 1, 0); gridLayout->addWidget(horizontalGridSpin, 1, 1); gridLayout->addWidget(gridColorLabel, 2, 0); gridLayout->addWidget(gridColorButton, 2, 1); gridGroupBox->setLayout(gridLayout); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(languageGroupBox); mainLayout->addWidget(captureGroupBox); mainLayout->addWidget(gridGroupBox); mainLayout->addStretch(1); setLayout(mainLayout); qDebug() << "GeneralWidget::makeGUI --> End"; } void GeneralWidget::initialize() { qDebug() << "GeneralWidget::initialize --> Start"; PreferencesTool *pref = frontend->getPreferences(); int value; QString actualLocale; QString colorName; QVector locales = frontend->getLocales(); pref->getStringPreference("preferences", "language", actualLocale); for (int index = 0; index < locales.count(); index++) { if (actualLocale.compare(locales[index]) == 0) { actualLanguage = index; } } languageCombo->setCurrentIndex(actualLanguage); if (pref->getIntegerPreference("preferences", "capturebutton", actualButtonFunction) == false) { actualButtonFunction = PreferencesTool::captureButtonAfter; } switch (actualButtonFunction) { case PreferencesTool::captureButtonBevor: setBevorButtonOn(); break; case PreferencesTool::captureButtonAfter: setAfterButtonOn(); break; case PreferencesTool::captureButtonAppend: setAppendButtonOn(); break; } if (pref->getIntegerPreference("preferences", "verticalgrid", value) == false) { value = false; } actualVerticalGrid = value; verticalGridCheck->setChecked(actualVerticalGrid); if (pref->getIntegerPreference("preferences", "verticalspin", value) == false) { value = 5; } actualVerticalSpin = value; verticalGridSpin->setValue(actualVerticalSpin); if (pref->getIntegerPreference("preferences", "horizontalgrid", value) == false) { value = false; } actualHorizontalGrid = value; horizontalGridCheck->setChecked(actualHorizontalGrid); if (pref->getIntegerPreference("preferences", "horizontalspin", value) == false) { value = 5; } actualHorizontalSpin = value; horizontalGridSpin->setValue(actualHorizontalSpin); if (pref->getStringPreference("preferences", "gridcolor", colorName) == true) { actualGridColor.setNamedColor(colorName); } gridColorButton->setText(actualGridColor.name()); qDebug() << "GeneralWidget::initialize --> End"; } /* void GeneralWidget::resizeEvent(QResizeEvent *event) { qDebug() << "GeneralWidget::resizeEvent --> Start"; QWidget::resizeEvent(event); qDebug() << "GeneralWidget::resizeEvent --> End"; } */ void GeneralWidget::apply() { qDebug() << "GeneralWidget::apply --> Start"; PreferencesTool *pref = frontend->getPreferences(); int newLanguage = languageCombo->currentIndex(); if (actualLanguage != newLanguage) { QVector locales = frontend->getLocales(); pref->setStringPreference("preferences", "language", locales[newLanguage]); actualLanguage = newLanguage; } PreferencesTool::captureButtonFunction newButtonFunction; if (bevorButton->isChecked()) { newButtonFunction = PreferencesTool::captureButtonBevor; } if (afterButton->isChecked()) { newButtonFunction = PreferencesTool::captureButtonAfter; } if (appendButton->isChecked()) { newButtonFunction = PreferencesTool::captureButtonAppend; } if (newButtonFunction != actualButtonFunction) { // Selection changed frontend->changeCaptureButtonFunction(newButtonFunction); pref->setIntegerPreference("preferences", "capturebutton", newButtonFunction); actualButtonFunction = newButtonFunction; } bool newVerticalGrid = verticalGridCheck->isChecked(); if (newVerticalGrid != actualVerticalGrid) { // Vertical grid changed frontend->setVerticalGrid(newVerticalGrid); pref->setIntegerPreference("preferences", "verticalgrid", newVerticalGrid); actualVerticalGrid = newVerticalGrid; } int newVerticalSpin = verticalGridSpin->value(); if (newVerticalSpin != actualVerticalSpin) { // Vertical spin changed frontend->setVerticalSpin(newVerticalSpin); pref->setIntegerPreference("preferences", "verticalspin", newVerticalSpin); actualVerticalSpin = newVerticalSpin; } bool newHorizontalGrid = horizontalGridCheck->isChecked(); if (newHorizontalGrid != actualHorizontalGrid) { // Horizontal grid changed frontend->setHorizontalGrid(newHorizontalGrid); pref->setIntegerPreference("preferences", "horizontalgrid", newHorizontalGrid); actualHorizontalGrid = newHorizontalGrid; } int newHorizontalSpin = horizontalGridSpin->value(); if (newHorizontalSpin != actualHorizontalSpin) { // Horizontal spin changed frontend->setHorizontalSpin(newHorizontalSpin); pref->setIntegerPreference("preferences", "horizontalspin", newHorizontalSpin); actualHorizontalSpin = newHorizontalSpin; } if (newGridColor != actualGridColor) { // Grid color changed int r, g, b, a; newGridColor.getRgb(&r, &g, &b, &a); frontend->setGridColorRGB(r, g, b, a); pref->setStringPreference("preferences", "gridcolor", newGridColor.name()); actualGridColor = newGridColor; } qDebug() << "GeneralWidget::apply --> End"; } void GeneralWidget::reset() { qDebug() << "GeneralWidget::reset --> Start"; changeLanguage(actualLanguage); frontend->changeCaptureButtonFunction(actualButtonFunction); switch (actualButtonFunction) { case PreferencesTool::captureButtonBevor: setBevorButtonOn(); break; case PreferencesTool::captureButtonAfter: setAfterButtonOn(); break; case PreferencesTool::captureButtonAppend: setAppendButtonOn(); break; } verticalGridCheck->setChecked(actualVerticalGrid); verticalGridSpin->setValue(actualVerticalSpin); horizontalGridCheck->setChecked(actualHorizontalGrid); horizontalGridSpin->setValue(actualHorizontalSpin); qDebug() << "GeneralWidget::reset --> End"; } void GeneralWidget::changeLanguage(int index) { frontend->changeLanguage(index); } void GeneralWidget::setBevorButtonOn() { bevorButton->setChecked(true); afterButton->setChecked(false); appendButton->setChecked(false); } void GeneralWidget::setAfterButtonOn() { bevorButton->setChecked(false); afterButton->setChecked(true); appendButton->setChecked(false); } void GeneralWidget::setAppendButtonOn() { bevorButton->setChecked(false); afterButton->setChecked(false); appendButton->setChecked(true); } void GeneralWidget::changeVerticalGridState(int newState) { if (newState) { verticalGridSpin->setEnabled(true); } else { verticalGridSpin->setEnabled(false); } } void GeneralWidget::changeHorizontalGridState(int newState) { if (newState) { horizontalGridSpin->setEnabled(true); } else { horizontalGridSpin->setEnabled(false); } } void GeneralWidget::clickedGridColorButton() { newGridColor = QColorDialog::getColor(actualGridColor); gridColorButton->setText(newGridColor.name()); } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/grabberwidget.cpp000644 000000 000000 00000026742 12751646113 030141 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2014-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "grabberwidget.h" #include #include #include #include #include #include #include "domain/domainfacade.h" #include "frontends/qtfrontend/elements/flexiblelineedit.h" #include "technical/preferencestool.h" GrabberWidget::GrabberWidget(Frontend *f, QWidget *parent) : QWidget(parent) { qDebug() << "GrabberWidget::Constructor --> Start"; frontend = f; infoText = 0; // Image grabber preferences grabberGroupBox = 0; v4l2GrabberCheck = 0; actualV4L2Grabber = false; v4l2ControllerCheck = 0; actualV4L2Controller = false; mediaFoundationGrabberCheck = 0; actualMediaFoundationGrabber = false; mediaFoundationControllerCheck = 0; actualMediaFoundationController = false; gphoto2GrabberCheck = 0; actualGphoto2Grabber = false; gphoto2ControllerCheck = 0; actualGphoto2Controller = false; this->setObjectName("GrabberWidget"); makeGUI(); qDebug() << "GrabberWidget::Constructor --> End"; } void GrabberWidget::makeGUI() { qDebug() << "GrabberWidget::makeGUI --> Start"; infoText = new QTextEdit; infoText->setReadOnly(true); infoText->setHtml( "

" + tr("Below you can select which image grabber should be used " "for grabbing images from the camera. If available the controller " "can be used to control focus, zoom and other functionality.") + "

"); infoText->setMinimumWidth(440); infoText->setMaximumHeight(100); infoText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); // Image grabber preferences grabberGroupBox = new QGroupBox; grabberGroupBox->setTitle(tr("Grabber Functionality")); v4l2GrabberCheck = new QCheckBox(tr("Video 4 Linux 2 Source")); v4l2GrabberCheck->setChecked(false); connect(v4l2GrabberCheck, SIGNAL(stateChanged(int)), this, SLOT(changeV4L2GrabberCheckState(int))); v4l2ControllerCheck = new QCheckBox(tr("Camera Controller (Experimental)")); v4l2ControllerCheck->setChecked(false); mediaFoundationGrabberCheck = new QCheckBox(tr("Microsoft Media Foundation Source")); mediaFoundationGrabberCheck->setChecked(false); connect(mediaFoundationGrabberCheck, SIGNAL(stateChanged(int)), this, SLOT(changeMediaFoundationGrabberCheckState(int))); mediaFoundationControllerCheck = new QCheckBox(tr("Camera Controller (Experimental)")); mediaFoundationControllerCheck->setChecked(false); gphoto2GrabberCheck = new QCheckBox(tr("Gphoto2 Source (Experimental)")); gphoto2GrabberCheck->setChecked(false); connect(gphoto2GrabberCheck, SIGNAL(stateChanged(int)), this, SLOT(changeGphoto2GrabberCheckState(int))); gphoto2ControllerCheck = new QCheckBox(tr("Camera Controller (Experimental)")); gphoto2ControllerCheck->setChecked(false); QGridLayout *grabberLayout = new QGridLayout; grabberLayout->setColumnMinimumWidth(0, 20); grabberLayout->setColumnStretch(1, 1); grabberLayout->addWidget(v4l2GrabberCheck, 0, 0, 1, 2); grabberLayout->addWidget(v4l2ControllerCheck, 1, 1, 1, 1); grabberLayout->addWidget(mediaFoundationGrabberCheck, 2, 0, 1, 2); grabberLayout->addWidget(mediaFoundationControllerCheck, 3, 1, 1, 1); grabberLayout->addWidget(gphoto2GrabberCheck, 4, 0, 1, 2); grabberLayout->addWidget(gphoto2ControllerCheck, 5, 1, 1, 1); grabberGroupBox->setLayout(grabberLayout); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(infoText); mainLayout->addWidget(grabberGroupBox); mainLayout->addStretch(1); setLayout(mainLayout); qDebug() << "GrabberWidget::makeGUI --> End"; } void GrabberWidget::initialize() { qDebug() << "GrabberWidget::initialize --> Start"; PreferencesTool *pref = frontend->getPreferences(); int value; #ifdef Q_OS_LINUX // Video4Linux2 device if (pref->getIntegerPreference("preferences", "v4l2grabber", value) == false) { value = true; } actualV4L2Grabber = value; v4l2GrabberCheck->setChecked(actualV4L2Grabber); changeV4L2GrabberCheckState(actualV4L2Grabber); if (pref->getIntegerPreference("preferences", "v4l2controller", value) == false) { value = false; } actualV4L2Controller = value; v4l2ControllerCheck->setChecked(actualV4L2Controller); // Temporary not enabled // v4l2GrabberCheck->setEnabled(false); // v4l2ControllerCheck->setEnabled(false); #else v4l2GrabberCheck->hide(); v4l2ControllerCheck->hide(); #endif #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // Media Foundation device if (pref->getIntegerPreference("preferences", "mediafoundationgrabber", value) == false) { value = true; } actualMediaFoundationGrabber = value; mediaFoundationGrabberCheck->setChecked(actualMediaFoundationGrabber); changeMediaFoundationGrabberCheckState(actualMediaFoundationGrabber); if (pref->getIntegerPreference("preferences", "mediafoundationcontroller", value) == false) { value = false; } actualMediaFoundationController = value; mediaFoundationControllerCheck->setChecked(actualMediaFoundationController); #else mediaFoundationGrabberCheck->hide(); mediaFoundationControllerCheck->hide(); #endif #ifdef Q_OS_LINUX // gphoto2 device if (pref->getIntegerPreference("preferences", "gphoto2grabber", value) == false) { value = false; } actualGphoto2Grabber = value; gphoto2GrabberCheck->setChecked(actualGphoto2Grabber); changeGphoto2GrabberCheckState(actualGphoto2Grabber); if (pref->getIntegerPreference("preferences", "gphoto2controller", value) == false) { value = false; } actualGphoto2Controller = value; gphoto2ControllerCheck->setChecked(actualGphoto2Controller); #else gphoto2GrabberCheck->hide(); gphoto2ControllerCheck->hide(); #endif qDebug() << "GrabberWidget::initialize --> End"; } /* void GrabberWidget::resizeEvent(QResizeEvent *event) { qDebug() << "GrabberWidget::resizeEvent --> Start"); QWidget::resizeEvent(event); qDebug() << "GrabberWidget::resizeEvent --> End"); } */ void GrabberWidget::apply() { qDebug() << "GrabberWidget::apply --> Start"; PreferencesTool *pref = frontend->getPreferences(); bool changes = false; bool newV4L2Grabber = v4l2GrabberCheck->isChecked(); if (newV4L2Grabber != actualV4L2Grabber) { // Video 4 Linux 2 grabber changed pref->setIntegerPreference("preferences", "v4l2grabber", newV4L2Grabber); actualV4L2Grabber = newV4L2Grabber; changes = true; } bool newV4L2Controller = v4l2ControllerCheck->isChecked(); if (newV4L2Controller != actualV4L2Controller) { // Video 4 Linux 2 controller changed pref->setIntegerPreference("preferences", "v4l2controller", newV4L2Controller); actualV4L2Controller = newV4L2Controller; changes = true; } bool newMediaFoundationGrabber = mediaFoundationGrabberCheck->isChecked(); if (newMediaFoundationGrabber != actualMediaFoundationGrabber) { // Media Foundation grabber changed pref->setIntegerPreference("preferences", "mediafoundationgrabber", newMediaFoundationGrabber); actualMediaFoundationGrabber = newMediaFoundationGrabber; changes = true; } bool newMediaFoundationController = mediaFoundationControllerCheck->isChecked(); if (newMediaFoundationController != actualMediaFoundationController) { // Media Foundation controller changed pref->setIntegerPreference("preferences", "mediafoundationcontroller", newMediaFoundationController); actualMediaFoundationController = newMediaFoundationController; changes = true; } bool newGphoto2Grabber = gphoto2GrabberCheck->isChecked(); if (newGphoto2Grabber != actualGphoto2Grabber) { // Gphoto 2 grabber changed pref->setIntegerPreference("preferences", "gphoto2grabber", newGphoto2Grabber); actualGphoto2Grabber = newGphoto2Grabber; changes = true; } bool newGphoto2Controller = gphoto2ControllerCheck->isChecked(); if (newGphoto2Controller != actualGphoto2Controller) { // Gphoto 2 controller changed pref->setIntegerPreference("preferences", "gphoto2controller", newGphoto2Controller); actualGphoto2Controller = newGphoto2Controller; changes = true; } if (true == changes) { // There are changes in the grabber preferences frontend->showInformation(tr("Information"), tr("Pease restart qStopMotion to activate the changings!")); } qDebug() << "GrabberWidget::apply --> End"; } void GrabberWidget::reset() { qDebug() << "GrabberWidget::reset --> Start"; v4l2GrabberCheck->setChecked(actualV4L2Grabber); v4l2ControllerCheck->setChecked(actualV4L2Controller); mediaFoundationGrabberCheck->setChecked(actualMediaFoundationGrabber); mediaFoundationControllerCheck->setChecked(actualMediaFoundationController); gphoto2GrabberCheck->setChecked(actualGphoto2Grabber); gphoto2ControllerCheck->setChecked(actualGphoto2Controller); qDebug() << "GrabberWidget::reset --> End"; } void GrabberWidget::changeV4L2GrabberCheckState(int newState) { if (newState) { v4l2ControllerCheck->setEnabled(true); } else { v4l2ControllerCheck->setEnabled(false); } } void GrabberWidget::changeMediaFoundationGrabberCheckState(int newState) { if (newState) { mediaFoundationControllerCheck->setEnabled(true); } else { mediaFoundationControllerCheck->setEnabled(false); } } void GrabberWidget::changeGphoto2GrabberCheckState(int newState) { if (newState) { gphoto2ControllerCheck->setEnabled(true); } else { gphoto2ControllerCheck->setEnabled(false); } } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/generaldialog.h000644 000000 000000 00000006727 12654352322 027572 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANPageILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef GENERALDIALOG_H #define GENERALDIALOG_H #include #include #include "frontends/frontend.h" #include "frontends/qtfrontend/preferences/exportwidget.h" #include "frontends/qtfrontend/preferences/generalwidget.h" #include "frontends/qtfrontend/preferences/grabberwidget.h" #include "frontends/qtfrontend/preferences/importwidget.h" #include "frontends/qtfrontend/preferences/projectwidget.h" #include "frontends/qtfrontend/preferences/transformwidget.h" /** * The general preferences dialog. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class GeneralDialog : public QDialog { Q_OBJECT public: /** * Sets up the filepreview-label. * @param f frontend of the application. * @param parent the parent of the widget. */ GeneralDialog(Frontend *f, QWidget *parent = 0); private: Frontend *frontend; QTreeWidget *pageTree; QHBoxLayout *pageLayout; GeneralWidget *generalSettingsPage; ProjectWidget *projectValuePage; ImportWidget *imageImportPage; TransformWidget *imageTransformationPage; ExportWidget *videoExportPage; GrabberWidget *grabberSelectPage; QPushButton *applyButton; QPushButton *closeButton; void makeGeneralSettingsPage(); void makeProjectValuePage(); void makeImageImportPage(); void makeImageTransformPage(); void makeVideoExportPage(); void makeGrabberSelectPage(); private slots: /** * Click in the page tree * @param pageItem The specified item is the item that was clicked, or 0 if no item was clicked. * @param column The column is the item's column that was clicked. */ void itemClicked(QTreeWidgetItem *pageItem, int column); void apply(); void close(); void finish(int result); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/projectwidget.cpp000644 000000 000000 00000033214 12751646113 030173 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "projectwidget.h" #include #include #include #include #include #include #include "domain/domainfacade.h" #include "frontends/qtfrontend/elements/flexiblelineedit.h" #include "technical/preferencestool.h" ProjectWidget::ProjectWidget(Frontend *f, bool type, QWidget *parent) : QWidget(parent) { qDebug() << "ProjectWidget::Constructor --> Start"; Q_ASSERT(type == 1); // Use this widget only in general dialog! frontend = f; tabType = type; recordingGroupBox = 0; recordingModeCombo = 0; grabberGroupBox = 0; grabberSourceCombo = 0; defaultGrabberSource = 0; captureGroupBox = 0; mixModeCombo = 0; defaultMixMode = 0; mixCountSliderCaption = 0; mixCountSlider = 0; defaultMixCount = 0; defaultPlaybackCount = 0; // autoGroupBox = 0; // unitModeCombo = 0; // defaultUnitMode = 0; this->setObjectName("ProjectWidget"); makeGUI(); qDebug() << "ProjectWidget::Constructor --> End"; } void ProjectWidget::makeGUI() { qDebug() << "ProjectWidget::makeGUI --> Start"; QVBoxLayout *mainLayout = new QVBoxLayout; recordingGroupBox = new QGroupBox(tr("Recording")); // recordingGroupBox->setFlat(true); recordingModeCombo = new QComboBox(); recordingModeCombo->setFocusPolicy(Qt::NoFocus); connect(recordingModeCombo, SIGNAL(activated(int)), this, SLOT(changeRecordingMode(int))); recordingModeCombo->addItem(tr("Single frame capture")); // recordingModeCombo->addItem(tr("Automated recording")); QVBoxLayout *recordingLayout = new QVBoxLayout; // recordingLayout->setMargin(0); // recordingLayout->setSpacing(2); // recordingLayout->addStretch(1); recordingLayout->addWidget(recordingModeCombo); recordingLayout->addStretch(10); recordingGroupBox->setLayout(recordingLayout); mainLayout->addWidget(recordingGroupBox); grabberGroupBox = new QGroupBox; grabberGroupBox->setTitle(tr("Image grabber settings")); // grabberGroupBox->setFlat(true); grabberSourceCombo = new QComboBox(); grabberSourceCombo->setFocusPolicy(Qt::NoFocus); connect(grabberSourceCombo, SIGNAL(activated(int)), this, SLOT(changeGrabberSource(int))); #ifdef Q_OS_LINUX grabberSourceCombo->addItem(tr("Video 4 Linux 2 (USB WebCam)")); grabberSourceCombo->addItem(tr("gphoto (USB Compact Camera)")); #endif #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) grabberSourceCombo->addItem(tr("Media Foundation")); #endif QVBoxLayout *grabberLayout = new QVBoxLayout; // grabberLayout->setMargin(0); // grabberLayout->setSpacing(2); // grabberLayout->addStretch(1); grabberLayout->addWidget(grabberSourceCombo); grabberLayout->addStretch(10); grabberGroupBox->setLayout(grabberLayout); mainLayout->addWidget(grabberGroupBox); captureGroupBox = new QGroupBox(tr("Capture")); // secondGroupBox->setFlat(true); mixModeCombo = new QComboBox(); mixModeCombo->setFocusPolicy(Qt::NoFocus); connect(mixModeCombo, SIGNAL(activated(int)), this, SLOT(changeMixMode(int))); mixModeCombo->addItem(tr("Mix")); mixModeCombo->addItem(tr("Diff")); mixModeCombo->addItem(tr("Playback")); mixCountSliderCaption = new QLabel(tr("Number of images:")); QString infoText = tr("

Number of images

" "

By changing the value in this slidebar you can specify how many images " "backwards in the animation which should be mixed on top of the camera or " "if you are in playback mode: how many images to play.

" "

By mixing the previous image(s) onto the camera you can more easily see " "how the next shot will be in relation to the other, therby making a smoother " "stop motion animation!

"); mixCountSliderCaption->setWhatsThis(infoText); mixCountSlider = new QSlider(Qt::Horizontal); mixCountSlider->setMinimum(0); mixCountSlider->setMaximum(5); mixCountSlider->setPageStep(1); mixCountSlider->setValue(2); mixCountSlider->setTickPosition(QSlider::TicksBelow); mixCountSlider->setFocusPolicy(Qt::NoFocus); connect(mixCountSlider, SIGNAL(valueChanged(int)), this, SLOT(changeMixCount(int))); mixCountSlider->setWhatsThis(infoText); QVBoxLayout *captureLayout = new QVBoxLayout; captureLayout->addWidget(mixModeCombo); captureLayout->addWidget(mixCountSliderCaption); captureLayout->addWidget(mixCountSlider); captureLayout->addStretch(10); captureGroupBox->setLayout(captureLayout); mainLayout->addWidget(captureGroupBox); /* autoGroupBox = new QGroupBox(tr("Auto")); // autoGroupBox->setFlat(true); unitModeCombo = new QComboBox(); unitModeCombo->setFocusPolicy(Qt::NoFocus); // unitModeCombo->setEnabled(false); connect(unitModeCombo, SIGNAL(activated(int)), this, SLOT(changeUnitMode(int))); unitModeCombo->addItem(""); unitModeCombo->addItem(tr("Pr sec")); unitModeCombo->addItem(tr("Pr min")); unitModeCombo->addItem(tr("Pr hr")); QVBoxLayout *autoLayout = new QVBoxLayout; autoLayout->addWidget(unitModeCombo); autoGroupBox->setLayout(autoLayout); // mainLayout->addWidget(autoGroupBox); */ mainLayout->addStretch(1); setLayout(mainLayout); qDebug() << "ProjectWidget::makeGUI --> End"; } void ProjectWidget::initialize() { qDebug() << "ProjectWidget::initialize --> Start"; PreferencesTool *pref = frontend->getPreferences(); int value; if (pref->getIntegerPreference("preferences", "defaultrecordingmode", value) == false) { value = 0; } defaultRecordingMode = value; if (pref->getIntegerPreference("preferences", "defaultgrabbersource", value) == false) { value = 0; } defaultGrabberSource = value; if (pref->getIntegerPreference("preferences", "defaultmixingmode", value) == false) { value = 0; } defaultMixMode = value; if (pref->getIntegerPreference("preferences", "defaultmixcount", value) == false) { value = 0; } defaultMixCount = value; if (pref->getIntegerPreference("preferences", "defaultplaybackcount", value) == false) { value = 0; } defaultPlaybackCount = value; // if (pref->getIntegerPreference("preferences", "defaultunitmode", value) == false) { // value = 0; // } // bdefaultUnitMode = value; recordingModeCombo->setCurrentIndex(defaultRecordingMode); changeRecordingMode(defaultRecordingMode); setImageGrabberSource(defaultGrabberSource); mixModeCombo->setCurrentIndex(defaultMixMode); changeMixMode(defaultMixMode); switch (defaultMixMode) { case 0: mixCountSlider->setValue(defaultMixCount); break; case 1: break; case 2: mixCountSlider->setValue(defaultPlaybackCount); break; } /* unitModeCombo->setCurrentIndex(defaultUnitMode); changeUnitMode(defaultUnitMode); */ qDebug() << "ProjectWidget::initialize --> End"; } /* void ProjectWidget::resizeEvent(QResizeEvent *event) { qDebug() << "ProjectWidget::resizeEvent --> Start"; QWidget::resizeEvent(event); qDebug() << "ProjectWidget::resizeEvent --> End"; } */ void ProjectWidget::apply() { qDebug() << "ProjectWidget::apply --> Start"; int index; int newRecordingMode = recordingModeCombo->currentIndex(); if (defaultRecordingMode != newRecordingMode) { defaultRecordingMode = newRecordingMode; } switch (grabberSourceCombo->currentIndex()) { case 0: #ifdef Q_OS_LINUX index = ImageGrabberDevice::video4Linux2Source; #endif #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) index = ImageGrabberDevice::mediaFoundationSource; #endif break; case 1: #ifdef Q_OS_LINUX index = ImageGrabberDevice::gphoto2Source; #endif break; } if (defaultGrabberSource != index) { defaultGrabberSource = index; } int newMixMode = mixModeCombo->currentIndex(); if (defaultMixMode != newMixMode) { defaultMixMode = newMixMode; } int newMixCount = mixCountSlider->value(); switch (newMixMode) { case 0: if (defaultMixCount != newMixCount) { defaultMixCount = newMixCount; } break; case 1: break; case 2: if (defaultPlaybackCount != newMixCount) { defaultPlaybackCount = newMixCount; } break; case 3: break; } /* int newUnitMode = unitModeChooseCombo->currentIndex(); if (defaultUnitMode != newUnitMode) { defaultUnitMode = newUnitMode; } */ PreferencesTool *pref = frontend->getPreferences(); pref->setIntegerPreference("preferences", "defaultrecordingmode", defaultRecordingMode); pref->setIntegerPreference("preferences", "defaultgrabbersource", defaultGrabberSource); pref->setIntegerPreference("preferences", "defaultmixmode", defaultMixMode); pref->setIntegerPreference("preferences", "defaultmixcount", defaultMixCount); pref->setIntegerPreference("preferences", "defaultplaybackcount", defaultPlaybackCount); // pref->setIntegerPreference("preferences", "defaultunitmode", defaultUnitMode); qDebug() << "ProjectWidget::apply --> End"; } void ProjectWidget::reset() { qDebug() << "ProjectWidget::reset --> Start"; changeRecordingMode(defaultRecordingMode); changeGrabberSource(defaultGrabberSource); changeMixMode(defaultMixMode); switch (defaultMixMode) { case 0: mixCountSlider->setValue(defaultMixCount); break; case 1: break; case 2: mixCountSlider->setValue(defaultPlaybackCount); break; } /* changeUnitMode(defaultUnitMode); */ qDebug() << "ProjectWidget::reset --> End"; } void ProjectWidget::setImageGrabberSource(int newSource) { qDebug() << "ImportWidget::setImageGrabberSource --> Start"; switch (newSource) { case ImageGrabberDevice::video4Linux2Source: grabberSourceCombo->setCurrentIndex(0); break; case ImageGrabberDevice::gphoto2Source: grabberSourceCombo->setCurrentIndex(1); break; case ImageGrabberDevice::mediaFoundationSource: grabberSourceCombo->setCurrentIndex(0); break; } qDebug() << "ImportWidget::setImageGrabberSource --> End"; } void ProjectWidget::changeRecordingMode(int index) { this->recordingModeCombo->setCurrentIndex(index); } void ProjectWidget::changeGrabberSource(int index) { this->grabberSourceCombo->setCurrentIndex(index); } void ProjectWidget::changeMixMode(int index) { switch (index) { case 0: mixCountSliderCaption->setEnabled(true); mixCountSlider->setEnabled(true); mixCountSlider->setMaximum(5); mixCountSlider->setValue(defaultMixCount); break; case 1: mixCountSliderCaption->setEnabled(false); mixCountSlider->setEnabled(false); break; case 2: mixCountSliderCaption->setEnabled(true); mixCountSlider->setEnabled(true); mixCountSlider->setMaximum(50); mixCountSlider->setValue(defaultPlaybackCount); break; default: Q_ASSERT(index < 3); break; } } void ProjectWidget::changeMixCount(int /*sliderValue*/) { } /* void ProjectWidget::changeUnitMode(int index) { int sliderValue = mixCountSlider->value(); if (sliderValue == 0 || index == 0) { return; } int factor = 0; switch (index) { case 1: factor = 1000; break; case 2: factor = 60000; break; case 3: factor = 3600000; break; default: break; } } void ProjectWidget::updateSliderValue(int sliderValue) { if (sliderValue != 0) { int factor = 0; int index = unitModeCombo->currentIndex(); switch (index) { case 1: factor = 1000; break; case 2: factor = 60000; break; case 3: factor = 3600000; break; } captureTimer->setInterval(factor / sliderValue); } } */ qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/importwidget.cpp000644 000000 000000 00000034331 12654352322 030036 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "importwidget.h" #include #include #include #include #include #include #include #include #include "domain/domainfacade.h" #include "frontends/qtfrontend/elements/flexiblelineedit.h" #include "technical/preferencestool.h" #include "technical/grabber/imagegrabber.h" ImportWidget::ImportWidget(Frontend *f, bool type, QWidget *parent) : QWidget(parent) { qDebug() << "ImportWidget::Constructor --> Start"; frontend = f; tabType = type; infoText = 0; encoderTable = 0; // Image preferences imagePrefs = 0; imageFormatLabel = 0; imageFormatCombo = 0; activeImageFormat = ImageGrabber::jpegFormat; imageQualityLabel = 0; imageQualitySlider = 0; activeImageQuality = 100; qualityMinimumLabel = 0; qualityMaximumLabel = 0; imageSizeLabel = 0; imageSizeCombo = 0; activeImageSize = ImageGrabber::defaultSize; // Live view preferences liveViewPrefs = 0; liveViewFpsLabel = 0; liveViewFpsSlider = 0; activeLiveViewFps = 20; fpsMinimumLabel = 0; fpsMaximumLabel = 0; this->setObjectName("ImportWidget"); makeGUI(); qDebug() << "ImportWidget::Constructor --> End"; } void ImportWidget::makeGUI() { qDebug() << "ImportWidget::makeGUI --> Start"; infoText = new QTextEdit; infoText->setReadOnly(true); if (tabType) { infoText->setHtml( "

" + tr("Below you can set which image sources should be used " "for importing images to a new project.") + "

"); } else { infoText->setHtml( "

" + tr("Below you can set which image sources should be used " "for importing images to the currently active project.") + "

"); } infoText->setMinimumWidth(440); infoText->setMinimumHeight(55); infoText->setMaximumHeight(60); infoText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); // Image import preferences imagePrefs = new QGroupBox; imagePrefs->setTitle(tr("Image import settings")); imageFormatLabel = new QLabel(tr("Image Format:")); imageFormatCombo = new QComboBox(); imageFormatLabel->setBuddy(imageFormatCombo); imageFormatCombo->setFocusPolicy(Qt::NoFocus); imageFormatCombo->setMinimumWidth(300); imageFormatCombo->setMaximumWidth(300); connect(imageFormatCombo, SIGNAL(activated(int)), this, SLOT(changeImageFormat(int))); imageFormatCombo->addItem(tr("JPEG")); imageFormatCombo->addItem(tr("TIFF")); imageFormatCombo->addItem(tr("BMP")); imageQualityLabel = new QLabel(tr("Image Quality:")); imageQualitySlider = new QSlider(); imageQualitySlider->setMaximum(0); imageQualitySlider->setMaximum(100); imageQualitySlider->setOrientation(Qt::Horizontal); imageQualitySlider->setMinimumWidth(300); imageQualitySlider->setMaximumWidth(300); imageQualitySlider->setTickPosition(QSlider::TicksBelow); imageQualitySlider->setTickInterval(20); imageQualitySlider->setSingleStep(10); imageQualitySlider->setPageStep(20); connect(imageQualitySlider, SIGNAL(sliderReleased()), this, SLOT(changeImageQuality())); qualityMinimumLabel = new QLabel(tr("Min")); qualityMaximumLabel = new QLabel(tr("Max")); imageSizeLabel = new QLabel(tr("Image Size:")); imageSizeCombo = new QComboBox(); imageSizeLabel->setBuddy(imageSizeCombo); imageSizeCombo->setFocusPolicy(Qt::NoFocus); imageSizeCombo->setMinimumWidth(300); imageSizeCombo->setMaximumWidth(300); connect(imageSizeCombo, SIGNAL(activated(int)), this, SLOT(changeImageSize(int))); imageSizeCombo->addItem(tr("Default Grabber Size")); imageSizeCombo->addItem(tr("QVGA (320x240)")); imageSizeCombo->addItem(tr("VGA (640x480)")); imageSizeCombo->addItem(tr("SVGA (800x600)")); imageSizeCombo->addItem(tr("PAL D (704x576)")); imageSizeCombo->addItem(tr("HD Ready (1280x720)")); imageSizeCombo->addItem(tr("Full HD (1900x1080)")); QHBoxLayout *icLayout = new QHBoxLayout; icLayout->addWidget(qualityMinimumLabel, 0, Qt::AlignLeft); icLayout->addStretch(); icLayout->addWidget(qualityMaximumLabel, 0, Qt::AlignRight); QGridLayout *imagePrefsLayout = new QGridLayout; imagePrefsLayout->setColumnStretch(0, 1); imagePrefsLayout->addWidget(imageFormatLabel, 0, 0, Qt::AlignLeft); imagePrefsLayout->addWidget(imageFormatCombo, 0, 1, Qt::AlignRight); imagePrefsLayout->addWidget(imageQualityLabel, 1, 0, Qt::AlignLeft); imagePrefsLayout->addWidget(imageQualitySlider, 1, 1, Qt::AlignRight); imagePrefsLayout->addLayout(icLayout, 2, 1, Qt::AlignRight); imagePrefsLayout->addWidget(imageSizeLabel, 3, 0, Qt::AlignLeft); imagePrefsLayout->addWidget(imageSizeCombo, 3, 1, Qt::AlignRight); imagePrefs->setLayout(imagePrefsLayout); // Live view preferences liveViewPrefs = new QGroupBox; liveViewPrefs->setTitle(tr("Live view settings")); liveViewFpsLabel = new QLabel(tr("Frames per second:")); liveViewFpsSlider = new QSlider(); liveViewFpsSlider->setMaximum(1); liveViewFpsSlider->setMaximum(50); liveViewFpsSlider->setOrientation(Qt::Horizontal); liveViewFpsSlider->setMinimumWidth(300); liveViewFpsSlider->setMaximumWidth(300); liveViewFpsSlider->setTickPosition(QSlider::TicksBelow); liveViewFpsSlider->setTickInterval(2); liveViewFpsSlider->setSingleStep(5); liveViewFpsSlider->setPageStep(10); connect(liveViewFpsSlider, SIGNAL(sliderReleased()), this, SLOT(changeLiveViewFps())); fpsMinimumLabel = new QLabel(tr("0.1")); fpsMaximumLabel = new QLabel(tr("5.0")); QHBoxLayout *fpsLayout = new QHBoxLayout; fpsLayout->addWidget(fpsMinimumLabel, 0, Qt::AlignLeft); fpsLayout->addStretch(); fpsLayout->addWidget(fpsMaximumLabel, 0, Qt::AlignRight); QGridLayout *liveViewPrefsLayout = new QGridLayout; liveViewPrefsLayout->setColumnStretch(0, 1); liveViewPrefsLayout->addWidget(liveViewFpsLabel, 1, 0, Qt::AlignLeft); liveViewPrefsLayout->addWidget(liveViewFpsSlider, 1, 1, Qt::AlignRight); liveViewPrefsLayout->addLayout(fpsLayout, 2, 1, Qt::AlignRight); liveViewPrefs->setLayout(liveViewPrefsLayout); // Widget layout QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(infoText); mainLayout->addWidget(imagePrefs); mainLayout->addWidget(liveViewPrefs); mainLayout->addStretch(1); setLayout(mainLayout); qDebug() << "ImportWidget::makeGUI --> End"; } void ImportWidget::initialize() { qDebug() << "ImportWidget::initialize --> Start"; PreferencesTool *pref = frontend->getPreferences(); int value; // Read eEncoder preferences if (tabType) { // This is a general dialog tab if (pref->getIntegerPreference("preferences", "defaultimageformat", value) == false) { value = ImageGrabber::jpegFormat; } activeImageFormat = value; if (pref->getIntegerPreference("preferences", "defaultimagequality", value) == false) { value = 100; } activeImageQuality = value; if (pref->getIntegerPreference("preferences", "defaultimagesize", value) == false) { value = ImageGrabber::defaultSize; } activeImageSize = value; if (pref->getIntegerPreference("preferences", "defaultliveviewfps", value) == false) { value = 20; } activeLiveViewFps = value; } else { // This is a project dialog tab activeImageFormat = frontend->getProject()->getImageFormat(); activeImageQuality = frontend->getProject()->getImageQuality(); activeImageSize = frontend->getProject()->getImageSize(); activeLiveViewFps = frontend->getProject()->getLiveViewFps(); } imageFormatCombo->setCurrentIndex(activeImageFormat); enableQuality(); imageQualitySlider->setValue(activeImageQuality); imageSizeCombo->setCurrentIndex(activeImageSize); liveViewFpsSlider->setValue(activeLiveViewFps); qDebug() << "ImportWidget::initialize --> End"; } /* void ImportWidget::resizeEvent(QResizeEvent *event) { qDebug() << "ImportWidget::resizeEvent --> Start"; QWidget::resizeEvent(event); qDebug() << "ImportWidget::resizeEvent --> End"; } */ void ImportWidget::apply() { qDebug() << "ImportWidget::apply --> Start"; PreferencesTool *pref = frontend->getPreferences(); int index; int value; bool changings = false; index = imageFormatCombo->currentIndex(); if (activeImageFormat != index) { activeImageFormat = index; changings = true; } value = imageQualitySlider->value(); if (activeImageQuality != value) { activeImageQuality = value; changings = true; } index = imageSizeCombo->currentIndex(); if (activeImageSize != index) { activeImageSize = index; changings = true; } value = liveViewFpsSlider->value(); if (activeLiveViewFps != value) { activeLiveViewFps = value; changings = true; } if (changings) { if (tabType) { // This is a general dialog tab pref->setIntegerPreference("preferences", "defaultimageformat", activeImageFormat); pref->setIntegerPreference("preferences", "defaultimagequality", activeImageQuality); pref->setIntegerPreference("preferences", "defaultimagesize", activeImageSize); pref->setIntegerPreference("preferences", "defaultliveviewfps", activeLiveViewFps); } else { // This is a project dialog tab frontend->getProject()->setImageFormat(activeImageFormat); frontend->getProject()->setImageQuality(activeImageQuality); frontend->getProject()->setImageSize(activeImageSize); frontend->getProject()->setLiveViewFps(activeLiveViewFps); } } qDebug() << "ImportWidget::apply --> End"; } void ImportWidget::reset() { qDebug() << "ImportWidget::reset --> Start"; imageFormatCombo->setCurrentIndex(activeImageFormat); enableQuality(); imageQualitySlider->setValue(activeImageQuality); imageSizeCombo->setCurrentIndex(activeImageSize); liveViewFpsSlider->setValue(activeLiveViewFps); qDebug() << "ImportWidget::reset --> End"; } void ImportWidget::changeImageFormat(int index) { qDebug() << "ImportWidget::changeImageFormat --> Start"; if (!tabType) { // Project settings are changed // Convert the existing images if (frontend->convertImages(index, activeImageQuality)) { // Images converted activeImageFormat = index; } else { // Images not converted, user break imageFormatCombo->setCurrentIndex(activeImageFormat); } } enableQuality(); qDebug() << "ImportWidget::changeImageFormat --> End"; } void ImportWidget::changeImageQuality() { qDebug() << "ImportWidget::changeImageQuality --> Start"; int value = imageQualitySlider->value(); if (activeImageQuality == value) { return; } if (!tabType) { // Project settings are changed // Convert the existing images if (frontend->convertImages(activeImageFormat, value)) { // Images converted activeImageQuality = value; } else { // Images not converted, user break imageQualitySlider->setValue(activeImageQuality); } } qDebug() << "ImportWidget::changeImageQuality --> End"; } void ImportWidget::changeImageSize(int /*index*/) { // qDebug() << "ImportWidget::changeImageSize --> Start"; // qDebug() << "ImportWidget::changeImageSize --> End"; } void ImportWidget::enableQuality() { if (imageFormatCombo->currentIndex() == ImageGrabber::jpegFormat) { imageQualityLabel->setEnabled(true); imageQualitySlider->setEnabled(true); qualityMinimumLabel->setEnabled(true); qualityMaximumLabel->setEnabled(true); } else { imageQualityLabel->setEnabled(false); imageQualitySlider->setEnabled(false); qualityMinimumLabel->setEnabled(false); qualityMaximumLabel->setEnabled(false); } } void ImportWidget::changeLiveViewFps() { qDebug() << "ImportWidget::changeLiveViewFps --> Start"; int value = liveViewFpsSlider->value(); if (activeLiveViewFps == value) { return; } /* if (!tabType) { // Project settings are changed } */ qDebug() << "ImportWidget::changeLiveViewFps --> End"; } qstopmotion-2.3.2-Source/src/frontends/qtfrontend/preferences/transformwidget.h000644 000000 000000 00000010713 12654352322 030202 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef TRANSFORMWIDGET_H #define TRANSFORMWIDGET_H #include "frontends/frontend.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /** * The image import tab in the preferences menu * @author Ralf Lange */ class TransformWidget : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param f frontend of the application * @param parent the parent of the this widget */ TransformWidget(Frontend *f, bool type, QWidget *parent = 0); /** * Applies the settings in the import tab. */ void apply(); /** * Reset the settings in the import tab. */ void reset(); /** * Initializes the table and fills it with starting values. */ void initialize(); protected: // void resizeEvent(QResizeEvent *event); private: /** * Set the adjustment in the adjustment box. * @param newAdjustment The new adjustment */ void setAdjustment(int newAdjustment); private slots: // Transformation preferences /** * Slot for notified the import tab when scale button is selected, so that * image transformation preferences can be updated. */ void setScaleButtonOn(); /** * Slot for notified the import tab when clip button is selected, so that * image transformation preferences can be updated. */ void setClipButtonOn(); /** * Slot for notified the import tab when zoom button is selected, so that * image transformation preferences can be updated. */ void setZoomButtonOn(); /** * Slot for notified the import tab when the zoom changes, * so that image transformation preferences can be updated. */ void changeZoom(); private: Frontend *frontend; /** * Type of the tab: true = general dialog tab, false = project dialog tab */ bool tabType; QTextEdit *infoText; // Transformation preferences QGroupBox *transformPrefs; QRadioButton *scaleButton; QRadioButton *clipButton; QRadioButton *zoomButton; int activeTransform; // Adjustment preferences QGroupBox *adjustmentPrefs; QRadioButton *leftUpButton; QRadioButton *centerUpButton; QRadioButton *rightUpButton; QRadioButton *leftMiddleButton; QRadioButton *centerMiddleButton; QRadioButton *rightMiddleButton; QRadioButton *leftDownButton; QRadioButton *centerDownButton; QRadioButton *rightDownButton; int activeImageAdjustment; // Zoom preferences QGroupBox *zoomPrefs; QLabel *zoomLabel; QSlider *zoomSlider; int activeZoomValue; QLabel *zoomMinimumLabel; QLabel *zoomMaximumLabel; void makeGUI(); void enableQuality(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/mainwindowgui.h000644 000000 000000 00000055134 12751646113 025353 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef QTGUI_H #define QTGUI_H #include #include #include #include #include #include #include "frontends/frontend.h" #include "frontends/qtfrontend/menuframe.h" #include "frontends/qtfrontend/toolbar.h" #include "frontends/qtfrontend/dialogs/descriptiondialog.h" #include "frontends/qtfrontend/dialogs/helpbrowser.h" #include "frontends/qtfrontend/dialogs/cameracontrollerdialog.h" #include "frontends/qtfrontend/elements/flexiblespinbox.h" #include "frontends/qtfrontend/frameview/frameviewinterface.h" #include "frontends/qtfrontend/preferences/generaldialog.h" #include "frontends/qtfrontend/preferences/projectdialog.h" #include "frontends/qtfrontend/timeline/timeline.h" // #include "frontends/qtfrontend/tooltabs/compositingtab.h" #include "frontends/qtfrontend/tooltabs/projecttab.h" #include "frontends/qtfrontend/tooltabs/recordingtab.h" // #include "frontends/qtfrontend/tooltabs/viewtab.h" #include "technical/externalchangemonitor.h" #include "technical/grabber/imagegrabberfacade.h" /** *The main window class for the qstopmotion application. *This class sets up the main GUI and connects the buttons. * *@author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class MainWindowGUI : public QMainWindow { Q_OBJECT public: enum {SAVE, SAVE_AS, UNDO, REDO, CUT, COPY, PASTE, GOTO}; /************************************************************************** * Public functions **************************************************************************/ /** * Sets up the program main GUI and connect the widgets and handlers. * @param stApp the application class for changing translator * on runtime. */ MainWindowGUI(QApplication *stApp, Frontend *f); /** * Cleans up after the mainwindowgui. */ ~MainWindowGUI(); /** * Retranslates the strings. * * This function is called after a new translator has been installed so that * the program strings are retranslated to the new language. */ void retranslateStrings(); /** * Initializes the main window and fills it with starting values. */ void initialize(); /** * Overloaded mouse listener. Closes the embedded menues when the user * clicks inside the main window. * @param e information about the event. */ void mousePressEvent(QMouseEvent * e); /** * Overloaded event listener which recieves information when a keyboard key is * pressed. * @param k information about the key event. */ void keyPressEvent(QKeyEvent *k); /** * Getting all possible GUI languages * @return A vector with all languages */ const QVector getLanguages(); /** * Getting all possible GUI locales * @return A vector with all locales */ const QVector getLocales(); /** * A new language is selected in the preferences menu. * @param newIndex New selected index. */ void changeLanguage(int newIndex); /** * A new capture button function is selected in the preferences menu. * @param newFunction New selected function. */ void changeCaptureButtonFunction(PreferencesTool::captureButtonFunction newFunction); /** * Get the status of the vertical lines of the grid. * @return The new state of the grid. */ bool getVerticalGrid(); /** * Set the status of the vertical lines of the grid. * @param newState The new state of the grid. */ void setVerticalGrid(bool newState); /** * Get the number of vertical lines of the grid. * @return The new number of lines. */ int getVerticalSpin(); /** * Set the number of vertical lines of the grid. * @param newSpin The new number of lines. */ void setVerticalSpin(int newSpin); /** * Get the status of the horizontal lines of the grid. * @return The new state of the grid. */ bool getHorizontalGrid(); /** * Set the status of the horizontal lines of the grid. * @param newState The new state of the grid. */ void setHorizontalGrid(bool newState); /** * Get the number of horizontal lines of the grid. * @return The new number of lines. */ int getHorizontalSpin(); /** * Set the number of horizontal lines of the grid. * @param newSpin The new number of lines. */ void setHorizontalSpin(int newSpin); /** * Get the RGB value of the color of the grid lines. * @param r The red component of the color's RGB value. * @param g The green component of the color's RGB value. * @param b The blue component of the color's RGB value. * @param a The alpha-channel component of the color's RGB value. */ void getGridColorRGB(int *r, int *g, int *b, int *a); /** * Set the RGB value of the color of the grid lines. * @param r The red component of the color's RGB value. * @param g The green component of the color's RGB value. * @param b The blue component of the color's RGB value. * @param a The alpha-channel component of the color's RGB value. */ void setGridColorRGB(int r, int g, int b, int a); /** * Function for displaying progress on timeconsuming operations. * @param infoText the text to display to the user * @param numOperations the number of calculated operations to do */ void showProgress(const QString &infoText, unsigned int numOperations = 0); /** * Function for hiding the progress info. */ void hideProgress(); /** * Function for updating the progress. * @param numOperationsDone the number of operations done */ void updateProgress(int numOperationsDone); /** * Function for increase the progress. */ void increaseProgress(); /** * Function for changing the information to display to the user * @param infoText the text to display to the user */ void setProgressInfo(const QString infoText); /** * Function for checking if the user has aborted the operation * (eg pressed cancel) * @return true if the the operation is aborted, false otherwise */ bool isOperationAborted(); /** * Display a message in the status bar. * @param message the message to display. * @param timeout the timeout for the message in mili-seconds. */ void showMessage(const QString &message, int timeout = 0); /** * Removes any temporary message being shown in the status bar. */ void clearMessage(); /** * Set the project ID in the status bar * @param id The new project id: */ void setProjectID(const QString &id); /** * Set the scene ID in the status bar * @param id The new scene id: */ void setSceneID(const QString &id); /** * Set the take ID in the status bar * @param id The new take id: */ void setTakeID(const QString &id); /** * Set the exposure ID in the status bar * @param id The new exposure id: */ void setExposureID(const QString &id); /** * Open the start dialog */ void startDialog(); /** * Turns on the webcamera/video import mode. */ bool startGrabber(); /** * Checks if the grabber is inited. * @return true if it is inited, false otherwise */ bool isGrabberInited(); /** * Turns off the webcamera/video import mode. */ void stopGrabber(); /** * Get grabber controller. * @return The controller of the current grabber */ GrabberController *getGrabberController(); /** * Get the possible video devices. * @return Vector with the devices. */ const QVector getDevices(); /** * Get one video devices. * @param deviceIndex The index of the device. * @return The video devices. */ ImageGrabberDevice *getDevice(int deviceIndex); /** * Get the possible video devices. * @return Vector with the device names. */ const QVector getDeviceNames(); /** * Get the possible resolution names * of the video device. * @param deviceIndex The index of the device. * @return Vector with the resolution names. */ const QVector getResolutionNames(int deviceIndex); /** * Get the live image from the image grabber. * @return live image. */ const QImage getLiveImage(); /** * Get the raw image from the image grabber. * @return raw image. */ const QImage getRawImage(); /** * Function for performing the redraw with the next frame of the animation. * @param exposureIndex Index of the next frame */ void nextAnimationFrame(int exposureIndex); /** * Opens a saved project. * @param projectFile the project to open */ void openProject(const QString &projectFile); /** * Set a new state to the tool bar. * @param newState the new tool bar state. */ void setToolBarState(int newState); /** * Get the recording mode. * @return The recording mode. */ int getRecordingMode(); /** * Set the recording mode. * @param mode The new recording mode. */ void setRecordingMode(int mode); /** * Get the video source index. * @return video source index */ int getVideoSource(); /** * Set the video source index. * @param index Index of the new video source * @return true if the new index is set, false else. */ bool setVideoSource(int index); /** * Get the video resolution index. * @return video resolution index */ int getResolution(); /** * Set the video resolution index. * @param index Index of the new video resolution * @return true if the new index is set, false else. */ bool setResolution(int index); /** * Get the video resolution object. * @param index Index of the new video resolution * @return video resolution object */ const GrabberResolution getResolution(int index); /** * Convert all images of the current project to a new image file format. * @param newFormat The new format of the images. * @param newQuality The new quality value of the images. * @return true if all images are converted to the new image format. */ bool convertImages(int newFormat, int newQuality); /** * Get the mix mode. * @return The mix mode. */ int getMixMode(); /** * Set the mix mode. * @param mode The new mix mode */ void setMixMode(int mode); /** * Get the mix count. * @return The mix count. */ int getMixCount(); /** * Set the mix count. * @param count The new mix count. */ void setMixCount(int count); /** * Get the playback count. * @return The playback count. */ int getPlaybackCount(); /** * Set the playback count. * @param count The new playback count. */ void setPlaybackCount(int count); /** * Get the overlay intensity value. * @return The overlay intensity value. */ int getOverlayIntensity(); /** * Set the overlay intensity value of the project. * @param overlay The new overlay intensity value. */ void setOverlayIntensity(int overlay); /** * Sets up the ExternalChangeMonitor to monitor the project directories * for changes in the project files. */ void setupDirectoryMonitoring(); /** * Register the directory for external change monitoring. * @param directory the directory to listen for changes in. */ void addDirectoryToMonitoring(const QString &directory); /** * Remove the directory from external change monitoring. * @param directory the directory to remove. */ void removeDirectoryFromMonitoring(const QString &directory); /** * Remove all directories from external change monitoring. */ void removeAllDirectoriesFromMonitoring(); /** * Register the file for external change monitoring. * @param file the file to listen for changes in. */ void addFileToMonitoring(const QString &file); /** * Remove the file from external change monitoring. * @param file the file to remove. */ void removeFileFromMonitoring(const QString &file); /** * Remove all files from external change monitoring. */ void removeAllFilesFromMonitoring(); /************************************************************************** * Public slots **************************************************************************/ public slots: /************************************************************************** * Private slots **************************************************************************/ private slots: /** * Creates a new project. */ void newProject(); /** * Opens a project. */ void openProject(); /** * Opens the last used projects. */ void openMostRecent(); void openSecondMostRecent(); void openThirdMostRecent(); void openFourthMostRecent(); /** * Saves the project to the last saved file. */ void saveProject(); /** * Saves the project to a given filename from the user. */ void saveProjectAs(); /** * Exports the current project to a video file choosen by the user. It uses the * registered video encoder -- if registered -- to export. */ void exportToVideo(); /** * Exports the current project to a valid cinelerra-cv project. */ void exportToCinelerra(); /** * Close the application. */ void closeApplication(); /** * Copies a selection to the global clipboard. */ void copy(); /** * Pastes a selection from the global clipboard to the program. */ void paste(); /** * Attatches a sound to a frame in the animation. */ void addSound(); /** * Removes a sound from a frame in the animation. */ void removeSound(); /** * Brings up a preferences dialog where the user can set * preferences for the application. */ void showPreferencesDialog(); /** * Brings up a properties dialog where the user can set * properties for the project. */ void showPropertiesDialog(); /** * Show the undo view window. */ void showUndoStack(); /** * Brings up an help dialog with the qstopmotion user manua. */ void showCameraControllerDialog(); /** * */ void whatsThis(); /** * Brings up an help dialog with the qstopmotion user manua. */ void showHelpDialog(); /** * Brings up an about dialog with information about the application. */ void showAboutDialog(); protected: void closeEvent(QCloseEvent* event); signals: /** * This signal is emitted when in the start dialog a new project is selected. */ void startNewProject(); /** * This signal is emitted when in the start dialog the last project is selected. */ void startLastProject(); /** * This signal is emitted when in the start dialog open project is selected. */ void startOpenProject(); /** * This signal is emitted when in the start dialog exit is selected. */ void startExit(); public: private: QApplication *stApp; Frontend *frontend; QWidget *centerWidget; QVBoxLayout *centerWidgetLayout; QWidget *workArea; QHBoxLayout *workAreaLayout; QWidget *viewArea; QVBoxLayout *viewAreaLayout; TimeLine *timeLine; FrameViewInterface *frameView; ToolBar *toolBar; // Actions // File menu QAction *newAct; QAction *openAct; QAction *mostRecentAct; QAction *secondMostRecentAct; QAction *thirdMostRecentAct; QAction *fourthMostRecentAct; QAction *saveAct; QAction *saveAsAct; QAction *videoAct; QAction *cinelerraAct; QAction *propertiesAct; QAction *quitAct; // Edit menu QAction *undoAct; QAction *redoAct; QAction *insertSceneAct; QAction *addSceneAct; QAction *removeSceneAct; QAction *insertTakeAct; QAction *addTakeAct; QAction *removeTakeAct; QAction *insertFramesAct; QAction *addFramesAct; QAction *removeFramesAct; QAction *cutAct; QAction *copyAct; QAction *pasteAct; QAction *preferencesAct; // Windows menu QAction *undoViewAct; QAction *cameraControllerAct; // Help menu QAction *whatsthisAct; QAction *aboutQtAct; QAction *aboutAct; QAction *helpAct; // Menues QMenu *fileMenu; QMenu *exportMenu; QMenu *mostRecentMenu; QMenu *editMenu; QMenu *windowsMenu; QMenu *helpMenu; QTabWidget *sideBar; RecordingTab *recordingTab; ProjectTab *projectTab; // ViewTab *viewTab; // CompositingTab *compositingTab; // QAction *gotoFrameAct; // MenuFrame *gotoMenu; // QPushButton *gotoMenuCloseButton; // QWidget *gotoMenuWidget; // QHBoxLayout *gotoMenuWidgetLayout; // FlexibleSpinBox *gotoSpinner; // QLabel *gotoFrameLabel; // Status bar QProgressDialog *progressDialog; // QLabel *infoText; QTimer *timer; QLabel *projectLabel; QLabel *projectID; QLabel *sceneLabel; QLabel *sceneID; QLabel *takeLabel; QLabel *takeID; QLabel *exposureLabel; QLabel *exposureID; // Other widgets QUndoView *undoView; CameraControllerDialog *cameraControllerDialog; HelpBrowser *helpBrowser; // Handlers ExternalChangeMonitor *changeMonitor; // Translation handling QTranslator appTranslator; QTranslator qtTranslator; QString translationsPath; QVector translationsLanguages; QVector translationsLocales; // Others QString lastVisitedDir; ImageGrabberFacade *grabber; bool verticalGrid; int verticalSpin; bool horizontalGrid; int horizontalSpin; QColor gridColor; /************************************************************************** * Private functions **************************************************************************/ /** * Create the translator of the application. * @paramnewLocale The new locale. */ void createTranslator(const QString &newLocale); /** * Initialize the possible languages */ void initTranslations(); /** * Creates key accelerators (keyboard shortcuts) * * More can be found in the function ToolsMenu::createAccelerators(). */ void createAccelerators(); /** * Creates the actions from which the menus are created. */ void createActions(); /** * Creates and sets up the menu and the toolbar. */ void createMenus(); /** *Creates and sets up the toolsmenu. *@param parent the widget the toolsmenu will be inserted into. */ void makeToolsMenu(QHBoxLayout *layout); /** * Creates and sets up the menu for going to a specified framenumber. * @param parent the widget the gotomenu will be inserted into. */ // void makeGotoMenu(QVBoxLayout *layout); /** *Creates and sets up the frameview. *@param parent the widget the frameview will be inserted into. */ void makeViews(QHBoxLayout *layout); /** * Sets up the statusbar with custom widgets. */ void makeStatusBar(); /** *Overloaded event listener for when when a drag enters the application. *@param event information about the dragEnterEvent */ void dragEnterEvent(QDragEnterEvent * event); /** *Overloaded event listener for when a drop event occur in the application. *@param event information about the dropEvent */ void dropEvent(QDropEvent *event); /** * Overloaded event listener which recieves information when a keyboard key is * released * @param k information about the key event. */ void keyReleaseEvent(QKeyEvent * k); /** * Retranslates the tooltip and whatsthis text. * * This function is called from retranslateStrings. */ void retranslateHelpText(); /** * Changes the project history so that they shows correctly in the * most recent menu. */ void setMostRecentProject(); /** * Updates the most recent menu. */ void updateMostRecentMenu(); /** * Check for saving of all changes. */ void checkSaved(); }; #endif qstopmotion-2.3.2-Source/src/frontends/qtfrontend/qtfrontend.h000644 000000 000000 00000043302 12751646113 024650 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef QTFRONTEND_H #define QTFRONTEND_H #include #include #include #include #include #include "frontends/frontend.h" #include "frontends/qtfrontend/mainwindowgui.h" struct AudioFile { unsigned int belongsTo; QString filename; }; Q_DECLARE_LOGGING_CATEGORY(qstopmotion) /** * Frontend for using the program through a GUI developed with the QT library. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class QtFrontend : public QObject, public Frontend { Q_OBJECT public: /** * Initializing the frontend. * @param argc the argc argument from the environment through main * @param argv argv the argv arguments from the environment through main */ QtFrontend(int &argc, char **argv); /** * Deallocates allocated memory and sets the pointers to NULL. */ virtual ~QtFrontend(); /** * Check the existance an writability of the application directory. * @param binDirName name of the binary directory */ bool checkApplicationDirectory(char *binDirName); /** * Initialize the frontend. */ void init(); /** * Check for recovery after a crash. * Open a project given in the arguments. * @return true if a project file is opened. */ bool handleArguments(int argc, char **argv); /** * The run function for starting the application. * @param argc the argc argument from the environment through main. * @param argv the argv arguments from the environment through main. * @return the return status on exit */ int run(int argc, char **argv); /** * Finalize the frontend. */ void finalize(); /** * Get the domain facade. * @return the domain facade. */ DomainFacade* getProject(); /** * Get the view facade. * @return the view facade. */ ViewFacade* getView(); /** * Function for geting the preferences tool. * @return the preferences tool. */ PreferencesTool* getPreferences(); /** * Getting the application directory * @return the application directory name string */ const QString getUserDirName(); /** * Getting the temporary directory * @return the temporary directory name string */ const QString getTempDirName(); /** * Function for getting the application directory * @return the application directory name string */ const QString getApplicationDirName(); /** * Function for getting the binary directory * @return the binary directory name string */ const QString getBinDirName(); /** * Function for getting the manual directory * @return the manual directory name string */ const QString getManualDirName(); /** * Function for getting the translations directory * @return the translations directory name string */ const QString getTranslationsDirName(); /** * Function for getting the graphics directory * @return the graphics directory name string */ const QString getGraphicsDirName(); /** * Function for getting the icons directory * @return the icons directory name string */ const QString getIconsDirName(); /** * Function for getting the pictures directory * @return the pictures directory name string */ const QString getPicturesDirName(); /** * Getting all possible GUI languages * @return A vector with all languages */ const QVector getLanguages(); /** * Getting all possible GUI locales * @return A vector with all locales */ const QVector getLocales(); /** * A new language is selected in the preferences menu. * @param newIndex New selected index. */ void changeLanguage(int newIndex); /** * A new capture button function is selected in the preferences menu. * @param newFunction New selected function. */ void changeCaptureButtonFunction(int newFunction); /** * Get the status of the vertical lines of the grid. * @return The new state of the grid. */ bool getVerticalGrid(); /** * Set the status of the vertical lines of the grid. * @param newState The new state of the grid. */ void setVerticalGrid(bool newState); /** * Get the number of vertical lines of the grid. * @return The new number of lines. */ int getVerticalSpin(); /** * Set the number of vertical lines of the grid. * @param newSpin The new number of lines. */ void setVerticalSpin(int newSpin); /** * Get the status of the horizontal lines of the grid. * @return The new state of the grid. */ bool getHorizontalGrid(); /** * Set the status of the horizontal lines of the grid. * @param newState The new state of the grid. */ void setHorizontalGrid(bool newState); /** * Get the number of horizontal lines of the grid. * @return The new number of lines. */ int getHorizontalSpin(); /** * Set the number of horizontal lines of the grid. * @param newSpin The new number of lines. */ void setHorizontalSpin(int newSpin); /** * Get the RGB value of the color of the grid lines. * @param r The red component of the color's RGB value. * @param g The green component of the color's RGB value. * @param b The blue component of the color's RGB value. * @param a The alpha-channel component of the color's RGB value. */ void getGridColorRGB(int *r, int *g, int *b, int *a); /** * Set the RGB value of the color of the grid lines. * @param r The red component of the color's RGB value. * @param g The green component of the color's RGB value. * @param b The blue component of the color's RGB value. * @param a The alpha-channel component of the color's RGB value. */ void setGridColorRGB(int r, int g, int b, int a); /** * Function for displaying progress on timeconsuming operations. * @param infoText the text to display to the user * @param numOperations the number of calculated operations to do */ void showProgress(const QString &infoText, unsigned int numOperations = 0); /** * Function for hiding the progress info. */ void hideProgress(); /** * Function for updating the progress. * @param numOperationsDone the number of operations done */ void updateProgress(int numOperationsDone); /** * Function for increase the progress. */ void increaseProgress(); /** * Function for changing the information to display to the user * @param infoText the text to display to the user */ void setProgressInfo(const QString infoText); /** * Display a message in the status bar. * @param message the message to display. * @param timeout the timeout for the message in mili-seconds. */ void showMessage(const QString &message, int timeout = 0); /** * Removes any temporary message being shown in the status bar. */ void clearMessage(); /** * Function for checking if the user has aborted the operation * (eg pressed cancel) * @return true if the the operation is aborted, false otherwise */ bool isOperationAborted(); /** * Function for changing the project id in the status bar * @param id the id to display in the status bar */ void setProjectID(const QString id); /** * Function for changing the scene id in the status bar * @param id the id to display in the status bar */ void setSceneID(const QString id); /** * Function for changing the take id in the status bar * @param id the id to display in the status bar */ void setTakeID(const QString id); /** * Function for changing the exposure id in the status bar * @param id the id to display in the status bar */ void setExposureID(const QString id); /** * Function for processing Qt events. This is useful on timeconsuming * operations which aren't running in separate processes or threads. */ void processEvents(); /** * Function for asking the user a yes/no question. * @param title title of the message dialog * @param question the question to ask * @return 0 if the user answer yes, 1 if no */ int askQuestion(const QString title, const QString &question); /** * Function for informating the user. * @param title title of the message dialog * @param info the information for the user */ void showInformation(const QString title, const QString &info); /** * Function for warning the user. * @param title title of the message dialog * @param warning the warning for the user */ void showWarning(const QString title, const QString &warning); /** * Function for signaling a critical state to the user. * @param title title of the message dialog * @param message the message for the user */ void showCritical(const QString title, const QString &message); /** * Function to run a external command * @param command command to run * @param arguments arguments for the command * @return return value of the command */ int runExternalCommand(const QString &command, const QStringList &arguments); /** * Turns on the webcamera/video import mode. */ bool startGrabber(); /** * Checks if the grabber is inited. * @return true if it is inited, false otherwise */ bool isGrabberInited(); /** * Turns off the webcamera/video import mode. */ void stopGrabber(); /** * Get the possible video devices * @return Vector with the devices. */ const QVector getDevices(); /** * Get one video devices. * @param deviceIndex The index of the device. * @return The video devices. */ ImageGrabberDevice *getDevice(int deviceIndex); /** * Get the possible video devices. * @return Vector with the device names. */ const QVector getDeviceNames(); /** * Get the possible resolution names * of the video device. * @param deviceIndex The index of the device. * @return Vector with the resolution names. */ const QVector getResolutionNames(int deviceIndex); /** * Get the live image from the image grabber. * @return live image. */ const QImage getLiveImage(); /** * Get the raw image from the image grabber. * @return raw image. */ const QImage getRawImage(); /** * Function for performing the redraw with the next frame of the animation. * @param exposureIndex Index of the next frame */ void nextAnimationFrame(int exposureIndex); /** * Set a new state to the tool bar. * @param newState the new tool bar state. */ void setToolBarState(int newState); /** * Get the recording mode. * @return The recording mode. */ int getRecordingMode(); /** * Set the recording mode. * @param mode The new recording mode. */ void setRecordingMode(int mode); /** * Get the video source index. * @return video source index */ int getVideoSource(); /** * Set the video source index. * @param index Index of the new video source * @return true if the new index is set, false else. */ bool setVideoSource(int index); /** * Get the video resolution index. * @return video resolution index */ int getResolution(); /** * Set the video resolution index. * @param index Index of the new video resolution * @return true if the new index is set, false else. */ bool setResolution(int index); /** * Get the video resolution object. * @param index Index of the new video resolution * @return video resolution object */ const GrabberResolution getResolution(int index); /** * Convert all images of the current project to a new image file format. * @param newFormat The new format of the images. * @param newQuality The new quality value of the images. * @return true if all images are converted to the new image format. */ bool convertImages(int newFormat, int newQuality); /** * Get the mix mode. * @return The mix mode. */ int getMixMode(); /** * Set the mix mode. * @param mode The new mix mode */ void setMixMode(int mode); /** * Get the mix count. * @return The mix count. */ int getMixCount(); /** * Set the mix count. * @param count The new mix count. */ void setMixCount(int count); /** * Get the playback count. * @return The playback count. */ int getPlaybackCount(); /** * Set the playback count. * @param count The new playback count. */ void setPlaybackCount(int count); /** * Get the overlay intensity value. * @return The overlay intensity value. */ int getOverlayIntensity(); /** * Set the overlay intensity value of the project. * @param overlay The new overlay intensity value. */ void setOverlayIntensity(int overlay); /** * Sets up the ExternalChangeMonitor to monitor the project directories * for changes in the project files. */ // Overlay slider void setupDirectoryMonitoring(); /** * Register the directory for external change monitoring. * @param directory the directory to listen for changes in. */ void addDirectoryToMonitoring(const QString &directory); /** * Remove the directory from external change monitoring. * @param directory the directory to remove. */ void removeDirectoryFromMonitoring(const QString &directory); /** * Remove all directories from external change monitoring. */ void removeAllDirectoriesFromMonitoring(); /** * Register the file for external change monitoring. * @param file the file to listen for changes in. */ void addFileToMonitoring(const QString &file); /** * Remove the file from external change monitoring. * @param file the file to remove. */ void removeFileFromMonitoring(const QString &file); /** * Remove all files from external change monitoring. */ void removeAllFilesFromMonitoring(); /** * Test function for debugging purposes */ void test(QWidget *parentWidget, int level); /** * Test function for debugging purposes */ void testMainWidget(); /** * Remove the content of the given directory. * @param path the path to te directory. * @return true if the removing was successful. */ bool removeContentInDirectory(const QString &path); /** * Create all temporary application directories (temp) */ void makeApplicationDirectories(); /** * Remove all temporary application directories (temp) */ void removeApplicationDirectories(); /** * Remove all temporary application files */ void removeApplicationFiles(); /** * */ bool isRecoveryMode(); /** * Recover the last changes after a crash. * @return true if an crashed project is recovered */ bool recoverProject(); /** * Open the start dialog */ void startDialog(); protected slots: private: QApplication *stApp; MainWindowGUI *mw; DomainFacade *domainFacade; ViewFacade *viewFacade; PreferencesTool *preferencesTool; QString appUserDirName; QString appTempDirName; QString appApplicationDirName; QString appBinDirName; QString appManualDirName; QString appTranslationsDirName; QString appGraphicsDirName; QString appIconsDirName; QString appPicturesDirName; void initializePreferences(); void setDefaultPreferences(); }; #endif qstopmotion-2.3.2-Source/src/frontends/observer.h000644 000000 000000 00000024334 13011043104 022110 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2013 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef OBSERVER_H #define OBSERVER_H #include "domain/animation/exposure.h" #include class Exposure; /** * The observer interface. All classes who wants to be notified when something * changes in the animationmodel has to implement from this class. * * The observers implemented with this class also has to be attached to the * animationmodel. * * The observer is implemented with strong use of the push model. Although this * decreases the flexibility we gain alot in efficiency which is more * important to us. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class Observer { public: virtual ~Observer() {} /************************************************************************** * Animation notification functions **************************************************************************/ /** * Abstract function for receiving notification when the model is erased. */ virtual void updateRemoveProject() = 0; /** * Abstract function for receiving notification when a new project are created. */ virtual void updateNewProject() = 0; /** * Abstract function for receiving notification when a project is opened. */ virtual void updateOpenProject() = 0; /** * Abstract function for recieving notification when a scene is to be played. * @param sceneIndex the scene to be played */ virtual void updatePlaySound(int sceneIndex) = 0; /** * Abstract function for recieving notification when a new mix mode is set. * @param newMixMode the new mix mode */ virtual void updateMixMode(int newMixMode) = 0; /** * Abstract function for recieving notification when a new mix count is set. * @param newMixCount the new mix count */ virtual void updateMixCount(int newMixCount) = 0; /** * Abstract function for recieving notification when a new live view frames * per second value is set. * @param newFps the new frames per second */ virtual void updateLiveViewFps(int newFps) = 0; /** * Abstract function for recieving notification when a new video frames * per second value is set. * @param newFps the new frames per second */ virtual void updateVideoFps(int newFps) = 0; /************************************************************************** * Scene notification functions **************************************************************************/ /** * Abstract function for recieving notification when a new scene is added * at location index. * @param index the location where the new scene is added. */ virtual void updateAddScene(int sceneIndex) = 0; /** * Abstract function for recieving notification when a new scene is inserted * at location index. * @param index the location where the new scene is inserted. */ virtual void updateInsertScene(int sceneIndex) = 0; /** * Abstract function for recieving notification when a new scene is set as the * current "active" scene. * @param sceneIndex the new active scene. */ // virtual void updateNewActiveScene(int sceneIndex) = 0; /** * Abstract function for recieving notification when a new scene is set as the * current "active" scene. */ virtual void updateActivateScene() = 0; /** * Abstract function for recieving notification when a scene is removed from * the model. * @param sceneIndex the scene which has been removed from the model. */ virtual void updateRemoveScene(int sceneIndex) = 0; /** * Abstract function for recieving notification when a scene in the animation * has been moved. * @param sceneIndex the scene which have been moved. * @param movePosition the position the scene has been moved to. */ virtual void updateMoveScene(int sceneIndex, int movePosition) = 0; /************************************************************************** * Take notification functions **************************************************************************/ /** * Abstract function for recieving notification when a new take is added * at location index. * @param sceneIndex the scene where the new take is added. * @param takeIndex the location where the new take is added. */ virtual void updateAddTake(int sceneIndex, int takeIndex) = 0; /** * Abstract function for recieving notification when a new take is inserted * at location index. * @param sceneIndex the scene where the new take is added. * @param takeIndex the location where the new take is inserted. */ virtual void updateInsertTake(int sceneIndex, int takeIndex) = 0; /** * Abstract function for recieving notification when a new take is set as the * current "active" take. * @param takeIndex the new active take. */ // virtual void updateSetNewActiveTake(int takeIndex) = 0; /** * Abstract function for recieving notification when a new take is is the * current "active" take. */ virtual void updateActivateTake() = 0; /** * Abstract function for recieving notification when a take is removed from * the model. * @param sceneIndex The scene of the take which has been removed from the model. * @param takeIndex The take which has been removed from the model. */ virtual void updateRemoveTake(int sceneIndex, int takeIndex) = 0; /************************************************************************** * Exposure notification functions **************************************************************************/ /** * Abstract function for recieving notification when a new exposure is added * at location index. * @param sceneIndex the scene of the take where the new exposure is added. * @param takeIndex the take where the new exposure is added. * @param exposureIndex the location where the new exposure is added. */ virtual void updateAddExposure(int sceneIndex, int takeIndex, int exposureIndex) = 0; /** * Abstract function for recieving notification when a new exposure is inserted * at location index. * @param sceneIndex the scene of the take where the new exposure is added. * @param takeIndex the take where the new exposure is added. * @param exposureIndex the location where the new exposure is inserted. */ virtual void updateInsertExposure(int sceneIndex, int takeIndex, int exposureIndex) = 0; /** * Function to recieve notification when one exposure are deleted. * @param sceneIndex the scene index of the selected exposure. * @param takeIndex the take index of the selected exposure. * @param exposureIndex the index of the removed exposure. */ virtual void updateRemoveExposure(int sceneIndex, int takeIndex, int exposureIndex) = 0; /** * Abstract function for recieving notification when frames are moved in the model. * @param fromFrame index of the first selected frame * @param toFrame index of the last selected frame * @param movePosition index to where the selection should be move to */ virtual void updateMoveExposures(int fromFrame, int toFrame, int movePosition) = 0; /** * Abstract function for recieving notification when a new frame are selected. * @param ExposureIndex Index of the new active exposure. */ // virtual void updateSetNewActiveExposure(int ExposureIndex) = 0; /** * Abstract function for recieving notification when a new frame are selected. * @param frameNumber the new active frame. */ virtual void updateActivateExposure() = 0; /** * Abstract function for recieving notification when the frame of an exposure has modifyed. * @param modSceneIndex The index of the scene of the modifyed exposure. * @param modTakeIndex The index of the take of the modifyed exposure. * @param modExposureIndex The index of the modifyed exposure. */ virtual void updateModifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex) = 0; }; #endif qstopmotion-2.3.2-Source/src/frontends/viewfacade.cpp000644 000000 000000 00000026264 13011043104 022716 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2015 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #include "viewfacade.h" #include ViewFacade::ViewFacade(Frontend *f) { qDebug() << "ViewFacade::Constructor --> Start"; frontend = f; qDebug() << "ViewFacade::Constructor --> End"; } ViewFacade::~ViewFacade() { frontend = NULL; } Frontend* ViewFacade::getFrontend() { return this->frontend; } DomainFacade* ViewFacade::getProject() { return this->frontend->getProject(); } void ViewFacade::attach(Observer *o) { qDebug() << "ViewFacade::attach --> Start"; if (o != NULL) { observers.append(o); } else { qDebug() << "ViewFacade::attach --> Trying to attach a NULL pointer to the ViewFacade"; } qDebug() << "ViewFacade::attach --> End"; } void ViewFacade::detatch(Observer *o) { qDebug() << "ViewFacade::detatch --> Start"; //Sequential search for the observer. Complexity: O(N/2) on the average. for (int i = 0; i < observers.size(); ++i) { if (observers[i] == o) { observers.erase(observers.begin() + i); break; } } qDebug() << "ViewFacade::detatch --> End"; } /************************************************************************** * Animation notification functions **************************************************************************/ void ViewFacade::notifyRemoveProject() { qDebug() << "ViewFacade::notifyClear --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateRemoveProject(); } qDebug() << "ViewFacade::notifyClear --> End"; } void ViewFacade::notifyNewProject() { qDebug() << "ViewFacade::notifyNewProject --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateNewProject(); } qDebug() << "ViewFacade::notifyNewProject --> End"; } void ViewFacade::notifyOpenProject() { qDebug() << "ViewFacade::notifyOpenProject --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateOpenProject(); } qDebug() << "ViewFacade::notifyOpenProject --> End"; } void ViewFacade::notifyPlaySound(int sceneIndex) { qDebug() << "ViewFacade::notifyPlaySound --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updatePlaySound(sceneIndex); } qDebug() << "ViewFacade::notifyPlaySound --> End"; } void ViewFacade::notifyNewMixMode(int newMixMode) { qDebug() << "ViewFacade::notifyNewMixMode --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateMixMode(newMixMode); } qDebug() << "ViewFacade::notifyNewMixMode --> End"; } void ViewFacade::notifyNewMixCount(int newMixCount) { qDebug() << "ViewFacade::notifyNewMixCount --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateMixCount(newMixCount); } qDebug() << "ViewFacade::notifyNewMixCount --> End"; } void ViewFacade::notifyNewLiveViewFps(int newFps) { qDebug() << "ViewFacade::notifyNewLiveViewFps --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateLiveViewFps(newFps); } qDebug() << "ViewFacade::notifyNewLiveViewFps --> End"; } void ViewFacade::notifyNewVideoFps(int newFps) { qDebug() << "ViewFacade::notifyNewVideoFps --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateVideoFps(newFps); } qDebug() << "ViewFacade::notifyNewVideoFps --> End"; } /************************************************************************** * Scene notification functions **************************************************************************/ void ViewFacade::notifyAddScene(int sceneIndex) { qDebug() << "ViewFacade::notifyNewScene --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateAddScene(sceneIndex); } qDebug() << "ViewFacade::notifyNewScene --> End"; } void ViewFacade::notifyInsertScene(int sceneIndex) { qDebug() << "ViewFacade::notifyNewScene --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateInsertScene(sceneIndex); } qDebug() << "ViewFacade::notifyNewScene --> End"; } void ViewFacade::notifyActivateScene() { qDebug() << "ViewFacade::notifyActivateScene --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateActivateScene(); } qDebug() << "ViewFacade::notifyActivateScene --> End"; } void ViewFacade::notifyRemoveScene(int sceneIndex) { qDebug() << "ViewFacade::notifyRemoveScene --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateRemoveScene(sceneIndex); } qDebug() << "ViewFacade::notifyRemoveScene --> End"; } void ViewFacade::notifyMoveScene(int sceneNumber, int movePosition) { qDebug() << "ViewFacade::notifyMoveScene --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateMoveScene(sceneNumber, movePosition); } qDebug() << "ViewFacade::notifyMoveScene --> End"; } /************************************************************************** * Take notification functions **************************************************************************/ void ViewFacade::notifyAddTake(int sceneIndex, int takeIndex) { qDebug() << "ViewFacade::notifyAddTake --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateAddTake(sceneIndex, takeIndex); } qDebug() << "ViewFacade::notifyAddTake --> End"; } void ViewFacade::notifyInsertTake(int sceneIndex, int takeIndex) { qDebug() << "ViewFacade::notifyInsertTake --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateInsertTake(sceneIndex, takeIndex); } qDebug() << "ViewFacade::notifyInsertTake --> End"; } void ViewFacade::notifyActivateTake() { qDebug() << "ViewFacade::notifyActivateTake --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateActivateTake(); } qDebug() << "ViewFacade::notifyActivateTake --> End"; } void ViewFacade::notifyRemoveTake(int sceneIndex, int takeIndex) { qDebug() << "ViewFacade::notifyRemoveTake --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateRemoveTake(sceneIndex, takeIndex); } qDebug() << "ViewFacade::notifyRemoveTake --> End"; } /************************************************************************** * Exposure notification functions **************************************************************************/ void ViewFacade::notifyAddExposure(int sceneIndex, int takeIndex, int exposureIndex) { // qDebug() << "ViewFacade::notifyAddExposure --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateAddExposure(sceneIndex, takeIndex, exposureIndex); } // qDebug() << "ViewFacade::notifyAddExposure --> End"; } void ViewFacade::notifyInsertExposure(int sceneIndex, int takeIndex, int exposureIndex) { qDebug() << "ViewFacade::notifyInsertExposure --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateInsertExposure(sceneIndex, takeIndex, exposureIndex); } qDebug() << "ViewFacade::notifyInsertExposure --> End"; } void ViewFacade::notifyActivateExposure() { qDebug() << "ViewFacade::notifyActivateExposure --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateActivateExposure(); } qDebug() << "ViewFacade::notifyActivateExposure --> End"; } void ViewFacade::notifyRemoveExposure(int sceneIndex, int takeIndex, int exposureIndex) { qDebug() << "ViewFacade::notifyRemoveExposure --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateRemoveExposure(sceneIndex, takeIndex, exposureIndex); } qDebug() << "ViewFacade::notifyRemoveExposure --> End"; } void ViewFacade::notifyMoveExposures(int fromFrame, int toFrame, int movePosition) { qDebug() << "ViewFacade::notifyMoveExposures --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateMoveExposures(fromFrame, toFrame, movePosition); } qDebug() << "ViewFacade::notifyMoveExposures --> End"; } void ViewFacade::notifyModifyExposure(int modSceneIndex, int modTakeIndex, int modExposureIndex) { qDebug() << "ViewFacade::notifyModifyExposure --> Start"; int numElem = observers.size(); for (int i = 0; i < numElem; ++i) { observers[i]->updateModifyExposure(modSceneIndex, modTakeIndex, modExposureIndex); } qDebug() << "ViewFacade::notifyModifyExposure --> End"; } qstopmotion-2.3.2-Source/src/frontends/frontend.h000644 000000 000000 00000043052 12751646113 022121 0ustar00rootroot000000 000000 /****************************************************************************** * Copyright (C) 2005-2016 by * * Bjoern Erik Nilsen (bjoern.nilsen@bjoernen.com), * * Fredrik Berg Kjoelstad (fredrikbk@hotmail.com), * * Ralf Lange (ralf.lange@longsoft.de) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ******************************************************************************/ #ifndef FRONTEND_H #define FRONTEND_H #include "domain/domainfacade.h" #include "frontends/viewfacade.h" #include "technical/preferencestool.h" #include "technical/grabber/grabberresolution.h" #include "technical/grabber/imagegrabberdevice.h" #include #include #include class PreferencesTool; class DomainFacade; class ViewFacade; class ImageGrabberDevice; /** * The frontend interface to be used by the implemented frontend. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class Frontend { public: virtual ~Frontend() {} /** * Abstract function for starting the application through the frontend. * @param argc the argc argument from the environment through main. * @param argv the argv arguments from the environment through main. * @return the return status on exit */ virtual int run(int argc, char **argv) = 0; /** * Abstract function for geting the domain facade. * @return the domain facade. */ virtual DomainFacade* getProject() = 0; /** * Abstract function for geting the view facade. * @return the view facade. */ virtual ViewFacade* getView() = 0; /** * Abstract function for geting the preferences tool. * @return the preferences tool. */ virtual PreferencesTool* getPreferences() = 0; /** * Abstract function for getting the application directory * @return the application directory name string */ virtual const QString getUserDirName() = 0; /** * Abstract function for getting the temporary directory * @return the temporary directory name string */ virtual const QString getTempDirName() = 0; /** * Abstract function for getting the application directory * @return the application directory name string */ virtual const QString getApplicationDirName() = 0; /** * Abstract function for getting the binary directory * @return the binary directory name string */ virtual const QString getBinDirName() = 0; /** * Abstract function for getting the manual directory * @return the manual directory name string */ virtual const QString getManualDirName() = 0; /** * Abstract function for getting the translations directory * @return the translations directory name string */ virtual const QString getTranslationsDirName() = 0; /** * Abstract function for getting the graphics directory * @return the graphics directory name string */ virtual const QString getGraphicsDirName() = 0; /** * Abstract function for getting the icons directory * @return the icons directory name string */ virtual const QString getIconsDirName() = 0; /** * Abstract function for getting the pictures directory * @return the pictures directory name string */ virtual const QString getPicturesDirName() = 0; /** * Abstract function for getting all possible GUI languages * @return A vector with all languages */ virtual const QVector getLanguages() = 0; /** * Abstract function for getting all possible GUI locales * @return A vector with all locales */ virtual const QVector getLocales() = 0; /** * A new language is selected in the preferences menu. * @param newIndex New selected index. */ virtual void changeLanguage(int newIndex) = 0; /** * A new capture button function is selected in the preferences menu. * @param newFunction New selected function. */ virtual void changeCaptureButtonFunction(int newFunction) = 0; /** * Get the status of the vertical lines of the grid. * @return The new state of the grid. */ virtual bool getVerticalGrid() = 0; /** * Set the status of the vertical lines of the grid. * @param newState The new state of the grid. */ virtual void setVerticalGrid(bool newState) = 0; /** * Get the number of vertical lines of the grid. * @return The new number of lines. */ virtual int getVerticalSpin() = 0; /** * Set the number of vertical lines of the grid. * @param newSpin The new number of lines. */ virtual void setVerticalSpin(int newSpin) = 0; /** * Get the status of the horizontal lines of the grid. * @return The new state of the grid. */ virtual bool getHorizontalGrid() = 0; /** * Set the status of the horizontal lines of the grid. * @param newState The new state of the grid. */ virtual void setHorizontalGrid(bool newState) = 0; /** * Get the number of horizontal lines of the grid. * @return The new number of lines. */ virtual int getHorizontalSpin() = 0; /** * Set the number of horizontal lines of the grid. * @param newSpin The new number of lines. */ virtual void setHorizontalSpin(int newSpin) = 0; /** * Get the RGB value of the color of the grid lines. * @param r The red component of the color's RGB value. * @param g The green component of the color's RGB value. * @param b The blue component of the color's RGB value. * @param a The alpha-channel component of the color's RGB value. */ virtual void getGridColorRGB(int *r, int *g, int *b, int *a) = 0; /** * Set the RGB value of the color of the grid lines. * @param r The red component of the color's RGB value. * @param g The green component of the color's RGB value. * @param b The blue component of the color's RGB value. * @param a The alpha-channel component of the color's RGB value. */ virtual void setGridColorRGB(int r, int g, int b, int a) = 0; /** * Abstract function for displaying progress on timeconsuming operations. * @param infoText the text to display to the user * @param numOperations the number of calculated operations to do */ virtual void showProgress(const QString &infoText, unsigned int numOperations = 0) = 0; /** * Abstract function for hiding the progress info. */ virtual void hideProgress() = 0; /** * Abstract function for updating the progress. * @param numOperationsDone the number of operations done */ virtual void updateProgress(int numOperationsDone) = 0; /** * Abstract function for increase the progress. */ virtual void increaseProgress() = 0; /** * Abstract function to display a message in the status bar. * @param message the message to display. * @param timeout the timeout for the message in mili-seconds. */ virtual void showMessage(const QString &message, int timeout = 0) = 0; /** * Abstract function to remove any temporary message being shown in the status bar. */ virtual void clearMessage() = 0; /** * Abstract function for changing the information to display to the user * @param infoText the text to display to the user */ virtual void setProgressInfo(const QString infoText) = 0; /** * Abstract function for changing the prozess id in the status bar * @param id the id to display in the status bar */ virtual void setProjectID(const QString id) = 0; /** * Abstract function for changing the scene id in the status bar * @param id the id to display in the status bar */ virtual void setSceneID(const QString id) = 0; /** * Abstract function for changing the take id in the status bar * @param id the id to display in the status bar */ virtual void setTakeID(const QString id) = 0; /** * Abstract function for changing the exposure id in the status bar * @param id the id to display in the status bar */ virtual void setExposureID(const QString id) = 0; /** * Abstract function for checking if the user has aborted the operation * (eg pressed cancel) * @return true if the the operation is aborted, false otherwise */ virtual bool isOperationAborted() = 0; /** * Abstract function for processing GUI events. This is useful on timeconsuming * operations which aren't running in separate processes or threads. */ virtual void processEvents() = 0; /** * Abstract function for asking the user a yes/no question. * @param title title of the message dialog * @param question the question to ask * @return 0 if the user answer yes, 1 if no */ virtual int askQuestion(const QString title, const QString &question) = 0; /** * Abstract function for informating the user. * @param title title of the message dialog * @param info the information for the user */ virtual void showInformation(const QString title, const QString &info) = 0; /** * Abstract function for warning the user. * @param title title of the message dialog * @param warning the warning for the user */ virtual void showWarning(const QString title, const QString &warning) = 0; /** * Abstract function for signaling a critical state to the user. * @param title title of the message dialog * @param message the message for the user */ virtual void showCritical(const QString title, const QString &message) = 0; /** * Abstract function to run a external command * @param command command to run * @param arguments arguments for the command * @return return value of the command */ virtual int runExternalCommand(const QString &command, const QStringList &arguments) = 0; /** * Abstract function to turns on the webcamera/video import mode. */ virtual bool startGrabber() = 0; /** * Abstract function to checks if the grabber is inited. * @return true if it is inited, false otherwise */ virtual bool isGrabberInited() = 0; /** * Abstract function to turns off the webcamera/video import mode. */ virtual void stopGrabber() = 0; /** * Abstract function to get the possible video devices. * @return Vector with the devices. */ virtual const QVector getDevices() = 0; /** * Abstract function to get one video devices. * @arg deviceIndex The index of the device. * @return The video devices. */ virtual ImageGrabberDevice *getDevice(int deviceIndex) = 0; /** * Abstract function to get the possible video device names. * @return Vector with the device names. */ virtual const QVector getDeviceNames() = 0; /** * Abstract function to get the possible resolution names * of the video device. * @arg deviceIndex The index of the device. * @return Vector with the resolution names. */ virtual const QVector getResolutionNames(int deviceIndex) = 0; /** * Abstract function to get the live image from the image grabber. * @return live image. */ virtual const QImage getLiveImage() = 0; /** * Abstract function to get the raw image from the image grabber. * @return raw image. */ virtual const QImage getRawImage() = 0; /** * Function for performing the redraw with the next frame of the animation. * @arg exposureIndex Index of the next frame */ virtual void nextAnimationFrame(int exposureIndex) = 0; /** * Register the directory for external change monitoring. * @param directory the directory to listen for changes in. */ virtual void addDirectoryToMonitoring(const QString &directory) = 0; /** * Remove the directory from external change monitoring. * @param directory the directory to remove. */ virtual void removeDirectoryFromMonitoring(const QString &directory) = 0; /** * Remove all directories from external change monitoring. */ virtual void removeAllDirectoriesFromMonitoring() = 0; /** * Register the file for external change monitoring. * @param file the file to listen for changes in. */ virtual void addFileToMonitoring(const QString &file) = 0; /** * Remove the file from external change monitoring. * @param file the file to remove. */ virtual void removeFileFromMonitoring(const QString &file) = 0; /** * Remove all files from external change monitoring. */ virtual void removeAllFilesFromMonitoring() = 0; /** * Test function for debugging purposes */ virtual void test(QWidget *parentWidget, int level) = 0; /** * Create all temporary application directories (temp, trash, packer) */ virtual void makeApplicationDirectories() = 0; /** * Remove all temporary application directories (temp, trash, packer) */ virtual void removeApplicationDirectories() = 0; /** * Remove all temporary application files */ virtual void removeApplicationFiles() = 0; /** * Set a new state to the tool bar. * @param newState the new tool bar state. */ virtual void setToolBarState(int newState) = 0; /************************************************************************** * Project preferences **************************************************************************/ /** * Get the recording mode. * @return The recording mode. */ virtual int getRecordingMode() = 0; /** * Set the recording mode. * @param mode The new recording mode. */ virtual void setRecordingMode(int mode) = 0; /** * Get the video source index. * @return video source index */ virtual int getVideoSource() = 0; /** * Set the video resolution index. * @param index Index of the new video resolution * @return true if the new index is set, false else. */ virtual bool setResolution(int index) = 0; /** * Get the video resolution index. * @return video resolution index */ virtual int getResolution() = 0; /** * Get the video resolution object. * @param index Index of the new video resolution * @return video resolution object */ virtual const GrabberResolution getResolution(int index) = 0; /** * Set the video source index. * @param index Index of the new video source * @return true if the new index is set, false else. */ virtual bool setVideoSource(int index) = 0; /** * Convert all images of the current project to a new image file format. * @param newFormat The new format of the images. * @param newQuality The new quality value of the images. * @return true if all images are converted to the new image format. */ virtual bool convertImages(int newFormat, int newQuality) = 0; /** * Get the mix mode. * @return The mix mode. */ virtual int getMixMode() = 0; /** * Set the mix mode. * @param mode The new mix mode. */ virtual void setMixMode(int mode) = 0; /** * Get the mix count. * @return The mix count. */ virtual int getMixCount() = 0; /** * Set the mix count. * @param count The new mix count. */ virtual void setMixCount(int count) = 0; /** * Get the playback count. * @return The playback count. */ virtual int getPlaybackCount() = 0; /** * Set the playback count. * @param count The new playback count. */ virtual void setPlaybackCount(int count) = 0; /** * Get the overlay intensity value. * @return The overlay intensity value. */ virtual int getOverlayIntensity() = 0; /** * Set the overlay intensity value of the project. * @param overlay The new overlay intensity value. */ virtual void setOverlayIntensity(int overlay) = 0; /************************************************************************** * Other **************************************************************************/ /** * Test function for debugging purposes */ virtual void testMainWidget() = 0; }; #endif qstopmotion-2.3.2-Source/src/qstopmotion.rc000644 000000 000000 00000000062 12536560627 021051 0ustar00rootroot000000 000000 IDR_MAINFRAME ICON DISCARDABLE "qstopmotion.ico" qstopmotion-2.3.2-Source/COPYING000644 000000 000000 00000043254 12536560627 016405 0ustar00rootroot000000 000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. qstopmotion-2.3.2-Source/translations/qt_de.qm000644 000000 000000 00001172666 12536560630 021533 0ustar00rootroot000000 000000 %>%(D֍8֍֍N֍,5E60N0u0{00H05J4 9  Dt D2+R,,v+FB+F+Lk+f8+f"~+zhg+O@+{++zh+9[+%+"+=I+++įO+į{Y+į+h4r747G^:9u+;=a@BjHTC:F0ixFn4Fn4GH/$Hw9MHw9HyI'4pIfbI J+OJ+?-J6PvJ6jJ6EJ6J6BJ6BJ6aJ6#sJ6*J6?J6JcbJ`KQƸK(mL CXLZCL6Lj<Lb>SM5Mb(MeMLM~N5NBO|iPFESPFEPFEFQ KQ7R8(R|HR̼%R8cSS8^HTzTW\Tʴ3zTJU?^ sU|:U}9V1V15VlAVCVYVsVZ0V9VEZWbWXWT0WTLWT[X~qX9\XXsX˙%X]"Y:YnY`Y-Z+``Zg`ZkZ;IZ)[;^e[=[f3d\\]4\]4o\Ϟ\$\\f9atPgclGrUNC t>|^|AZĝcga vvmX,ԱIz fE)Ch!MdW^|(4L5+.V6C4dIAJȾ[Hggɼ,\IT,kÉyXtLD DU%WEhRnDɵnnQɵn`ɵni-ɵn5ɵn1ɵn®ɵnɵn u_PI BLT5*'[nMy1-lN)*a!Mjq.ٮpT:۔: 1>He|&Bэ8,-Vɤ}c<!pW5#Qa%UT(Ŏ/)9j*4-ctk$-ct.23L5v lN+ d`y,T't#ʯӬl-e$\y#8^iourkt.eJ0qT߮޶SIZRQ2  ~S Yd $ !g)8"l%%G&Xd)b}-F/=NeZ/Xt1$5~A< p]<3'0=>L?2~?N^@EF@VB!DFRkM@NkyUiW~y]H`q*`>jtlglyzpl}&oi3vtykvty2Q.͉hN$$18l?%"A>%>(9O<4o)m,}a 666YSe^FO zNRTy=~.^- XE-\EЦ-{=8A=τ cgNNPnADDۓl[yLQt&x-nU ()qn)OmMME?ELPn wLw+6eT^ IO lڎKq0R 4ghWUR 1!e&)f*/eg*++N#,1,N6;?4ByEc9_FcIQK~FNjOZf\S~M\cpy\K`b4AbkcփTf5g&4 :jC/mn$q{^q ctuo u(J{>c}kat}-:DR>1+~ qB_0y1m8|>آK'F$ $w5?U5J+K[(gJuU,.Dʁr+^K50L\֊i~*>DžSހ.s nGC,c.YLhZ3qX;yω$daOv-KI,A|_Cn* n7^$$0zLH0=`&Hc&u,n./bl0u4r4!G 5K5>~8w ?]BMCbIxSgJKʈL@MOR.R>*XE%YM@RYML^VdKҫfчh^Ui[n^nunrrsscs w*@x3/^2G2^p"%tNۊiYat;TYNe#]*V]&I;IMIMIIItIvmI()Z QIOYOiPyPZNNO$ObN,NjIQPQQRQPuDE uDQD8o**,6v,{,,B,w',]0>>r|0N;V ._>q.ĖɘeD ˓ʇ5$B 4W8fR@gfR+G>r*)tRݨ<\U#]?_\9:NENH~,d6Q~IcXS8PqHVVDfR"/|T6KPw 6  Q Q^tKXXJ^;l(^b8 lM"o$I$ %CU&~7&>)2s)R+,53(5S 8S~8S;_?"/?>u??%ͩFuKNK-.M<7N>rO>SRvU5V|98]_]]h eg^YOkZ]y^R~{yw?Ji)5t\5t0F-\:Ξo9l8 ]QG%>8nZn n%Uصǥ)__o+_+uD)` nt9{y~[ۜ;;/'xA;rj9\:bs;UsϾ6N %fl:{pe,Li}gzܓ7ޟܳߺft~{롥`%+!I~aNm\^!ֶDD՜F !d & $~b+~b2oBMrt&z `{5!f%%?d'(z)ўғ+uO+3,8/q/[/14~66 _8<? 2JAB>N:9DnEFgG~G?VG*Gb1HULAUUM~UOrlPѧQPGRCJSnfTVbUuUmUOUT]XYĻ9xZZ@RZ@Z@Z@[[j]k*+g]QU^n_Pi_ph`uӚd`qd`e@iEiR/kQm?$oNxy;{N{u}uY}w,F}wk}w'}whsdp~sz~z~82~71ly*o r/'j=p~z~~60~5/BZvt tYd'.,.kP3P OiUJ>huɥkTm5DY~^x&t^PtMdtV7rWo?\\DS]ϐ]/tBarEe ng*.g|ld?n8PnW&p&qjtC;wqy'yz5|(^||i}wZ}$+}$j}$~9L4Dϗ/Zg~AVNjšDXSL>{]91Niq_inx-n£K<f+ E.ANͮ\·j·/Z·ý?E ׳:NF:nET~.& kn_/OfC>(u̲n"-nMe8]7tajUP7wE=ȥNv)UCONu<%52)Ts1/" e~pi~:WL\b'Ni9%׊wb8!c#G#%%%d"'a-.X .5kE =m=7~=N?}?>@J?^@T˘CtI5zEfNPVPQsA;V%I"V%JXU )HZ`1awbDbbGtuffdf̉gAJphI7i$kn,wx1 >z*2<||QR&ddJU%mU<c(.j<zMc.UR4C5<e^QQL&|mY5erًXnm? ^deԴnL\Hb†5i43Cq~ߓUIAʴ5ʴ5ʶ$ϡ$Cы#Du^ [Ӟv'Ԅ۔#QD8'N'dAdF5RF5YpZF+>f4N}&D8I?6I)As;j sY }$E qeK. ڤ# ڥ ds E EJ ys AcD Ac. n5 nH * 35u 6> R WMN `Bu bU bb= b`.I b`э d( gU i3Z kkO la lf lv ok qv( qv qzf tN uQ xq |o ~ |+  n~!  5 Ja  tC t-G  .  . =o   ) F>a K ! (  leU ^ Z q  B9 ҉ 4! M > ? U kS   j  n 5 NL  9>" V܉ & u"ί  Y+67 Y> 0^ KQ  @z 팤6 E;w l~`k %' MN3@ 7} R  /= CM0 q = q:  D^ c }خ 9/ ov ĄQ 2  T $\ )d */; .>4 5 74"l 7u ;v n B Bnk; FR Gݞ3P H j IF. J" K2؇ Rۮx RE Ty c T^ ν Ja $k $1!  %pb2 ,8Y ,! =l c  $H8 | N4.< t< nr] o^ `VD Sd nd Bv p z B= vbJ ȯ' t $q lby p z˦ ˔=z }pq P]z P CF NY ~ton . 68 ( >>(a  v" :h3 f : f $3 O 4dq ( .<(  *T s= s' ~ AAG 9 1%  9 05 rBA  m,G 5) ݡG !% #-tW ' . 0Nc 5 5\3 Ay CU< E9DA I< L L] L Mc\ Oa P..y R Sf Vl W ZW \Ot ]$p ` c f); f)$ f= io> jJU l#] lud m`U* n|n0 wC xR: yr {nS }Qi% ~L&s > . PK H9 H" a  nj СF $&t .@e  K iZ <TH b ӱ P/ |  l zdq F % J> J(+  ` c t.} k) ӇP  M N7 N>u# /= ̺= &~  Nt -D> .y x ۷ r^ k- k< } U)S T>V <S lt 3# i 0X# :   $r^ է ~ z+  D  Qi  I61 + 9N % L1 sZ . xHX  I "  !p $ j %6b! )ΕV .g 2M 7F =ю*3 >HR >I >K >X >n >z[ > > >t >Z ?t| A^ B~I$ DT5 Fn! G) If J> L Mb` P@ QT: RV.w RV] RV RnΌ S.v SG S T~R YU Y [ \ eN hۮ5 j7o m( pg sL!0 uGZ vQu G Bj  To0 T TÒ T= ݰ k r6  c 6k 6 /.7 ,) ,2 S: )d T R^ x .o .au .< . .Ƈ . .  s >V j .c a PJ ySI + z e.f x2 C ' N/ +8  hN-I ɾd& ɾd(p e8 ̈́^| > ҂2 Ӵ(W ء ߢ.G  >z %m u t s X |2 & b# L Xt_q np 9 )9 t   a}c a .T D :bS UqT ^ 7 ʜe fK f7 f5 $M >Or .  " $0n  ' #$# #= %n1 '. (I$k (N< +>i +kd 0E& 644 ;ɾ Cn# Fga K9N Lc PtX Pt R"y S,cG T> `K۬ cs dB fe* fe g  g7 hQ$0, iFCDa i* iE jN j& jӮY kGn` l" m9 m9* n s'~; uY uf] u| v * v&L v{ w+M wj w4 w}+ w}jd w}Ȅ yn |[ E ug A? M < j JZ b  | ^> %  .J  $L }xO R %7y P ' xN "[8 U/ ɰeW F[A N XA] b Y* & 3 x? DB , +5C  t5 t5 hO  ?0 >a   )5 R T$R։;Pw>Y @aT`Y-*Q6<;n?pgTa>J !a"&-z*^*+g/E_/E4Qt%p7SIENI.I_T2KfNVOOS5XRuXHZov[ [ a.(a.;a%"Qgcm|i%nyG sW)Dv6v<vɅHy$ y?.H%~V%JZ>n4eH)=4}NlN934^H'd4y,~DSn,ENV0^5Ǘ]=U:q.Z57DB\75L3Ӯ`wӮ`sӮ`DA֒ " 6gr|FݖmU[yt4^YrF%jj .  J .} < &GA lDn0:q"#@$UG2%4-%41'* l,--vk0i)TG0U1c2wTSDVF74XGHFJdUJ+KrL$.RWR[{+h\@&c5,c5cªg3iCyiT-lp;qiiv)yCWG{`{~aRM6$fY53V4A&&D $t9){#X`n4Y$[G>)n=%ͣ[x=N't5>bN Eգ"~gdLr`Cry-1Hkyd֠U& "'T044Ln] > wBPt?t2ddUiSchlieen Close Tab CloseButtonFake error ! Fake error ! FakeReplyUngltige URL Invalid URL FakeReplyber %1About %1MAC_APPLICATION_MENU%1 ausblendenHide %1MAC_APPLICATION_MENU"Andere ausblenden Hide OthersMAC_APPLICATION_MENU Einstellungen...Preferences...MAC_APPLICATION_MENU%1 beendenQuit %1MAC_APPLICATION_MENUDiensteServicesMAC_APPLICATION_MENUAlle anzeigenShow AllMAC_APPLICATION_MENUEingabehilfen AccessibilityPhonon::Kommunikation CommunicationPhonon:: SpieleGamesPhonon:: MusikMusicPhonon::$Benachrichtigungen NotificationsPhonon:: VideoVideoPhonon:: <html>Es wird zum Audiogert <b>%1</b> geschaltet, <br/>da es hher priorisiert ist oder spezifisch fr diesen Stream konfiguriert wurde.</html>Switching to the audio playback device %1
which has higher preference or is specifically configured for this stream.Phonon::AudioOutput<html>Das Audiogert <b>%1</b> wurde aktiviert,<br/>da es gerade verfgbar und hher priorisiert ist.</html>xSwitching to the audio playback device %1
which just became available and has higher preference.Phonon::AudioOutput<html>Das Audiogert <b>%1</b> funktioniert nicht.<br/>Es wird stattdessen <b>%2</b> verwendet.</html>^The audio playback device %1 does not work.
Falling back to %2.Phonon::AudioOutput:Zurckschalten zum Gert '%1'Revert back to device '%1'Phonon::AudioOutputAchtung: Die grundlegenden GStreamer-Plugins sind nicht installiert. Die Audio- und Video-Untersttzung steht nicht zur Verfgung.~Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabledPhonon::Gstreamer::BackendAchtung: Das Paket gstreamer0.10-plugins-good ist nicht installiert. Einige Video-Funktionen stehen nicht zur Verfgung.Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled.Phonon::Gstreamer::BackendEs sind nicht alle erforderlichen Codecs installiert. Um diesen Inhalt abzuspielen, muss der folgende Codec installiert werden: %0`A required codec is missing. You need to install the following codec(s) to play this content: %0Phonon::Gstreamer::MediaObject`Das Abspielen konnte nicht gestartet werden. Bitte berprfen Sie Ihre GStreamer-Installation und stellen Sie sicher, dass das Paket libgstreamer-plugins-base installiert ist.wCannot start playback. Check your GStreamer installation and make sure you have libgstreamer-plugins-base installed.Phonon::Gstreamer::MediaObject\Die Medienquelle konnte nicht gefunden werden.Could not decode media source.Phonon::Gstreamer::MediaObject\Die Medienquelle konnte nicht gefunden werden.Could not locate media source.Phonon::Gstreamer::MediaObjectDas Audiogert konnte nicht geffnet werden, da es bereits in Benutzung ist.:Could not open audio device. The device is already in use.Phonon::Gstreamer::MediaObject\Die Medienquelle konnte nicht geffnet werden.Could not open media source.Phonon::Gstreamer::MediaObject@Ungltiger Typ der Medienquelle.Invalid source type.Phonon::Gstreamer::MediaObjectVDer Skript-Hilfsassistent des Codecs fehlt.&Missing codec helper script assistant.Phonon::Gstreamer::MediaObjectzDie Installation des Codec-Plugins ist fehlgeschlagen fr: %0.Plugin codec installation failed for codec: %0Phonon::Gstreamer::MediaObject$Zugriff verweigert Access denied Phonon::MMF"Existiert bereitsAlready exists Phonon::MMFAudio-Ausgabe Audio Output Phonon::MMFxAudio- oder Videokomponenten konnten nicht abgespielt werden-Audio or video components could not be played Phonon::MMF0Fehler bei Audio-AusgabeAudio output error Phonon::MMFZEs konnte keine Verbindung hergestellt werdenCould not connect Phonon::MMFDRM-Fehler DRM error Phonon::MMF"Fehler im Decoder Decoder error Phonon::MMFGetrennt Disconnected Phonon::MMF*Bereits in VerwendungIn use Phonon::MMF.Unzureichende BandweiteInsufficient bandwidth Phonon::MMFUngltige URL Invalid URL Phonon::MMF(Ungltiges ProtokollInvalid protocol Phonon::MMF Multicast-FehlerMulticast error Phonon::MMF\Fehler bei der Kommunikation ber das NetzwerkNetwork communication error Phonon::MMF0Netzwerk nicht verfgbarNetwork unavailable Phonon::MMFKein FehlerNo error Phonon::MMFNicht gefunden Not found Phonon::MMFNicht bereit Not ready Phonon::MMF"Nicht untersttzt Not supported Phonon::MMFFEs ist kein Speicher mehr verfgbar Out of memory Phonon::MMFberlaufOverflow Phonon::MMFBPfad konnte nicht gefunden werdenPath not found Phonon::MMF$Zugriff verweigertPermission denied Phonon::MMFJFehler bei Proxy-Server-KommunikationProxy server error Phonon::MMF<Proxy-Server nicht untersttztProxy server not supported Phonon::MMFServer alert Server alert Phonon::MMF6Streaming nicht untersttztStreaming not supported Phonon::MMF$Audio-AusgabegertThe audio output device Phonon::MMFUnterlauf Underflow Phonon::MMF.Unbekannter Fehler (%1)Unknown error (%1) Phonon::MMF0Fehler bei Video-AusgabeVideo output error Phonon::MMF(Fehler beim DownloadDownload error Phonon::MMF::AbstractMediaPlayerHDer URL konnte nicht geffnet werdenError opening URL Phonon::MMF::AbstractMediaPlayerLDie Datei konnte nicht geffnet werdenError opening file Phonon::MMF::AbstractMediaPlayerTDie Ressource konnte nicht geffnet werdenError opening resource Phonon::MMF::AbstractMediaPlayerDie Quelle konnte nicht geffnet werden: Ressource nicht geffnet)Error opening source: resource not opened Phonon::MMF::AbstractMediaPlayerLDas Laden des Clips ist fehlgeschlagenLoading clip failed Phonon::MMF::AbstractMediaPlayer^Das Abspielen ist im Grundzustand nicht mglichNot ready to play Phonon::MMF::AbstractMediaPlayer"Abspielen beendetPlayback complete Phonon::MMF::AbstractMediaPlayer\Die Lautstrke konnte nicht eingestellt werdenSetting volume failed Phonon::MMF::AbstractMediaPlayerRDie Position konnte nicht bestimmt werdenGetting position failed Phonon::MMF::AbstractVideoPlayerJDer Clip konnte nicht geffnet werdenOpening clip failed Phonon::MMF::AbstractVideoPlayer2Fehler bei Pause-Funktion Pause failed Phonon::MMF::AbstractVideoPlayer8Suchoperation fehlgeschlagen Seek failed Phonon::MMF::AbstractVideoPlayer %1 Hz%1 HzPhonon::MMF::AudioEqualizerRDie Position konnte nicht bestimmt werdenGetting position failedPhonon::MMF::AudioPlayer8Fehler bei der Video-AnzeigeVideo display errorPhonon::MMF::DsaVideoPlayerAktiviertEnabledPhonon::MMF::EffectFactoryDHochfrequenz-Abklingverhltnis (%)Decay HF ratio (%) Phonon::MMF::EnvironmentalReverb Abklingzeit (ms)Decay time (ms) Phonon::MMF::EnvironmentalReverbDichte (%) Density (%) Phonon::MMF::EnvironmentalReverbDiffusion (%) Diffusion (%) Phonon::MMF::EnvironmentalReverb4Verzgerung des Echos (ms)Reflections delay (ms) Phonon::MMF::EnvironmentalReverb*Strke des Echos (mB)Reflections level (mB) Phonon::MMF::EnvironmentalReverb<Verzgerung des Nachhalls (ms)Reverb delay (ms) Phonon::MMF::EnvironmentalReverb2Strke des Nachhalls (mB)Reverb level (mB) Phonon::MMF::EnvironmentalReverb8Hochfrequenz-Pegel des Raums Room HF level Phonon::MMF::EnvironmentalReverb(Pegel des Raums (mB)Room level (mB) Phonon::MMF::EnvironmentalReverbDie Quelle konnte nicht geffnet werden: Der Medientyp konnte nicht bestimmt werden8Error opening source: media type could not be determinedPhonon::MMF::MediaObjectDie Quelle konnte nicht geffnet werden: Die Ressource ist komprimiert,Error opening source: resource is compressedPhonon::MMF::MediaObjectxDie Quelle konnte nicht geffnet werden: Ungltige Ressource(Error opening source: resource not validPhonon::MMF::MediaObjectDie Quelle konnte nicht geffnet werden: Dieser Typ wird nicht untersttzt(Error opening source: type not supportedPhonon::MMF::MediaObjectDer angeforderte Internetzugriffspunkt konnte nicht gesetzt werdenFailed to set requested IAPPhonon::MMF::MediaObjectStrke (%) Level (%)Phonon::MMF::StereoWidening8Fehler bei der Video-AnzeigeVideo display errorPhonon::MMF::SurfaceVideoPlayerStummschaltungMutedPhonon::VolumeSliderMit diesem Regler stellen Sie die Lautstrke ein. Die Position links entspricht 0%; die Position rechts entspricht %1%WUse this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%Phonon::VolumeSliderLautstrke: %1% Volume: %1%Phonon::VolumeSlider6%1, %2 sind nicht definiert%1, %2 not definedQ3Accel\Mehrdeutige %1 knnen nicht verarbeitet werdenAmbiguous %1 not handledQ3AccelLschenDelete Q3DataTable FalschFalse Q3DataTableEinfgenInsert Q3DataTableWahrTrue Q3DataTableAktualisierenUpdate Q3DataTable%1 Datei kann nicht gefunden werden. berprfen Sie Pfad und Dateinamen.+%1 File not found. Check path and filename. Q3FileDialog&Lschen&Delete Q3FileDialog &Nein&No Q3FileDialog&OK&OK Q3FileDialog&ffnen&Open Q3FileDialog&Umbenennen&Rename Q3FileDialogS&peichern&Save Q3FileDialog&Unsortiert &Unsorted Q3FileDialog&Ja&Yes Q3FileDialogv<qt>Sind Sie sicher, dass Sie %1 "%2" lschen mchten?</qt>1Are you sure you wish to delete %1 "%2"? Q3FileDialog Alle Dateien (*) All Files (*) Q3FileDialog$Alle Dateien (*.*)All Files (*.*) Q3FileDialogAttribute Attributes Q3FileDialog ZurckBack Q3FileDialogAbbrechenCancel Q3FileDialog>Datei kopieren oder verschiebenCopy or Move a File Q3FileDialog,Neuen Ordner erstellenCreate New Folder Q3FileDialog DatumDate Q3FileDialog%1 lschen Delete %1 Q3FileDialogAusfhrlich Detail View Q3FileDialogVerzeichnisDir Q3FileDialogVerzeichnisse Directories Q3FileDialogVerzeichnis: Directory: Q3FileDialog FehlerError Q3FileDialog DateiFile Q3FileDialogDatei&name: File &name: Q3FileDialogDatei&typ: File &type: Q3FileDialog$Verzeichnis suchenFind Directory Q3FileDialogGesperrt Inaccessible Q3FileDialog Liste List View Q3FileDialogSu&chen in: Look &in: Q3FileDialogNameName Q3FileDialog"Neues Verzeichnis New Folder Q3FileDialog(Neues Verzeichnis %1 New Folder %1 Q3FileDialog&Neues Verzeichnis 1 New Folder 1 Q3FileDialog,Ein Verzeichnis zurckOne directory up Q3FileDialog ffnenOpen Q3FileDialog ffnenOpen  Q3FileDialog4Vorschau des Datei-InhaltsPreview File Contents Q3FileDialog@Vorschau der Datei-InformationenPreview File Info Q3FileDialogErne&ut ladenR&eload Q3FileDialogNur Lesen Read-only Q3FileDialogLesen/Schreiben Read-write Q3FileDialogLesen: %1Read: %1 Q3FileDialogSpeichern unterSave As Q3FileDialog4Whlen Sie ein VerzeichnisSelect a Directory Q3FileDialog8&Versteckte Dateien anzeigenShow &hidden files Q3FileDialog GreSize Q3FileDialogSortierenSort Q3FileDialog*Nach &Datum sortieren Sort by &Date Q3FileDialog*Nach &Namen sortieren Sort by &Name Q3FileDialog*Nach &Gre sortieren Sort by &Size Q3FileDialogSpezialattributSpecial Q3FileDialog6Verknpfung mit VerzeichnisSymlink to Directory Q3FileDialog*Verknpfung mit DateiSymlink to File Q3FileDialog8Verknpfung mit SpezialdateiSymlink to Special Q3FileDialogTypType Q3FileDialogNur Schreiben Write-only Q3FileDialogSchreiben: %1 Write: %1 Q3FileDialogdas Verzeichnis the directory Q3FileDialogdie Dateithe file Q3FileDialogdie Verknpfung the symlink Q3FileDialogJKonnte Verzeichnis nicht erstellen %1Could not create directory %1 Q3LocalFs@Konnte nicht geffnet werden: %1Could not open %1 Q3LocalFsBKonnte Verzeichnis nicht lesen %1Could not read directory %1 Q3LocalFs\Konnte Datei oder Verzeichnis nicht lschen %1%Could not remove file or directory %1 Q3LocalFsRKonnte nicht umbenannt werden: %1 nach %2Could not rename %1 to %2 Q3LocalFsFKonnte nicht geschrieben werden: %1Could not write %1 Q3LocalFsAnpassen... Customize... Q3MainWindowAusrichtenLine up Q3MainWindowBOperation von Benutzer angehaltenOperation stopped by the userQ3NetworkProtocolAbbrechenCancelQ3ProgressDialogAnwendenApply Q3TabDialogAbbrechenCancel Q3TabDialog VoreinstellungenDefaults Q3TabDialog HilfeHelp Q3TabDialogOKOK Q3TabDialog&Kopieren&Copy Q3TextEditEinf&gen&Paste Q3TextEdit"Wieder&herstellen&Redo Q3TextEdit&Rckgngig&Undo Q3TextEditLschenClear Q3TextEdit&AusschneidenCu&t Q3TextEditAlles auswhlen Select All Q3TextEditSchlieenClose Q3TitleBar(Schliet das FensterCloses the window Q3TitleBarVEnthlt Befehle zum ndern der Fenstergre*Contains commands to manipulate the window Q3TitleBarvZeigt den Namen des Fensters und enthlt Befehle zum ndernFDisplays the name of the window and contains controls to manipulate it Q3TitleBarVollbildmodusMakes the window full screen Q3TitleBarMaximierenMaximize Q3TitleBarMinimierenMinimize Q3TitleBar*Minimiert das FensterMoves the window out of the way Q3TitleBarRStellt ein maximiertes Fenster wieder her&Puts a maximized window back to normal Q3TitleBarRStellt ein minimiertes Fenster wieder her&Puts a minimized window back to normal Q3TitleBar Wiederherstellen Restore down Q3TitleBar Wiederherstellen Restore up Q3TitleBar SystemSystem Q3TitleBarMehr...More... Q3ToolBar(unbekannt) (unknown) Q3UrlOperatorDas Protokoll `%1' untersttzt nicht das Kopieren oder Verschieben von Dateien oder VerzeichnissenIThe protocol `%1' does not support copying or moving files or directories Q3UrlOperatorDas Protokoll `%1' untersttzt nicht das Anlegen neuer Verzeichnisse;The protocol `%1' does not support creating new directories Q3UrlOperatortDas Protokoll `%1' untersttzt nicht das Laden von Dateien0The protocol `%1' does not support getting files Q3UrlOperatorDas Protokoll `%1' untersttzt nicht das Auflisten von Verzeichnissen6The protocol `%1' does not support listing directories Q3UrlOperator|Das Protokoll `%1' untersttzt nicht das Speichern von Dateien0The protocol `%1' does not support putting files Q3UrlOperatorDas Protokoll `%1' untersttzt nicht das Lschen von Dateien oder Verzeichnissen@The protocol `%1' does not support removing files or directories Q3UrlOperatorDas Protokoll `%1' untersttzt nicht das Umbenennen von Dateien oder Verzeichnissen@The protocol `%1' does not support renaming files or directories Q3UrlOperatorRDas Protokoll `%1' wird nicht untersttzt"The protocol `%1' is not supported Q3UrlOperator&Abbrechen&CancelQ3WizardAb&schlieen&FinishQ3Wizard &Hilfe&HelpQ3Wizard&Weiter >&Next >Q3Wizard< &Zurck< &BackQ3Wizard*Verbindung verweigertConnection refusedQAbstractSockethDas Zeitlimit fr die Verbindung wurde berschrittenConnection timed outQAbstractSocketHRechner konnte nicht gefunden werdenHost not foundQAbstractSocketBDas Netzwerk ist nicht erreichbarNetwork unreachableQAbstractSocketZDiese Socket-Operation wird nicht untersttzt$Operation on socket is not supportedQAbstractSocketNicht verbundenSocket is not connectedQAbstractSocketfDas Zeitlimit fr die Operation wurde berschrittenSocket operation timed outQAbstractSocket &Alles auswhlen &Select AllQAbstractSpinBox&Inkrementieren&Step upQAbstractSpinBox&Dekrementieren Step &downQAbstractSpinBoxDrckenPressQAccessibleButtonAktivierenActivate QApplicationPAktiviert das Hauptfenster der Anwendung#Activates the program's main window QApplicationDie Anwendung '%1' bentigt Qt %2; es wurde aber Qt %3 gefunden.,Executable '%1' requires Qt %2, found Qt %3. QApplicationDDie Qt-Bibliothek ist inkompatibelIncompatible Qt Library Error QApplicationLTRQT_LAYOUT_DIRECTION QApplication&Abbrechen&Cancel QAxSelectCOM-&Objekt: COM &Object: QAxSelectOKOK QAxSelect2ActiveX-Element auswhlenSelect ActiveX Control QAxSelectAnkreuzenCheck QCheckBoxUmschaltenToggle QCheckBoxLschenUncheck QCheckBoxRZu benutzerdefinierten Farben &hinzufgen&Add to Custom Colors QColorDialogGrundfar&ben &Basic colors QColorDialog4&Benutzerdefinierte Farben&Custom colors QColorDialog &Grn:&Green: QColorDialog &Rot:&Red: QColorDialog&Sttigung:&Sat: QColorDialog&Helligkeit:&Val: QColorDialogA&lphakanal:A&lpha channel: QColorDialog Bla&u:Bl&ue: QColorDialogFarb&ton:Hu&e: QColorDialogFarbauswahl Select Color QColorDialogSchlieenClose QComboBox FalschFalse QComboBox ffnenOpen QComboBoxWahrTrue QComboBox*%1: existiert bereits%1: already existsQCoreApplication$%1: Nicht existent%1: does not existQCoreApplicationD%1: ftok-Aufruf ist fehlgeschlagen%1: ftok failedQCoreApplicationH%1: Ungltige Schlsselangabe (leer)%1: key is emptyQCoreApplicationF%1: Keine Ressourcen mehr verfgbar%1: out of resourcesQCoreApplication,%1: Zugriff verweigert%1: permission deniedQCoreApplicationR%1: Es kann kein Schlssel erzeugt werden%1: unable to make keyQCoreApplication2%1: Unbekannter Fehler %2%1: unknown error %2QCoreApplicationDie Transaktion kann nicht durchgefhrt werden (Operation 'commit' fehlgeschlagen)Unable to commit transaction QDB2DriverREs kann keine Verbindung aufgebaut werdenUnable to connect QDB2DriverDie Transaktion kann nicht rckgngig gemacht werden (Operation 'rollback' fehlgeschlagen)Unable to rollback transaction QDB2DriverP'autocommit' kann nicht aktiviert werdenUnable to set autocommit QDB2DriverNDie Variable kann nicht gebunden werdenUnable to bind variable QDB2ResultNDer Befehl kann nicht ausgefhrt werdenUnable to execute statement QDB2Result\Der erste Datensatz kann nicht abgeholt werdenUnable to fetch first QDB2Result`Der nchste Datensatz kann nicht abgeholt werdenUnable to fetch next QDB2ResultVDer Datensatz %1 kann nicht abgeholt werdenUnable to fetch record %1 QDB2ResultTDer Befehl kann nicht initialisiert werdenUnable to prepare statement QDB2ResultAMAM QDateTimeEditPMPM QDateTimeEditamam QDateTimeEditpmpm QDateTimeEditBDie Klasse Animation ist abstraktAnimation is an abstract classQDeclarativeAbstractAnimationDie Eigenschaft "%1" existiert nicht und kann daher nicht animiert werden)Cannot animate non-existent property "%1"QDeclarativeAbstractAnimationDie Eigenschaft "%1" ist schreibgeschtzt und kann daher nicht animiert werden&Cannot animate read-only property "%1"QDeclarativeAbstractAnimationREs kann keine Zeitdauer <0 gesetzt werdenCannot set a duration of < 0QDeclarativeAnchorAnimationEin Baseline-Anker darf nicht zusammen mit weiteren Ankerangaben fr oben, unten und vertikal zentriert verwendet werden.SBaseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.QDeclarativeAnchorsEs kann kein Anker zu einer horizontalen oder vertikalen Kante angegeben werden.3Cannot anchor a horizontal edge to a vertical edge.QDeclarativeAnchorsVertikale und horizontale Kanten knnen nicht mit Ankern verbunden werden.3Cannot anchor a vertical edge to a horizontal edge.QDeclarativeAnchorsfEin Element kann keinen Anker zu sich selbst haben.Cannot anchor item to self.QDeclarativeAnchorstEs kann kein Anker zu einem Null-Element angegeben werden.Cannot anchor to a null item.QDeclarativeAnchorsDas Ziel eines Anker muss ein Elternelement oder Element der gleichen Ebene sein.8Cannot anchor to an item that isn't a parent or sibling.QDeclarativeAnchorsAnkerangaben fr links, rechts und horizontal zentriert drfen nicht zusammen auftreten.0Cannot specify left, right, and hcenter anchors.QDeclarativeAnchorsAnkerangaben fr oben, unten und vertikal zentriert drfen nicht zusammen auftreten.0Cannot specify top, bottom, and vcenter anchors.QDeclarativeAnchorsBei der Operation 'centerIn' wurde eine potentielle Endlosschleife der Anker festgestellt.*Possible anchor loop detected on centerIn.QDeclarativeAnchorsBei der Flloperation wurde eine potentielle Endlosschleife der Anker festgestellt.&Possible anchor loop detected on fill.QDeclarativeAnchorsBei einem horizontalen Anker wurde eine potentielle Endlosschleife der Anker festgestellt.3Possible anchor loop detected on horizontal anchor.QDeclarativeAnchorsBei einem vertikalen Anker wurde eine potentielle Endlosschleife der Anker festgestellt.1Possible anchor loop detected on vertical anchor.QDeclarativeAnchorsDiese Version der Qt-Bibliothek wurde ohne Untersttzung fr die Klasse QMovie erstellt'Qt was built without support for QMovieQDeclarativeAnimatedImageN'Application' ist eine abstrakte Klasse Application is an abstract classQDeclarativeApplicationDie zu einem Behavior-Element gehrende Animation kann nicht gendert werden.3Cannot change the animation assigned to a Behavior.QDeclarativeBehaviorBei der fr die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt'Binding loop detected for property "%1"QDeclarativeBindingBei der fr die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt'Binding loop detected for property "%1"QDeclarativeCompiledBindingsT"%1" kann nicht auf "%2" angewandt werden"%1" cannot operate on "%2"QDeclarativeCompilerz"%1.%2" ist in dieser Version der Komponente nicht verfgbar 5"%1.%2" is not available due to component versioning.QDeclarativeCompilerP"%1.%2" ist in %3 %4.%5 nicht verfgbar.%"%1.%2" is not available in %3 %4.%5.QDeclarativeCompilerrDie Alias-Eigenschaft berschreitet die Grenzen des Alias#Alias property exceeds alias boundsQDeclarativeCompilerAn dieser Stelle knnen keine Eigenschaften des Typs 'attached' verwendet werden'Attached properties cannot be used hereQDeclarativeCompilerlListen kann nur eine einzige Bindung zugewiesen werden$Can only assign one binding to listsQDeclarativeCompilerBei einer Eigenschaft, die Teil einer Gruppierung ist, ist keine direkte Wertzuweisung zulssig4Cannot assign a value directly to a grouped propertyQDeclarativeCompilerEinem Signal knnen keine Werte zugewiesen werden (es wird ein Skript erwartet)@Cannot assign a value to a signal (expecting a script to be run)QDeclarativeCompilerEine Zuweisung mehrerer Werte an eine Skript-Eigenschaft ist nicht zulssig2Cannot assign multiple values to a script propertyQDeclarativeCompilerEine Zuweisung mehrerer Werte an eine einfache Eigenschaft ist nicht zulssig4Cannot assign multiple values to a singular propertyQDeclarativeCompilerhZuweisung eines Objekts an eine Liste nicht zulssigCannot assign object to listQDeclarativeCompilertZuweisung eines Objekts an eine Eigenschaft nicht zulssig Cannot assign object to propertyQDeclarativeCompilerZuweisung eines einfachen Werts (primitive) an eine Liste nicht zulssig!Cannot assign primitives to listsQDeclarativeCompilerEs kann keine Zuweisung erfolgen, da keine Vorgabe-Eigenschaft existiert.Cannot assign to non-existent default propertyQDeclarativeCompilerEs kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens '%1" existiert+Cannot assign to non-existent property "%1"QDeclarativeCompilerhEs kann keine leere Komponentenangabe erzeugt werden+Cannot create empty component specificationQDeclarativeCompilerEine als 'FINAL' ausgewiesene Eigenschaft kann nicht berschrieben werdenCannot override FINAL propertyQDeclarativeCompilerKomponenten drfen auer id keine weiteren Eigenschaften enthalten;Component elements may not contain properties other than idQDeclarativeCompilerzKomponentenobjekte knnen keine neuen Funktionen deklarieren./Component objects cannot declare new functions.QDeclarativeCompilerKomponentenobjekte knnen keine neuen Eigenschaften deklarieren.0Component objects cannot declare new properties.QDeclarativeCompilertKomponentenobjekte knnen keine neuen Signale deklarieren.-Component objects cannot declare new signals.QDeclarativeCompilerXMehrfaches Auftreten der Vorgabe-EigenschaftDuplicate default propertyQDeclarativeCompilerRMehrfaches Auftreten eines MethodennamensDuplicate method nameQDeclarativeCompilerZMehrfaches Auftreten eines EigenschaftsnamensDuplicate property nameQDeclarativeCompilerNMehrfaches Auftreten eines SignalnamensDuplicate signal nameQDeclarativeCompilerLDas Element kann nicht erzeugt werden.Element is not creatable.QDeclarativeCompiler6Leere EigenschaftszuweisungEmpty property assignmentQDeclarativeCompiler*Leere SignalzuweisungEmpty signal assignmentQDeclarativeCompilerzDer Id-Wert berdeckt eine globale Eigenschaft aus JavaScript-ID illegally masks global JavaScript propertyQDeclarativeCompilernId-Werte drfen nicht mit einem Grobuchstaben beginnen)IDs cannot start with an uppercase letterQDeclarativeCompilertId-Werte drfen nur Buchstaben oder Unterstriche enthalten7IDs must contain only letters, numbers, and underscoresQDeclarativeCompiler|Id-Werte mssen mit einem Buchstaben oder Unterstrich beginnen*IDs must start with a letter or underscoreQDeclarativeCompiler6Ungltiger Name fr MethodeIllegal method nameQDeclarativeCompiler>Ungltiger Name der EigenschaftIllegal property nameQDeclarativeCompiler4Ungltiger Name fr SignalIllegal signal nameQDeclarativeCompilerXAngegebene Signalzuweisung ist nicht korrekt'Incorrectly specified signal assignmentQDeclarativeCompilerVUngltige Quellangabe bei Alias-EigenschaftInvalid alias locationQDeclarativeCompilerUngltige Alias-Referenz. Eine Alias-Referenz muss in der Form <id>, <id>.<property> or <id>.<value property>.<property> angegeben werdenzInvalid alias reference. An alias reference must be specified as , . or ..QDeclarativeCompilerUngltige Referenzierung einer Alias-Eigenschaft. Der Id-Wert "%1" konnte nicht gefunden werden/Invalid alias reference. Unable to find id "%1"QDeclarativeCompilerLUngltige Zuweisung des Bezugselements"Invalid attached object assignmentQDeclarativeCompiler<Inhalt der Komponente ungltig$Invalid component body specificationQDeclarativeCompilerDUngltige Komponentenspezifikation"Invalid component id specificationQDeclarativeCompiler6Ungltiger (leerer) Id-WertInvalid empty IDQDeclarativeCompiler^Falsche Gruppierung bei Zugriff auf EigenschaftInvalid grouped property accessQDeclarativeCompiler|Ungltige Zuweisung bei Eigenschaft: "%1" ist schreibgeschtzt9Invalid property assignment: "%1" is a read-only propertyQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird ein dreidimensionaler Vektor erwartet/Invalid property assignment: 3D vector expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird ein boolescher Wert erwartet-Invalid property assignment: boolean expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird eine Farbspezifikation erwartet+Invalid property assignment: color expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird eine Datumsangabe erwartet*Invalid property assignment: date expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird eine Datumsangabe erwartet.Invalid property assignment: datetime expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird ein Ganzzahlwert erwartet)Invalid property assignment: int expectedQDeclarativeCompiler~Ungltige Zuweisung bei Eigenschaft: Es wird eine Zahl erwartet,Invalid property assignment: number expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird eine Koordinatenangabe fr einen Punkt erwartet+Invalid property assignment: point expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es werden Parameter fr ein Rechteck erwartet*Invalid property assignment: rect expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird ein Skript erwartet,Invalid property assignment: script expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird eine Grenangabe erwartet*Invalid property assignment: size expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird eine Zeichenkette erwartet,Invalid property assignment: string expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird eine Zeitangabe erwartet*Invalid property assignment: time expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Unbekannter Aufzhlungswert0Invalid property assignment: unknown enumerationQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Es wird eine vorzeichenloser Ganzzahlwert erwartet2Invalid property assignment: unsigned int expectedQDeclarativeCompilerUngltige Zuweisung bei Eigenschaft: Der Typ "%1" ist nicht untersttzt2Invalid property assignment: unsupported type "%1"QDeclarativeCompiler|Ungltige Zuweisung bei Eigenschaft: Es wird eine URL erwartet)Invalid property assignment: url expectedQDeclarativeCompilerPUngltige Schachtelung von EigenschaftenInvalid property nestingQDeclarativeCompiler<Ungltiger Typ der EigenschaftInvalid property typeQDeclarativeCompilerLUngltige Verwendung von EigenschaftenInvalid property useQDeclarativeCompilerhUngltige Verwendung einer Eigenschaft des Typs 'Id'Invalid use of id propertyQDeclarativeCompilerLUngltige Verwendung eines NamensraumsInvalid use of namespaceQDeclarativeCompilerxMethodennamen drfen nicht mit einem Grobuchstaben beginnen3Method names cannot begin with an upper case letterQDeclarativeCompilerDAlias-Eigenschaft ohne QuellangabeNo property alias locationQDeclarativeCompilerfEs existiert kein Bezugselement fr die EigenschaftNon-existent attached objectQDeclarativeCompilerpKein gltiger Name einer Eigenschaft des Typs 'attached'Not an attached property nameQDeclarativeCompilerBZuweisung an Eigenschaft erwartetProperty assignment expectedQDeclarativeCompilerbDer Eigenschaft wurde bereits ein Wert zugewiesen*Property has already been assigned a valueQDeclarativeCompilerEigenschaftsnamen drfen nicht mit einem Grobuchstaben beginnen5Property names cannot begin with an upper case letterQDeclarativeCompilerhMehrfache Zuweisung eines Wertes an eine Eigenschaft!Property value set multiple timesQDeclarativeCompilertSignalnamen drfen nicht mit einem Grobuchstaben beginnen3Signal names cannot begin with an upper case letterQDeclarativeCompilerTEinzelne Zuweisung an Eigenschaft erwartet#Single property assignment expectedQDeclarativeCompilerBUnerwartete Zuweisung des ObjektsUnexpected object assignmentQDeclarativeCompiler.ID-Wert nicht eindeutigid is not uniqueQDeclarativeCompiler*Ungltige (leere) URLInvalid empty URLQDeclarativeComponentLcreateObject: Der Wert ist kein Objekt$createObject: value is not an objectQDeclarativeComponentEs kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens "%1" existiert+Cannot assign to non-existent property "%1"QDeclarativeConnectionspVerbindungen: Verschachtelte Objekte sind nicht zulssig'Connections: nested objects not allowedQDeclarativeConnections:Verbindungen: Skript erwartetConnections: script expectedQDeclarativeConnections4Verbindungen: SyntaxfehlerConnections: syntax errorQDeclarativeConnections:Schreibgeschtzte TransaktionRead-only TransactionQDeclarativeEngineLDie SQL-Transaktion ist fehlgeschlagenSQL transaction failedQDeclarativeEngineSQL: Die Version der Datenbank entspricht nicht der erwarteten VersionSQL: database version mismatchQDeclarativeEngine~Die Version %2 kann nicht verwendet werden; es wird %1 bentigt'Version mismatch: expected %1, found %2QDeclarativeEnginev'executeSql' wurde auerhalb von 'transaction()' aufgerufen'executeSql called outside transaction()QDeclarativeEngine<callback fehlt bei Transaktiontransaction: missing callbackQDeclarativeEngineP'back' kann nur einmal zugewiesen werdenback is a write-once propertyQDeclarativeFlipableR'front' kann nur einmal zugewiesen werdenfront is a write-once propertyQDeclarativeFlipableHDas Verzeichnis "%1" existiert nicht"%1": no such directoryQDeclarativeImportDatabaseB- %1 ist kein gltiger Namensraum- %1 is not a namespaceQDeclarativeImportDatabase^- geschachtelte Namensrume sind nicht zulssig- nested namespaces not allowedQDeclarativeImportDatabaseDie Gro/Kleinschreibung des Dateinamens "%2" stimmt nicht berein File name case mismatch for "%2"QDeclarativeImportDatabaseDer Module "%1" kann nicht geladen werden: Der Dateiname "%2" unterscheidet sich in der Gro/Kleinschreibung9cannot load module "%1": File name case mismatch for "%2"QDeclarativeImportDatabased"qmldir" und Namensraum fehlen bei dem Import "%1"*import "%1" has no qmldir and no namespaceQDeclarativeImportDatabaseXist mehrdeutig. Es kommt in %1 und in %2 vor#is ambiguous. Found in %1 and in %2QDeclarativeImportDatabaseist mehrdeutig. Es kommt in %1 in den Version %2.%3 und %4.%5 vor4is ambiguous. Found in %1 in version %2.%3 and %4.%5QDeclarativeImportDatabase4wird rekursiv instanziiertis instantiated recursivelyQDeclarativeImportDatabaseist kein Typ is not a typeQDeclarativeImportDatabase&Lokales Verzeichnislocal directoryQDeclarativeImportDatabasehModul "%1" Definition "%2" kann nicht gelesen werden(module "%1" definition "%2" not readableQDeclarativeImportDatabase@Modul "%1" ist nicht installiertmodule "%1" is not installedQDeclarativeImportDatabasefModul "%1" Plugin "%2" konnte nicht gefunden werden!module "%1" plugin "%2" not foundQDeclarativeImportDatabase\Modul "%1" Version %2.%3 ist nicht installiert*module "%1" version %2.%3 is not installedQDeclarativeImportDatabasepDas Plugin des Moduls "%1" kann nicht geladen werden: %2+plugin cannot be loaded for module "%1": %2QDeclarativeImportDatabaseTastennavigation ist nur ber Eigenschaften des Typs 'attached' verfgbar7KeyNavigation is only available via attached properties!QDeclarativeKeyNavigationAttachedDie Untersttzung fr Tasten ist nur ber Eigenschaften des Typs 'attached' verfgbar.Keys is only available via attached propertiesQDeclarativeKeysAttachedEigenschaften des Typs 'attached' knnen nur mit Elementen der Klasse Item verwendet werden7LayoutDirection attached property only works with Items#QDeclarativeLayoutMirroringAttachedLayoutMirroring ist nur in Verbindung mit Eigenschaften des Typs "attached" mglich9LayoutMirroring is only available via attached properties#QDeclarativeLayoutMirroringAttachedpListElement kann keine geschachtelten Elemente enthalten+ListElement: cannot contain nested elementsQDeclarativeListModelzListElement: Die "id"-Eigenschaft kann nicht verwendet werden.ListElement: cannot use reserved "id" propertyQDeclarativeListModelListElement: Es kann kein Skript fr den Wert der Eigenschaft verwendet werden1ListElement: cannot use script for property valueQDeclarativeListModelfListModel: Die Eigenschaft '%1' ist nicht definiert"ListModel: undefined property '%1'QDeclarativeListModel@append: Der Wert ist kein Objektappend: value is not an objectQDeclarativeListModelpinsert: Der Index %1 ist auerhalb des gltigen Bereichsinsert: index %1 out of rangeQDeclarativeListModel@insert: Der Wert ist kein Objektinsert: value is not an objectQDeclarativeListModelJmove: Auerhalb des gltigen Bereichsmove: out of rangeQDeclarativeListModelpremove: Der Index %1 ist auerhalb des gltigen Bereichsremove: index %1 out of rangeQDeclarativeListModeljset: Der Index %1 ist auerhalb des gltigen Bereichsset: index %1 out of rangeQDeclarativeListModel:set: Der Wert ist kein Objektset: value is not an objectQDeclarativeListModelrDas Laden nicht-visueller Elemente ist nicht untersttzt.4Loader does not support loading non-visual elements.QDeclarativeLoaderDas Erscheinungsbild kann bei einer komplexen Transformation nicht beibehalten werden5Unable to preserve appearance under complex transformQDeclarativeParentAnimationDas Erscheinungsbild kann bei einer nicht-uniformen Skalierung nicht beibehalten werden5Unable to preserve appearance under non-uniform scaleQDeclarativeParentAnimationDas Erscheinungsbild kann bei einer Skalierung mit 0 nicht beibehalten werden.Unable to preserve appearance under scale of 0QDeclarativeParentAnimationDas Erscheinungsbild kann bei einer komplexen Transformation nicht beibehalten werden5Unable to preserve appearance under complex transformQDeclarativeParentChangeDas Erscheinungsbild kann bei einer nicht-uniformen Skalierung nicht beibehalten werden5Unable to preserve appearance under non-uniform scaleQDeclarativeParentChangeDas Erscheinungsbild kann bei einer Skalierung mit 0 nicht beibehalten werden.Unable to preserve appearance under scale of 0QDeclarativeParentChangebEs wird eine Typangabe fr den Parameter erwartetExpected parameter typeQDeclarativeParserDTypangabe fr Eigenschaft erwartetExpected property typeQDeclarativeParserBEs wird das Element '%1' erwartetExpected token `%1'QDeclarativeParser8Es wird ein Typname erwartetExpected type nameQDeclarativeParserEin Bezeichner darf nicht mit einem numerischen Literal beginnen,Identifier cannot start with numeric literalQDeclarativeParser$Ungltiges ZeichenIllegal characterQDeclarativeParser0Ungltige Escape-SequenzIllegal escape sequenceQDeclarativeParser>Ungltige Syntax des Exponenten%Illegal syntax for exponential numberQDeclarativeParser@Ungltige Unicode-Escape-SequenzIllegal unicode escape sequenceQDeclarativeParser<Ungltige Id-Angabe bei ImportInvalid import qualifier IDQDeclarativeParserdUngltiger Modifikator fr den Typ der EigenschaftInvalid property type modifierQDeclarativeParserdUngltiger Modifikator '%0' bei regulrem Ausdruck$Invalid regular expression flag '%0'QDeclarativeParserEine JavaScript-Deklaration ist auerhalb eines Skriptelementes nicht zulssig-JavaScript declaration outside Script elementQDeclarativeParserrDer Import einer Bibliothek erfordert eine Versionsangabe!Library import requires a versionQDeclarativeParserhMehrfache Zuweisung eines Wertes an eine Eigenschaft!Property value set multiple timesQDeclarativeParserp'read-only' wird an dieser Stelle noch nicht untersttztReadonly not yet supportedQDeclarativeParserDer reservierte Name "Qt" kann nicht als Bezeichner verwendet werden1Reserved name "Qt" cannot be used as an qualifierQDeclarativeParserDer fr den Skript-Import angegebene Qualifizierer muss eindeutig sein.(Script import qualifiers must be unique.QDeclarativeParserxDer Skript-Import erfordert die Angabe eines Qualifizierers."Script import requires a qualifierQDeclarativeParserSyntaxfehler Syntax errorQDeclarativeParserTKommentar am Dateiende nicht abgeschlossenUnclosed comment at end of fileQDeclarativeParser\Zeichenkette am Zeilenende nicht abgeschlossenUnclosed string at end of lineQDeclarativeParserModifikator fr den Typ der Eigenschaft an dieser Stelle nicht zulssig!Unexpected property type modifierQDeclarativeParser2Unerwartetes Element '%1'Unexpected token `%1'QDeclarativeParservBackslash-Sequenz in regulrem Ausdruck nicht abgeschlossen2Unterminated regular expression backslash sequenceQDeclarativeParser`Klasse im regulren Ausdruck nicht abgeschlossen%Unterminated regular expression classQDeclarativeParserLRegulrer Ausdruck nicht abgeschlossen'Unterminated regular expression literalQDeclarativeParserREs kann keine Zeitdauer <0 gesetzt werdenCannot set a duration of < 0QDeclarativePauseAnimation4Fehlschlag beim ffnen: %1Cannot open: %1QDeclarativePixmap<Fehler beim Dekodieren: %1: %2Error decoding: %1: %2QDeclarativePixmapVBilddaten konnten nicht erhalten werden: %1%Failed to get image from provider: %1QDeclarativePixmapREs kann keine Zeitdauer <0 gesetzt werdenCannot set a duration of < 0QDeclarativePropertyAnimationEs kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens '%1" existiert+Cannot assign to non-existent property "%1"QDeclarativePropertyChangesDie Eigenschaft "%1" ist schreibgeschtzt und kann daher nicht zugewiesen werden(Cannot assign to read-only property "%1"QDeclarativePropertyChangesDie Erzeugung von Objekten, die einem Zustand zugeordnet sind, wird von PropertyChanges nicht untersttzt.APropertyChanges does not support creating state-specific objects.QDeclarativePropertyChanges`Cursor-Delegate konnte nicht instanziiert werden%Could not instantiate cursor delegateQDeclarativeTextInputVCursor-Delegate konnte nicht geladen werdenCould not load cursor delegateQDeclarativeTextInput %1 %2%1 %2QDeclarativeTypeLoadervDer Namensraum %1 kann nicht als Typangabe verwendet werden%Namespace %1 cannot be used as a typeQDeclarativeTypeLoaderBDas Skript %1 ist nicht verfgbarScript %1 unavailableQDeclarativeTypeLoader<Der Typ %1 ist nicht verfgbarType %1 unavailableQDeclarativeTypeLoaderxDer Signal-Eigenschaft %1 kann kein Objekt zugewiesen werden-Cannot assign an object to signal property %1QDeclarativeVMEDer Eigenschaft der Schnittstelle kann kein Objekt zugewiesen werden*Cannot assign object to interface propertyQDeclarativeVMEhZuweisung eines Objekts an eine Liste nicht zulssigCannot assign object to listQDeclarativeVMEDer Objekttyp %1 kann nicht zugewiesen werden, da keine Vorgabe-Methode existiert3Cannot assign object type %1 with no default methodQDeclarativeVMEzDer Wert '%1' kann der Eigenschaft %2 nicht zugewiesen werden%Cannot assign value %1 to property %2QDeclarativeVMEEs kann keine Verbindung zwischen dem Signal %1 und dem Slot %2 hergestellt werden, da sie nicht zusammenpassen0Cannot connect mismatched signal/slot %1 %vs. %2QDeclarativeVMEEs knnen keine Eigenschaften auf %1 gesetzt werden, da es 'null' ist)Cannot set properties on %1 as it is nullQDeclarativeVME^Es konnte kein 'attached'-Objekt erzeugt werden Unable to create attached objectQDeclarativeVME`Es konnte kein Objekt des Typs %1 erzeugt werden"Unable to create object of type %1QDeclarativeVMEXDelegate-Komponente muss vom Typ 'Item' sein%Delegate component must be Item type.QDeclarativeVisualDataModelDiese Version der Qt-Bibliothek wurde ohne Untersttzung fr xmlpatterns erstellt,Qt was built without support for xmlpatternsQDeclarativeXmlListModel`Eine XmlRole-Abfrage darf nicht mit '/' beginnen(An XmlRole query must not start with '/'QDeclarativeXmlListModelRolerEine XmlListModel-Abfrage muss mit '/' oder "//" beginnen1An XmlListModel query must start with '/' or "//"QDeclarativeXmlRoleList QDialQDialQDialSchieberegler SliderHandleQDialTachometer SpeedoMeterQDial FertigDoneQDialogDirekthilfe What's This?QDialog&Abbrechen&CancelQDialogButtonBoxSchl&ieen&CloseQDialogButtonBox &Nein&NoQDialogButtonBox&OK&OKQDialogButtonBoxS&peichern&SaveQDialogButtonBox&Ja&YesQDialogButtonBoxAbbrechenAbortQDialogButtonBoxAnwendenApplyQDialogButtonBoxAbbrechenCancelQDialogButtonBoxSchlieenCloseQDialogButtonBox0Schlieen ohne SpeichernClose without SavingQDialogButtonBoxVerwerfenDiscardQDialogButtonBoxNicht speichern Don't SaveQDialogButtonBox HilfeHelpQDialogButtonBoxIgnorierenIgnoreQDialogButtonBoxN&ein, keine N&o to AllQDialogButtonBoxOKOKQDialogButtonBox ffnenOpenQDialogButtonBoxZurcksetzenResetQDialogButtonBox VoreinstellungenRestore DefaultsQDialogButtonBoxWiederholenRetryQDialogButtonBoxSpeichernSaveQDialogButtonBoxAlles speichernSave AllQDialogButtonBoxJa, &alle Yes to &AllQDialogButtonBoxnderungsdatum Date Modified QDirModelArtKind QDirModelNameName QDirModel GreSize QDirModelTypType QDirModelSchlieenClose QDockWidgetAndockenDock QDockWidgetHerauslsenFloat QDockWidgetWenigerLessQDoubleSpinBoxMehrMoreQDoubleSpinBox&OK&OK QErrorMessage<Diese Meldung wieder an&zeigen&Show this message again QErrorMessageDebug-Ausgabe:Debug Message: QErrorMessageFehler: Fatal Error: QErrorMessageAchtung:Warning: QErrorMessage:%1 kann nicht erstellt werdenCannot create %1 for outputQFileN%1 kann nicht zum Lesen geffnet werdenCannot open %1 for inputQFileVDas ffnen zum Schreiben ist fehlgeschlagenCannot open for outputQFileRDie Quelldatei kann nicht entfernt werdenCannot remove source fileQFile>Die Zieldatei existiert bereitsDestination file existsQFile\Der Datenblock konnte nicht geschrieben werdenFailure to write blockQFileEs ist kein Datei-Engine verfgbar oder der gegenwrtig aktive Engine untersttzt die UnMap-Erweiterung nichtBNo file engine available or engine does not support UnMapExtensionQFileEine sequentielle Datei kann nicht durch blockweises Kopieren umbenannt werden0Will not rename sequential file using block copyQFile%1 Das Verzeichnis konnte nicht gefunden werden. Stellen Sie sicher, dass der Verzeichnisname richtig ist.K%1 Directory not found. Please verify the correct directory name was given. QFileDialog%1 Die Datei konnte nicht gefunden werden. Stellen Sie sicher, dass der Dateiname richtig ist.A%1 File not found. Please verify the correct file name was given. QFileDialog|Die Datei %1 existiert bereits. Soll sie berschrieben werden?-%1 already exists. Do you want to replace it? QFileDialog&Auswhlen&Choose QFileDialog&Lschen&Delete QFileDialog$&Neues Verzeichnis &New Folder QFileDialog&ffnen&Open QFileDialog&Umbenennen&Rename QFileDialogS&peichern&Save QFileDialog'%1' ist schreibgeschtzt. Mchten Sie die Datei trotzdem lschen?9'%1' is write protected. Do you want to delete it anyway? QFileDialog AliasAlias QFileDialog Alle Dateien (*) All Files (*) QFileDialog$Alle Dateien (*.*)All Files (*.*) QFileDialog^Sind Sie sicher, dass Sie '%1' lschen mchten?!Are sure you want to delete '%1'? QFileDialog ZurckBack QFileDialog0Wechsle zu DetailansichtChange to detail view mode QFileDialog0Wechsle zu ListenansichtChange to list view mode QFileDialogBKonnte Verzeichnis nicht lschen.Could not delete directory. QFileDialog,Neuen Ordner erstellenCreate New Folder QFileDialog,Neuen Ordner erstellenCreate a New Folder QFileDialogDetails Detail View QFileDialogVerzeichnisse Directories QFileDialogVerzeichnis: Directory: QFileDialogLaufwerkDrive QFileDialog DateiFile QFileDialogDatei&name: File &name: QFileDialog Ordner File Folder QFileDialog"Dateien des Typs:Files of type: QFileDialog$Verzeichnis suchenFind Directory QFileDialog OrderFolder QFileDialogVorwrtsForward QFileDialog ZurckGo back QFileDialogVor Go forward QFileDialogFGehe zum bergeordneten VerzeichnisGo to the parent directory QFileDialog Liste List View QFileDialogSuchen in:Look in: QFileDialogMein Computer My Computer QFileDialog"Neues Verzeichnis New Folder QFileDialog ffnenOpen QFileDialog4bergeordnetes VerzeichnisParent Directory QFileDialogZuletzt besucht Recent Places QFileDialogLschenRemove QFileDialogSpeichern unterSave As QFileDialog"Symbolischer LinkShortcut QFileDialogAnzeigen Show  QFileDialog8&Versteckte Dateien anzeigenShow &hidden files QFileDialogUnbekanntUnknown QFileDialog %1 GB%1 GBQFileSystemModel %1 KB%1 KBQFileSystemModel %1 MB%1 MBQFileSystemModel %1 TB%1 TBQFileSystemModel%1 byte %1 byte(s)QFileSystemModel%1 Byte%1 bytesQFileSystemModel<b>Der Name "%1" kann nicht verwendet werden.</b><p>Versuchen Sie, die Sonderzeichen zu entfernen oder einen krzeren Namen zu verwenden.oThe name "%1" can not be used.

Try using another name, with fewer characters or no punctuations marks.QFileSystemModelComputerComputerQFileSystemModelnderungsdatum Date ModifiedQFileSystemModel(Ungltiger DateinameInvalid filenameQFileSystemModelArtKindQFileSystemModelMein Computer My ComputerQFileSystemModelNameNameQFileSystemModel GreSizeQFileSystemModelTypTypeQFileSystemModelAlleAny QFontDatabaseArabischArabic QFontDatabaseArmenischArmenian QFontDatabaseBengalischBengali QFontDatabaseSchwarzBlack QFontDatabaseFettBold QFontDatabaseKyrillischCyrillic QFontDatabaseSemiDemi QFontDatabaseHalbfett Demi Bold QFontDatabaseDevanagari Devanagari QFontDatabaseGeorgischGeorgian QFontDatabaseGriechischGreek QFontDatabaseGujaratiGujarati QFontDatabaseGurmukhiGurmukhi QFontDatabaseHebrischHebrew QFontDatabase KursivItalic QFontDatabaseJapanischJapanese QFontDatabaseKannadaKannada QFontDatabase KhmerKhmer QFontDatabaseKoreanischKorean QFontDatabaseLaotischLao QFontDatabaseLateinischLatin QFontDatabase LeichtLight QFontDatabaseMalayalam Malayalam QFontDatabaseMyanmarMyanmar QFontDatabaseN'KoN'Ko QFontDatabase NormalNormal QFontDatabaseSchrggestelltOblique QFontDatabase OghamOgham QFontDatabase OriyaOriya QFontDatabase RunenRunic QFontDatabase0Chinesisch (Kurzzeichen)Simplified Chinese QFontDatabaseSinhalaSinhala QFontDatabase SymbolSymbol QFontDatabaseSyrischSyriac QFontDatabaseTamilischTamil QFontDatabase TeluguTelugu QFontDatabase ThaanaThaana QFontDatabaseThailndischThai QFontDatabaseTibetischTibetan QFontDatabase0Chinesisch (Langzeichen)Traditional Chinese QFontDatabaseVietnamesisch Vietnamese QFontDatabase&Schriftart&Font QFontDialog &Gre&Size QFontDialog&Unterstrichen &Underline QFontDialogEffekteEffects QFontDialogSchrifts&til Font st&yle QFontDialogBeispielSample QFontDialog(Schriftart auswhlen Select Font QFontDialog Durch&gestrichen Stri&keout QFontDialog&SchriftsystemWr&iting System QFontDialog`ndern des Verzeichnisses ist fehlgeschlagen: %1Changing directory failed: %1QFtp<Verbindung mit Rechner bestehtConnected to hostQFtp0Verbunden mit Rechner %1Connected to host %1QFtpZVerbindung mit Rechner ist fehlgeschlagen: %1Connecting to host failed: %1QFtp$Verbindung beendetConnection closedQFtp\Verbindung fr die Daten Verbindung verweigert&Connection refused for data connectionQFtp8Verbindung mit %1 verweigertConnection refused to host %1QFtpxDas Zeitlimit fr die Verbindung zu '%1' wurde berschrittenConnection timed out to host %1QFtp2Verbindung mit %1 beendetConnection to %1 closedQFtpfErstellen des Verzeichnisses ist fehlgeschlagen: %1Creating directory failed: %1QFtp\Herunterladen der Datei ist fehlgeschlagen: %1Downloading file failed: %1QFtp&Rechner %1 gefunden Host %1 foundQFtpNRechner %1 konnte nicht gefunden werdenHost %1 not foundQFtp Rechner gefunden Host foundQFtpzDer Inhalt des Verzeichnisses kann nicht angezeigt werden: %1Listing directory failed: %1QFtp@Anmeldung ist fehlgeschlagen: %1Login failed: %1QFtp Keine Verbindung Not connectedQFtpbLschen des Verzeichnisses ist fehlgeschlagen: %1Removing directory failed: %1QFtpPLschen der Datei ist fehlgeschlagen: %1Removing file failed: %1QFtp$Unbekannter Fehler Unknown errorQFtpTHochladen der Datei ist fehlgeschlagen: %1Uploading file failed: %1QFtp@Es wurde kein Hostname angegebenNo host name given QHostInfo$Unbekannter Fehler Unknown error QHostInfoHRechner konnte nicht gefunden werdenHost not foundQHostInfoAgent,Ungltiger RechnernameInvalid hostnameQHostInfoAgent@Es wurde kein Hostname angegebenNo host name givenQHostInfoAgent*Unbekannter AdresstypUnknown address typeQHostInfoAgent$Unbekannter Fehler Unknown errorQHostInfoAgent<Authentifizierung erforderlichAuthentication requiredQHttp<Verbindung mit Rechner bestehtConnected to hostQHttp0Verbunden mit Rechner %1Connected to host %1QHttp$Verbindung beendetConnection closedQHttp*Verbindung verweigertConnection refusedQHttpdVerbindung verweigert oder Zeitlimit berschritten!Connection refused (or timed out)QHttp2Verbindung mit %1 beendetConnection to %1 closedQHttp2Die Daten sind verflschtData corruptedQHttpBeim Schreiben der Antwort auf das Ausgabegert ist ein Fehler aufgetreten Error writing response to deviceQHttp6HTTP-Anfrage fehlgeschlagenHTTP request failedQHttpDie angeforderte HTTPS-Verbindung kann nicht aufgebaut werden, da keine SSL-Untersttzung vorhanden ist:HTTPS connection requested but SSL support not compiled inQHttp&Rechner %1 gefunden Host %1 foundQHttpNRechner %1 konnte nicht gefunden werdenHost %1 not foundQHttp Rechner gefunden Host foundQHttp^Der Hostrechner verlangt eine AuthentifizierungHost requires authenticationQHttpnDer Inhalt (chunked body) der HTTP-Antwort ist ungltigInvalid HTTP chunked bodyQHttpTDer Kopfteil der HTTP-Antwort ist ungltigInvalid HTTP response headerQHttplFr die Verbindung wurde kein Server-Rechner angegebenNo server set to connect toQHttpHProxy-Authentifizierung erforderlichProxy authentication requiredQHttp`Der Proxy-Server verlangt eine AuthentifizierungProxy requires authenticationQHttp2Anfrage wurde abgebrochenRequest abortedQHttppIm Ablauf des SSL-Protokolls ist ein Fehler aufgetreten.SSL handshake failedQHttphDer Server hat die Verbindung unerwartet geschlossen%Server closed connection unexpectedlyQHttpHUnbekannte AuthentifizierungsmethodeUnknown authentication methodQHttp$Unbekannter Fehler Unknown errorQHttpXEs wurde ein unbekanntes Protokoll angegebenUnknown protocol specifiedQHttp,Ungltige LngenangabeWrong content lengthQHttp<Authentifizierung erforderlichAuthentication requiredQHttpSocketEngineFKeine HTTP-Antwort vom Proxy-Server(Did not receive HTTP response from proxyQHttpSocketEnginebFehler bei der Kommunikation mit dem Proxy-Server#Error communicating with HTTP proxyQHttpSocketEngineFehler beim Auswerten der Authentifizierungsanforderung des Proxy-Servers/Error parsing authentication request from proxyQHttpSocketEnginejDer Proxy-Server hat die Verbindung vorzeitig beendet#Proxy connection closed prematurelyQHttpSocketEnginevDer Proxy-Server hat den Aufbau einer Verbindung verweigertProxy connection refusedQHttpSocketEnginevDer Proxy-Server hat den Aufbau einer Verbindung verweigertProxy denied connectionQHttpSocketEngineBei der Verbindung mit dem Proxy-Server wurde ein Zeitlimit berschritten!Proxy server connection timed outQHttpSocketEngineVEs konnte kein Proxy-Server gefunden werdenProxy server not foundQHttpSocketEngineXEs konnte keine Transaktion gestartet werdenCould not start transaction QIBaseDriverhDie Datenbankverbindung konnte nicht geffnet werdenError opening database QIBaseDriverDie Transaktion konnte nicht durchgefhrt werden (Operation 'commit' fehlgeschlagen)Unable to commit transaction QIBaseDriverDie Transaktion konnte nicht rckgngig gemacht werden (Operation 'rollback' fehlgeschlagen)Unable to rollback transaction QIBaseDriverZDie Allokation des Befehls ist fehlgeschlagenCould not allocate statement QIBaseResult~Es konnte keine Beschreibung des Eingabebefehls erhalten werden"Could not describe input statement QIBaseResultpEs konnte keine Beschreibung des Befehls erhalten werdenCould not describe statement QIBaseResult`Das nchste Element konnte nicht abgeholt werdenCould not fetch next item QIBaseResultJDas Feld konnte nicht gefunden werdenCould not find array QIBaseResultbDie Daten des Feldes konnten nicht gelesen werdenCould not get array data QIBaseResultDie erforderlichen Informationen zur Abfrage sind nicht verfgbarCould not get query info QIBaseResultZEs ist keine Information zum Befehl verfgbarCould not get statement info QIBaseResultXDer Befehl konnte nicht initialisiert werdenCould not prepare statement QIBaseResultXEs konnte keine Transaktion gestartet werdenCould not start transaction QIBaseResultTDer Befehl konnte nicht geschlossen werdenUnable to close statement QIBaseResultDie Transaktion konnte nicht durchgefhrt werden (Operation 'commit' fehlgeschlagen)Unable to commit transaction QIBaseResultDEs konnte kein BLOB erzeugt werdenUnable to create BLOB QIBaseResultRDer Befehl konnte nicht ausgefhrt werdenUnable to execute query QIBaseResultJDer BLOB konnte nicht geffnet werdenUnable to open BLOB QIBaseResultHDer BLOB konnte nicht gelesen werdenUnable to read BLOB QIBaseResultPDer BLOB konnte nicht geschrieben werdenUnable to write BLOB QIBaseResultbKein freier Speicherplatz auf dem Gert vorhandenNo space left on device QIODevicevDie Datei oder das Verzeichnis konnte nicht gefunden werdenNo such file or directory QIODevice$Zugriff verweigertPermission denied QIODevice2Zu viele Dateien geffnetToo many open files QIODevice$Unbekannter Fehler Unknown error QIODeviceFEPFEP QInputContext.Mac OS X-EingabemethodeMac OS X input method QInputContext,S60-FEP-EingabemethodeS60 FEP input method QInputContext,Windows-EingabemethodeWindows input method QInputContextXIMXIM QInputContext$XIM-EingabemethodeXIM input method QInputContext2Geben Sie einen Wert ein:Enter a value: QInputDialogV'%1' ist keine gltige ELF-Objektdatei (%2)"'%1' is an invalid ELF object (%2)QLibrary<'%1' ist keine ELF-Objektdatei'%1' is not an ELF objectQLibraryF'%1' ist keine ELF-Objektdatei (%2)'%1' is not an ELF object (%2)QLibrary^Die Bibliothek %1 kann nicht geladen werden: %2Cannot load library %1: %2QLibraryjDas Symbol "%1" kann in %2 nicht aufgelst werden: %3$Cannot resolve symbol "%1" in %2: %3QLibrary`Die Bibliothek %1 kann nicht entladen werden: %2Cannot unload library %1: %2QLibraryhDie Prfdaten des Plugins '%1' stimmen nicht berein)Plugin verification data mismatch in '%1'QLibraryVDie Datei '%1' ist kein gltiges Qt-Plugin.'The file '%1' is not a valid Qt plugin.QLibraryDas Plugin '%1' verwendet eine inkompatible Qt-Bibliothek. (%2.%3.%4) [%5]=The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]QLibrary0Das Plugin '%1' verwendet eine inkompatible Qt-Bibliothek. (Im Debug- bzw. Release-Modus erstellte Bibliotheken knnen nicht zusammen verwendet werden.)WThe plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)QLibraryDas Plugin '%1' verwendet eine inkompatible Qt-Bibliothek. Erforderlicher build-spezifischer Schlssel "%2", erhalten "%3"OThe plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"QLibrarynDie dynamische Bibliothek konnte nicht gefunden werden.!The shared library was not found.QLibrary$Unbekannter Fehler Unknown errorQLibrary&Kopieren&Copy QLineEditEinf&gen&Paste QLineEdit"Wieder&herstellen&Redo QLineEdit&Rckgngig&Undo QLineEdit&AusschneidenCu&t QLineEditLschenDelete QLineEditAlles auswhlen Select All QLineEditL%1: Die Adresse wird bereits verwendet%1: Address in use QLocalServer*%1: Fehlerhafter Name%1: Name error QLocalServer,%1: Zugriff verweigert%1: Permission denied QLocalServer2%1: Unbekannter Fehler %2%1: Unknown error %2 QLocalServer,%1: Zugriff verweigert%1: Access denied QLocalSocket*%1: Verbindungsfehler%1: Connection error QLocalSocketT%1: Der Verbindungsaufbau wurde verweigert%1: Connection refused QLocalSocket:%1: Das Datagramm ist zu gro%1: Datagram too large QLocalSocket&%1: Ungltiger Name%1: Invalid name QLocalSocketn%1: Die Verbindung wurde von der Gegenseite geschlossen%1: Remote closed QLocalSocketL%1: Fehler beim Zugriff auf den Socket%1: Socket access error QLocalSocketV%1: Zeitberschreitung bei Socket-Operation%1: Socket operation timed out QLocalSocketJ%1: Socket-Fehler (Ressourcenproblem)%1: Socket resource error QLocalSocketb%1: Diese Socket-Operation wird nicht untersttzt)%1: The socket operation is not supported QLocalSocket,%1: Unbekannter Fehler%1: Unknown error QLocalSocket2%1: Unbekannter Fehler %2%1: Unknown error %2 QLocalSocketTEs kann keine Transaktion gestartet werdenUnable to begin transaction QMYSQLDriverDie Transaktion kann nicht durchgefhrt werden (Operation 'commit' fehlgeschlagen)Unable to commit transaction QMYSQLDriverREs kann keine Verbindung aufgebaut werdenUnable to connect QMYSQLDriverhDie Datenbankverbindung kann nicht geffnet werden 'Unable to open database ' QMYSQLDriverDie Transaktion kann nicht rckgngig gemacht werden (Operation 'rollback' fehlgeschlagen)Unable to rollback transaction QMYSQLDriver\Die Ausgabewerte konnten nicht gebunden werdenUnable to bind outvalues QMYSQLResultJDer Wert konnte nicht gebunden werdenUnable to bind value QMYSQLResultbDie folgende Abfrage kann nicht ausgefhrt werdenUnable to execute next query QMYSQLResultTDie Abfrage konnte nicht ausgefhrt werdenUnable to execute query QMYSQLResultRDer Befehl konnte nicht ausgefhrt werdenUnable to execute statement QMYSQLResultLEs konnten keine Daten abgeholt werdenUnable to fetch data QMYSQLResultXDer Befehl konnte nicht initialisiert werdenUnable to prepare statement QMYSQLResultXDer Befehl konnte nicht zurckgesetzt werdenUnable to reset statement QMYSQLResultfDas folgende Ergebnis kann nicht gespeichert werdenUnable to store next result QMYSQLResultXDas Ergebnis konnte nicht gespeichert werdenUnable to store result QMYSQLResultvDie Ergebnisse des Befehls konnten nicht gespeichert werden!Unable to store statement results QMYSQLResult(Unbenannt) (Untitled)QMdiArea%1 - [%2] %1 - [%2] QMdiSubWindowSchl&ieen&Close QMdiSubWindowVer&schieben&Move QMdiSubWindow"Wieder&herstellen&Restore QMdiSubWindowGre &ndern&Size QMdiSubWindow - [%1]- [%1] QMdiSubWindowSchlieenClose QMdiSubWindow HilfeHelp QMdiSubWindowMa&ximieren Ma&ximize QMdiSubWindowMaximierenMaximize QMdiSubWindowMenMenu QMdiSubWindowM&inimieren Mi&nimize QMdiSubWindowMinimierenMinimize QMdiSubWindow WiederherstellenRestore QMdiSubWindow Wiederherstellen Restore Down QMdiSubWindowAufrollenShade QMdiSubWindow.Im &Vordergrund bleiben Stay on &Top QMdiSubWindowHerabrollenUnshade QMdiSubWindowSchlieenCloseQMenuAusfhrenExecuteQMenu ffnenOpenQMenuOptionenActionsQMenuBar~<h3>ber Qt</h3><p>Dieses Programm verwendet Qt Version %1.</p>8

About Qt

This program uses Qt version %1.

 QMessageBoxber QtAbout Qt QMessageBox HilfeHelp QMessageBox*Details ausblenden...Hide Details... QMessageBoxOKOK QMessageBox*Details einblenden...Show Details... QMessageBox0Eingabemethode auswhlen Select IMQMultiInputContext<Umschalter fr EingabemethodenMultiple input method switcherQMultiInputContextPluginMehrfachumschalter fr Eingabemethoden, der das Kontextmen des Text-Widgets verwendetMMultiple input method switcher that uses the context menu of the text widgetsQMultiInputContextPlugin^Auf diesem Port hrt bereits ein anderer Socket4Another socket is already listening on the same portQNativeSocketEngineEs wurde versucht, einen IPv6-Socket auf einem System ohne IPv6-Untersttzung zu verwenden=Attempt to use IPv6 socket on a platform with no IPv6 supportQNativeSocketEngine*Verbindung verweigertConnection refusedQNativeSocketEnginehDas Zeitlimit fr die Verbindung wurde berschrittenConnection timed outQNativeSocketEngine|Das Datagram konnte nicht gesendet werden, weil es zu gro istDatagram was too large to sendQNativeSocketEngineTDer Zielrechner kann nicht erreicht werdenHost unreachableQNativeSocketEngine8Ungltiger Socket-DeskriptorInvalid socket descriptorQNativeSocketEngineNetzwerkfehler Network errorQNativeSocketEnginefDas Zeitlimit fr die Operation wurde berschrittenNetwork operation timed outQNativeSocketEngineBDas Netzwerk ist nicht erreichbarNetwork unreachableQNativeSocketEnginehOperation kann nur auf einen Socket angewandt werdenOperation on non-socketQNativeSocketEngine4Keine Ressourcen verfgbarOut of resourcesQNativeSocketEngine$Zugriff verweigertPermission deniedQNativeSocketEngineHDas Protokoll wird nicht untersttztProtocol type not supportedQNativeSocketEngine>Die Adresse ist nicht verfgbarThe address is not availableQNativeSocketEngine2Die Adresse ist geschtztThe address is protectedQNativeSocketEngine\Die angegebene Adresse ist bereits in Gebrauch#The bound address is already in useQNativeSocketEngine|Die Operation kann mit dem Proxy-Typ nicht durchgefhrt werden,The proxy type is invalid for this operationQNativeSocketEnginehDer entfernte Rechner hat die Verbindung geschlossen%The remote host closed the connectionQNativeSocketEnginelDer Broadcast-Socket konnte nicht initialisiert werden%Unable to initialize broadcast socketQNativeSocketEngine|Der nichtblockierende Socket konnte nicht initialisiert werden(Unable to initialize non-blocking socketQNativeSocketEngineVDie Nachricht konnte nicht empfangen werdenUnable to receive a messageQNativeSocketEngineTDie Nachricht konnte nicht gesendet werdenUnable to send a messageQNativeSocketEnginebDer Schreibvorgang konnte nicht ausgefhrt werdenUnable to writeQNativeSocketEngine$Unbekannter Fehler Unknown errorQNativeSocketEngineD Socket-Kommando nicht untersttztUnsupported socket operationQNativeSocketEngine>%1 konnte nicht geffnet werdenError opening %1QNetworkAccessCacheBackend$Ungltiger URI: %1Invalid URI: %1QNetworkAccessDataBackendDer entfernte Rechner hat die Verbindung zu %1 vorzeitig beendet3Remote host closed the connection prematurely on %1QNetworkAccessDebugPipeBackend0Socket-Fehler bei %1: %2Socket error on %1: %2QNetworkAccessDebugPipeBackend>Fehler beim Schreiben zu %1: %2Write error writing to %1: %2QNetworkAccessDebugPipeBackend%1 kann nicht geffnet werden: Der Pfad spezifiziert ein Verzeichnis#Cannot open %1: Path is a directoryQNetworkAccessFileBackendF%1 konnte nicht geffnet werden: %2Error opening %1: %2QNetworkAccessFileBackendfBeim Lesen von der Datei %1 trat ein Fehler auf: %2Read error reading from %1: %2QNetworkAccessFileBackendfAnforderung zum ffnen einer Datei ber Netzwerk %1%Request for opening non-local file %1QNetworkAccessFileBackendLFehler beim Schreiben zur Datei %1: %2Write error writing to %1: %2QNetworkAccessFileBackend%1 kann nicht geffnet werden: Es handelt sich um ein VerzeichnisCannot open %1: is a directoryQNetworkAccessFtpBackendbBeim Herunterladen von %1 trat ein Fehler auf: %2Error while downloading %1: %2QNetworkAccessFtpBackendZBeim Hochladen von %1 trat ein Fehler auf: %2Error while uploading %1: %2QNetworkAccessFtpBackendDie Anmeldung bei %1 ist fehlgeschlagen: Es ist eine Authentifizierung erforderlich0Logging in to %1 failed: authentication requiredQNetworkAccessFtpBackendlEs konnte kein geeigneter Proxy-Server gefunden werdenNo suitable proxy foundQNetworkAccessFtpBackendlEs konnte kein geeigneter Proxy-Server gefunden werdenNo suitable proxy foundQNetworkAccessHttpBackendbDer Zugriff auf das Netzwerk ist nicht gestattet.Network access is disabled.QNetworkAccessManagerBeim Herunterladen von %1 trat ein Fehler auf - Die Antwort des Servers ist: %2)Error downloading %1 - server replied: %2 QNetworkReply<Fehler bei Netzwerkverbindung.Network session error. QNetworkReply@Das Protokoll "%1" ist unbekanntProtocol "%1" is unknown QNetworkReplyJDas Netzwerk ist zurzeit ausgefallen.Temporary network failure. QNetworkReply*Operation abgebrochenOperation canceledQNetworkReplyImpl0Ungltige Konfiguration.Invalid configuration.QNetworkSession&Fehler beim Roaming Roaming errorQNetworkSessionPrivateImpltDas Roaming wurde abgebrochen oder ist hier nicht mglich.'Roaming was aborted or is not possible.QNetworkSessionPrivateImplDie Verbindung wurde vom Benutzer oder vom Betriebssystem unterbrochen!Session aborted by user or systemQNetworkSessionPrivateImplzDie angeforderte Operation wird vom System nicht untersttzt.7The requested operation is not supported by the system.QNetworkSessionPrivateImplDie Verbindung wurde vom Benutzer oder vom Betriebssystem unterbrochen..The session was aborted by the user or system.QNetworkSessionPrivateImplrDie angegebene Konfiguration kann nicht verwendet werden.+The specified configuration cannot be used.QNetworkSessionPrivateImpl$Unbekannter FehlerUnidentified ErrorQNetworkSessionPrivateImplTUnbekannter Fehler bei Netzwerkverbindung.Unknown session error.QNetworkSessionPrivateImplXEs konnte keine Transaktion gestartet werdenUnable to begin transaction QOCIDriverDie Transaktion konnte nicht durchgefhrt werden (Operation 'commit' fehlgeschlagen)Unable to commit transaction QOCIDriver<Initialisierung fehlgeschlagenUnable to initialize QOCIDriver8Logon-Vorgang fehlgeschlagenUnable to logon QOCIDriverDie Transaktion konnte nicht rckgngig gemacht werden (Operation 'rollback' fehlgeschlagen)Unable to rollback transaction QOCIDriverZDie Allokation des Befehls ist fehlgeschlagenUnable to alloc statement QOCIResultDie Spalte konnte nicht fr den Stapelverarbeitungs-Befehl gebunden werden'Unable to bind column for batch execute QOCIResultJDer Wert konnte nicht gebunden werdenUnable to bind value QOCIResultzDer Stapelverarbeitungs-Befehl konnte nicht ausgefhrt werden!Unable to execute batch statement QOCIResultRDer Befehl konnte nicht ausgefhrt werdenUnable to execute statement QOCIResultXDer Anweisungstyp kann nicht bestimmt werdenUnable to get statement type QOCIResultJKann nicht zum nchsten Element gehenUnable to goto next QOCIResultXDer Befehl konnte nicht initialisiert werdenUnable to prepare statement QOCIResultDie Transaktion konnte nicht durchgefhrt werden (Operation 'commit' fehlgeschlagen)Unable to commit transaction QODBCDriverREs kann keine Verbindung aufgebaut werdenUnable to connect QODBCDriverEs kann keine Verbindung aufgebaut werden weil der Treiber die bentigte Funktionalitt nicht vollstndig untersttztEUnable to connect - Driver doesn't support all functionality required QODBCDriverX'autocommit' konnte nicht deaktiviert werdenUnable to disable autocommit QODBCDriverT'autocommit' konnte nicht aktiviert werdenUnable to enable autocommit QODBCDriverDie Transaktion konnte nicht rckgngig gemacht werden (Operation 'rollback' fehlgeschlagen)Unable to rollback transaction QODBCDriver(QODBCResult::reset: 'SQL_CURSOR_STATIC' konnte nicht als Attribut des Befehls gesetzt werden. Bitte prfen Sie die Konfiguration Ihres ODBC-TreibersyQODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResultRDie Variable konnte nicht gebunden werdenUnable to bind variable QODBCResultRDer Befehl konnte nicht ausgefhrt werdenUnable to execute statement QODBCResultLEs konnten keine Daten abgeholt werdenUnable to fetch QODBCResult`Der erste Datensatz konnte nicht abgeholt werdenUnable to fetch first QODBCResultbDer letzte Datensatz konnte nicht abgeholt werdenUnable to fetch last QODBCResultdDer nchste Datensatz konnte nicht abgeholt werdenUnable to fetch next QODBCResulthDer vorherige Datensatz konnte nicht abgeholt werdenUnable to fetch previous QODBCResultXDer Befehl konnte nicht initialisiert werdenUnable to prepare statement QODBCResult"%1" ist bereits als Name einer Rolle vergeben und wird daher deaktiviert.:"%1" duplicates a previous role name and will be disabled.QObject.PulseAudio-Sound-ServerPulseAudio Sound ServerQObject.Ungltige Abfrage: "%1"invalid query: "%1"QObjectNameNameQPPDOptionsModelWertValueQPPDOptionsModelXEs konnte keine Transaktion gestartet werdenCould not begin transaction QPSQLDriverDie Transaktion konnte nicht durchgefhrt werden (Operation 'commit' fehlgeschlagen)Could not commit transaction QPSQLDriverDie Transaktion konnte nicht rckgngig gemacht werden (Operation 'rollback' fehlgeschlagen)Could not rollback transaction QPSQLDriverREs kann keine Verbindung aufgebaut werdenUnable to connect QPSQLDriverHDie Registrierung ist fehlgeschlagenUnable to subscribe QPSQLDriver`Die Registrierung konnte nicht aufgehoben werdenUnable to unsubscribe QPSQLDriverLEs konnte keine Abfrage erzeugt werdenUnable to create query QPSQLResultXDer Befehl konnte nicht initialisiert werdenUnable to prepare statement QPSQLResultZentimeter (cm)Centimeters (cm)QPageSetupWidgetFormularFormQPageSetupWidget Hhe:Height:QPageSetupWidgetZoll (in) Inches (in)QPageSetupWidgetQuerformat LandscapeQPageSetupWidget RnderMarginsQPageSetupWidgetMillimeter (mm)Millimeters (mm)QPageSetupWidgetAusrichtung OrientationQPageSetupWidgetSeitengre: Page size:QPageSetupWidget PapierPaperQPageSetupWidgetPapierquelle: Paper source:QPageSetupWidgetPunkte (pt) Points (pt)QPageSetupWidgetHochformatPortraitQPageSetupWidget,Umgekehrtes QuerformatReverse landscapeQPageSetupWidget,Umgekehrtes HochformatReverse portraitQPageSetupWidgetBreite:Width:QPageSetupWidgetUnterer Rand bottom marginQPageSetupWidgetLinker Rand left marginQPageSetupWidgetRechter Rand right marginQPageSetupWidgetOberer Rand top marginQPageSetupWidget>Das Plugin wurde nicht geladen.The plugin was not loaded. QPluginLoader$Unbekannter Fehler Unknown error QPluginLoader|Die Datei %1 existiert bereits. Soll sie berschrieben werden?/%1 already exists. Do you want to overwrite it? QPrintDialog%1 ist ein Verzeichnis. Bitte whlen Sie einen anderen Dateinamen.7%1 is a directory. Please choose a different file name. QPrintDialog$&Einstellungen <<  &Options << QPrintDialog"&Einstellungen >> &Options >> QPrintDialog&Drucken&Print QPrintDialogN<qt>Soll sie berschrieben werden?</qt>%Do you want to overwrite it? QPrintDialogA0A0 QPrintDialog$A0 (841 x 1189 mm)A0 (841 x 1189 mm) QPrintDialogA1A1 QPrintDialog"A1 (594 x 841 mm)A1 (594 x 841 mm) QPrintDialogA2A2 QPrintDialog"A2 (420 x 594 mm)A2 (420 x 594 mm) QPrintDialogA3A3 QPrintDialog"A3 (297 x 420 mm)A3 (297 x 420 mm) QPrintDialogA4A4 QPrintDialog"A4 (210 x 297 mm)%A4 (210 x 297 mm, 8.26 x 11.7 inches) QPrintDialogA5A5 QPrintDialog"A5 (148 x 210 mm)A5 (148 x 210 mm) QPrintDialogA6A6 QPrintDialog"A6 (105 x 148 mm)A6 (105 x 148 mm) QPrintDialogA7A7 QPrintDialog A7 (74 x 105 mm)A7 (74 x 105 mm) QPrintDialogA8A8 QPrintDialogA8 (52 x 74 mm)A8 (52 x 74 mm) QPrintDialogA9A9 QPrintDialogA9 (37 x 52 mm)A9 (37 x 52 mm) QPrintDialogAlias: %1 Aliases: %1 QPrintDialogB0B0 QPrintDialog&B0 (1000 x 1414 mm)B0 (1000 x 1414 mm) QPrintDialogB1B1 QPrintDialog$B1 (707 x 1000 mm)B1 (707 x 1000 mm) QPrintDialogB10B10 QPrintDialog B10 (31 x 44 mm)B10 (31 x 44 mm) QPrintDialogB2B2 QPrintDialog"B2 (500 x 707 mm)B2 (500 x 707 mm) QPrintDialogB3B3 QPrintDialog"B3 (353 x 500 mm)B3 (353 x 500 mm) QPrintDialogB4B4 QPrintDialog"B4 (250 x 353 mm)B4 (250 x 353 mm) QPrintDialogB5B5 QPrintDialog"B5 (176 x 250 mm)%B5 (176 x 250 mm, 6.93 x 9.84 inches) QPrintDialogB6B6 QPrintDialog"B6 (125 x 176 mm)B6 (125 x 176 mm) QPrintDialogB7B7 QPrintDialog B7 (88 x 125 mm)B7 (88 x 125 mm) QPrintDialogB8B8 QPrintDialogB8 (62 x 88 mm)B8 (62 x 88 mm) QPrintDialogB9B9 QPrintDialogB9 (44 x 62 mm)B9 (44 x 62 mm) QPrintDialogC5EC5E QPrintDialog$C5E (163 x 229 mm)C5E (163 x 229 mm) QPrintDialog"BenutzerdefiniertCustom QPrintDialogDLEDLE QPrintDialog$DLE (110 x 220 mm)DLE (110 x 220 mm) QPrintDialogExecutive Executive QPrintDialogNExecutive (7,5 x 10 Zoll, 191 x 254 mm))Executive (7.5 x 10 inches, 191 x 254 mm) QPrintDialogDie Datei %1 ist schreibgeschtzt. Bitte whlen Sie einen anderen Dateinamen.=File %1 is not writable. Please choose a different file name. QPrintDialog6Die Datei existiert bereits File exists QPrintDialog FolioFolio QPrintDialog(Folio (210 x 330 mm)Folio (210 x 330 mm) QPrintDialog LedgerLedger QPrintDialog*Ledger (432 x 279 mm)Ledger (432 x 279 mm) QPrintDialog LegalLegal QPrintDialogFLegal (8,5 x 14 Zoll, 216 x 356 mm)%Legal (8.5 x 14 inches, 216 x 356 mm) QPrintDialog LetterLetter QPrintDialogHLetter (8,5 x 11 Zoll, 216 x 279 mm)&Letter (8.5 x 11 inches, 216 x 279 mm) QPrintDialogLokale Datei Local file QPrintDialogOKOK QPrintDialogDruckenPrint QPrintDialog(In Datei drucken ...Print To File ... QPrintDialogAlles drucken Print all QPrintDialog&Diese Seite druckenPrint current page QPrintDialogBereich drucken Print range QPrintDialogAuswahl druckenPrint selection QPrintDialog(In PDF-Datei druckenPrint to File (PDF) QPrintDialog6In Postscript-Datei druckenPrint to File (Postscript) QPrintDialogTabloidTabloid QPrintDialog,Tabloid (279 x 432 mm)Tabloid (279 x 432 mm) QPrintDialogDie Angabe fr die erste Seite darf nicht grer sein als die fr die letzte Seite.7The 'From' value cannot be greater than the 'To' value. QPrintDialog,US Common #10 EnvelopeUS Common #10 Envelope QPrintDialogJUS Common #10 Envelope (105 x 241 mm)%US Common #10 Envelope (105 x 241 mm) QPrintDialog,Schreiben der Datei %1 Write %1 file QPrintDialog direkt verbundenlocally connected QPrintDialogunbekanntunknown QPrintDialog%1%%1%QPrintPreviewDialogSchlieenCloseQPrintPreviewDialogPDF exportieren Export to PDFQPrintPreviewDialog,PostScript exportierenExport to PostScriptQPrintPreviewDialogErste Seite First pageQPrintPreviewDialogSeite anpassenFit pageQPrintPreviewDialogBreite anpassen Fit widthQPrintPreviewDialogQuerformat LandscapeQPrintPreviewDialogLetzte Seite Last pageQPrintPreviewDialogNchste Seite Next pageQPrintPreviewDialog Seite einrichten Page SetupQPrintPreviewDialog Seite einrichten Page setupQPrintPreviewDialogHochformatPortraitQPrintPreviewDialogVorige Seite Previous pageQPrintPreviewDialogDruckenPrintQPrintPreviewDialogDruckvorschau Print PreviewQPrintPreviewDialogBGegenberliegende Seiten anzeigenShow facing pagesQPrintPreviewDialog,bersicht aller SeitenShow overview of all pagesQPrintPreviewDialog.Einzelne Seite anzeigenShow single pageQPrintPreviewDialogVergrernZoom inQPrintPreviewDialogVerkleinernZoom outQPrintPreviewDialogErweitertAdvancedQPrintPropertiesWidgetFormularFormQPrintPropertiesWidget SeitePageQPrintPropertiesWidgetSortierenCollateQPrintSettingsOutput FarbeColorQPrintSettingsOutputFarbmodus Color ModeQPrintSettingsOutput Anzahl ExemplareCopiesQPrintSettingsOutput"Anzahl Exemplare:Copies:QPrintSettingsOutput Current PageQPrintSettingsOutputDuplexdruckDuplex PrintingQPrintSettingsOutputFormularFormQPrintSettingsOutputGraustufen GrayscaleQPrintSettingsOutputLange Seite Long sideQPrintSettingsOutputKeinNoneQPrintSettingsOutputOptionenOptionsQPrintSettingsOutput(AusgabeeinstellungenOutput SettingsQPrintSettingsOutputSeiten von Pages fromQPrintSettingsOutputAlles drucken Print allQPrintSettingsOutputBereich drucken Print rangeQPrintSettingsOutputUmgekehrtReverseQPrintSettingsOutputAuswahl SelectionQPrintSettingsOutputKurze Seite Short sideQPrintSettingsOutputbistoQPrintSettingsOutput &Name:&Name: QPrintWidget...... QPrintWidgetFormularForm QPrintWidgetStandort: Location: QPrintWidgetAusgabe&datei: Output &file: QPrintWidget&Eigenschaften P&roperties QPrintWidgetVorschauPreview QPrintWidgetDruckerPrinter QPrintWidgetTyp:Type: QPrintWidgetvDie Eingabeumleitung konnte nicht zum Lesen geffnet werden,Could not open input redirection for readingQProcessvDie Ausgabeumleitung konnte nicht zum Lesen geffnet werden-Could not open output redirection for writingQProcessPDas Lesen vom Prozess ist fehlgeschlagenError reading from processQProcessXDas Schreiben zum Prozess ist fehlgeschlagenError writing to processQProcess@Es wurde kein Programm angegebenNo program definedQProcess4Der Prozess ist abgestrztProcess crashedQProcess`Das Starten des Prozesses ist fehlgeschlagen: %1Process failed to start: %1QProcess$ZeitberschreitungProcess operation timed outQProcessLRessourcenproblem ("fork failure"): %1!Resource error (fork failure): %1QProcessAbbrechenCancelQProgressDialog ffnenOpen QPushButtonAnkreuzenCheck QRadioButton@falsche Syntax fr Zeichenklassebad char class syntaxQRegExp8falsche Syntax fr Lookaheadbad lookahead syntaxQRegExpBfalsche Syntax fr Wiederholungenbad repetition syntaxQRegExpLdeaktivierte Eigenschaft wurde benutztdisabled feature usedQRegExp&ungltige Kategorieinvalid categoryQRegExp(ungltiges Intervallinvalid intervalQRegExp*ungltiger Oktal-Wertinvalid octal valueQRegExp.internes Limit erreichtmet internal limitQRegExp2fehlende linke Begrenzungmissing left delimQRegExpkein Fehlerno error occurredQRegExp"unerwartetes Endeunexpected endQRegExphDie Datenbankverbindung konnte nicht geffnet werdenError opening databaseQSQLite2DriverXEs konnte keine Transaktion gestartet werdenUnable to begin transactionQSQLite2DriverDie Transaktion konnte nicht durchgefhrt werden (Operation 'commit' fehlgeschlagen)Unable to commit transactionQSQLite2DriverhDie Transaktion kann nicht rckgngig gemacht werdenUnable to rollback transactionQSQLite2DriverRDer Befehl konnte nicht ausgefhrt werdenUnable to execute statementQSQLite2ResultRDas Ergebnis konnte nicht abgeholt werdenUnable to fetch resultsQSQLite2ResultnDie Datenbankverbindung konnte nicht geschlossen werdenError closing database QSQLiteDriverhDie Datenbankverbindung konnte nicht geffnet werdenError opening database QSQLiteDriverXEs konnte keine Transaktion gestartet werdenUnable to begin transaction QSQLiteDriverDie Transaktion konnte nicht durchgefhrt werden (Operation 'commit' fehlgeschlagen)Unable to commit transaction QSQLiteDriverDie Transaktion konnte nicht rckgngig gemacht werden (Operation 'rollback' fehlgeschlagen)Unable to rollback transaction QSQLiteDriverKein AbfrageNo query QSQLiteResultFDie Anzahl der Parameter ist falschParameter count mismatch QSQLiteResultTDie Parameter konnte nicht gebunden werdenUnable to bind parameters QSQLiteResultRDer Befehl konnte nicht ausgefhrt werdenUnable to execute statement QSQLiteResultTDer Datensatz konnte nicht abgeholt werdenUnable to fetch row QSQLiteResultXDer Befehl konnte nicht zurckgesetzt werdenUnable to reset statement QSQLiteResultBedingung ConditionQScriptBreakpointsModelAusgelst Hit-countQScriptBreakpointsModelIDIDQScriptBreakpointsModelAuslsen nach Ignore-countQScriptBreakpointsModel StelleLocationQScriptBreakpointsModelEinmal auslsen Single-shotQScriptBreakpointsModelLschenDeleteQScriptBreakpointsWidgetNeuNewQScriptBreakpointsWidget&&Suche im Skript...&Find in Script...QScriptDebuggerKonsole lschen Clear ConsoleQScriptDebugger*Debug-Ausgabe lschenClear Debug OutputQScriptDebugger*Fehlerausgabe lschenClear Error LogQScriptDebugger WeiterContinueQScriptDebugger Ctrl+FCtrl+FQScriptDebuggerCtrl+F10Ctrl+F10QScriptDebugger Ctrl+GCtrl+GQScriptDebuggerDebuggenDebugQScriptDebuggerF10F10QScriptDebuggerF11F11QScriptDebuggerF3F3QScriptDebuggerF5F5QScriptDebuggerF9F9QScriptDebugger&&Nchste Fundstelle Find &NextQScriptDebugger2&Vorhergehende FundstelleFind &PreviousQScriptDebuggerGehe zu Zeile Go to LineQScriptDebuggerUnterbrechen InterruptQScriptDebugger Zeile:Line:QScriptDebugger(Bis Cursor ausfhren Run to CursorQScriptDebugger:Bis zu neuem Skript ausfhrenRun to New ScriptQScriptDebuggerShift+F11 Shift+F11QScriptDebuggerShift+F3Shift+F3QScriptDebuggerShift+F5Shift+F5QScriptDebugger(Einzelschritt herein Step IntoQScriptDebugger(Einzelschritt herausStep OutQScriptDebugger$Einzelschritt ber Step OverQScriptDebugger*Haltepunkt umschaltenToggle BreakpointQScriptDebugger<img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Die Suche hat das Ende erreichtJ Search wrappedQScriptDebuggerCodeFinderWidget:Gro/Kleinschreibung beachtenCase SensitiveQScriptDebuggerCodeFinderWidgetSchlieenCloseQScriptDebuggerCodeFinderWidgetNchsteNextQScriptDebuggerCodeFinderWidget VorigePreviousQScriptDebuggerCodeFinderWidgetGanze Worte Whole wordsQScriptDebuggerCodeFinderWidgetNameNameQScriptDebuggerLocalsModelWertValueQScriptDebuggerLocalsModel EbeneLevelQScriptDebuggerStackModel StelleLocationQScriptDebuggerStackModelNameNameQScriptDebuggerStackModelBedingung:Breakpoint Condition: QScriptEdit.Haltepunkt deaktivierenDisable Breakpoint QScriptEdit*Haltepunkt aktivierenEnable Breakpoint QScriptEdit*Haltepunkt umschaltenToggle Breakpoint QScriptEditHaltepunkte BreakpointsQScriptEngineDebuggerKonsoleConsoleQScriptEngineDebuggerDebug-Ausgabe Debug OutputQScriptEngineDebuggerFehlerausgabe Error LogQScriptEngineDebugger Geladene SkripteLoaded ScriptsQScriptEngineDebugger Lokale VariablenLocalsQScriptEngineDebugger$Qt Script DebuggerQt Script DebuggerQScriptEngineDebugger SucheSearchQScriptEngineDebugger StapelStackQScriptEngineDebuggerAnsichtViewQScriptEngineDebuggerSchlieenCloseQScriptNewBreakpointWidgetEndeBottom QScrollBarLinker Rand Left edge QScrollBar*Eine Zeile nach unten Line down QScrollBarAusrichtenLine up QScrollBar*Eine Seite nach unten Page down QScrollBar*Eine Seite nach links Page left QScrollBar,Eine Seite nach rechts Page right QScrollBar(Eine Seite nach obenPage up QScrollBarPositionPosition QScrollBarRechter Rand Right edge QScrollBar&Nach unten scrollen Scroll down QScrollBar Hierher scrollen Scroll here QScrollBar&Nach links scrollen Scroll left QScrollBar(Nach rechts scrollen Scroll right QScrollBar$Nach oben scrollen Scroll up QScrollBar AnfangTop QScrollBarV%1: Die Unix-Schlsseldatei existiert nicht%1: UNIX key file doesn't exist QSharedMemory*%1: existiert bereits%1: already exists QSharedMemoryv%1: Die Grenangabe fr die Erzeugung ist kleiner als Null%1: create size is less then 0 QSharedMemory&%1: existiert nicht%1: doesn't exist QSharedMemory&%1: existiert nicht%1: doesn't exists QSharedMemoryD%1: ftok-Aufruf ist fehlgeschlagen%1: ftok failed QSharedMemory&%1: Ungltige Gre%1: invalid size QSharedMemory4%1: Fehlerhafter Schlssel %1: key error QSharedMemoryH%1: Ungltige Schlsselangabe (leer)%1: key is empty QSharedMemory&%1: nicht verbunden%1: not attached QSharedMemoryF%1: Keine Ressourcen mehr verfgbar%1: out of resources QSharedMemory,%1: Zugriff verweigert%1: permission denied QSharedMemoryX%1: Die Abfrage der Gre ist fehlgeschlagen%1: size query failed QSharedMemoryl%1: Ein systembedingtes Limit der Gre wurde erreicht$%1: system-imposed size restrictions QSharedMemory6%1: Sperrung fehlgeschlagen%1: unable to lock QSharedMemoryR%1: Es kann kein Schlssel erzeugt werden%1: unable to make key QSharedMemoryt%1: Es kann kein Schlssel fr die Sperrung gesetzt werden%1: unable to set key on lock QSharedMemory^%1: Die Sperrung konnte nicht aufgehoben werden%1: unable to unlock QSharedMemory2%1: Unbekannter Fehler %2%1: unknown error %2 QSharedMemory++ QShortcut,Lesezeichen hinzufgen Add Favorite QShortcut*Helligkeit einstellenAdjust Brightness QShortcutAltAlt QShortcutAnwendung linksApplication Left QShortcut Anwendung rechtsApplication Right QShortcut$Audiospur wechselnAudio Cycle Track QShortcutAudio vorspulen Audio Forward QShortcut>Audio zufllige Auswahl spielenAudio Random Play QShortcut"Audio wiederholen Audio Repeat QShortcut Audio rckspulen Audio Rewind QShortcutAbwesendAway QShortcut ZurckBack QShortcut(Hinterstes nach vorn Back Forward QShortcutRcktaste Backspace QShortcutRck-TabBacktab QShortcutBass-Boost Bass Boost QShortcut Bass - Bass Down QShortcut Bass +Bass Up QShortcutBatterieBattery QShortcutBluetooth Bluetooth QShortcutBuchBook QShortcutBrowserBrowser QShortcutCDCD QShortcutRechner Calculator QShortcut AnrufCall QShortcutScharfstellen Camera Focus QShortcutAuslserCamera Shutter QShortcutFeststelltaste Caps Lock QShortcutFeststelltasteCapsLock QShortcutLschenClear QShortcutZugriff lschen Clear Grab QShortcutSchlieenClose QShortcutCode-Eingabe Code input QShortcutCommunity Community QShortcutKontext1Context1 QShortcutKontext2Context2 QShortcutKontext3Context3 QShortcutKontext4Context4 QShortcutKopierenCopy QShortcutStrgCtrl QShortcutAusschneidenCut QShortcutDOSDOS QShortcutEntfDel QShortcutLschenDelete QShortcutAnzeigenDisplay QShortcutDokumente Documents QShortcut RunterDown QShortcutEisu Shift Eisu Shift QShortcutEisu toggle Eisu toggle QShortcutAuswerfenEject QShortcutEndeEnd QShortcut EnterEnter QShortcutEscEsc QShortcut EscapeEscape QShortcutF%1F%1 QShortcutFavoriten Favorites QShortcutFinanzenFinance QShortcutUmdrehenFlip QShortcutVorwrtsForward QShortcut SpielGame QShortcutLosGo QShortcutHangeulHangul QShortcutHangeul-Banja Hangul Banja QShortcutHangeul Ende Hangul End QShortcutHangeul-Hanja Hangul Hanja QShortcutHangeul-Jamo Hangul Jamo QShortcutHangeul-Jeonja Hangul Jeonja QShortcut"Hangeul-PostHanjaHangul PostHanja QShortcut Hangeul-PreHanjaHangul PreHanja QShortcutHangeul-Romaja Hangul Romaja QShortcutHangeul SpecialHangul Special QShortcutHangeul Anfang Hangul Start QShortcutAuflegenHangup QShortcutHankakuHankaku QShortcut HilfeHelp QShortcut HenkanHenkan QShortcutHibernate Hibernate QShortcutHiraganaHiragana QShortcut"Hiragana KatakanaHiragana Katakana QShortcutVerlaufHistory QShortcutPos1Home QShortcutHome Office Home Office QShortcutStartseite Home Page QShortcut&Empfohlene Verweise Hot Links QShortcut EinfgIns QShortcutEinfgenInsert QShortcutKana Lock Kana Lock QShortcutKana Shift Kana Shift QShortcut KanjiKanji QShortcutKatakanaKatakana QShortcut6Tastaturbeleuchtung dunklerKeyboard Brightness Down QShortcut4Tastaturbeleuchtung hellerKeyboard Brightness Up QShortcut6Tastaturbeleuchtung Ein/AusKeyboard Light On/Off QShortcutTastaturmen Keyboard Menu QShortcut WahlwiederholungLast Number Redial QShortcut(0) starten Launch (0) QShortcut(1) starten Launch (1) QShortcut(2) starten Launch (2) QShortcut(3) starten Launch (3) QShortcut(4) starten Launch (4) QShortcut(5) starten Launch (5) QShortcut(6) starten Launch (6) QShortcut(7) starten Launch (7) QShortcut(8) starten Launch (8) QShortcut(9) starten Launch (9) QShortcut(A) starten Launch (A) QShortcut(B) starten Launch (B) QShortcut(C) starten Launch (C) QShortcut(D) starten Launch (D) QShortcut(E) starten Launch (E) QShortcut(F) starten Launch (F) QShortcutMail starten Launch Mail QShortcut*Medienspieler starten Launch Media QShortcut LinksLeft QShortcutBeleuchtung LightBulb QShortcut LogoffLogoff QShortcutWeiterleitung Mail Forward QShortcut MarktMarket QShortcut MassyoMassyo QShortcutNchster Media Next QShortcut Pause Media Pause QShortcutWiedergabe Media Play QShortcutVorherigerMedia Previous QShortcutAufzeichnen Media Record QShortcut Stopp Media Stop QShortcutVersammlungMeeting QShortcutMenMenu QShortcutMen PBMenu PB QShortcutMessenger Messenger QShortcutMetaMeta QShortcutMonitor dunklerMonitor Brightness Down QShortcutMonitor hellerMonitor Brightness Up QShortcutMuhenkanMuhenkan QShortcut$Mehrere VorschlgeMultiple Candidate QShortcut MusikMusic QShortcutMeine OrteMy Sites QShortcutNachrichtenNews QShortcutNeinNo QShortcut*Zahlen-FeststelltasteNum Lock QShortcut*Zahlen-FeststelltasteNumLock QShortcut*Zahlen-Feststelltaste Number Lock QShortcutURL ffnenOpen URL QShortcut OptionOption QShortcutBild abwrts Page Down QShortcutBild aufwrtsPage Up QShortcutEinfgenPaste QShortcut PausePause QShortcutBild abwrtsPgDown QShortcutBild aufwrtsPgUp QShortcutTelefonPhone QShortcut BilderPictures QShortcutAusschalten Power Off QShortcut(Vorheriger VorschlagPrevious Candidate QShortcut DruckPrint QShortcut$Bildschirm drucken Print Screen QShortcutAktualisierenRefresh QShortcutNeu ladenReload QShortcutAntwortenReply QShortcut ReturnReturn QShortcut RechtsRight QShortcut RomajiRomaji QShortcut Fenster rotierenRotate Windows QShortcutRotation KB Rotation KB QShortcutRotation PB Rotation PB QShortcutSpeichernSave QShortcut"Bildschirmschoner Screensaver QShortcut*Rollen-Feststelltaste Scroll Lock QShortcut*Rollen-Feststelltaste ScrollLock QShortcut SuchenSearch QShortcutAuswhlenSelect QShortcut SendenSend QShortcutUmschaltShift QShortcutShopShop QShortcutSchlafmodusSleep QShortcutLeertasteSpace QShortcut&Rechtschreibprfung Spellchecker QShortcut"Bildschirm teilen Split Screen QShortcutSpreadsheet Spreadsheet QShortcutStandbyStandby QShortcutAbbrechenStop QShortcutUntertitelSubtitle QShortcut HilfeSupport QShortcut PauseSuspend QShortcut SysReqSysReq QShortcutSystem RequestSystem Request QShortcutTabTab QShortcutTask-Leiste Task Panel QShortcutTerminalTerminal QShortcutZeitTime QShortcut"Anrufen/AufhngenToggle Call/Hangup QShortcut Wiedergabe/PauseToggle Media Play/Pause QShortcutWerkzeugeTools QShortcutHauptmenTop Menu QShortcutTourokuTouroku QShortcut ReiseTravel QShortcutHhen - Treble Down QShortcutHhen + Treble Up QShortcutUltra Wide BandUltra Wide Band QShortcutHochUp QShortcut VideoVideo QShortcutAnsichtView QShortcutSprachwahl Voice Dial QShortcutLautstrke - Volume Down QShortcutTon aus Volume Mute QShortcutLautstrke + Volume Up QShortcutInternetWWW QShortcutAufweckenWake Up QShortcut WebCamWebCam QShortcutDrahtlosWireless QShortcut TextverarbeitungWord Processor QShortcutXFerXFer QShortcutJaYes QShortcutZenkakuZenkaku QShortcutZenkaku HankakuZenkaku Hankaku QShortcutVergrernZoom In QShortcutVerkleinernZoom Out QShortcut iTouchiTouch QShortcut*Eine Seite nach unten Page downQSlider*Eine Seite nach links Page leftQSlider,Eine Seite nach rechts Page rightQSlider(Eine Seite nach obenPage upQSliderPositionPositionQSliderNDieser Adresstyp wird nicht untersttztAddress type not supportedQSocks5SocketEngine`Der SOCKSv5-Server hat die Verbindung verweigert(Connection not allowed by SOCKSv5 serverQSocks5SocketEnginejDer Proxy-Server hat die Verbindung vorzeitig beendet&Connection to proxy closed prematurelyQSocks5SocketEnginevDer Proxy-Server hat den Aufbau einer Verbindung verweigertConnection to proxy refusedQSocks5SocketEngineBei der Verbindung mit dem Proxy-Server wurde ein Zeitlimit berschrittenConnection to proxy timed outQSocks5SocketEngine~Allgemeiner Fehler bei der Kommunikation mit dem SOCKSv5-ServerGeneral SOCKSv5 server failureQSocks5SocketEnginefDas Zeitlimit fr die Operation wurde berschrittenNetwork operation timed outQSocks5SocketEnginetDie Authentifizierung beim Proxy-Server ist fehlgeschlagenProxy authentication failedQSocks5SocketEngine|Die Authentifizierung beim Proxy-Server ist fehlgeschlagen: %1Proxy authentication failed: %1QSocks5SocketEngineZDer Proxy-Server konnte nicht gefunden werdenProxy host not foundQSocks5SocketEngineDProtokoll-Fehler (SOCKS Version 5)SOCKS version 5 protocol errorQSocks5SocketEngine\Dieses SOCKSv5-Kommando wird nicht untersttztSOCKSv5 command not supportedQSocks5SocketEngineTTL verstrichen TTL expiredQSocks5SocketEngine|Unbekannten Fehlercode vom SOCKSv5-Proxy-Server erhalten: 0x%1%Unknown SOCKSv5 proxy error code 0x%1QSocks5SocketEngineAbbrechenCancelQSoftKeyManager FertigDoneQSoftKeyManagerBeendenExitQSoftKeyManagerOkOkQSoftKeyManagerOptionenOptionsQSoftKeyManagerAuswhlenSelectQSoftKeyManagerWenigerLessQSpinBoxMehrMoreQSpinBoxAbbrechenCancelQSql*nderungen verwerfen?Cancel your edits?QSqlBesttigenConfirmQSqlLschenDeleteQSql2Diesen Datensatz lschen?Delete this record?QSqlEinfgenInsertQSqlNeinNoQSql*nderungen speichern? Save edits?QSqlAktualisierenUpdateQSqlJaYesQSqlOhne Schlssel kann kein Zertifikat zur Verfgung gestellt werden, %1,Cannot provide a certificate with no key, %1 QSslSocketnEs konnte keine SSL-Kontextstruktur erzeugt werden (%1)Error creating SSL context (%1) QSslSocket\Es konnte keine SSL-Sitzung erzeugt werden, %1Error creating SSL session, %1 QSslSocket\Es konnte keine SSL-Sitzung erzeugt werden: %1Error creating SSL session: %1 QSslSocketvIm Ablauf des SSL-Protokolls ist ein Fehler aufgetreten: %1Error during SSL handshake: %1 QSslSocketjDas lokale Zertifikat konnte nicht geladen werden, %1#Error loading local certificate, %1 QSslSocketjDer private Schlssel konnte nicht geladen werden, %1Error loading private key, %1 QSslSocketRBeim Lesen ist ein Fehler aufgetreten: %1Error while reading: %1 QSslSocketPUngltige oder leere Schlsselliste (%1)!Invalid or empty cipher list (%1) QSslSocket`Keines der Zertifikate konnte verifiziert werden!No certificates could be verified QSslSocketKein FehlerNo error QSslSocketxEines der Zertifikate der Zertifizierungsstelle ist ungltig%One of the CA certificates is invalid QSslSocketDer private Schlssel passt nicht zum ffentlichen Schlssel, %1+Private key does not certify public key, %1 QSslSocketrDie Lnge des basicConstraints-Pfades wurde berschritten QUndoModel WiederherstellenRedo QUndoStackRckgngigUndo QUndoStack@Unicode-Kontrollzeichen einfgen Insert Unicode control characterQUnicodeControlCharacterMenuHLRE Start of left-to-right embedding$LRE Start of left-to-right embeddingQUnicodeControlCharacterMenu,LRM Left-to-right markLRM Left-to-right markQUnicodeControlCharacterMenuFLRO Start of left-to-right override#LRO Start of left-to-right overrideQUnicodeControlCharacterMenu<PDF Pop directional formattingPDF Pop directional formattingQUnicodeControlCharacterMenuHRLE Start of right-to-left embedding$RLE Start of right-to-left embeddingQUnicodeControlCharacterMenu,RLM Right-to-left markRLM Right-to-left markQUnicodeControlCharacterMenuFRLO Start of right-to-left override#RLO Start of right-to-left overrideQUnicodeControlCharacterMenu*ZWJ Zero width joinerZWJ Zero width joinerQUnicodeControlCharacterMenu4ZWNJ Zero width non-joinerZWNJ Zero width non-joinerQUnicodeControlCharacterMenu*ZWSP Zero width spaceZWSP Zero width spaceQUnicodeControlCharacterMenuFDer URL kann nicht angezeigt werdenCannot show URL QWebFrameVDieser Mime-Typ kann nicht angezeigt werdenCannot show mimetype QWebFrame2Die Datei existiert nichtFile does not exist QWebFrameDas Laden des Rahmens wurde durch eine nderung der Richtlinien unterbrochen'Frame load interrupted by policy change QWebFrame0Anfrage wurde abgewiesenRequest blocked QWebFrame2Anfrage wurde abgebrochenRequest cancelled QWebFrame %1 (%2x%3 Pixel)%1 (%2x%3 pixels)QWebPageR%1 Tage %2 Stunden %3 Minuten %4 Sekunden&%1 days %2 hours %3 minutes %4 secondsQWebPageB%1 Stunden %2 Minuten %3 Sekunden%1 hours %2 minutes %3 secondsQWebPage,%1 Minuten %2 Sekunden%1 minutes %2 secondsQWebPage%1 Sekunden %1 secondsQWebPageEine Datei%n Dateien %n file(s)QWebPage.In Wrterbuch aufnehmenAdd To DictionaryQWebPage,Linksbndig ausrichten Align LeftQWebPage.Rechtsbndig ausrichten Align RightQWebPageAudio-Element Audio ElementQWebPageBAudio-Steuerung und Statusanzeige2Audio element playback controls and status displayQWebPage4Ungltige HTTP-AnforderungBad HTTP requestQWebPageAbspielenBegin playbackQWebPageFettBoldQWebPageEndeBottomQWebPageZentrierenCenterQWebPagebGrammatik mit Rechtschreibung zusammen berprfenCheck Grammar With SpellingQWebPage,Rechtschreibung prfenCheck SpellingQWebPagebRechtschreibung whrend des Schreibens berprfenCheck Spelling While TypingQWebPageDurchsuchen Choose FileQWebPageBGespeicherte Suchanfragen lschenClear recent searchesQWebPageKopierenCopyQWebPageGrafik kopieren Copy ImageQWebPage*Link-Adresse kopieren Copy LinkQWebPage Status des FilmsCurrent movie statusQWebPage*Abspielzeit des FilmsCurrent movie timeQWebPageAusschneidenCutQWebPageVorgabeDefaultQWebPage>Bis zum Ende des Wortes lschenDelete to the end of the wordQWebPageBBis zum Anfang des Wortes lschenDelete to the start of the wordQWebPageSchreibrichtung DirectionQWebPageSpielzeit Elapsed TimeQWebPage FontsFontsQWebPageVollbild-TasteFullscreen ButtonQWebPage ZurckGo BackQWebPageVor Go ForwardQWebPageXRechtschreibung und Grammatik nicht anzeigenHide Spelling and GrammarQWebPageIgnorierenIgnoreQWebPageIgnorieren Ignore Grammar context menu itemIgnoreQWebPage Unbegrenzte ZeitIndefinite timeQWebPageEinrckenIndentQWebPage4Liste mit Punkten einfgenInsert Bulleted ListQWebPage4Nummerierte Liste einfgenInsert Numbered ListQWebPage&Neue Zeile einfgenInsert a new lineQWebPage0Neuen Abschnitt einfgenInsert a new paragraphQWebPage PrfenInspectQWebPage KursivItalicQWebPage.JavaScript-Hinweis - %1JavaScript Alert - %1QWebPage6JavaScript-Besttigung - %1JavaScript Confirm - %1QWebPage.JavaScript-Problem - %1JavaScript Problem - %1QWebPageFJavaScript-Eingabeaufforderung - %1JavaScript Prompt - %1QWebPageAusrichtenJustifyQWebPageLinker Rand Left edgeQWebPage*Von links nach rechts Left to RightQWebPage Live-bertragungLive BroadcastQWebPageLdt... Loading...QWebPage2Im Wrterbuch nachschauenLook Up In DictionaryQWebPage Fehlendes PluginMissing Plug-inQWebPageRPositionsmarke auf Ende des Blocks setzen'Move the cursor to the end of the blockQWebPageXPositionsmarke auf Ende des Dokuments setzen*Move the cursor to the end of the documentQWebPageHPositionsmarke auf Zeilenende setzen&Move the cursor to the end of the lineQWebPageTPositionsmarke auf nchstes Zeichen setzen%Move the cursor to the next characterQWebPageNPositionsmarke auf nchste Zeile setzen Move the cursor to the next lineQWebPageNPositionsmarke auf nchstes Wort setzen Move the cursor to the next wordQWebPageXPositionsmarke auf vorheriges Zeichen setzen)Move the cursor to the previous characterQWebPageRPositionsmarke auf vorherige Zeile setzen$Move the cursor to the previous lineQWebPagePPositionsmarke auf vorherige Wort setzen$Move the cursor to the previous wordQWebPageVPositionsmarke auf Anfang des Blocks setzen)Move the cursor to the start of the blockQWebPage\Positionsmarke auf Anfang des Dokuments setzen,Move the cursor to the start of the documentQWebPageLPositionsmarke auf Zeilenanfang setzen(Move the cursor to the start of the lineQWebPageAbspielzeitMovie time scrubberQWebPageJGriff zur Einstellung der AbspielzeitMovie time scrubber thumbQWebPage Stummschalttaste Mute ButtonQWebPage.Schalte Tonspuren stummMute audio tracksQWebPage2Keine Vorschlge gefundenNo Guesses FoundQWebPage:Es ist keine Datei ausgewhltNo file selectedQWebPageJEs existieren noch keine SuchanfragenNo recent searchesQWebPageFrame ffnen Open FrameQWebPage<Grafik in neuem Fenster ffnen Open ImageQWebPageAdresse ffnen Open LinkQWebPage.In neuem Fenster ffnenOpen in New WindowQWebPage&Einrckung aufhebenOutdentQWebPage UmrissOutlineQWebPage*Eine Seite nach unten Page downQWebPage*Eine Seite nach links Page leftQWebPage,Eine Seite nach rechts Page rightQWebPage(Eine Seite nach obenPage upQWebPageEinfgenPasteQWebPage<Einfgen und dem Stil anpassenPaste and Match StyleQWebPagePause-Knopf Pause ButtonQWebPage PausePause playbackQWebPageAbspielknopf Play ButtonQWebPage>Film im Vollbildmodus abspielenPlay movie in full-screen modeQWebPage,Bisherige SuchanfragenRecent searchesQWebPagebMaximal Anzahl von Weiterleitungen wurde erreichtRedirection limit reachedQWebPageNeu ladenReloadQWebPage"Verbleibende ZeitRemaining TimeQWebPage6Verbleibende Zeit des FilmsRemaining movie timeQWebPage,Formatierung entfernenRemove formattingQWebPageRcksetzenResetQWebPage<Setze Film auf Echtzeit zurck#Return streaming movie to real-timeQWebPage0Kehre zu Echtzeit zurckReturn to Real-time ButtonQWebPageRckspultaste Rewind ButtonQWebPage"Film zurckspulen Rewind movieQWebPageRechter Rand Right edgeQWebPage*Von rechts nach links Right to LeftQWebPage,Grafik speichern unter Save ImageQWebPage.Ziel speichern unter... Save Link...QWebPage&Nach unten scrollen Scroll downQWebPage Hierher scrollen Scroll hereQWebPage&Nach links scrollen Scroll leftQWebPage(Nach rechts scrollen Scroll rightQWebPage$Nach oben scrollen Scroll upQWebPageIm Web suchenSearch The WebQWebPageRcklauftasteSeek Back ButtonQWebPageVorlauftasteSeek Forward ButtonQWebPage2Schnelles RckwrtssuchenSeek quickly backQWebPage0Schnelles VorwrtssuchenSeek quickly forwardQWebPageAlles auswhlen Select allQWebPageBBis zum Ende des Blocks markierenSelect to the end of the blockQWebPageHBis zum Ende des Dokuments markieren!Select to the end of the documentQWebPage8Bis zum Zeilenende markierenSelect to the end of the lineQWebPageDBis zum nchsten Zeichen markierenSelect to the next characterQWebPage@Bis zur nchsten Zeile markierenSelect to the next lineQWebPage>Bis zum nchsten Wort markierenSelect to the next wordQWebPageHBis zum vorherigen Zeichen markieren Select to the previous characterQWebPageDBis zur vorherigen Zeile markierenSelect to the previous lineQWebPageBBis zum vorherigen Wort markierenSelect to the previous wordQWebPageFBis zum Anfang des Blocks markieren Select to the start of the blockQWebPageLBis zum Anfang des Dokuments markieren#Select to the start of the documentQWebPage<Bis zum Zeilenanfang markierenSelect to the start of the lineQWebPageLRechtschreibung und Grammatik anzeigenShow Spelling and GrammarQWebPageSchiebereglerSliderQWebPage&Schieberegler-Griff Slider ThumbQWebPageRechtschreibungSpellingQWebPageStatusanzeigeStatus DisplayQWebPageAbbrechenStopQWebPageDurchgestrichen StrikethroughQWebPage SendenSubmitQWebPage SendenQSubmit (input element) alt text for elements with no alt, title, or valueSubmitQWebPageTiefstellung SubscriptQWebPageHochstellung SuperscriptQWebPageSchreibrichtungText DirectionQWebPageDas Skript dieser Webseite ist fehlerhaft. Mchten Sie es anhalten?RThe script on this page appears to have a problem. Do you want to stop the script?QWebPageDieser Index verfgt ber eine Suchfunktion. Geben Sie einen Suchbegriff ein:3This is a searchable index. Enter search keywords: QWebPage AnfangTopQWebPageUnterstrichen UnderlineQWebPageUnbekanntUnknownQWebPage>Abstelltaste fr Stummschaltung Unmute ButtonQWebPageJStummschaltung der Tonspuren aufhebenUnmute audio tracksQWebPageVideo-Element Video ElementQWebPageBVideo-Steuerung und Statusanzeige2Video element playback controls and status displayQWebPage$Web Inspector - %2Web Inspector - %2QWebPageDirekthilfe What's This?QWhatsThisAction**QWidgetAb&schlieen&FinishQWizard &Hilfe&HelpQWizard&Weiter&NextQWizard&Weiter >&Next >QWizard< &Zurck< &BackQWizardAbbrechenCancelQWizardAnwendenCommitQWizard WeiterContinueQWizard FertigDoneQWizard ZurckGo BackQWizard HilfeHelpQWizard%1 - [%2] %1 - [%2] QWorkspaceSchl&ieen&Close QWorkspaceVer&schieben&Move QWorkspace"Wieder&herstellen&Restore QWorkspace&Gre ndern&Size QWorkspace&Herabrollen&Unshade QWorkspaceSchlieenClose QWorkspaceMa&ximieren Ma&ximize QWorkspaceM&inimieren Mi&nimize QWorkspaceMinimierenMinimize QWorkspace Wiederherstellen Restore Down QWorkspace&AufrollenSh&ade QWorkspace.Im &Vordergrund bleiben Stay on &Top QWorkspacefehlende Kodierung-Deklaration oder Standalone-Deklaration beim Parsen der XML-DeklarationYencoding declaration or standalone declaration expected while reading the XML declarationQXmlhFehler in der Text-Deklaration einer externen Entity3error in the text declaration of an external entityQXmlFFehler beim Parsen eines Kommentars$error occurred while parsing commentQXmlZFehler beim Parsen des Inhalts eines Elements$error occurred while parsing contentQXmlXFehler beim Parsen der Dokumenttypdefinition5error occurred while parsing document type definitionQXmlBFehler beim Parsen eines Elements$error occurred while parsing elementQXmlBFehler beim Parsen einer Referenz&error occurred while parsing referenceQXml4Konsument lste Fehler auserror triggered by consumerQXmlrin der DTD sind keine externen Entity-Referenzen erlaubt ;external parsed general entity reference not allowed in DTDQXmlin einem Attribut-Wert sind keine externen Entity-Referenzen erlaubtGexternal parsed general entity reference not allowed in attribute valueQXmlin einer DTD ist keine interne allgemeine Entity-Referenz erlaubt4internal general entity reference not allowed in DTDQXmldkein gltiger Name fr eine Processing-Instruktion'invalid name for processing instructionQXml^ein Buchstabe ist an dieser Stelle erforderlichletter is expectedQXml>mehrere Dokumenttypdefinitionen&more than one document type definitionQXmlkein Fehlerno error occurredQXml rekursive Entityrecursive entitiesQXml~fehlende Standalone-Deklaration beim Parsen der XML DeklarationAstandalone declaration expected while reading the XML declarationQXmlXElement-Tags sind nicht richtig geschachtelt tag mismatchQXml(unerwartetes Zeichenunexpected characterQXml6unerwartetes Ende der Dateiunexpected end of fileQXml~nicht-analysierte Entity-Referenz im falschen Kontext verwendet*unparsed entity reference in wrong contextQXml`fehlende Version beim Parsen der XML-Deklaration2version expected while reading the XML declarationQXmlXfalscher Wert fr die Standalone-Deklaration&wrong value for standalone declarationQXmlXFehler %1 in %2, bei Zeile %3, Spalte %4: %5)Error %1 in %2, at line %3, column %4: %5QXmlPatternistCLI&Fehler %1 in %2: %3Error %1 in %2: %3QXmlPatternistCLIUnbekannter OrtUnknown locationQXmlPatternistCLITWarnung in %1, bei Zeile %2, Spalte %3: %4(Warning in %1, at line %2, column %3: %4QXmlPatternistCLI"Warnung in %1: %2Warning in %1: %2QXmlPatternistCLI^%1 ist keine gltige Angabe fr eine PUBLIC-Id.#%1 is an invalid PUBLIC identifier. QXmlStreamX%1 ist kein gltiger Name fr die Kodierung.%1 is an invalid encoding name. QXmlStreamt%1 ist kein gltiger Name fr eine Prozessing-Instruktion.-%1 is an invalid processing instruction name. QXmlStream@erwartet, stattdessen erhalten ' , but got ' QXmlStream<Redefinition eines Attributes.Attribute redefined. QXmlStreamNDie Kodierung %1 wird nicht untersttztEncoding %1 is unsupported QXmlStreampEs wurde Inhalt mit einer ungltigen Kodierung gefunden.(Encountered incorrectly encoded content. QXmlStreamJDie Entity '%1' ist nicht deklariert.Entity '%1' not declared. QXmlStreamEs wurde  Expected  QXmlStream@Es wurden Zeichendaten erwartet.Expected character data. QXmlStreamXberzhliger Inhalt nach Ende des Dokuments.!Extra content at end of document. QXmlStreamBUngltige Namensraum-Deklaration.Illegal namespace declaration. QXmlStream.Ungltiges XML-Zeichen.Invalid XML character. QXmlStream(Ungltiger XML-Name.Invalid XML name. QXmlStream:Ungltige XML-Versionsangabe.Invalid XML version string. QXmlStreamhDie XML-Deklaration enthlt ein ungltiges Attribut.%Invalid attribute in XML declaration. QXmlStream4Ungltige Zeichenreferenz.Invalid character reference. QXmlStream(Ungltiges Dokument.Invalid document. QXmlStream.Ungltiger Entity-Wert.Invalid entity value. QXmlStreambDer Name der Prozessing-Instruktion ist ungltig.$Invalid processing instruction name. QXmlStreamxEine Parameter-Entity-Deklaration darf kein NDATA enthalten.&NDATA in parameter entity declaration. QXmlStreambDer Namensraum-Prfix '%1' wurde nicht deklariert"Namespace prefix '%1' not declared QXmlStreamDie Anzahl der ffnenden Elemente stimmt nicht mit der Anzahl der schlieenden Elemente berein. Opening and ending tag mismatch. QXmlStream>Vorzeitiges Ende des Dokuments.Premature end of document. QXmlStreamXEs wurde eine rekursive Entity festgestellt.Recursive entity detected. QXmlStreamvIm Attributwert wurde die externe Entity '%1' referenziert.5Reference to external entity '%1' in attribute value. QXmlStreambEs wurde die ungeparste Entity '%1' referenziert."Reference to unparsed entity '%1'. QXmlStreamfIm Inhalt ist die Zeichenfolge ']]>' nicht erlaubt.&Sequence ']]>' not allowed in content. QXmlStreamDer Wert fr das 'Standalone'-Attribut kann nur 'yes' oder 'no' sein."Standalone accepts only yes or no. QXmlStream6ffnendes Element erwartet.Start tag expected. QXmlStreamDas Standalone-Pseudoattribut muss der Kodierung unmittelbar folgen.?The standalone pseudo attribute must appear after the encoding. QXmlStream8Ungltig an dieser Stelle '  Unexpected ' QXmlStreamr'%1' ist kein gltiges Zeichen in einer public-id-Angabe./Unexpected character '%1' in public id literal. QXmlStreamRDiese XML-Version wird nicht untersttzt.Unsupported XML version. QXmlStreamDie XML-Deklaration befindet sich nicht am Anfang des Dokuments.)XML declaration not at start of document. QXmlStreamDie Ausdrcke %1 und %2 passen jeweils auf den Anfang oder das Ende einer beliebigen Zeile.,%1 and %2 match the start and end of a line. QtXmlPatternsDas Attribut %1 aus %2 muss die Verwendung '%3' spezifizieren, wie im Basistyp %4.9%1 attribute in %2 must have %3 use like in base type %4. QtXmlPatternsDas Attribut %1 in einem abgeleiteten komplexen Typ muss wie im Basistyp '%2' sein.B%1 attribute in derived complex type must be %2 like in base type. QtXmlPatternsDas Attribut %1 des Elements %2 enthlt ungltigen Inhalt: {%3} ist kein Wert des Typs %4.T%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4. QtXmlPatternsDas Attribut %1 des Elements %2 enthlt ungltigen Inhalt: {%3}.:%1 attribute of %2 element contains invalid content: {%3}. QtXmlPatternsDer Wert des Attributs %1 des Elements %2 ist grer als der des Attributs %3.>%1 attribute of %2 element has larger value than %3 attribute. QtXmlPatternsrDas Attribut %1 des Elements %2 kann nur %3 oder %4 sein.,%1 attribute of %2 element must be %3 or %4. QtXmlPatternsDas Attribut %1 des Elements %2 muss %3, %4 oder eine Liste der URIs enthalten.A%1 attribute of %2 element must contain %3, %4 or a list of URIs. QtXmlPatternsDer Wert des Attributs %1 des Elements %2 muss entweder %3 oder die anderen Werte enthalten.F%1 attribute of %2 element must either contain %3 or the other values. QtXmlPatternsDas Attribut %1 des Elements %2 kann nur einen der Werte %3 oder %4 haben.9%1 attribute of %2 element must have a value of %3 or %4. QtXmlPatternsnDas Attribut %1 des Elements %2 muss den Wert %3 haben.3%1 attribute of %2 element must have a value of %3. QtXmlPatternsDas Attribut %1 des Elements %2 muss den Wert %3 haben, da das Attribut %4 gesetzt ist.R%1 attribute of %2 element must have the value %3 because the %4 attribute is set. QtXmlPatternsfDas Attribut %1 des Elements %2 kann nicht %3 sein.*%1 attribute of %2 element must not be %3. QtXmlPatterns:%1 kann nicht bestimmt werden%1 cannot be retrieved QtXmlPatterns~%1 kann keinen komplexen Basistyp haben, der '%2' spezifiziert./%1 cannot have complex base type that has a %2. QtXmlPatternsh%1 enthlt eine Facette %2 mit ungltigen Daten: %3.+%1 contains %2 facet with invalid data: %3. QtXmlPatterns6%1 enthlt ungltige Daten.%1 contains invalid data. QtXmlPatterns%1 enthlt Oktette, die in der Kodierung %2 nicht zulssig sind.E%1 contains octets which are disallowed in the requested encoding %2. QtXmlPatternsDas Element %2 (%1) ist keine gltige Einschrnkung des berschriebenen Elements (%3): %4.L%1 element %2 is not a valid restriction of the %3 element it redefines: %4. QtXmlPatternsDer Wert des Attributs %2 des Elements %1 kann nur %3 oder %4 sein.C%1 element cannot have %2 attribute with value other than %3 or %4. QtXmlPatternsvDer Wert des Attributs %2 des Elements %1 kann nur %3 sein.=%1 element cannot have %2 attribute with value other than %3. QtXmlPatternsDas Element %1 hat weder das Attribut %2 noch ein Unterelement %3.9%1 element has neither %2 attribute nor %3 child element. QtXmlPatternshDas Element %1 ist in diesem Kontext nicht zulssig.*%1 element is not allowed in this context. QtXmlPatternsfDas Element %1 ist in diesem Bereich nicht zulssig'%1 element is not allowed in this scope QtXmlPatternsWenn das Attribut %3 vorhanden ist, darf das Element %1 nicht im Element %2 vorkommen.G%1 element is not allowed inside %2 element if %3 attribute is present. QtXmlPatternsDas Element %1 kann nicht den Zielnamensraum %3 als Wert des Attributs '%2' spezifizieren.Y%1 element is not allowed to have the same %2 attribute value as the target namespace %3. QtXmlPatternsDas Element %1 muss entweder das Attribut %2 spezifizieren oder ber eines der Unterelemente %3 oder %4 verfgen.F%1 element must have either %2 attribute or %3 or %4 as child element. QtXmlPatternsDas Element %1 muss eines der Attribute %2 oder %3 spezifizieren./%1 element must have either %2 or %3 attribute. QtXmlPatternsDie Attribute %2 und %3 knnen nicht zusammen im Element %1 erscheinen.6%1 element must not have %2 and %3 attribute together. QtXmlPatternspDas Element %1 erfordert eines der Attribute %2 oder %3..%1 element requires either %2 or %3 attribute. QtXmlPatternsDas Element %1 darf kein Attribut %3 haben, wenn das Unterelement %2 vorhanden ist.>%1 element with %2 child element must not have a %3 attribute. QtXmlPatternsIn einem Schema ohne Namensraum muss das Element %1 ein Attribut %2 haben.V%1 element without %2 attribute is not allowed inside schema without target namespace. QtXmlPatternspDie Facetten %1 und %2 knnen nicht zusammen erscheinen.-%1 facet and %2 facet cannot appear together. QtXmlPatternsDie Facette %1 kann nicht %2 sein, wenn die Facette %3 des Basistyps %4 ist.5%1 facet cannot be %2 if %3 facet of base type is %4. QtXmlPatternsDie Facette %1 kann nicht %2 oder %3 sein, wenn die Facette %4 des Basistyps %5 ist.;%1 facet cannot be %2 or %3 if %4 facet of base type is %5. QtXmlPatternslDie Facette %1 steht im Widerspruch zu der Facette %2. %1 facet collides with %2 facet. QtXmlPatternstDie Facette %1 enthlt einen ungltigen regulren Ausdruck,%1 facet contains invalid regular expression QtXmlPatternshDie Facette %1 enthlt einen ungltigen Wert %2: %3.'%1 facet contains invalid value %2: %3. QtXmlPatternsDie Facette %1 muss grer oder gleich der Facette %2 des Basistyps sein.=%1 facet must be equal or greater than %2 facet of base type. QtXmlPatternsDie Facette %1 muss grer als die Facette %2 des Basistyps sein.4%1 facet must be greater than %2 facet of base type. QtXmlPatternsDie Facette %1 muss grer oder gleich der Facette %2 des Basistyps sein.@%1 facet must be greater than or equal to %2 facet of base type. QtXmlPatterns|Die Facette %1 muss kleiner der Facette %2 des Basistyps sein.1%1 facet must be less than %2 facet of base type. QtXmlPatternshDie Facette %1 muss kleiner als die Facette %2 sein.$%1 facet must be less than %2 facet. QtXmlPatternsDie Facette %1 muss kleiner oder gleich der Facette %2 des Basistyps sein.=%1 facet must be less than or equal to %2 facet of base type. QtXmlPatternsxDie Facette %1 muss kleiner oder gleich der Facette %2 sein.0%1 facet must be less than or equal to %2 facet. QtXmlPatternsDie Facette %1 muss denselben Wert wie die Facette %2 des Basistyps haben.;%1 facet must have the same value as %2 facet of base type. QtXmlPatternsBei %1 unterscheidet sich die Anzahl der Felder von der der Identittseinschrnkung %2, auf die es verweist.W%1 has a different number of fields from the identity constraint %2 that it references. QtXmlPatterns|%1 hat ein Attributssuchmuster, nicht jedoch sein Basistyp %2.7%1 has attribute wildcard but its base type %2 has not. QtXmlPatterns^%1 hat eine zirkulre Vererbung im Basistyp %2.,%1 has inheritance loop in its base type %2. QtXmlPatternsT%1 ist ein komplexer Typ. Eine "cast"-Operation zu komplexen Typen ist nicht mglich. Es knnen allerdings "cast"-Operationen zu atomare Typen wie %2 durchgefhrt werden.s%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. QtXmlPatterns.%1 ist kein gltiges %2%1 is an invalid %2 QtXmlPatterns%1 ist kein gltiger Modifikator fr regulre Ausdrcke. Gltige Modifikatoren sind:?%1 is an invalid flag for regular expressions. Valid flags are: QtXmlPatternsH%1 ist kein gltiger Namensraum-URI.%1 is an invalid namespace URI. QtXmlPatternsV%1 ist kein gltiger regulrer Ausdruck: %2/%1 is an invalid regular expression pattern: %2 QtXmlPatternsd%1 ist kein gltiger Name fr einen Vorlagenmodus.$%1 is an invalid template mode name. QtXmlPatternsD%1 ist ein unbekannter Schema-Typ.%1 is an unknown schema type. QtXmlPatternsPDie Kodierung %1 wird nicht untersttzt.%1 is an unsupported encoding. QtXmlPatternsJ%1 ist kein gltiges XML-1.0-Zeichen.$%1 is not a valid XML 1.0 character. QtXmlPatternst%1 ist kein gltiger Name fr eine Processing-Instruktion.4%1 is not a valid name for a processing-instruction. QtXmlPatternsR%1 ist kein gltiger numerischer Literal."%1 is not a valid numeric literal. QtXmlPatterns%1 ist kein gltiger Zielname einer Processing-Anweisung, es muss ein %2 Wert wie zum Beispiel %3 sein.Z%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. QtXmlPatternsL%1 ist kein gltiger Wert des Typs %2.#%1 is not a valid value of type %2. QtXmlPatternsN%1 ist keine ganzzahlige Minutenangabe.$%1 is not a whole number of minutes. QtXmlPatterns%1 darf nicht durch Erweiterung von %2 abgeleitet werden, da letzterer sie als final deklariert.S%1 is not allowed to derive from %2 by extension as the latter defines it as final. QtXmlPatterns%1 darf nicht durch Listen von %2 abgeleitet werden, da letzterer sie als final deklariert.N%1 is not allowed to derive from %2 by list as the latter defines it as final. QtXmlPatterns%1 darf nicht durch Einschrnkung von %2 abgeleitet werden, da letzterer sie als final deklariert.U%1 is not allowed to derive from %2 by restriction as the latter defines it as final. QtXmlPatterns%1 darf nicht durch Vereinigung von %2 abgeleitet werden, da sie letzterer sie als final deklariert.O%1 is not allowed to derive from %2 by union as the latter defines it as final. QtXmlPatternst%1 darf keinen Typ eines Mitglieds desselben Namens haben.E%1 is not allowed to have a member type with the same name as itself. QtXmlPatterns:%1 darf keine Facetten haben.%%1 is not allowed to have any facets. QtXmlPatterns%1 ist kein atomarer Typ. "cast"-Operation knnen nur zu atomaren Typen durchgefhrt werden.C%1 is not an atomic type. Casting is only possible to atomic types. QtXmlPatterns%1 befindet sich nicht unter den Attributdeklarationen im Bereich. Schema-Import wird nicht untersttzt.g%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. QtXmlPatterns0%1 ist nach %2 ungltig. %1 is not valid according to %2. QtXmlPatternsL%1 ist kein gltiger Wert des Typs %2.&%1 is not valid as a value of type %2. QtXmlPatterns\Der Ausdruck '%1' schliet Zeilenvorschbe ein%1 matches newline characters QtXmlPatternsAuf %1 muss %2 oder %3 folgen; es kann nicht am Ende der Ersetzung erscheinen.J%1 must be followed by %2 or %3, not at the end of the replacement string. QtXmlPatternsDas Attribut %1 des abgeleiteten Suchmusters ist keine gltige Einschrnkung des Attributs '%2' des BasissuchmustersH%1 of derived wildcard is not a valid restriction of %2 of base wildcard QtXmlPatternsDas Attribut %1 oder %2 des Verweises %3 entspricht nicht der Attributsdeklaration %4.T%1 or %2 attribute of reference %3 does not match with the attribute declaration %4. QtXmlPatterns%1 verweist auf eine Identittseinschrnkung %2, die weder ein '%3' noch ein '%4' Element ist.A%1 references identity constraint %2 that is no %3 or %4 element. QtXmlPatternsx%1 verweist auf ein unbekanntes Element %4 ('%2' oder '%3').*%1 references unknown %2 or %3 element %4. QtXmlPatterns%1 erfordert mindestens ein Argument; die Angabe %3 ist daher ungltig.%1 erfordert mindestens %n Argumente; die Angabe %3 ist daher ungltig.=%1 requires at least %n argument(s). %2 is therefore invalid. QtXmlPatternsr%1 hat nur %n Argument; die Angabe %2 ist daher ungltig.t%1 hat nur %n Argumente; die Angabe %2 ist daher ungltig.9%1 takes at most %n argument(s). %2 is therefore invalid. QtXmlPatterns"%1 wurde gerufen.%1 was called. QtXmlPatternsDie Facetten %1, %2, %3, %4, %5 und %6 sind bei Vererbung durch Listen nicht zulssig.F%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list. QtXmlPatternsDas Attribut '%1' enthlt einen ungltigen qualifizierten Namen: %2.2'%1' attribute contains invalid QName content: %2. QtXmlPatternsJEin Kommentar darf %1 nicht enthaltenA comment cannot contain %1 QtXmlPatternsLEin Kommentar darf nicht auf %1 enden.A comment cannot end with a %1. QtXmlPatternsEs wurde ein Sprachkonstrukt angetroffen, was in der aktuellen Sprache (%1) nicht erlaubt ist.LA construct was encountered which is disallowed in the current language(%1). QtXmlPatternsDie Deklaration des Default-Namensraums muss vor Funktions-, Variablen- oder Optionsdeklaration erfolgen.^A default namespace declaration must occur before function, variable, and option declarations. QtXmlPatternsEs wurde ein fehlerhafter direkter Element-Konstruktor gefunden. %1 endet mit %2.EA direct element constructor is not well-formed. %1 is ended with %2. QtXmlPatternsnEs existiert bereits eine Funktion mit der Signatur %1.0A function already exists with the signature %1. QtXmlPatternsEin Bibliotheksmodul kann nicht direkt ausgewertet werden, er muss von einem Hauptmodul importiert werden.VA library module cannot be evaluated directly. It must be imported from a main module. QtXmlPatternsDer Parameter einer Funktion kann nicht als Tunnel deklariert werden.Can not process unknown element %1, expected elements are: %2. QtXmlPatternsDas Unterelement fehlt im Bereich; mgliche Unterelemente wren: %1.HChild element is missing in that scope, possible child elements are: %1. QtXmlPatterns4Zirkulrer Verweis bei %1. Circular group reference for %1. QtXmlPatternsFZirkulre Vererbung im Basistyp %1.%Circular inheritance of base type %1. QtXmlPatternsVZirkulre Vererbung bei der Vereinigung %1.!Circular inheritance of union %1. QtXmlPatterns Der komplexe Typ %1 kann nicht durch Erweiterung von %2 abgeleitet werden, da letzterer ein '%3'-Element in seinem Inhaltsmodell hat.nComplex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model. QtXmlPatternsDer komplexe Typ %1 kann nicht vom Basistyp %2 abgeleitet werden%3.6Complex type %1 cannot be derived from base type %2%3. QtXmlPatternsDer komplexe Typ %1 enthlt ein Attribut %2 mit einer Einschrnkung des Werts, dessen Typ aber von %3 abgeleitet ist._Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3. QtXmlPatternshDer komplexe Typ %1 enthlt das Attribut %2 doppelt.,Complex type %1 contains attribute %2 twice. QtXmlPatternsDie Attributgruppe %1 enthlt zwei verschiedene Attribute mit Typen, die beide von %2 abgeleitet sind.WComplex type %1 contains two different attributes that both have types derived from %2. QtXmlPatternsDer komplexe Typ %1 hat ein dupliziertes Element %2 in seinem Inhaltsmodell.?Complex type %1 has duplicated element %2 in its content model. QtXmlPatternsnDer komplexe Typ %1 hat nicht-deterministischen Inhalt..Complex type %1 has non-deterministic content. QtXmlPatternsZDer komplexe Typ %1 kann nicht abstrakt sein..Complex type %1 is not allowed to be abstract. QtXmlPatternshDer komplexe Typ %1 kann nur einfachen Inhalt haben.)Complex type %1 must have simple content. QtXmlPatternsDer komplexe Typ %1 kann nur einen einfachen Typ als Basisklasse %2 haben.DComplex type %1 must have the same simple type as its base class %2. QtXmlPatternsDer komplexe Typ %1 einfachen Inhalts darf nicht vom komplexen Basistyp %2 abgeleitet werden.PComplex type %1 with simple content cannot be derived from complex base type %2. QtXmlPatternsDer komplexe Typ des abgeleiteten Elements %1 kann nicht vom Basiselement abgeleitet werden.OComplex type of derived element %1 cannot be validly derived from base element. QtXmlPatternsrEs wurde bereits eine Komponente mit der ID %1 definiert.1Component with ID %1 has been defined previously. QtXmlPatterns6Das Inhaltsmodell des komplexen Typs %1enthlt ein Element '%2'; es kann daher nicht durch Erweiterung von einem Typ abgeleitet werden, der nicht leer ist.pContent model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type. QtXmlPatternsDas Inhaltsmodell des komplexen Typs %1 ist keine gltige Erweiterung des Inhaltsmodells von %2.QContent model of complex type %1 is not a valid extension of content model of %2. QtXmlPatternsDer Inhalt des Attributs %1 des Elements %2 kann nicht vom Namensraum %3 stammen.DContent of %1 attribute of %2 element must not be from namespace %3. QtXmlPatternsDer Inhalt des Attributs %1 entspricht nicht der definierten Einschrnkung des Werts.@Content of attribute %1 does not match defined value constraint. QtXmlPatternsDer Inhalt des Attributs %1 entspricht nicht seiner Typdefinition: %2.?Content of attribute %1 does not match its type definition: %2. QtXmlPatternsDer Inhalt des Elements %1 entspricht nicht der definierten Einschrnkung des Werts.>Content of element %1 does not match defined value constraint. QtXmlPatternsDer Inhalt des Elements %1 entspricht nicht seiner Typdefinition: %2.=Content of element %1 does not match its type definition: %2. QtXmlPatternsPDaten vom Typ %1 knnen nicht leer sein.,Data of type %1 are not allowed to be empty. QtXmlPatternspDie Datumsangabe entspricht nicht der Suchmusterfacette./Date time content does not match pattern facet. QtXmlPatternszDie Datumsangabe entspricht nicht der Facette 'maxExclusive'.8Date time content does not match the maxExclusive facet. QtXmlPatternszDie Datumsangabe entspricht nicht der Facette 'maxInclusive'.8Date time content does not match the maxInclusive facet. QtXmlPatternszDie Datumsangabe entspricht nicht der Facette 'minExclusive'.8Date time content does not match the minExclusive facet. QtXmlPatternszDie Datumsangabe entspricht nicht der Facette 'minInclusive'.8Date time content does not match the minInclusive facet. QtXmlPatterns~Die Datumsangabe ist nicht in der Aufzhlungsfacette enthalten.9Date time content is not listed in the enumeration facet. QtXmlPatternsbDie Tagesangabe %1 ist fr den Monat %2 ungltig.Day %1 is invalid for month %2. QtXmlPatternslDie Tagesangabe %1 ist auerhalb des Bereiches %2..%3.#Day %1 is outside the range %2..%3. QtXmlPatternszDie Dezimalzahl entspricht nicht der Facette 'fractionDigit'.;Decimal content does not match in the fractionDigits facet. QtXmlPatternsvDie Dezimalzahl entspricht nicht der Facette 'totalDigits'.8Decimal content does not match in the totalDigits facet. QtXmlPatternshFr das Attribut %1 ist keine Deklaration verfgbar.,Declaration for attribute %1 does not exist. QtXmlPatternsfFr das Element %1 ist keine Deklaration verfgbar.*Declaration for element %1 does not exist. QtXmlPatternsErweiterung muss als Vererbungsmethode fr %1 verwendet werden, da der Basistyp %2 ein einfacher Typ ist.TDerivation method of %1 must be extension because the base type %2 is a simple type. QtXmlPatternsDas abgeleitete Attribut %1 existiert in der Basisdefinition nicht.;Derived attribute %1 does not exist in the base definition. QtXmlPatternsDas abgeleitete Attribut %1 entspricht nicht dem Suchmuster in der Basisdefinition.HDerived attribute %1 does not match the wildcard in the base definition. QtXmlPatternsDie abgeleitete Definition enthlt ein Element %1, was in der Basisdefinition nicht existiertUDerived definition contains an %1 element that does not exists in the base definition QtXmlPatternsDas abgeleitete Element %1 kann kein 'nillable'-Attribut haben, da das Basiselement keines spezifiziert.FDerived element %1 cannot be nillable as base element is not nillable. QtXmlPatternsDas abgeleitete Element %1 hat eine schwchere Einschrnkung des Wertes als der Basispartikel.BDerived element %1 has weaker value constraint than base particle. QtXmlPatternsIm abgeleiteten Element %1 fehlt Einschrnkung des Wertes, wie sie im Basispartikel definiert ist.KDerived element %1 is missing value constraint as defined in base particle. QtXmlPatternsDer abgeleitete Partikel gestattet Inhalt, der fr den Basispartikel nicht zulssig ist.IDerived particle allows content that is not allowed in the base particle. QtXmlPatterns\Das Element %1 fehlt im abgeleiteten Partikel.'Derived particle is missing element %1. QtXmlPatternsDas abgeleitete Suchmuster ist keine Untermenge des Basissuchmusters.6Derived wildcard is not a subset of the base wildcard. QtXmlPatternsDie Division eines Werts des Typs %1 durch %2 (kein numerischer Wert) ist nicht zulssig.@Dividing a value of type %1 by %2 (not-a-number) is not allowed. QtXmlPatternsDie Division eines Werts des Typs %1 durch %2 oder %3 (positiv oder negativ Null) ist nicht zulssig.LDividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. QtXmlPatternslDie Division (%1) durch Null (%2) ist nicht definiert.(Division (%1) by zero (%2) is undefined. QtXmlPatternsBDas Dokument ist kein XML-Schema.Document is not a XML schema. QtXmlPatternstDie Gleitkommazahl entspricht nicht der Suchmusterfacette.,Double content does not match pattern facet. QtXmlPatterns~Die Gleitkommazahl entspricht nicht der Facette 'maxExclusive'.5Double content does not match the maxExclusive facet. QtXmlPatterns~Die Gleitkommazahl entspricht nicht der Facette 'maxInclusive'.5Double content does not match the maxInclusive facet. QtXmlPatterns~Die Gleitkommazahl entspricht nicht der Facette 'minExclusive'.5Double content does not match the minExclusive facet. QtXmlPatterns~Die Gleitkommazahl entspricht nicht der Facette 'minInclusive'.5Double content does not match the minInclusive facet. QtXmlPatternsDie Gleitkommazahl ist nicht in der Aufzhlungsfacette enthalten.6Double content is not listed in the enumeration facet. QtXmlPatternshDer Elementname %1 kommt im Element %2 mehrfach vor.*Duplicated element names %1 in %2 element. QtXmlPatternsbIm einfachen Typ %1 kommen Facetten mehrfach vor.$Duplicated facets in simple type %1. QtXmlPatternsDie Angabe der Zeitdauer entspricht nicht der Suchmusterfacette..Duration content does not match pattern facet. QtXmlPatternsDie Angabe der Zeitdauer entspricht nicht der Facette 'maxExclusive'.7Duration content does not match the maxExclusive facet. QtXmlPatternsDie Angabe der Zeitdauer entspricht nicht der Facette 'maxInclusive'.7Duration content does not match the maxInclusive facet. QtXmlPatternsDie Angabe der Zeitdauer entspricht nicht der Facette 'minExclusive'.7Duration content does not match the minExclusive facet. QtXmlPatternsDie Angabe der Zeitdauer entspricht nicht der Facette 'minInclusive'.7Duration content does not match the minInclusive facet. QtXmlPatternsDie Angabe der Zeitdauer ist nicht in der Aufzhlungsfacette enthalten.8Duration content is not listed in the enumeration facet. QtXmlPatternsDie Namen von Vorlagenparametern mssen eindeutig sein, %1 existiert bereits.CEach name of a template parameter must be unique; %1 is duplicated. QtXmlPatternsDer effektive boolesche Wert einer Sequenz aus zwei oder mehreren atomaren Werten kann nicht berechnet werden.aEffective Boolean Value cannot be calculated for a sequence containing two or more atomic values. QtXmlPatternsJDas Element %1 ist bereits definiert.Element %1 already defined. QtXmlPatternsDas Element %1 kann nicht serialisiert werden, da es auerhalb des Dokumentenelements erscheint.OElement %1 can't be serialized because it appears outside the document element. QtXmlPatternsDas Element %1 kann keine anderen Element enthalten, da sein Inhalt festgelegt ist.DElement %1 cannot contain other elements, as it has a fixed content. QtXmlPatternshDas Element %1 kann keinen Sequenzkonstruktor haben..Element %1 cannot have a sequence constructor. QtXmlPatternsZDas Element %1 kann keine Kindelemente haben. Element %1 cannot have children. QtXmlPatternsRDas Element %1 enthlt ungltigen Inhalt.$Element %1 contains invalid content. QtXmlPatternsZDas Element %1 enthlt unzulssige Attribute.+Element %1 contains not allowed attributes. QtXmlPatterns`Das Element %1 enthlt unzulssigen Unterinhalt..Element %1 contains not allowed child content. QtXmlPatternsjDas Element %1 enthlt ein unzulssiges Unterelement..Element %1 contains not allowed child element. QtXmlPatterns^Das Element %1 enthlt unzulssigen Textinhalt.-Element %1 contains not allowed text content. QtXmlPatternsdDas Element %1 enthlt zwei Attribute des Typs %2..Element %1 contains two attributes of type %2. QtXmlPatternsfDas Element %1 enthlt ein unbekanntes Attribut %2.)Element %1 contains unknown attribute %2. QtXmlPatternsDas Element %1 entspricht nicht der Namensraumeinschrnkung des Basispartikels.LElement %1 does not match namespace constraint of wildcard in base particle. QtXmlPatternsEs existieren zwei Vorkommen verschiedenen Typs des Elements %1.-Element %1 exists twice with different types. QtXmlPatternsVDas Element %1 ist als abstrakt deklariert.#Element %1 is declared as abstract. QtXmlPatternsNBeim Element %1 fehlt ein Unterelement.$Element %1 is missing child element. QtXmlPatterns\Das Element %1 fehlt im abgeleiteten Partikel.*Element %1 is missing in derived particle. QtXmlPatternspBei dem Element %1 fehlt ein erforderliches Attribut %2.,Element %1 is missing required attribute %2. QtXmlPatternsdDas Element %1 darf nicht an dieser Stelle stehen.+Element %1 is not allowed at this location. QtXmlPatternsDas Element %1 ist in diesem Bereich nicht zulssig; mglich wren: %2.CElement %1 is not allowed in this scope, possible elements are: %2. QtXmlPatternsDas Element %1 darf keine Einschrnkung des Werts haben, wenn der Basistyp komplex ist.QElement %1 is not allowed to have a value constraint if its base type is complex. QtXmlPatternsDas Element %1 darf keine Einschrnkung des Werts haben, wenn sein Typ von %2 abgeleitet ist.TElement %1 is not allowed to have a value constraint if its type is derived from %2. QtXmlPatternsDas Element %1 kann nicht zu einer Substitutionsgruppe gehren, da es kein globales Element ist.\Element %1 is not allowed to have substitution group affiliation as it is no global element. QtXmlPatternsjDas Element %1 ist in diesem Bereich nicht definiert.(Element %1 is not defined in this scope. QtXmlPatterns|Das Element %1 hat das Attribut 'nillable' nicht spezifiziert.Element %1 is not nillable. QtXmlPatternsFDas Element %1 muss zuletzt stehen.Element %1 must come last. QtXmlPatternsDas Element %1 muss mindestens eines der Attribute %2 oder %3 haben.=Element %1 must have at least one of the attributes %2 or %3. QtXmlPatternsDas Element %1 muss entweder ein %2-Attribut haben oder es muss ein Sequenzkonstruktor verwendet werden.EElement %1 must have either a %2-attribute or a sequence constructor. QtXmlPatternstDas Element hat Inhalt, obwohl es 'nillable' spezifiziert.1Element contains content although it is nillable. QtXmlPatternsVDie Elementgruppe %1 ist bereits definiert.!Element group %1 already defined. QtXmlPatternsEs kann kein leerer Partikel von einem Partikel abgeleitet werden, der nicht leer ist.9Empty particle cannot be derived from non-empty particle. QtXmlPatternsUngltiger Inhalt einer Aufzhlungsfacette: {%1} ist kein Wert des Typs %2.KEnumeration facet contains invalid content: {%1} is not a value of type %2. QtXmlPatternsJDas Feld %1 hat keinen einfachen Typ.Field %1 has no simple type. QtXmlPatternsEine Beschrnkung auf einen festen Wert ist nicht zulssig, wenn das Element 'nillable' spezifiziert.:Fixed value constraint not allowed if element is nillable. QtXmlPatternsDie feste Einschrnkung des Wertes des Elements %1 unterscheidet sich von der Einschrnkung des Wertes des Basispartikels.TFixed value constraint of element %1 differs from value constraint in base particle. QtXmlPatternsJDer ID-Wert '%1' ist nicht eindeutig.ID value '%1' is not unique. QtXmlPatternsjDie Identittseinschrnkung %1 ist bereits definiert.'Identity constraint %1 already defined. QtXmlPatternsWenn beide Werte mit Zeitzonen angegeben werden, mssen diese bereinstimmen. %1 und %2 sind daher unzulssig.bIf both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. QtXmlPatternsDas Element %1 darf keines der Attribute %3 oder %4 haben, solange es nicht das Attribut %2 hat.EIf element %1 has no attribute %2, it cannot have attribute %3 or %4. QtXmlPatterns0Es kann kein Prfix angegeben werden, wenn das erste Argument leer oder eine leere Zeichenkette (kein Namensraum) ist. Es wurde der Prfix %1 angegeben.If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. QtXmlPatternsIm Konstruktor eines Namensraums darf der Wert des Namensraumes keine leere Zeichenkette sein.PIn a namespace constructor, the value for a namespace cannot be an empty string. QtXmlPatternsIn einem vereinfachten Stylesheet-Modul muss das Attribut %1 vorhanden sein.@In a simplified stylesheet module, attribute %1 must be present. QtXmlPatternsBei einem XSL-T-Suchmuster drfen nur die Achsen %2 oder %3 verwendet werden, nicht jedoch %1.DIn an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can. QtXmlPatternsBei einem XSL-T-Suchmuster darf die Funktion %1 kein drittes Argument haben.>In an XSL-T pattern, function %1 cannot have a third argument. QtXmlPatternsBei einem XSL-T-Suchmuster drfen nur die Funktionen %1 und %2, nicht jedoch %3 zur Suche verwendet werden.OIn an XSL-T pattern, only function %1 and %2, not %3, can be used for matching. QtXmlPatternsBei einem XSL-T-Suchmuster muss das erste Argument zur Funktion %1 bei der Verwendung zur Suche ein Literal oder eine Variablenreferenz sein.yIn an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching. QtXmlPatternsBei einem XSL-T-Suchmuster muss das erste Argument zur Funktion %1 bei der Verwendung zur Suche ein Zeichenketten-Literal sein.hIn an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching. QtXmlPatternsIn der Ersetzung kann %1 nur verwendet werden, um sich selbst oder %2 schtzen, nicht jedoch fr %3MIn the replacement string, %1 can only be used to escape itself or %2, not %3 QtXmlPatternsIn der Ersetzung muss auf %1 eine Ziffer folgen, wenn es nicht durch ein Escape-Zeichen geschtzt ist.VIn the replacement string, %1 must be followed by at least one digit when not escaped. QtXmlPatterns|Die Ganzzahldivision (%1) durch Null (%2) ist nicht definiert.0Integer division (%1) by zero (%2) is undefined. QtXmlPatternslDer Inhalt des qualifizierten Namens ist ungltig: %1.Invalid QName content: %1. QtXmlPatternsPDer Prfix %1 kann nicht gebunden werden+It is not possible to bind to the prefix %1 QtXmlPatternsZDer Prfix %1 kann nicht redeklariert werden.*It is not possible to redeclare prefix %1. QtXmlPatterns<%1 kann nicht bestimmt werden.'It will not be possible to retrieve %1. QtXmlPatterns`Attribute drfen nicht auf andere Knoten folgen.AIt's not possible to add attributes after any other kind of node. QtXmlPatternstDer Subtyp %1 des Elements %2 kann nicht aufgelst werden..Item type %1 of %2 element cannot be resolved. QtXmlPatternsDer Elementtyp des Basistyps entspricht nicht dem Elementtyp von %1.6Item type of base type does not match item type of %1. QtXmlPatternsDer Elementtyp des einfachen Typs %1 kann kein komplexer Typ sein.5Item type of simple type %1 cannot be a complex type. QtXmlPatternsDie Einschrnkung des Schlssels %1 enthlt nicht vorhandene Felder.)Key constraint %1 contains absent fields. QtXmlPatternsDie Einschrnkung des Schlssels %1 verweist auf das Element %2, was 'nillable' spezifiziert.:Key constraint %1 contains references nillable element %2. QtXmlPatternshDer Listeninhalt entspricht nicht der Lngenfacette.)List content does not match length facet. QtXmlPatternstDer Listeninhalt entspricht nicht der Facette 'maxLength'.,List content does not match maxLength facet. QtXmlPatternstDer Listeninhalt entspricht nicht der Facette 'minLength'.,List content does not match minLength facet. QtXmlPatternspDer Listeninhalt entspricht nicht der Suchmusterfacette.*List content does not match pattern facet. QtXmlPatterns~Der Listeninhalt ist nicht in der Aufzhlungsfacette enthalten.4List content is not listed in the enumeration facet. QtXmlPatternsBDas geladene Schema ist ungltig.Loaded schema file is invalid. QtXmlPatternsPGro/Kleinschreibung wird nicht beachtetMatches are case insensitive QtXmlPatternsDer Typ %1 des Mitglieds darf nicht vom Typ %2 des Mitglieds vom Basistyp %4 von %3 sein.JMember type %1 cannot be derived from member type %2 of %3's base type %4. QtXmlPatternstDer Subtyp %1 des Elements %2 kann nicht aufgelst werden.0Member type %1 of %2 element cannot be resolved. QtXmlPatternsDer Typ eines Mitglieds des einfachen Typs %1 kann kein komplexer Typ sein.7Member type of simple type %1 cannot be a complex type. QtXmlPatternsModul-Importe mssen vor Funktions-, Variablen- oder Optionsdeklarationen stehen.MModule imports must occur before function, variable, and option declarations. QtXmlPatternszDie Modulo-Division (%1) durch Null (%2) ist nicht definiert.0Modulus division (%1) by zero (%2) is undefined. QtXmlPatternsnDie Monatsangabe %1 ist auerhalb des Bereiches %2..%3.%Month %1 is outside the range %2..%3. QtXmlPatterns\Fr das Feld %1 wurden mehrere Werte gefunden.'More than one value found for field %1. QtXmlPatternsDie Multiplikation eines Werts des Typs %1 mit %2 oder %3 (positiv oder negativ unendlich) ist nicht zulssig.YMultiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. QtXmlPatternsDer Namensraum %1 kann nur an %2 gebunden werden. Dies ist bereits vordeklariert.ONamespace %1 can only be bound to %2 (and it is, in either case, pre-declared). QtXmlPatternsNamensraums-Deklarationen mssen vor Funktions- Variablen- oder Optionsdeklarationen stehen.UNamespace declarations must occur before function, variable, and option declarations. QtXmlPatternsDer Namensraum-Prfix des qualifizierten Namens %1 ist nicht definiert.5Namespace prefix of qualified name %1 is not defined. QtXmlPatternspDas Zeitlimit der Netzwerkoperation wurde berschritten.Network timeout. QtXmlPatternsdFr das Element %1 ist keine Definition verfgbar.'No definition for element %1 available. QtXmlPatternsExterne Funktionen werden nicht untersttzt. Alle untersttzten Funktionen knnen direkt verwendet werden, ohne sie als extern zu deklarieren{No external functions are supported. All supported functions can be used directly, without first declaring them as external QtXmlPatterns\Es ist keine Funktion des Namens %1 verfgbar.&No function with name %1 is available. QtXmlPatterns^Es existiert keine Funktion mit der Signatur %1*No function with signature %1 is available QtXmlPatternsnEs existiert keine Namensraum-Bindung fr den Prfix %1-No namespace binding exists for the prefix %1 QtXmlPatternszEs existiert keine Namensraum-Bindung fr den Prfix %1 in %23No namespace binding exists for the prefix %1 in %2 QtXmlPatternsDer referenzierte Wert der Schlsselreferenz %1 konnte nicht gefunden werden./No referenced value found for key reference %1. QtXmlPatternsbEs ist kein Schema fr die Validierung definiert.!No schema defined for validation. QtXmlPatternsXEs existiert keine Vorlage mit dem Namen %1.No template by name %1 exists. QtXmlPatternsEs ist kein Wert fr die externe Variable des Namens %1 verfgbar.=No value is available for the external variable with name %1. QtXmlPatternsREs existiert keine Variable des Namens %1No variable with name %1 exists QtXmlPatternsFr die Einschrnkung %1 wurde ein nicht eindeutiger Wert gefunden.)Non-unique value found for constraint %1. QtXmlPatternsEs muss ein fallback-Ausdruck vorhanden sein, da keine pragma-Ausdrcke untersttzt werden^None of the pragma expressions are supported. Therefore, a fallback expression must be present QtXmlPatternsLDie Notation %1 ist bereits definiert.Notation %1 already defined. QtXmlPatternsDer Inhalt der Notation ist nicht in der Aufzhlungsfacette enthalten.8Notation content is not listed in the enumeration facet. QtXmlPatternsBei Vererbung durch Vereinigung sind nur die Facetten %1 und %2 zulssig.8Only %1 and %2 facets are allowed when derived by union. QtXmlPatternstDer Anfrage-Prolog darf nur eine %1-Deklaration enthalten.6Only one %1 declaration can occur in the query prolog. QtXmlPatternsVEs darf nur ein einziges %1-Element stehen.Only one %1-element can appear. QtXmlPatternsEs wird nur Unicode Codepoint Collation untersttzt (%1). %2 wird nicht untersttzt.IOnly the Unicode Codepoint Collation is supported(%1). %2 is unsupported. QtXmlPatternszAn %2 kann nur der Prfix %1 gebunden werden (und umgekehrt).5Only the prefix %1 can be bound to %2 and vice versa. QtXmlPatternsDer Operator %1 kann nicht auf atomare Werte der Typen %2 und %3 angewandt werden.>Operator %1 cannot be used on atomic values of type %2 and %3. QtXmlPatternsvDer Operator %1 kann nicht auf den Typ %2 angewandt werden.&Operator %1 cannot be used on type %2. QtXmlPatternslDas Datum %1 kann nicht dargestellt werden (berlauf)."Overflow: Can't represent date %1. QtXmlPatternsfDas Datum kann nicht dargestellt werden (berlauf).$Overflow: Date can't be represented. QtXmlPatterns Parse-Fehler: %1Parse error: %1 QtXmlPatternsnDer Partikel enthlt nicht-deterministische Suchmuster..Particle contains non-deterministic wildcards. QtXmlPatternsDer Prfix %1 kann nur an %2 gebunden werden. Dies ist bereits vordeklariert.LPrefix %1 can only be bound to %2 (and it is, in either case, pre-declared). QtXmlPatternsbDer Prfix %1 wurde bereits im Prolog deklariert.,Prefix %1 is already declared in the prolog. QtXmlPatternsxDer Prfix des qualifizierten Namens %1 ist nicht definiert.+Prefix of qualified name %1 is not defined. QtXmlPatternsDie Wandlung von %1 zu %2 kann zu einem Verlust an Genauigkeit fhren./Promoting %1 to %2 may cause loss of precision. QtXmlPatternsDer Inhalt des qualifizierten Namens entspricht nicht der Suchmusterfacette.+QName content does not match pattern facet. QtXmlPatternsDer Inhalt des qualifizierten Namens ist nicht in der Aufzhlungsfacette enthalten.5QName content is not listed in the enumeration facet. QtXmlPatternsvDer Verweis %1 des Elements %2 kann nicht aufgelst werden..Reference %1 of %2 element cannot be resolved. QtXmlPatternsnDie erforderliche Kardinalitt ist %1 (gegenwrtig %2)./Required cardinality is %1; got cardinality %2. QtXmlPatternsrDer erforderliche Typ ist %1, es wurde aber %2 angegeben.&Required type is %1, but %2 was found. QtXmlPatternsEs wird ein XSL-T-1.0-Stylesheet mit einem Prozessor der Version 2.0 verarbeitet.5Running an XSL-T 1.0 stylesheet with a 2.0 processor. QtXmlPatternsDer vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'totalDigits'.?Signed integer content does not match in the totalDigits facet. QtXmlPatternsDer vorzeichenbehaftete Ganzzahlwert entspricht nicht der Suchmusterfacette.4Signed integer content does not match pattern facet. QtXmlPatternsDer vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'maxExclusive'.=Signed integer content does not match the maxExclusive facet. QtXmlPatternsDer vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'maxInclusive'.=Signed integer content does not match the maxInclusive facet. QtXmlPatternsDer vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'minExclusive'.=Signed integer content does not match the minExclusive facet. QtXmlPatternsDer vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'minInclusive'.=Signed integer content does not match the minInclusive facet. QtXmlPatternsDer vorzeichenbehaftete Ganzzahlwert ist nicht in der Aufzhlungsfacette enthalten.>Signed integer content is not listed in the enumeration facet. QtXmlPatternsDer einfache Typ %1 kann nur einen einfachen. atomaren Basistyp haben.=Simple type %1 can only have simple atomic type as base type. QtXmlPatterns%1 darf nicht von %2 abgeleitet werden, da letzterer die Einschrnkung als final deklariert.PSimple type %1 cannot derive from %2 as the latter defines restriction as final. QtXmlPatternsDer einfache Typ %1 kann nicht den unmittelbaren Basistyp %2 haben./Simple type %1 cannot have direct base type %2. QtXmlPatternsDer einfache Typ %1 enthlt einen nicht erlaubten Facettentyp %2.2Simple type %1 contains not allowed facet type %2. QtXmlPatternsjDer einfache Typ %1 darf nicht den Basistyp %2 haben.3Simple type %1 is not allowed to have base type %2. QtXmlPatternsdDer einfache Typ %1 darf nur die Facette %2 haben.0Simple type %1 is only allowed to have %2 facet. QtXmlPatternsjDer einfache Typ enthlt eine unzulssige Facette %1.*Simple type contains not allowed facet %1. QtXmlPatternsDer einfache Typ des abgeleiteten Elements %1 kann nicht vom Basiselement abgeleitet werden.NSimple type of derived element %1 cannot be validly derived from base element. QtXmlPatternsnDer angegebene Typ %1 ist im Schema nicht spezifiziert.-Specified type %1 is not known to the schema. QtXmlPatternsDer angebenene Typ %1 kann nicht durch den Elementtyp %2 substituiert werden.DSpecified type %1 is not validly substitutable with element type %2. QtXmlPatternsDie Angabe von use='prohibited' in einer Attributgruppe hat keinerlei Auswirkungen.DSpecifying use='prohibited' inside an attribute group has no effect. QtXmlPatterns~Der Zeichenketteninhalt entspricht nicht der Suchmusterfacette.,String content does not match pattern facet. QtXmlPatternsvDer Zeichenketteninhalt entspricht nicht der Lngenfacette./String content does not match the length facet. QtXmlPatternsDer Zeichenketteninhalt entspricht nicht der Lngenfacette (Maximumangabe).2String content does not match the maxLength facet. QtXmlPatternsDer Zeichenketteninhalt entspricht nicht der Lngenfacette (Minimumangabe).2String content does not match the minLength facet. QtXmlPatternsDer Zeichenketteninhalt ist nicht in der Aufzhlungsfacette enthalten.6String content is not listed in the enumeration facet. QtXmlPatternsrDie Substitutionsgruppe %1 hat eine zirkulre Definition..Substitution group %1 has circular definition. QtXmlPatternsDie Substitutionsgruppe %1 des Elements %2 kann nicht aufgelst werden.7Substitution group %1 of %2 element cannot be resolved. QtXmlPatternsDer Zielnamensraum %1 des importierten Schemas unterscheidet sich vom dem von ihm definierten Zielnamensraum %2.tTarget namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema. QtXmlPatternsDer Zielnamensraum %1 des eingebundenen Schemas unterscheidet sich vom dem von ihm definierten Zielnamensraum %2.tTarget namespace %1 of included schema is different from the target namespace %2 as defined by the including schema. QtXmlPatterns`An dieser Stelle drfen keine Textknoten stehen.,Text nodes are not allowed at this location. QtXmlPatternsText- oder Entittsreferenzen sind innerhalb eines %1-Elements nicht zulssig.7Text or entity references not allowed inside %1 element QtXmlPatternsZDie %1-Achse wird in XQuery nicht untersttzt$The %1-axis is unsupported in XQuery QtXmlPatternsDie Deklaration %1 ist unzulssig, da Schema-Import nicht untersttzt wird.WThe Schema Import feature is not supported, and therefore %1 declarations cannot occur. QtXmlPatterns%1-Ausdrcke knnen nicht verwendet werden, da Schemavalidierung nicht untersttzt wird. VThe Schema Validation Feature is not supported. Hence, %1-expressions may not be used. QtXmlPatternsJDer URI darf kein Fragment enthalten.The URI cannot have a fragment QtXmlPatternshNur das erste %2-Element darf das Attribut %1 haben.9The attribute %1 can only appear on the first %2 element. QtXmlPatterns%2 darf nicht das Attribut %1 haben, wenn es ein Kindelement von %3 ist.?The attribute %1 cannot appear on %2, when it is a child of %3. QtXmlPatternsDer Code-Punkt %1 aus %2 mit der Kodierung %3 ist kein gltiges XML-Zeichen.QThe codepoint %1, occurring in %2 using encoding %3, is an invalid XML character. QtXmlPatternsDie Daten einer Processing-Anweisung drfen nicht die Zeichenkette %1 enthaltenAThe data of a processing instruction cannot contain the string %1 QtXmlPatterns^Fr eine Kollektion ist keine Vorgabe definiert#The default collection is undefined QtXmlPatternsDie Kodierung %1 ist ungltig; sie darf nur aus lateinischen Buchstaben bestehen und muss dem regulren Ausdruck %2 entsprechen.The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. QtXmlPatternsDas erste Argument von %1 darf nicht vom Typ %2 sein; es muss numerisch, xs:yearMonthDuration oder xs:dayTimeDuration sein.uThe first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. QtXmlPatternsDas erste Argument von %1 kann nicht vom Typ %2 sein, es muss einer der Typen %3, %4 oder %5 sein.PThe first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. QtXmlPatterns8Es ist kein Fokus definiert.The focus is undefined. QtXmlPatternsDie Initialisierung der Variable %1 hngt von ihrem eigenem Wert ab3The initialization of variable %1 depends on itself QtXmlPatternstDas Element %1 entspricht nicht dem erforderlichen Typ %2./The item %1 did not match the required type %2. QtXmlPatternsDas Schlsselwort %1 kann nicht mit einem anderen Modusnamen zusammen verwendet werden.5The keyword %1 cannot occur with any other mode name. QtXmlPatternsDer letzte Schritt eines Pfades kann entweder nur Knoten oder nur atomare Werte enthalten. Sie drfen nicht zusammen auftreten.kThe last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. QtXmlPatternsFModul-Import wird nicht untersttzt*The module import feature is not supported QtXmlPatterns`Der Name %1 hat keinen Bezug zu einem Schematyp..The name %1 does not refer to any schema type. QtXmlPatternsDer Name eines berechneten Attributes darf keinen Namensraum-URI %1 mit dem lokalen Namen %2 haben.ZThe name for a computed attribute cannot have the namespace URI %1 with the local name %2. QtXmlPatternsHDer Name der gebundenen Variablen eines for-Ausdrucks muss sich von dem der Positionsvariable unterscheiden. Die zwei Variablen mit dem Namen %1 stehen im Konflikt.The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. QtXmlPatternsDer Name eines Erweiterungsausdrucks muss sich in einem Namensraum befinden.;The name of an extension expression must be in a namespace. QtXmlPatternsDer Name einer Option muss einen Prfix haben. Es gibt keine Namensraum-Vorgabe fr Optionen.TThe name of an option must have a prefix. There is no default namespace for options. QtXmlPatterns@Der Namensraum %1 ist reserviert und kann daher von nutzerdefinierten Funktionen nicht verwendet werden (fr diesen Zweck gibt es den vordefinierten Prfix %2).The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. QtXmlPatternsDer Namensraum-URI darf nicht leer sein, wenn er an den Prfix %1 gebunden ist.JThe namespace URI cannot be the empty string when binding to a prefix, %1. QtXmlPatternsDer Namensraum-URI im Namen eines berechneten Attributes darf nicht %1 sein.DThe namespace URI in the name for a computed attribute cannot be %1. QtXmlPatternsEin Namensraum-URI muss eine Konstante sein und darf keine eingebetteten Ausdrcke verwenden.IThe namespace URI must be a constant and cannot use enclosed expressions. QtXmlPatternsDer Namensraum einer benutzerdefinierten Funktion darf nicht leer sein (fr diesen Zweck gibt es den vordefinierten Prfix %1)yThe namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) QtXmlPatterns Der Namensraum einer nutzerdefinierten Funktion aus einem Bibliotheksmodul muss dem Namensraum des Moduls entsprechen (%1 anstatt %2) The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 QtXmlPatternsrDie Normalisierungsform %1 wird nicht untersttzt. Die untersttzten Normalisierungsformen sind %2, %3, %4 and %5, und "kein" (eine leere Zeichenkette steht fr "keine Normalisierung").The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). QtXmlPatternsEs existiert kein entsprechendes %2 fr den bergebenen Parameter %1.;The parameter %1 is passed, but no corresponding %2 exists. QtXmlPatternsEs wurde kein entsprechendes %2 fr den erforderlichen Parameter %1 angegeben.BThe parameter %1 is required, but no corresponding %2 is supplied. QtXmlPatternsPDer Prfix %1 kann nicht gebunden werdenThe prefix %1 cannot be bound. QtXmlPatternsDer Prfix %1 kann nicht gebunden werden. Er ist bereits per Vorgabe an den Namensraum %2 gebunden.SThe prefix %1 cannot be bound. By default, it is already bound to the namespace %2. QtXmlPatternsDer Prfix muss ein gltiger %1 sein. Das ist bei %2 nicht der Fall./The prefix must be a valid %1, which %2 is not. QtXmlPatternsDer bergeordnete Knoten des zweiten Arguments der Funktion %1 muss ein Dokumentknoten sein, was bei %2 nicht der Fall ist.gThe root node of the second argument to function %1 must be a document node. %2 is not a document node. QtXmlPatternsDas zweite Argument von %1 kann nicht vom Typ %2 sein, es muss einer der Typen %3, %4 oder %5 sein.QThe second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. QtXmlPatternsDer Zielname einer Processing-Anweisung kann nicht %1 (unabhngig von Gro/Kleinschreibung) sein. %2 ist daher ungltig.~The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid. QtXmlPatterns`Der Ziel-Namensraum von %1 darf nicht leer sein.-The target namespace of a %1 cannot be empty. QtXmlPatternsDer Wert des Attributs %1 des Elements %2 kann nur %3 oder %4 sein, nicht jedoch %5.IThe value for attribute %1 on element %2 must either be %3 or %4, not %5. QtXmlPatternsDer Wert des Attributs %1 muss vom Typ %2 sein, was bei %3 nicht der Fall ist.=The value of attribute %1 must be of type %2, which %3 isn't. QtXmlPatternsDer Wert eines XSL-T-Versionsattributes muss vom Typ %1 sein, was bei %2 nicht der Fall ist.TThe value of the XSL-T version attribute must be a value of type %1, which %2 isn't. QtXmlPatternsHDie Variable %1 wird nicht verwendetThe variable %1 is unused QtXmlPatternsEs existiert ein IDREF-Wert, fr den keine zugehrige ID vorhanden ist: %1.6There is one IDREF value with no corresponding ID: %1. QtXmlPatterns%1 kann nicht verwendet werden, da dieser Prozessor keine Schemas untersttzt.CThis processor is not Schema-aware and therefore %1 cannot be used. QtXmlPatternsPDie Zeitangabe %1:%2:%3.%4 ist ungltig.Time %1:%2:%3.%4 is invalid. QtXmlPatternsDie Zeitangabe 24:%1:%2.%3 ist ungltig. Bei der Stundenangabe 24 mssen Minuten, Sekunden und Millisekunden 0 sein._Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0;  QtXmlPatternsDie zuoberst stehenden Elemente eines Stylesheets drfen sich nicht im Null-Namensraum befinden, was bei %1 der Fall ist.NTop level stylesheet elements must be in a non-null namespace, which %1 isn't. QtXmlPatternsEs wurden zwei Namensraum-Deklarationsattribute gleichen Namens (%1) gefunden.Unbekanntes XSL-T-Attribut: %1.Unknown XSL-T attribute %1. QtXmlPatternsdDie Facette %2 enthlt eine ungltige Notation %1.%Unknown notation %1 used in %2 facet. QtXmlPatternsDer vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'totalDigits'.AUnsigned integer content does not match in the totalDigits facet. QtXmlPatternsDer vorzeichenlose Ganzzahlwert entspricht nicht der Suchmusterfacette.6Unsigned integer content does not match pattern facet. QtXmlPatternsDer vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'maxExclusive'.?Unsigned integer content does not match the maxExclusive facet. QtXmlPatternsDer vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'maxInclusive'.?Unsigned integer content does not match the maxInclusive facet. QtXmlPatternsDer vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'minExclusive'.?Unsigned integer content does not match the minExclusive facet. QtXmlPatternsDer vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'minInclusive'.?Unsigned integer content does not match the minInclusive facet. QtXmlPatternsDer vorzeichenlose Ganzzahlwert ist nicht in der Aufzhlungsfacette enthalten.@Unsigned integer content is not listed in the enumeration facet. QtXmlPatternsnDer Wert %1 des Typs %2 berschreitet das Maximum (%3).)Value %1 of type %2 exceeds maximum (%3). QtXmlPatternspDer Wert %1 des Typs %2 unterschreitet das Minimum (%3).*Value %1 of type %2 is below minimum (%3). QtXmlPatternsDie Einschrnkung des Werts des Attributs %1 ist nicht vom Typ des Attributs: %2.?Value constraint of attribute %1 is not of attributes type: %2. QtXmlPatternsDie Einschrnkung des Werts des abgeleiteten Attributs %1 entspricht nicht der Einschrnkung des Werts des Basisattributs.[Value constraint of derived attribute %1 does not match value constraint of base attribute. QtXmlPatternsDie Einschrnkung des Werts des Elements %1 ist nicht vom Typ des Elements: %2.;Value constraint of element %1 is not of elements type: %2. QtXmlPatternsDie Variett der Typen von %1 muss entweder atomar oder eine Vereinigung sein.:Variety of item type of %1 must be either atomic or union. QtXmlPatterns^Die Variett der Typen von %1 muss atomar sein.-Variety of member types of %1 must be atomic. QtXmlPatternsDie Version %1 wird nicht untersttzt. Die untersttzte Version von XQuery ist 1.0.AVersion %1 is not supported. The supported XQuery version is 1.0. QtXmlPatternsPW3C XML Schema identity constraint field(W3C XML Schema identity constraint field QtXmlPatternsVW3C XML Schema identity constraint selector+W3C XML Schema identity constraint selector QtXmlPatternsDer Defaultwert eines erforderlichen Parameters kann weder durch ein %1-Attribut noch durch einen Sequenzkonstruktor angegeben werden. rWhen a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor. QtXmlPatternsEs kann kein Sequenzkonstruktor verwendet werden, wenn %2 ein Attribut %1 hat.JWhen attribute %1 is present on %2, a sequence constructor cannot be used. QtXmlPatternsBei einer "cast"-Operation von %1 zu %2 darf der Wert nicht %3 sein.:When casting to %1 from %2, the source value cannot be %3. QtXmlPatternsHBei einer "cast"-Operation zum Typ %1 oder abgeleitetenTypen muss der Quellwert ein Zeichenketten-Literal oder ein Wert gleichen Typs sein. Der Typ %2 ist ungltig.When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed. QtXmlPatterns6Bei der Verwendung der Funktion %1 zur Auswertung innerhalb eines Suchmusters muss das Argument eine Variablenreferenz oder ein Zeichenketten-Literal sein.vWhen function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal. QtXmlPatternsLeerzeichen werden entfernt, sofern sie nicht in Zeichenklassen erscheinenOWhitespace characters are removed, except when they appear in character classes QtXmlPatternsDas Suchmuster im abgeleiteten Partikel ist keine gltige Untermenge des Suchmusters des Basispartikels.PWildcard in derived particle is not a valid subset of wildcard in base particle. QtXmlPatternsp%1 ist keine gltige Jahresangabe, da es mit %2 beginnt.-Year %1 is invalid because it begins with %2. QtXmlPatternsleerempty QtXmlPatternsgenau ein exactly one QtXmlPatterns ein oder mehrere one or more QtXmlPatternsDas 'processContent'-Attribut des Basissuchmusters muss schwcher sein als das des abgeleiteten Suchmusters.EprocessContent of base wildcard must be weaker than derived wildcard. QtXmlPatternsDas processContent-Attribut des Suchmusters des abgeleiteten Partikels ist schwcher als das Suchmuster des Basispartikels.XprocessContent of wildcard in derived particle is weaker than wildcard in base particle. QtXmlPatternsxsi:noNamespaceSchemaLocation kann nicht nach dem ersten Element oder Attribut ohne Namensraum erscheinen.^xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute. QtXmlPatternsxsi:schemaLocation namespace %1 wurde im Instanzdokument bereits spezifiziert.Vxsi:schemaLocation namespace %1 has already appeared earlier in the instance document. QtXmlPatterns"kein oder mehrere zero or more QtXmlPatternskein oder ein zero or one QtXmlPatternsqstopmotion-2.3.2-Source/translations/qt_da.qm000644 000000 000000 00000352016 12536560630 021513 0ustar00rootroot000000 000000 fffSg Tl8TUL=Ma `:`wyi%H@te!teMeb6įTįUL y~I\^H$b(4^$(4^X(5^(5^*y'j*y*yQ*Tj=*05T*0{+F+F}:+L{1+f+fU+z>z+'+/+RQ+z>+J+HU+V*+jx+2+}+į(+į`+įR+>7);@C:OF0iFn4Fn4JGHHw9&yHw9HHl{I'c3I<IJ+(7J6(J6?J6I[J6MJ6J6/J6J6~Jcb KQlKYLZ/LL@LbM5N5Mb1Me`MNdO|?PFE+PFEPFE~QeRfYR|RfS8^TTʴGT#:U?^U|FU}g\V1V1 Vl*VVnV8pVgWSWT#WTWT8XKhXojX˙LX9YgYyY:]Y]pZg:ZkcZh\\]47\]4A"\!\catgc/|^vGHvzi0Vfq4L5`6CcIA#[Ku!I6yɵnAɵnuɵnɵntɵnɵnɵnHɵn6t Bw*9 e6M4E%aw[qG v> H;<pJ5#Q%UTS(Ŏ_3*4"-ctNj25vd?txKCC4Ce<D"D1pM"Q~+aSžaR?VWe [fPul koR9orqw^x|{yLc%GeWW 22YZ{'].NR#Ai[]P dyHur ם Yd`" "lG)9_-r/=N;[1$q5~nF< ?2?NMnNky6UiW~]"`C`ߪjtglg=lyzl}g`oickvty@vty'$1f"CZL)}6G66} ^rQh'RRwT=3~.P9#pQE#Ep#p{T=8AAp?[yLGrn9DوVmmMnM|ElEv!w%w! I MB$ &!eX&);*/e<<5,;ByFFOUZfT\cA`cփ6zfg&4jC^qItu@u(1I}kaDyg~ ۣo#y ~$$c(<ʁrj^fKKm֊? nN,i;yAJ"&H./IxS=[MxR>YMm)YMvj^h^-i3|sscw!mzxb ۊ?RN;]!=]\ II&>I&II I\IE`I{I3#Y3]i3y32;2u2212I5-4E4444 uDq;uDzD{o P,,,/W,F&,S6]!P!ɘe05$ 4*fRfR\N0\hec1SfPqtVJVafRU1F e@ c< )f_W$%C./&~e)2l+,U?"J?>ujKNOM-!RuV|g]r]gXk8y^*{y5to5F] 9g:cg)G%k]ص_ǥ&: +:3`ba6tx{y/ w;hxAhr59\hR:shz-Ͼ%<C-857C^{XƨvƨG%˾0ҝziLlէ?FMZ>&zRߺPf^! P$~b[~baoVMn!>+ux+3//44~Ԋ6 9? 2zA DxGlgGb`LAUPcOr>tPѧIQySnUUUTqZ.4Z.lZ.Z.[|&]k*[^nY_p e/iqi{kQoNy;O{ }u8K}w"}w=}wn[}wvr%XB0vltt'.# .=3QPiUaD1DJYt5tw t_ 7+wFʢDʢƴ<dEddZd~dc0m|59pэ>+NSFU˴dBUhw \ 'V7+|,Dk/2OW6r?;CU]bD0J0'KKoU|-\ar:t:|(^p|l|}wZ}$"}$=W}$n ϗZj@Dfqd)K<Jf+_·$·N  ׳ A /y#Ek(HVu%5`T@i~iC9%tucw]O#%3' .5kE=+=O?'?CtIdP`V%`XU Z`&bD;bGfdZgA#hIeti$ x1 . z*2,|QRsdܬU-5AzOc.}kAQ* rw&X_ml^`esn%L94b†5x)ibCLlʴ5ʴ5}hʶ^ Ԅ۔#D^dF5+LF5/YpIIZAs3 E4 }$< qeu ڤ ڥ D dC E Eة Ac} Ac] @! 35@    nC ^J Y+*| K)A Vj 팤 %'U  5g = qh)  Dg  }Q oP )W */, .> 7u ; 1 9! I4 I; IG ;" R  fU) J: $@ $&& %p9" ,` ,UZ 9 t_| `~; nj ty ˔j P5$ Pz o w 68 >> :>F f  f W 4 .i_ sq sY~ AAsl 9| I 9/   m,! #-tɂ 0N:] AH CUi E9, IhB L^ L5 L{^ Mc\L S V ]$C( f) f)Wg f=$ io> m`- w yrF r H HU 8 $Xu .@; $ i r ( Se q % J JY & t.! kQ Ӈ( M & N>f ̺j -Dk . ۷e rx k$K kq U){  <, ' N 07| kZ  z+l  p  z Id %i 7 \ xHJ K . .= 7F >s >t >uz > > > > > ?t|X DT I= P@ RV] RVy RV S.E SGL S Y} Y [Wb hۮdG j7oT p= . B  TB; T TL T  O Ds d S )d T V .B . . . .ݗ .E  D0 aP y+ ҂| # %i; uh T |'v $ 9[~ t aK :b|)  ʜ? 0E 64( ;ɾR FgT K9W Pt Pt~z fe!j fed g| iFC0M i[ i0 jӮ m9a4 n u8$ uKD v& v{ w" w< wm w}"R w}= w}m |[#  m v %Y J4 ^s } RXC Px  xN ! U@ ɰe} ~ X & D \ +) t5 t5~@ o 7 ~ )Q -]RtwxT8`|o@gT8l*5*{/E7/EĴ=BI_|OOXRuW[ a.Jgc?nyGvɅ"Ty$~~>44YS?^lǗm-:PB4fWr'ݖ1[yr B XlD"#$U %4L%4`-vV#0i)6R061cŖ2wT6D.jH rJd}KC)L$.c5#Dc5og3JiCmh3pyC/}{~a56$eY5{&ϫ&a`[pY7>bai[.NSt@ Es"~r7{rQ_ky9:B Pt2; `Dd{UY#i<html>Skifter til audio-playback-enheden, <b>%1</b><br/>der lige er blevet tilgngelig og har en hjere prference.</html>xSwitching to the audio playback device %1
which just became available and has higher preference. AudioOutput<html>Audio-playback-enheden<b>%1</b> virker ikke.<br/>Falder tilbage til <b>%2</b>.</html>^The audio playback device %1 does not work.
Falling back to %2. AudioOutput6G tilbage til enheden '%1'Revert back to device '%1' AudioOutputLuk fane Close Tab CloseButton Om %1About %1MAC_APPLICATION_MENUSkjul %1Hide %1MAC_APPLICATION_MENUSkjul andre Hide OthersMAC_APPLICATION_MENUIndstillinger &Preferences...MAC_APPLICATION_MENUSlut %1Quit %1MAC_APPLICATION_MENUTjenesterServicesMAC_APPLICATION_MENUVis alleShow AllMAC_APPLICATION_MENUTilgngelighed AccessibilityPhonon::Kommunikation CommunicationPhonon::SpilGamesPhonon:: MusikMusicPhonon::Meddelelser NotificationsPhonon::VideoPhonon::Advarsel: Det ser ikke ud til, at base GStreamer plugins er installeret. Al audio- og videosupport er deaktiveret~Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabledPhonon::Gstreamer::BackendAdvarsel: Det ser ikke ud til, at gstreamer0.10-plugins-good pakken er installeret. Nogle videofunktioner er deaktiveret.Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled.Phonon::Gstreamer::BackendDer mangler et codec. Flgende codecs skal installeres for at afspille dette indhold: %0`A required codec is missing. You need to install the following codec(s) to play this content: %0Phonon::Gstreamer::MediaObjectKan ikke starte playback. Tjek Gstreamer-installationen og kontrollr, at libgstreamer-plugins-base er installeret.wCannot start playback. Check your Gstreamer installation and make sure you have libgstreamer-plugins-base installed.Phonon::Gstreamer::MediaObject<Kunne ikke afkode mediekilden.Could not decode media source.Phonon::Gstreamer::MediaObjectDKunne ikke lokalisere mediekilden.Could not locate media source.Phonon::Gstreamer::MediaObjectnKunne ikke bne lydenheden. Enheden er allerede i brug.:Could not open audio device. The device is already in use.Phonon::Gstreamer::MediaObject8Kunne ikke bne mediekilden.Could not open media source.Phonon::Gstreamer::MediaObjectUgyldig kilde.Invalid source type.Phonon::Gstreamer::MediaObjectAnvend denne skyder til at indstille lydstyrken. Lngst til venstre er 0% og lngst til hjre er %1%WUse this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%Phonon::VolumeSlider Volume: %1%Phonon::VolumeSlider,%1, %2 ikke definerede%1, %2 not definedQ3Accel4Tvetydig %1 ikke behandletAmbiguous %1 not handledQ3AccelSletDelete Q3DataTable FalskFalse Q3DataTable IndstInsert Q3DataTable SandtTrue Q3DataTableOpdaterUpdate Q3DataTablej%1 Filen blev ikke fundet. Kontrollr sti og filnavn.+%1 File not found. Check path and filename. Q3FileDialog &Slet&Delete Q3FileDialog&Nej&No Q3FileDialog&OK&OK Q3FileDialog&bn&Open Q3FileDialog &Omdb&Rename Q3FileDialog&Gem&Save Q3FileDialog&Usorteret &Unsorted Q3FileDialog&Ja&Yes Q3FileDialogf<qt>Er du sikker p, at du vil slette %1 "%2"?</qt>1Are you sure you wish to delete %1 "%2"? Q3FileDialogAlle filer (*) All Files (*) Q3FileDialog Alle filer (*.*)All Files (*.*) Q3FileDialogAttributter Attributes Q3FileDialogTilbageBack Q3FileDialogAnnullerCancel Q3FileDialog0Kopir eller flyt en filCopy or Move a File Q3FileDialogOpret ny folderCreate New Folder Q3FileDialogDatoDate Q3FileDialogSlet %1 Delete %1 Q3FileDialogDetaljevisning Detail View Q3FileDialogKatalogDir Q3FileDialogKataloger Directories Q3FileDialogKatalog: Directory: Q3FileDialogFejlError Q3FileDialogFilFile Q3FileDialogFil&navn: File &name: Q3FileDialogFil&type: File &type: Q3FileDialogFind katalogFind Directory Q3FileDialogUtilgngelig Inaccessible Q3FileDialogListevisning List View Q3FileDialogKig &i: Look &in: Q3FileDialogNavnName Q3FileDialogNy folder New Folder Q3FileDialogNy folder %1 New Folder %1 Q3FileDialogNy folder 1 New Folder 1 Q3FileDialogEn mappe opOne directory up Q3FileDialogbnOpen Q3FileDialogbnOpen  Q3FileDialogVis filindholdPreview File Contents Q3FileDialog$Vis filinformationPreview File Info Q3FileDialogGen&indlsR&eload Q3FileDialogSkrivebeskyttet Read-only Q3FileDialogLs-skriv Read-write Q3FileDialogLs: %1Read: %1 Q3FileDialogGem somSave As Q3FileDialogVlg et katalogSelect a Directory Q3FileDialog$Vis s&kjulte filerShow &hidden files Q3FileDialogStrrelseSize Q3FileDialog SortrSort Q3FileDialog$Sortr efter &dato Sort by &Date Q3FileDialog$Sortr efter n&avn Sort by &Name Q3FileDialog.Sortr efter s&trrelse Sort by &Size Q3FileDialogSpecielSpecial Q3FileDialog&Symlink til katalogSymlink to Directory Q3FileDialogSymlink til FilSymlink to File Q3FileDialog&Symlink til SpecielSymlink to Special Q3FileDialogType Q3FileDialogWrite-only Write-only Q3FileDialogSkriv: %1 Write: %1 Q3FileDialogkataloget the directory Q3FileDialog filenthe file Q3FileDialogsymlinket the symlink Q3FileDialog:Kunne ikke oprette katalog %1Could not create directory %1 Q3LocalFs$Kunne ikke bne %1Could not open %1 Q3LocalFs4Kunne ikke lse katalog %1Could not read directory %1 Q3LocalFsLKunne ikke fjerne fil eller katalog %1%Could not remove file or directory %1 Q3LocalFs4Kunne ikke omdbe %1 to %2Could not rename %1 to %2 Q3LocalFs(Kunne ikke skrive %1Could not write %1 Q3LocalFsTilpas... Customize... Q3MainWindowLinie opLine up Q3MainWindow8Brugeren stoppede handlingenOperation stopped by the userQ3NetworkProtocolAnnullerCancelQ3ProgressDialog UdfrApply Q3TabDialogAnnullerCancel Q3TabDialogStandarderDefaults Q3TabDialog HjlpHelp Q3TabDialogOK Q3TabDialogK&opir&Copy Q3TextEdit&St ind&Paste Q3TextEdit&Gendan&Redo Q3TextEdit&Fortryd&Undo Q3TextEditRydClear Q3TextEdit &KlipCu&t Q3TextEditMarkr alt Select All Q3TextEditLukClose Q3TitleBarLukker vinduetCloses the window Q3TitleBar`Indeholder kommandoer til indstilling af vinduet*Contains commands to manipulate the window Q3TitleBarViser vinduets navn og indeholder kontroller til indstilling af vinduetFDisplays the name of the window and contains controls to manipulate it Q3TitleBar4Gr vinduet til fuld skrmMakes the window full screen Q3TitleBarMaksimrMaximize Q3TitleBarMinimerMinimize Q3TitleBar&Flytter vinduet vkMoves the window out of the way Q3TitleBar`Stter et maksimeret vindue til normal strrelse&Puts a maximized window back to normal Q3TitleBar^Stter et minimeret vindue til normal strrelsePuts a minimized back to normal Q3TitleBarGendan ned Restore down Q3TitleBarGendan op Restore up Q3TitleBarSystem Q3TitleBarMere...More... Q3ToolBar(ukendt) (unknown) Q3UrlOperatorProtokollen '%1' understtter ikke kopiering eller flytning af filer eller katalogerIThe protocol `%1' does not support copying or moving files or directories Q3UrlOperator|Protokollen '%1' understtter ikke oprettelse af nye kataloger;The protocol `%1' does not support creating new directories Q3UrlOperatorhProtokollen '%1' understtter ikke hentning af filer0The protocol `%1' does not support getting files Q3UrlOperatortProtokollen '%1' understtter ikke opremsning af kataloger6The protocol `%1' does not support listing directories Q3UrlOperatordProtokollen '%1' understtter ikke upload af filer0The protocol `%1' does not support putting files Q3UrlOperatorProtokollen '%1' understtter ikke, at filer eller kataloger fjernes@The protocol `%1' does not support removing files or directories Q3UrlOperatorProtokollen '%1' understtter ikke, at filer eller kataloger omdbes@The protocol `%1' does not support renaming files or directories Q3UrlOperatorDProtokollen '%1' understttes ikke"The protocol `%1' is not supported Q3UrlOperator&Annuller&CancelQ3Wizard &Udfr&FinishQ3Wizard &Hjlp&HelpQ3Wizard&Nste >&Next >Q3Wizard< &Tilbage< &BackQ3Wizard$Forbindelse afvistConnection refusedQAbstractSocket,Forbindelsen timed outConnection timed outQAbstractSocket*Host blev ikke fundetHost not foundQAbstractSocket<Netvrket er ikke tilgngeligtNetwork unreachableQAbstractSocketDSocket-operation ikke understttet$Operation on socket is not supportedQAbstractSocket*Socket ikke forbundetSocket is not connectedQAbstractSocket4Socket-operation timed outSocket operation timed outQAbstractSocket&Vlg alle &Select AllQAbstractSpinBox&Trin op&Step upQAbstractSpinBoxTrin &ned Step &downQAbstractSpinBoxAktivrActivate QApplicationBAktiverer programmets hovedvindue#Activates the program's main window QApplicationbEksekverbar '%1' krver Qt %2, ikke fundet Qt %3.,Executable '%1' requires Qt %2, found Qt %3. QApplication8Inkompatibel Qt Library fejlIncompatible Qt Library Error QApplicationQT_LAYOUT_DIRECTION QApplication&Annuller&Cancel QAxSelectCOM &Objekt: COM &Object: QAxSelectOK QAxSelect(Vlg ActiveX-kontrolSelect ActiveX Control QAxSelectKryds afCheck QCheckBoxSl til/fraToggle QCheckBoxFjern markeringUncheck QCheckBox(&Fj til egne farver&Add to Custom Colors QColorDialog&Basisfarver &Basic colors QColorDialog&Egne farver&Custom colors QColorDialog &Grn:&Green: QColorDialog &Rd:&Red: QColorDialog &Mt:&Sat: QColorDialog &Vr:&Val: QColorDialogAl&fa-kanal:A&lpha channel: QColorDialog Bl&:Bl&ue: QColorDialog Ton&e:Hu&e: QColorDialogVlg farve Select Color QColorDialogLukClose QComboBox FalskFalse QComboBoxbnOpen QComboBox SandtTrue QComboBox(%1: ftok mislykkedes%1: ftok failedQCoreApplication %1: ngle er tom%1: key is emptyQCoreApplication2%1: kunne ikke lave ngle%1: unable to make keyQCoreApplicationBKunne ikke gennemfre transaktionUnable to commit transaction QDB2Driver8Kunne ikke skabe forbindelseUnable to connect QDB2DriverHKunne ikke tilbagetrkke transaktionUnable to rollback transaction QDB2Driver<Kunne ikke aktivere autocommitUnable to set autocommit QDB2Driver2Kunne ikke binde variabelUnable to bind variable QDB2Result6Kunne ikke udfre statementUnable to execute statement QDB2Result.Kunne ikke hente frsteUnable to fetch first QDB2Result,Kunne ikke hente nsteUnable to fetch next QDB2Result0Kunne ikke hente post %1Unable to fetch record %1 QDB2Result6Kunne ikke forberede udsagnUnable to prepare statement QDB2ResultAM QDateTimeEditPM QDateTimeEditam QDateTimeEditpm QDateTimeEditQDialQDial SliderHandleQDialSpeedometer SpeedoMeterQDial UdfrtDoneQDialogHvad er dette? What's This?QDialog&Annuller&CancelQDialogButtonBox&Luk&CloseQDialogButtonBox&Nej&NoQDialogButtonBox&OKQDialogButtonBox&Gem&SaveQDialogButtonBox&Ja&YesQDialogButtonBox AfbrydAbortQDialogButtonBox UdfrApplyQDialogButtonBoxAnnullerCancelQDialogButtonBoxLukCloseQDialogButtonBox"Luk uden at gemmeClose without SavingQDialogButtonBox KassrDiscardQDialogButtonBoxGem ikke Don't SaveQDialogButtonBox HjlpHelpQDialogButtonBoxIgnorerIgnoreQDialogButtonBoxNe&j til alle N&o to AllQDialogButtonBoxOKQDialogButtonBoxbnOpenQDialogButtonBoxNulstilResetQDialogButtonBox,Gendan standardvrdierRestore DefaultsQDialogButtonBoxPrv igenRetryQDialogButtonBoxGemSaveQDialogButtonBoxGem alleSave AllQDialogButtonBoxJa til &alle Yes to &AllQDialogButtonBoxndringsdato Date Modified QDirModelTypeKind QDirModelNavnName QDirModelStrrelseSize QDirModelType QDirModelLukClose QDockWidgetLstDock QDockWidgetFlydendeFloat QDockWidget MindreLessQDoubleSpinBoxMereMoreQDoubleSpinBox&OK QErrorMessage,&Vis denne besked igen&Show this message again QErrorMessageDebug-besked:Debug Message: QErrorMessageFatal fejl: Fatal Error: QErrorMessageAdvarsel:Warning: QErrorMessage@Kunne ikke oprette %1 til outputCannot create %1 for outputQFile4Kan ikke bne %1 til inputCannot open %1 for inputQFile0Kan ikke bne til outputCannot open for outputQFile0Kan ikke fjerne kildefilCannot remove source fileQFile,Destinationsfil findesDestination file existsQFile,Kunne ikke skrive blokFailure to write blockQFile%1 Katalog kunne ikke findes. Kontrollr, at det rigtige katalognavn er indtastet.K%1 Directory not found. Please verify the correct directory name was given. QFileDialog%1 Filen kunne ikke findes. Kontrollr, at det rigtige filnavn er indtastet.A%1 File not found. Please verify the correct file name was given. QFileDialog\%1 findes allerede. nsker du at erstatte den?-%1 already exists. Do you want to replace it? QFileDialog &Vlg&Choose QFileDialog &Slet&Delete QFileDialog&Ny folder &New Folder QFileDialog&bn&Open QFileDialog &Omdb&Rename QFileDialog&Gem&Save QFileDialogn'%1' er skrivebeskyttet. nsker du alligevel at slette?9'%1' is write protected. Do you want to delete it anyway? QFileDialogAlle filer (*) All Files (*) QFileDialog Alle filer (*.*)All Files (*.*) QFileDialogLEr du sikker p, at '%1' skal slettes?!Are sure you want to delete '%1'? QFileDialogTilbageBack QFileDialog8Kunne ikke slette kataloget.Could not delete directory. QFileDialogOpret ny folderCreate New Folder QFileDialogDetaljevisning Detail View QFileDialogKataloger Directories QFileDialogKatalog: Directory: QFileDialogDrevDrive QFileDialogFilFile QFileDialog&Filnavn: File &name: QFileDialogFiler af typen:Files of type: QFileDialogFind katalogFind Directory QFileDialogFremForward QFileDialogListevisning List View QFileDialog Sg i:Look in: QFileDialogMin computer My Computer QFileDialogNy folder New Folder QFileDialogbnOpen QFileDialog(Ovenliggende katalogParent Directory QFileDialogAktuelle steder Recent Places QFileDialog FjernRemove QFileDialogGem somSave As QFileDialogVisShow  QFileDialog$Vis s&kjulte filerShow &hidden files QFileDialog UkendtUnknown QFileDialog %1 GB%1 GBQFileSystemModel %1 KB'%1 KBQFileSystemModel %1 MB%1 MBQFileSystemModel %1 TB%1 TBQFileSystemModel%1 bytes%1 bytesQFileSystemModel<b>Navnet, %1, kan ikke benyttes.</b><p>Brug et andet navn med frre tegn og ingen kommatering.oThe name "%1" can not be used.

Try using another name, with fewer characters or no punctuations marks.QFileSystemModelComputerQFileSystemModelndringsdato Date ModifiedQFileSystemModel Ugyldigt filnavnInvalid filenameQFileSystemModelTypeKindQFileSystemModelMin computer My ComputerQFileSystemModelNavnNameQFileSystemModelStrrelseSizeQFileSystemModelTypeQFileSystemModelAlleAny QFontDatabaseArabiskArabic QFontDatabaseArmenskArmenian QFontDatabaseBengalskBengali QFontDatabaseSortBlack QFontDatabaseFedBold QFontDatabaseKyrilliskCyrillic QFontDatabaseDemi QFontDatabase Demi Bold QFontDatabase Devanagari QFontDatabasegeorgisk Georgian QFontDatabase GrskGreek QFontDatabaseGujarati QFontDatabaseGurmukhi QFontDatabaseHebriskHebrew QFontDatabase KursivItalic QFontDatabaseJapanskJapanese QFontDatabaseKannada QFontDatabaseKhmer QFontDatabaseKoreanskKorean QFontDatabaseLao QFontDatabaseLatin QFontDatabaseLysLight QFontDatabase Malayalam QFontDatabaseMyanmar QFontDatabaseNormal QFontDatabase SkrtOblique QFontDatabaseOgham QFontDatabaseOriya QFontDatabaseRunic QFontDatabase$Forenklet kinesiskSimplified Chinese QFontDatabaseSinhala QFontDatabaseSymbol QFontDatabase SyriskSyriac QFontDatabaseTamil QFontDatabaseTelugu QFontDatabaseThaana QFontDatabaseThailandskThai QFontDatabaseTibetanskTibetan QFontDatabase*Traditionelt kinesiskTraditional Chinese QFontDatabaseVietnamesisk Vietnamese QFontDatabaseS&krifttype&Font QFontDialog&Strrelse&Size QFontDialog&Understreg &Underline QFontDialogEffekterEffects QFontDialog S&til Font st&yle QFontDialogEksempelSample QFontDialogVlg skrifttype Select Font QFontDialog&Overstreget Stri&keout QFontDialogSkr&ivesystemWr&iting System QFontDialogDndring af katalog mislykkedes: %1Changing directory failed: %1QFtpTilsluttet vrtConnected to hostQFtp$Tilsluttet vrt %1Connected to host %1QFtpHForbindelse til vrt mislykkedes: %1Connecting to host failed: %1QFtp$Forbindelse lukketConnection closedQFtp,Dataforbindelse afvist&Connection refused for data connectionQFtp<Forbindelse til vrt %1 afvistConnection refused to host %1QFtpDForbindelsen timed out til host %1Connection timed out to host %1QFtp2Forbindelse til %1 lukketConnection to %1 closedQFtpJOprettelse af katalog mislykkedes: %1Creating directory failed: %1QFtpDDownloading af fil mislykkedes: %1Downloading file failed: %1QFtpVrt %1 fundet Host %1 foundQFtp&Vrt %1 ikke fundetHost %1 not foundQFtpVrt fundet Host foundQFtpXOpremsning af katalogindhold mislykkedes: %1Listing directory failed: %1QFtp*Login mislykkedes: %1Login failed: %1QFtp"Ingen forbindelse Not connectedQFtpJDet mislykkedes at fjerne katalog: %1Removing directory failed: %1QFtpBDet mislykkedes at fjerne fil: %1Removing file failed: %1QFtpUkendt fejl Unknown errorQFtp@Uploading af fil mislykkedes: %1Uploading file failed: %1QFtpUkendt fejl Unknown error QHostInfo Vrt ikke fundetHost not foundQHostInfoAgent$Ukendt adressetypeUnknown address typeQHostInfoAgentUkendt fejl Unknown errorQHostInfoAgent0Autentificering pkrvetAuthentication requiredQHttpTilsluttet vrtConnected to hostQHttp$Tilsluttet vrt %1Connected to host %1QHttp$Forbindelse lukketConnection closedQHttp$Forbindelse afvistConnection refusedQHttpRForbindelse blev afvist (eller tid udlb)!Connection refused (or timed out)QHttp2Forbindelse til %1 lukketConnection to %1 closedQHttpData er delagtData corruptedQHttpXSkrivefejl mens der blev skrevet til enheden Error writing response to deviceQHttp4HTTP anmodning mislykkedesHTTP request failedQHttpDer blevet anmodet om en HTTPS-forbindelse, men SSL understttelse er ikke kompileret ind:HTTPS connection requested but SSL support not compiled inQHttpVrt %1 fundet Host %1 foundQHttp&Vrt %1 ikke fundetHost %1 not foundQHttpVrt fundet Host foundQHttp6Vrt krver autentificeringHost requires authenticationQHttp2Ugyldig HTTP chunked bodyInvalid HTTP chunked bodyQHttp0Ugyldig HTTP-svar-headerInvalid HTTP response headerQHttp8Ingen server at forbinde tilNo server set to connect toQHttp8Krver proxy-autentificeringProxy authentication requiredQHttp8Proxy krver autentificeringProxy requires authenticationQHttp8Foresprgsel blev annulleretRequest abortedQHttp2SSL handshake mislykkedesSSL handshake failedQHttpPServeren afsluttede uventet forbindelsen%Server closed connection unexpectedlyQHttp:Ukendt autentifikationsmetodeUnknown authentication methodQHttpUkendt fejl Unknown errorQHttp>En ukendt protokol blev angivetUnknown protocol specifiedQHttp,Forkert indholdslngdeWrong content lengthQHttp0Autentificering pkrvetAuthentication requiredQHttpSocketEngine>Modtog ikke HTTP-svar fra proxy(Did not receive HTTP response from proxyQHttpSocketEngineNFejl under kommunikation med HTTP-proxy#Error communicating with HTTP proxyQHttpSocketEnginexFejl under fortolking af autentificeringsanmodning fra proxy/Error parsing authentication request from proxyQHttpSocketEngineHProxy-forbindelse afsluttede i utide#Proxy connection closed prematurelyQHttpSocketEngine2Proxy-forbindelse ngtedeProxy connection refusedQHttpSocketEngine2Proxy ngtede forbindelseProxy denied connectionQHttpSocketEngineBProxy-serverforbindelse timed out!Proxy server connection timed outQHttpSocketEngine<Proxy-server kunne ikke findesProxy server not foundQHttpSocketEngineDKunne ikke pbegynde transaktionenCould not start transaction QIBaseDriverLDer opstod fejl ved bning af databaseError opening database QIBaseDriverFKunne ikke gennemfre transaktionenUnable to commit transaction QIBaseDriverLKunne ikke tilbagetrkke transaktionenUnable to rollback transaction QIBaseDriver:Kunne ikke allokere statementCould not allocate statement QIBaseResultFKunne ikke beskrive input-statement"Could not describe input statement QIBaseResult:Kunne ikke beskrive statementCould not describe statement QIBaseResult<Kunne ikke hente nste elementCould not fetch next item QIBaseResult,Kunne ikke finde arrayCould not find array QIBaseResult4Kunne ikke hente arraydataCould not get array data QIBaseResultDKunne ikke hente foresprgselsinfoCould not get query info QIBaseResultFKunne ikke hente udsagnsinformationCould not get statement info QIBaseResult6Kunne ikke forberede udsagnCould not prepare statement QIBaseResultDKunne ikke pbegynde transaktionenCould not start transaction QIBaseResult.Kunne ikke lukke udsagnUnable to close statement QIBaseResultFKunne ikke gennemfre transaktionenUnable to commit transaction QIBaseResult.Kunne ikke oprette BLOBUnable to create BLOB QIBaseResult<Kunne ikke udfre foresprgselUnable to execute query QIBaseResult(Kunne ikke bne BLOBUnable to open BLOB QIBaseResult(Kunne ikke lse BLOBUnable to read BLOB QIBaseResult,Kunne ikke skrive BLOBUnable to write BLOB QIBaseResult<Ingen plads tilbage p enhedenNo space left on device QIODevice:Fil eller katalog findes ikkeNo such file or directory QIODevice"Tilladelse ngtetPermission denied QIODevice6Der er for mange bne filerToo many open files QIODeviceUkendt fejl Unknown error QIODevice*Mac OS X input-metodeMac OS X input method QInputContext(Windows input-metodeWindows input method QInputContextXIM QInputContext XIM input-metodeXIM input method QInputContext"Indtast en vrdi:Enter a value: QInputDialogBKan ikke indlse bibliotek %1: %2Cannot load library %1: %2QLibraryDKan ikke lse symbol "%1" i %2: %3$Cannot resolve symbol "%1" in %2: %3QLibraryLKan ikke afregistrere bibliotek %1: %2Cannot unload library %1: %2QLibraryCould not mmap '%1': %2QLibrary\Der var ikke muligt at lave unmap p '%1': %2 Could not unmap '%1': %2QLibraryjPlugin-verifikationsdata er sat forkert sammen i '%1')Plugin verification data mismatch in '%1'QLibraryPFilen '%1' er ikke et gyldigt Qt-plugin.'The file '%1' is not a valid Qt plugin.QLibrary|Plugin '%1' bruger inkompatibelt Qt-bibliotek. (%2.%3.%4) [%5]=The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]QLibraryPlugin '%1' bruger inkompatibelt Qt-bibliotek. (Ikke muligt at mikse debug og release-biblioteker)WThe plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)QLibraryPlugin '%1' bruger inkompatibelt Qt-bibliotek. Forventet build key "%2", hentede "%3"'OThe plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"QLibrary*DSO blev ikke fundet.!The shared library was not found.QLibraryUkendt fejl' Unknown errorQLibrary&Kopir&Copy QLineEdit&St ind&Paste QLineEdit&Gendan&Redo QLineEdit&Fortryd&Undo QLineEdit K&lipCu&t QLineEditSletDelete QLineEditMarkr alt Select All QLineEdit$%1: Adresse i brug%1: Address in use QLocalServer%1: Navnefejl%1: Name error QLocalServer*%1: Tilladelse ngtet%1: Permission denied QLocalServer$%1: Ukendt fejl %2%1: Unknown error %2 QLocalServer(%1: Forbindelsesfejl%1: Connection error QLocalSocket,%1: Forbindelse afvist%1: Connection refused QLocalSocket2%1: Datagram er for stort%1: Datagram too large QLocalSocket"%1: Ugyldigt navn%1: Invalid name QLocalSocket4%1: Den anden ende lukkede%1: Remote closed QLocalSocket0%1: Fejl i socket-adgang%1: Socket access error QLocalSocket:%1: Socket-handling timed out%1: Socket operation timed out QLocalSocket6%1: Fejl i socket-ressource%1: Socket resource error QLocalSocketN%1: Socket-handlingen understttes ikke)%1: The socket operation is not supported QLocalSocket%1: Ukendt fejl%1: Unknown error QLocalSocket$%1: Ukendt fejl %2%1: Unknown error %2 QLocalSocketDKunne ikke pbegynde transaktionenUnable to begin transaction QMYSQLDriverFKunne ikke gennemfre transaktionenUnable to commit transaction QMYSQLDriver&Kunne ikke forbindeUnable to connect QMYSQLDriver6Kunne ikke bne databasen 'Unable to open database ' QMYSQLDriverLKunne ikke tilbagetrkke transaktionenUnable to rollback transaction QMYSQLDriver4Kunne ikke binde udvrdierUnable to bind outvalues QMYSQLResult0Kunne ikke tildele vrdiUnable to bind value QMYSQLResultHKunne ikke udfre nste foresprgselUnable to execute next query QMYSQLResult<Kunne ikke udfre foresprgselUnable to execute query QMYSQLResult0Kunne ikke udfre udsagnUnable to execute statement QMYSQLResult*Kunne ikke hente dataUnable to fetch data QMYSQLResult6Kunne ikke forberede udsagnUnable to prepare statement QMYSQLResult6Kunne ikke nulstille udsagnUnable to reset statement QMYSQLResult>Kunne ikke gemme nste resultatUnable to store next result QMYSQLResult6Kunne ikke gemme resultatetUnable to store result QMYSQLResultDKunne ikke gemme udsagnsresultater!Unable to store statement results QMYSQLResult(Uden titel) (Untitled)QMdiArea %1 - [%2] QMdiSubWindow&Luk&Close QMdiSubWindow &Flyt&Move QMdiSubWindow&Gendan&Restore QMdiSubWindow&Strrelse&Size QMdiSubWindow- [%1] QMdiSubWindowLukClose QMdiSubWindow HjlpHelp QMdiSubWindowMa&ksimr Ma&ximize QMdiSubWindowMaksimrMaximize QMdiSubWindowMenu QMdiSubWindowMi&nimr Mi&nimize QMdiSubWindowMinimrMinimize QMdiSubWindow GendanRestore QMdiSubWindowGendan Ned Restore Down QMdiSubWindow SkyggeShade QMdiSubWindowBliv &oppe Stay on &Top QMdiSubWindowFjern skyggeUnshade QMdiSubWindowLukCloseQMenu UdfrExecuteQMenubnOpenQMenu <h3>Om Qt</h3><p>Dette program anvender Qt version %1.</p><p>Qt er et C++ toolkit til cross-platform applikationsudvikling.</p><p>Qt tilbyder single-source portabilitet til MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, og alle strre kommercielle Unix-varianter. Qt er ogs tilgngeligt til indlejrede systemer som Qt for Embedded Linux and Qt for Windows CE.</p>Qt er tilgngeligt under tre forskellige licenser skabt med henblik p at imdekomme forskellige brugeres behov.</p><p>Qt licenseret under vores kommercielle licensaftale er passende for udvikling af proprietr/kommerciel software, hvor du ikke nsker at dele sourcekode med tredie part, eller p anden vis ikke kan tiltrde vilkrerne i GNU LGPL version 2.1 eller GNU GPL version 3.0</p><p>Qt licenseret under GLU General Public License version 3.0 er passende for udvikling af Qt applikationer, hvor du nsker at bruge softwaren i kombination med software under vilkrerne i GNU GPL version 3.0, eller hvor du ellers er villig til at overholde vilkrerne i GNU GPL version 3.0</p><p>See venligst <a href="http://qt.digia.com/product/licensing">qt.digia.com/product/licensing</a> for et overblik over Qt licensforhold.</p><p>Qt er et Digia produkt. Se <a href="http://qt.digia.com/">qt.digia.com</a> for yderligere information.</p>6

About Qt

This program uses Qt version %1.

Qt is a C++ toolkit for cross-platform application development.

Qt provides single-source portability across MS Windows, Mac OS X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.

Qt is available under three different licensing options designed to accommodate the needs of our various users.

Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.

Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.

Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.

Please see qt.digia.com/product/licensing for an overview of Qt licensing.

Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).

Qt is a Digia product. See qt.digia.com for more information.

 QMessageBox Om QtAbout Qt QMessageBox HjlpHelp QMessageBox"Skjul detaljer...Hide Details... QMessageBoxOK QMessageBoxVis detaljer...Show Details... QMessageBoxMarkr IM Select IMQMultiInputContext<Multiple input metode-switcherMultiple input method switcherQMultiInputContextPluginMultiple input metode-switcher, der benytter tekstkontrollernes kontekstmenuerMMultiple input method switcher that uses the context menu of the text widgetsQMultiInputContextPluginZEn anden socket lytter allerede p samme port4Another socket is already listening on the same portQNativeSocketEngine~Forsg p at bruge IPv6-socket p en platform uden IPv6-support=Attempt to use IPv6 socket on a platform with no IPv6 supportQNativeSocketEngine$Forbindelse afvistConnection refusedQNativeSocketEngine,Forbindelsen timed outConnection timed outQNativeSocketEngineXDatagrammet var for stort til at blive sendtDatagram was too large to sendQNativeSocketEngine0Vrt er ikke tilgngeligHost unreachableQNativeSocketEngine2Ugyldig socket-deskriptorInvalid socket descriptorQNativeSocketEngineNetvrksfejl Network errorQNativeSocketEngine:Netvrksoperationen timed outNetwork operation timed outQNativeSocketEngine<Netvrket er ikke tilgngeligtNetwork unreachableQNativeSocketEngine,Handling p non-socketOperation on non-socketQNativeSocketEngine*Ikke flere ressourcerOut of resourcesQNativeSocketEngine"Tilladelse ngtetPermission deniedQNativeSocketEngine>Protokoltypen understttes ikkeProtocol type not supportedQNativeSocketEngine8Adressen er ikke tilgngeligThe address is not availableQNativeSocketEngine*Adressen er beskyttetThe address is protectedQNativeSocketEngineJDen bundne adresse er allerede i brug#The bound address is already in useQNativeSocketEnginePProxytypen er ugyldig til denne handling,The proxy type is invalid for this operationQNativeSocketEngineBFjern-hosten lukkede forbindelsen%The remote host closed the connectionQNativeSocketEnginePKunne ikke initialisere broadcast-socket%Unable to initialize broadcast socketQNativeSocketEngineVKunne ikke initialisere non-blocking socket(Unable to initialize non-blocking socketQNativeSocketEngine8Kunne ikke modtage en beskedUnable to receive a messageQNativeSocketEngine4Kunne ikke sende en beskedUnable to send a messageQNativeSocketEngine"Kunne ikke skriveUnable to writeQNativeSocketEngineUkendt fejl Unknown errorQNativeSocketEngineDSocket-operation ikke understttetUnsupported socket operationQNativeSocketEngine8Der opstod fejl i at bne %1Error opening %1QNetworkAccessCacheBackendJKan ikke bne %1: Stien er et katalog#Cannot open %1: Path is a directoryQNetworkAccessFileBackend@Der opstod fejl i at bne %1: %2Error opening %1: %2QNetworkAccessFileBackendLLsefejl mens der blev lst fra %1: %2Read error reading from %1: %2QNetworkAccessFileBackendLAnmodning om at bne ikke-lokal fil %1%Request for opening non-local file %1QNetworkAccessFileBackendVSkrivefejl mens der blev skrevet til %1: %2Write error writing to %1: %2QNetworkAccessFileBackend>Kan ikke bne %1: Er et katalogCannot open %1: is a directoryQNetworkAccessFtpBackendJDer opstod fejl i at downloade %1: %2Error while downloading %1: %2QNetworkAccessFtpBackendFDer opstod fejl i at uploade %1: %2Error while uploading %1: %2QNetworkAccessFtpBackendpDer opstod fejl i at logge p %1: Autentificering krves0Logging in to %1 failed: authentication requiredQNetworkAccessFtpBackend@Ingen passende proxy blev fundetNo suitable proxy foundQNetworkAccessFtpBackend@Ingen passende proxy blev fundetNo suitable proxy foundQNetworkAccessHttpBackendpDer opstod fejl i at downloade %1 - serveren svarede: %2)Error downloading %1 - server replied: %2 QNetworkReply4Protokollen "%1" er ukendtProtocol "%1" is unknown QNetworkReply0Handling blev annulleretOperation canceledQNetworkReplyImplDKunne ikke pbegynde transaktionenUnable to begin transaction QOCIDriverFKunne ikke gennemfre transaktionenUnable to commit transaction QOCIDriver.Kunne ikke initialisereUnable to initialize QOCIDriver&Kunne ikke logge pUnable to logon QOCIDriverLKunne ikke tilbagetrkke transaktionenUnable to rollback transaction QOCIDriver4Kunne ikke allokere udsagnUnable to alloc statement QOCIResultZKunne ikke tildele kolonne til batch-udfrsel'Unable to bind column for batch execute QOCIResult0Kunne ikke tildele vrdiUnable to bind value QOCIResult<Kunne ikke udfre batch-udsagn!Unable to execute batch statement QOCIResult0Kunne ikke udfre udsagnUnable to execute statement QOCIResult6Kunne ikke g til den nsteUnable to goto next QOCIResult6Kunne ikke forberede udsagnUnable to prepare statement QOCIResultFKunne ikke gennemfre transaktionenUnable to commit transaction QODBCDriver&Kunne ikke forbindeUnable to connect QODBCDriverKunne ikke forbinde. Driveren understtter ikke alle de ndvendige funktionaliteterCUnable to connect - Driver doesn't support all needed functionality QODBCDriver:Kunne ikke sl auto-udfr fraUnable to disable autocommit QODBCDriver:Kunne ikke sl auto-udfr tilUnable to enable autocommit QODBCDriverLKunne ikke tilbagetrkke transaktionenUnable to rollback transaction QODBCDriverQODBCResult::reset: Kunne ikke indstille 'SQL_CURSOR_STATIC' til udsagnsattribut. Kontrollr ODBC-driver-konfigurationenyQODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult6Kunne ikke tildele variabelUnable to bind variable QODBCResult0Kunne ikke udfre udsagnUnable to execute statement QODBCResult Kunne ikke henteUnable to fetch QODBCResult6Kunne ikke hente den frsteUnable to fetch first QODBCResult6Kunne ikke hente den sidsteUnable to fetch last QODBCResult4Kunne ikke hente den nsteUnable to fetch next QODBCResult8Kunne ikke hente den forrigeUnable to fetch previous QODBCResult6Kunne ikke forberede udsagnUnable to prepare statement QODBCResultHjemHomeQObjectUgyldig URI: %1Invalid URI: %1QObject Hostnavn manglerNo host name givenQObjectJHandling blev ikke understttet p %1Operation not supported on %1QObjectXProtokolfejl: Pakke p strrelsen 0 modtaget)Protocol error: packet of size 0 receivedQObjectLLsefejl mens der blev lst fra %1: %2Read error reading from %1: %2QObjectbFjern-host lukkede forbindelsen for tidligt p %13Remote host closed the connection prematurely on %1QObject*Socket-fejl p %1: %2Socket error on %1: %2QObjectVSkrivefejl mens der blev skrevet til %1: %2Write error writing to %1: %2QObjectNavnNameQPPDOptionsModel VrdiValueQPPDOptionsModel@Kunne ikke pbegynde transaktionCould not begin transaction QPSQLDriverBKunne ikke gennemfre transaktionCould not commit transaction QPSQLDriverHKunne ikke tilbagetrkke transaktionCould not rollback transaction QPSQLDriver8Kunne ikke skabe forbindelseUnable to connect QPSQLDriver&Kunne ikke tilmeldeUnable to subscribe QPSQLDriver$Kunne ikke afmeldeUnable to unsubscribe QPSQLDriver>Kunne ikke oprette foresprgselUnable to create query QPSQLResult6Kunne ikke forberede udsagnUnable to prepare statement QPSQLResultCentimeter (cm)Centimeters (cm)QPageSetupWidgetFormQPageSetupWidget Hjde:Height:QPageSetupWidget Inches (in)QPageSetupWidgetLandskab LandscapeQPageSetupWidgetMargenerMarginsQPageSetupWidgetMillimeter (mm)Millimeters (mm)QPageSetupWidget OrientationQPageSetupWidgetSidestrrelse: Page size:QPageSetupWidget PapirPaperQPageSetupWidgetPapirkilde: Paper source:QPageSetupWidgetPoint (pt) Points (pt)QPageSetupWidgetPortrtPortraitQPageSetupWidget Omvendt landskabReverse landscapeQPageSetupWidgetOmvendt portrtReverse portraitQPageSetupWidget Vidde:Width:QPageSetupWidgetMargen - bund bottom marginQPageSetupWidget Margen - venstre left marginQPageSetupWidgetMargen - hjre right marginQPageSetupWidgetMargen - verst top marginQPageSetupWidget2Plugin blev ikke indlst.The plugin was not loaded. QPluginLoaderUkendt fejl Unknown error QPluginLoaderX%1 findes allerede. nsker du at overskrive?/%1 already exists. Do you want to overwrite it? QPrintDialogP%1 er et katalog. Vlg et andet filnavn.7%1 is a directory. Please choose a different file name. QPrintDialog &Indstillinger<< &Options << QPrintDialog &Indstillinger>> &Options >> QPrintDialog&Udskriv&Print QPrintDialogB<qt>nsker du at overskrive?</qt>%Do you want to overwrite it? QPrintDialogA0 QPrintDialogA0 (841 x 1189 mm) QPrintDialogA1 QPrintDialogA1 (594 x 841 mm) QPrintDialogA2 QPrintDialogA2 (420 x 594 mm) QPrintDialogA3 QPrintDialogA3 (297 x 420 mm) QPrintDialogA4 QPrintDialog%A4 (210 x 297 mm, 8.26 x 11.7 inches) QPrintDialogA5 QPrintDialogA5 (148 x 210 mm) QPrintDialogA6 QPrintDialogA6 (105 x 148 mm) QPrintDialogA7 QPrintDialogA7 (74 x 105 mm) QPrintDialogA8 QPrintDialogA8 (52 x 74 mm) QPrintDialogA9 QPrintDialogA9 (37 x 52 mm) QPrintDialogAliasser: %1 Aliases: %1 QPrintDialogB0 QPrintDialogB0 (1000 x 1414 mm) QPrintDialogB1 QPrintDialogB1 (707 x 1000 mm) QPrintDialogB10 QPrintDialogB10 (31 x 44 mm) QPrintDialogB2 QPrintDialogB2 (500 x 707 mm) QPrintDialogB3 QPrintDialogB3 (353 x 500 mm) QPrintDialogB4 QPrintDialogB4 (250 x 353 mm) QPrintDialogB5 QPrintDialog%B5 (176 x 250 mm, 6.93 x 9.84 inches) QPrintDialogB6 QPrintDialogB6 (125 x 176 mm) QPrintDialogB7 QPrintDialogB7 (88 x 125 mm) QPrintDialogB8 QPrintDialogB8 (62 x 88 mm) QPrintDialogB9 QPrintDialogB9 (44 x 62 mm) QPrintDialogC5E QPrintDialogC5E (163 x 229 mm) QPrintDialogBrugerdefineretCustom QPrintDialogDLE QPrintDialogDLE (110 x 220 mm) QPrintDialog Executive QPrintDialog)Executive (7.5 x 10 inches, 191 x 254 mm) QPrintDialogbFilen %1 kan ikke skrives. Vlg et andet filnavn.=File %1 is not writable. Please choose a different file name. QPrintDialogFil findes File exists QPrintDialogFolio QPrintDialogFolio (210 x 330 mm) QPrintDialogLedger QPrintDialogLedger (432 x 279 mm) QPrintDialogLegal QPrintDialog%Legal (8.5 x 14 inches, 216 x 356 mm) QPrintDialogLetter QPrintDialog&Letter (8.5 x 11 inches, 216 x 279 mm) QPrintDialogLokal fil Local file QPrintDialogOK QPrintDialogUdskrivPrint QPrintDialog$Udskriv til fil...Print To File ... QPrintDialogUdskriv alle Print all QPrintDialogUdskriftsomrde Print range QPrintDialog"Udskriv markeredePrint selection QPrintDialog*Udskriv til fil (PDF)Print to File (PDF) QPrintDialog8Udskriv til fil (Postscript)Print to File (Postscript) QPrintDialogTabloid QPrintDialogTabloid (279 x 432 mm) QPrintDialogj'Fra'-vrdien kan ikke vre strre end 'til'-vrdien.7The 'From' value cannot be greater than the 'To' value. QPrintDialogUS Common #10 Envelope QPrintDialog%US Common #10 Envelope (105 x 241 mm) QPrintDialogSkriv %1 fil Write %1 file QPrintDialog lokalt forbundetlocally connected QPrintDialog Ukendtunknown QPrintDialog%1%QPrintPreviewDialogLukCloseQPrintPreviewDialog"Eksportr til PDF Export to PDFQPrintPreviewDialog0Eksportr til PostScriptExport to PostScriptQPrintPreviewDialogFrste side First pageQPrintPreviewDialogTilpas sidenFit pageQPrintPreviewDialogTilpas bredde Fit widthQPrintPreviewDialogLandskab LandscapeQPrintPreviewDialogSidste side Last pageQPrintPreviewDialogNste side Next pageQPrintPreviewDialogSideopstning Page SetupQPrintPreviewDialogSideopstning Page setupQPrintPreviewDialogPortrtPortraitQPrintPreviewDialogForrige side Previous pageQPrintPreviewDialogUdskrivPrintQPrintPreviewDialogVis udskrift Print PreviewQPrintPreviewDialogVis sideopslagShow facing pagesQPrintPreviewDialog4Vis oversigt af alle siderShow overview of all pagesQPrintPreviewDialogVis enkelt sideShow single pageQPrintPreviewDialogZoom indZoom inQPrintPreviewDialogZoom udZoom outQPrintPreviewDialogAvanceretAdvancedQPrintPropertiesWidgetFormFormQPrintPropertiesWidgetSidePageQPrintPropertiesWidgetSamordneCollateQPrintSettingsOutput FarveColorQPrintSettingsOutputFarvetilstand Color ModeQPrintSettingsOutput KopierCopiesQPrintSettingsOutputKopier:Copies:QPrintSettingsOutputDobbelsidetDuplex PrintingQPrintSettingsOutputFormQPrintSettingsOutputGrskala GrayscaleQPrintSettingsOutputBog Long sideQPrintSettingsOutput IngenNoneQPrintSettingsOutputValgmulighederOptionsQPrintSettingsOutput,UdskriftsindstillingerOutput SettingsQPrintSettingsOutputSider fra Pages fromQPrintSettingsOutputUdskriv alle Print allQPrintSettingsOutputUdskriv sider Print rangeQPrintSettingsOutputOmvendtReverseQPrintSettingsOutputValg SelectionQPrintSettingsOutput Tavle Short sideQPrintSettingsOutputtiltoQPrintSettingsOutput &Navn:&Name: QPrintWidget... QPrintWidgetForm QPrintWidgetPlacering: Location: QPrintWidgetUdskrifts&fil: Output &file: QPrintWidget&Egenskaber P&roperties QPrintWidgetVis udskriftPreview QPrintWidget'Printer QPrintWidgetType: QPrintWidgetZKunne ikke bne input redirection for lsning,Could not open input redirection for readingQProcess`Kunne ikke bne output redirection for skrivning-Could not open output redirection for writingQProcess6Fejl ved lsning fra procesError reading from processQProcess:Fejl ved skrivning til procesError writing to processQProcess.Intet program defineretNo program definedQProcessProces crashedeProcess crashedQProcess6Processen kunne ikke starteProcess failed to startQProcess2Proces-operation time outProcess operation timed outQProcess<Ressource fejl (fork fejl): %1!Resource error (fork failure): %1QProcessAnnullerCancelQProgressDialogbnOpen QPushButtonKontrollrCheck QRadioButton2drlig char class syntaksbad char class syntaxQRegExp0drlig lookahead syntaksbad lookahead syntaxQRegExp2drlig gentagelsessyntaksbad repetition syntaxQRegExp>deaktiveret funktion blev brugtdisabled feature usedQRegExp$ugyldigt oktal-talinvalid octal valueQRegExp(nede interne grnsemet internal limitQRegExp6Manglende venstre delimitermissing left delimQRegExp*der opstod ingen fejlno error occurredQRegExp$uventet afslutningunexpected endQRegExpLDer opstod fejl ved bning af databaseError to open databaseQSQLite2DriverDKunne ikke pbegynde transaktionenUnable to begin transactionQSQLite2DriverFKunne ikke gennemfre transaktionenUnable to commit transactionQSQLite2DriverHKunne ikke tilbagetrkke transaktionUnable to rollback TransactionQSQLite2Driver6Kunne ikke udfre statementUnable to execute statementQSQLite2Result6Kunne ikke hente resultaterUnable to fetch resultsQSQLite2ResultNDer opstod fejl ved lukning af databaseError closing database QSQLiteDriverLDer opstod fejl ved bning af databaseError opening database QSQLiteDriverDKunne ikke pbegynde transaktionenUnable to begin transaction QSQLiteDriverBKunne ikke gennemfre transaktionUnable to commit transaction QSQLiteDriverHKunne ikke tilbagetrkke transaktionUnable to rollback transaction QSQLiteDriver&Ingen foresprgeselNo query QSQLiteResult:Misforhold i parametertllingParameter count mismatch QSQLiteResult2Unable to bind parametersUnable to bind parameters QSQLiteResult0Kunne ikke udfre udsagnUnable to execute statement QSQLiteResult,Kunne ikke hente rkkeUnable to fetch row QSQLiteResult6Kunne ikke nulstille udsagnUnable to reset statement QSQLiteResultBundBottom QScrollBarVenstre kant Left edge QScrollBarLinie ned Line down QScrollBarLinie opLine up QScrollBarSide ned Page down QScrollBarSide venstre Page left QScrollBarSide hjre Page right QScrollBarSide verstPage up QScrollBarPlaceringPosition QScrollBarHjre kant Right edge QScrollBarScroll ned Scroll down QScrollBarScroll her Scroll here QScrollBar$Scroll til venstre Scroll left QScrollBar Scroll til hjre Scroll right QScrollBarScroll op Scroll up QScrollBar verstTop QScrollBar&%1: Findes allerede%1: already exists QSharedMemory<%1: create size is less then 0%1: create size is less then 0 QSharedMemory%1: Findes ikke%1: doesn't exists QSharedMemory(%1: ftok mislykkedes%1: ftok failed QSharedMemory*%1: Ugyldig strrelse%1: invalid size QSharedMemory%1: Nglefejl %1: key error QSharedMemory %1: ngle er tom%1: key is empty QSharedMemory$%1: Ikke vedhftet%1: not attached QSharedMemory2%1: Ikke flere ressourcer%1: out of resources QSharedMemory*%1: Tilladelse ngtet%1: permission denied QSharedMemoryL%1: Strrelsesforesprgsel mislykkedes%1: size query failed QSharedMemoryT%1: System-plagte strrelsesrestriktioner$%1: system-imposed size restrictions QSharedMemory&%1: Kunne ikke lse%1: unable to lock QSharedMemory8%1: Kunne ikke oprette ngle%1: unable to make key QSharedMemory8%1: Kunne ikke oprette ngle%1: unable to set key on lock QSharedMemory8%1: Kunne ikke oprette ngle%1: unable to unlock QSharedMemory8%1: Kunne ikke oprette ngle %1: unix key file doesn't exists QSharedMemory$%1: ukendt fejl %2%1: unknown error %2 QSharedMemory+ QShortcutAlt QShortcutTilbageBack QShortcutTilbage Backspace QShortcut"Tilbage-tabulatorBacktab QShortcut Bass Boost QShortcutBass ned Bass Down QShortcutBass opBass Up QShortcutRing tilCall QShortcut Caps Lock QShortcut'CapsLock QShortcutKontekst1Context1 QShortcutKontekst2Context2 QShortcutKontekst3Context3 QShortcutKontekst4Context4 QShortcutCtrl QShortcutDel QShortcutDelete QShortcutNedDown QShortcutEnd QShortcutEnter QShortcutEsc QShortcutEscape QShortcutF%1 QShortcut Favorites QShortcutVendFlip QShortcutFremForward QShortcut Lg pHangup QShortcut HjlpHelp QShortcutHome QShortcutStartside Home Page QShortcutIns QShortcutInsert QShortcutStart (0) Launch (0) QShortcutStart (1) Launch (1) QShortcutStart (2) Launch (2) QShortcutStart (3) Launch (3) QShortcutStart (4) Launch (4) QShortcutStart (5) Launch (5) QShortcutStart (6) Launch (6) QShortcutStart (7) Launch (7) QShortcutStart (8) Launch (8) QShortcutStart (9) Launch (9) QShortcutStart (A) Launch (A) QShortcutStart (B) Launch (B) QShortcutStart (C) Launch (C) QShortcutStart (D) Launch (D) QShortcutStart (E) Launch (E) QShortcutStart (F) Launch (F) QShortcutStart mail Launch Mail QShortcutStart Media Launch Media QShortcutVenstreLeft QShortcutMedia nste Media Next QShortcut Media Play QShortcutMedia forrigeMedia Previous QShortcut Media Record QShortcut Media Stop QShortcutMenu QShortcutMeta QShortcutNejNo QShortcutNum Lock QShortcutNumLock QShortcut Number Lock QShortcutbn URLOpen URL QShortcut Page Down QShortcutPage Up QShortcutPause QShortcutPgDown QShortcutPgUp QShortcutUdskrivPrint QShortcut Print Screen QShortcutOpdaterRefresh QShortcutReturn QShortcut HjreRight QShortcut Scroll Lock QShortcut ScrollLock QShortcutSgSearch QShortcutVgSelect QShortcutShift QShortcutSpace QShortcutStandby QShortcutStop QShortcutSysReq QShortcutSystem Request QShortcutTab QShortcutDiskant ned Treble Down QShortcutDiskant op Treble Up QShortcutOpUp QShortcutLydstyrke ned Volume Down QShortcutLydstyrke mute Volume Mute QShortcutLydstyrke op Volume Up QShortcutJaYes QShortcutSide ned Page downQSliderSide venstre Page leftQSliderSide hjre Page rightQSliderSide opPage upQSliderPlaceringPositionQSlider:Adressetype understttes ikkeAddress type not supportedQSocks5SocketEngineRForbindelse ikke tilladt a SOCKSv5-server(Connection not allowed by SOCKSv5 serverQSocks5SocketEngineHProxy-forbindelse afsluttede i utide&Connection to proxy closed prematurelyQSocks5SocketEngine2Proxy-forbindelse ngtedeConnection to proxy refusedQSocks5SocketEngineBProxy-serverforbindelse timed outConnection to proxy timed outQSocks5SocketEngine4General SOCKSv5 serverfejlGeneral SOCKSv5 server failureQSocks5SocketEngine:Netvrksoperationen timed outNetwork operation timed outQSocks5SocketEngineBProxy autentificering mislykkedesProxy authentication failedQSocks5SocketEngineJProxy autentificering mislykkedes: %1Proxy authentication failed: %1QSocks5SocketEngine8Proxy-host kunne ikke findesProxy host not foundQSocks5SocketEngine8SOCKS version 5 protokolfejlSOCKS version 5 protocol errorQSocks5SocketEngineDSOCKSv5-kommando ikke understttetSOCKSv5 command not supportedQSocks5SocketEngineTTL udlbet TTL expiredQSocks5SocketEngineDUkendt SOCKSv5 proxy fejlkode 0x%1%Unknown SOCKSv5 proxy error code 0x%1QSocks5SocketEngine MindreLessQSpinBoxMereMoreQSpinBoxAnnullerCancelQSql>Skal dine ndringer annulleres?Cancel your edits?QSqlBekrftConfirmQSqlSletDeleteQSql Slet denne post?Delete this record?QSql IndstInsertQSqlNejNoQSqlGem ndringer? Save edits?QSqlOpdaterUpdateQSqlJaYesQSqlTKan ikke give et certifikat uden ngle, %1,Cannot provide a certificate with no key, %1 QSslSocketjDer opstod fejl under oprettelse af SSL-kontekst (%1)Error creating SSL context (%1) QSslSocketfDer opstod fejl under oprettelse af SSL-session, %1Error creating SSL session, %1 QSslSocketfDer opstod fejl under oprettelse af SSL-session, %1Error creating SSL session: %1 QSslSocketTDer opstod en fejl under SSL handshake: %1Error during SSL handshake: %1 QSslSocketrDer opstod fejl under indlsning af lokalt certifikat, %1#Error loading local certificate, %1 QSslSockethDer opstod fejl under indlsning af privat ngle, %1Error loading private key, %1 QSslSocketNDer opstod en fejl under lsning af: %1Error while reading: %1 QSslSocketFUgyldig eller tom chifferliste (%1)!Invalid or empty cipher list (%1) QSslSocketbPrivat-ngle autoriserer ikke offentlig-ngle, %1/Private key does not certificate public key, %1 QSslSocket4Kunne ikke skrive data: %1Unable to write data: %1 QSslSocket&%1: Findes allerede%1: already existsQSystemSemaphore%1: Findes ikke%1: does not existQSystemSemaphore2%1: Ikke flere ressourcer%1: out of resourcesQSystemSemaphore*%1: Tilladelse ngtet%1: permission deniedQSystemSemaphore$%1: Ukendt fejl %2%1: unknown error %2QSystemSemaphore@Kunne ikke etablere forbindelsenUnable to open connection QTDSDriver4Kunne ikke bruge databasenUnable to use database QTDSDriver$Scroll til venstre Scroll LeftQTabBar Scroll til hjre Scroll RightQTabBarDSocket-operation ikke understttet$Operation on socket is not supported QTcpServer&Kopir&Copy QTextControl&St ind&Paste QTextControl&Gendan&Redo QTextControl&Fortryd&Undo QTextControlKopir l&inkCopy &Link Location QTextControl K&lipCu&t QTextControlSletDelete QTextControlMarkr alt Select All QTextControlbnOpen QToolButtonTryk pPress QToolButtonJDenne platform understtter ikke IPv6#This platform does not support IPv6 QUdpSocket GendanRedo QUndoGroupFortrydUndo QUndoGroup <tom> QUndoModel GendanRedo QUndoStackFortrydUndo QUndoStack Insert Unicode control characterQUnicodeControlCharacterMenu$LRE Start of left-to-right embeddingQUnicodeControlCharacterMenuLRM Left-to-right markQUnicodeControlCharacterMenu#LRO Start of left-to-right overrideQUnicodeControlCharacterMenuPDF Pop directional formattingQUnicodeControlCharacterMenu$RLE Start of right-to-left embeddingQUnicodeControlCharacterMenuRLM Right-to-left markQUnicodeControlCharacterMenu#RLO Start of right-to-left overrideQUnicodeControlCharacterMenuZWJ Zero width joinerQUnicodeControlCharacterMenuZWNJ Zero width non-joinerQUnicodeControlCharacterMenuZWSP Zero width spaceQUnicodeControlCharacterMenu"Kan ikke vise URLCannot show URL QWebFrame.Kan ikke vise MIME-typeCannot show mimetype QWebFrame"Filen findes ikkeFile does not exist QWebFramelBilledindlsning afbrudt af ndringer i retningslinier&Frame load interruped by policy change QWebFrame$Anmodning blokeretRequest blocked QWebFrame(Anmodning annulleretRequest cancelled QWebFrame"%1 (%2x%3 pixels)%1 (%2x%3 pixels)QWebPage %n fil%n filer %n file(s)QWebPage"Tilfj til ordbogAdd To DictionaryQWebPage*Drlig HTTP-anmodningBad HTTP requestQWebPageFedBoldQWebPageBundBottomQWebPageXKr grammatikkontrol sammen med stavekontrolCheck Grammar With SpellingQWebPage Kr stavekontrolCheck SpellingQWebPage@Kr stavekontrol mens der tastesCheck Spelling While TypingQWebPageVlg fil Choose FileQWebPage,Ryd aktuelle sgningerClear recent searchesQWebPage KopirCopyQWebPageKopir billede Copy ImageQWebPageKopir link Copy LinkQWebPageKlipCutQWebPageStandardDefaultQWebPage8Slet til slutningen af ordetDelete to the end of the wordQWebPage2Slet til starten af ordetDelete to the start of the wordQWebPageRetning DirectionQWebPageSkrifttyperFontsQWebPageG tilbageGo BackQWebPageG frem Go ForwardQWebPage@Skjul stave- og grammatikkontrolHide Spelling and GrammarQWebPageIgnorrIgnoreQWebPageIgnorr Ignore Grammar context menu itemIgnoreQWebPageInsert ny linieInsert a new lineQWebPage(Indst et nyt afsnitInsert a new paragraphQWebPageInspicrInspectQWebPage KursivItalicQWebPage*JavaScript alert - %1JavaScript Alert - %1QWebPage.JavaScript Bekrft - %1JavaScript Confirm - %1QWebPage,JavaScript Prompt - %1JavaScript Prompt - %1QWebPageLTRQWebPageVenstre kant Left edgeQWebPageSl op i ordbogLook Up In DictionaryQWebPageNFlyt markr til slutningen af sektionen'Move the cursor to the end of the blockQWebPagePFlyt markr til slutningen af dokumentet*Move the cursor to the end of the documentQWebPageHFlyt markr til slutningen af linien&Move the cursor to the end of the lineQWebPage4Flyt markr til nste tegn%Move the cursor to the next characterQWebPage6Flyt markr til nste linie Move the cursor to the next lineQWebPage2Flyt markr til nste ord Move the cursor to the next wordQWebPage8Flyt markr til forrige tegn)Move the cursor to the previous characterQWebPage:Flyt markr til forrige linie$Move the cursor to the previous lineQWebPage6Flyt markr til forrige ord$Move the cursor to the previous wordQWebPageHFlyt markr til starten af sektionen)Move the cursor to the start of the blockQWebPageJFlyt markr til starten af dokumentet,Move the cursor to the start of the documentQWebPageBFlyt markr til starten af linien(Move the cursor to the start of the lineQWebPage8Der er ikke fundet nogen gtNo Guesses FoundQWebPage0Der er ikke valgt en filNo file selectedQWebPage0Ingen aktuelle sgningerNo recent searchesQWebPagebn faneblad Open FrameQWebPagebn billede Open ImageQWebPagebn link Open LinkQWebPage bn i nyt vindueOpen in New WindowQWebPage KonturOutlineQWebPageSide ned Page downQWebPageSide venstre Page leftQWebPageSide hjre Page rightQWebPageSide verstPage upQWebPageSt indPasteQWebPageRTLQWebPage$Aktuelle sgningerRecent searchesQWebPageGenindlsReloadQWebPageNulstilResetQWebPageHjre kant Right edgeQWebPageGem billede Save ImageQWebPageGem link... Save Link...QWebPageScroll ned Scroll downQWebPageScroll her Scroll hereQWebPage$Scroll til venstre Scroll leftQWebPage Scroll til hjre Scroll rightQWebPageScroll op Scroll upQWebPageSg p nettetSearch The WebQWebPageMarkr alt Select allQWebPage@Vlg til slutningen af sektionenSelect to the end of the blockQWebPageBVlg til slutningen af dokumentet!Select to the end of the documentQWebPage:Vlg til slutningen af linienSelect to the end of the lineQWebPage&Vlg til nste tegnSelect to the next characterQWebPage(Vlg til nste linieSelect to the next lineQWebPage$Vlg til nste ordSelect to the next wordQWebPage*Vlg til forrige tegn Select to the previous characterQWebPage,Vlg til forrige linieSelect to the previous lineQWebPage(Vlg til forrige ordSelect to the previous wordQWebPage:Vlg til starten af sektionen Select to the start of the blockQWebPage<Vlg til starten af dokumentet#Select to the start of the documentQWebPage4Vlg til starten af linienSelect to the start of the lineQWebPage<Vis stave- og grammatikkontrolShow Spelling and GrammarQWebPageStavekontrolSpellingQWebPageStopStopQWebPageSendSubmitQWebPageSendQSubmit (input element) alt text for elements with no alt, title, or valueSubmitQWebPageTekstretningText DirectionQWebPagePDette er et sgeindeks. Indtast sgeord:3This is a searchable index. Enter search keywords: QWebPageTopQWebPageUnderstreget UnderlineQWebPage UkendtUnknownQWebPage$Web-inspektr - %2Web Inspector - %2QWebPageHvad er dette? What's This?QWhatsThisAction*QWidget&Afslut&FinishQWizard &Hjlp&HelpQWizard &Nste&NextQWizard&Nste >&Next >QWizard< &Tilbage< &BackQWizardAnnullerCancelQWizard UdfrCommitQWizardFortstContinueQWizard FrdigDoneQWizardG tilbageGo BackQWizard HjlpHelpQWizard %1 - [%2] QWorkspace&Luk&Close QWorkspace &Flyt&Move QWorkspace&Gendan&Restore QWorkspace&Strrelse&Size QWorkspace&Fjern skygge&Unshade QWorkspaceLukClose QWorkspaceMa&ksimr Ma&ximize QWorkspaceMi&nimr Mi&nimize QWorkspaceMinimerMinimize QWorkspaceGendan ned Restore Down QWorkspaceSk&yggeSh&ade QWorkspaceBliv p &toppen Stay on &Top QWorkspaceEnkodningsdeklaration eller fri deklaration forventet ved lsning af XML-deklarationYencoding declaration or standalone declaration expected while reading the XML declarationQXmlVfejl i tekstdeklaration p en ekstern enhed3error in the text declaration of an external entityQXmlZder opstod fejl under fortolking af kommentar$error occurred while parsing commentQXmlVder opstod fejl under fortolking af indhold$error occurred while parsing contentQXmltder opstod fejl under fortolking af dokumenttypedefinition5error occurred while parsing document type definitionQXmlVder opstod fejl under fortolking af element$error occurred while parsing elementQXmlZder opstod fejl under fortolking af reference&error occurred while parsing referenceQXmlDFejltilstand rejst af datamodtagererror triggered by consumerQXmlxEksternt parset generel entitetsreference ikke tilladt i DTD;external parsed general entity reference not allowed in DTDQXmlEksternt parset generel entitetsreference ikke tilladt i attributvrdiGexternal parsed general entity reference not allowed in attribute valueQXmlfintern generel entitetsreference ikke tilladt i DTD4internal general entity reference not allowed in DTDQXmlPUgyldigt navn for processing instruction'invalid name for processing instructionQXml"bogstav forventetletter is expectedQXmlLmere end n definition p dokumenttype&more than one document type definitionQXml*der opstod ingen fejlno error occurredQXml&rekursive entiteterrecursive entitiesQXmlpfri deklaration forventet ved lsning af XML-deklarationAstandalone declaration expected while reading the XML declarationQXml tag mismatchQXmluventet tegnunexpected characterQXml2uventet afslutning p filunexpected end of fileQXmlZufortolket enhedsreference i forkert kontekst*unparsed entity reference in wrong contextQXmldversion forventet under lsning af XML-deklaration2version expected while reading the XML declarationQXmlBForkert vrdi for fri deklaration&wrong value for standalone declarationQXmlF%1 er en ugyldig PUBLIC identifier.#%1 is an invalid PUBLIC identifier. QXmlStreamB%1 er et ugyldigt enkodningsnavn.%1 is an invalid encoding name. QXmlStream\%1 er et ugyldigt processing-instruction-navn.-%1 is an invalid processing instruction name. QXmlStream, men fik ' , but got ' QXmlStream*Attribut redefineret.Attribute redefined. QXmlStreamBEnkodning %1 er ikke understttetEncoding %1 is unsupported QXmlStreamFIndhold med forkert enkodning lst.(Encountered incorrectly encoded content. QXmlStream:Enheden '%1' ikke deklareret.Entity '%1' not declared. QXmlStreamForventet Expected  QXmlStream&Forventet tegndata.Expected character data. QXmlStreamDEkstra indhold sidst i dokumentet.!Extra content at end of document. QXmlStream<Ulovligt navnerumsdeklaration.Illegal namespace declaration. QXmlStream$Ugyldigt XML-tegn.Invalid XML character. QXmlStream$Ugyldigt XML-navn.Invalid XML name. QXmlStream8Ugyldigt XML-versionsstreng.Invalid XML version string. QXmlStreamFUgyldig attribut i XML-deklaration.%Invalid attribute in XML declaration. QXmlStream,Ugyldig tegnreference.Invalid character reference. QXmlStream$Ugyldigt dokument.Invalid document. QXmlStream(Ugyldig enhedsvrdi.Invalid entity value. QXmlStreamJUgyldigt processing-instruction-navn.$Invalid processing instruction name. QXmlStreamJNDATA i parameterentitetsdeklaration.&NDATA in parameter entity declaration. QXmlStreamJNavnerumsprfiks '%1' ikke deklareret"Namespace prefix '%1' not declared QXmlStream@bner og afslutter tag-mismatch. Opening and ending tag mismatch. QXmlStream<Dokument sluttede for tidligt.Premature end of document. QXmlStream2Rekursiv entitet opdaget.Recursive entity detected. QXmlStreambReference til ekstern enhed '%1' i attributvrdi.5Reference to external entity '%1' in attribute value. QXmlStreamFReference to ufortolket enhed '%1'."Reference to unparsed entity '%1'. QXmlStreamJSekvens ']]>' ikke tilladt i indhold.&Sequence ']]>' not allowed in content. QXmlStream(Start-tag forventet.Start tag expected. QXmlStreampDen frie pseudo-attribut skal optrde efter enkodningen.?The standalone pseudo attribute must appear after the encoding. QXmlStreamUventet ' Unexpected ' QXmlStreamHUventet tegn '%1' i public id vrdi./Unexpected character '%1' in public id literal. QXmlStream<XML-version understttes ikke.Unsupported XML version. QXmlStreamZXML-deklaration ikke i starten af dokumentet.)XML declaration not at start of document. QXmlStreamN%1 er ikke en gyldig vrdi af typen %2.#%1 is not a valid value of type %2. QtXmlPatternsEn %1-attribut skal have en gyldig %2 som vrdi, hvilket %3 ikke er.>An %1-attribute must have a valid %2 as value, which %3 isn't. QtXmlPatternsbEn %1-attribut med vrdi %2 er allerede erklret.8An %1-attribute with value %2 has already been declared. QtXmlPatternsNMindst en komponent skal vre tilstede.'At least one component must be present. QtXmlPatternsvMindst en tidskomponent skal optrde efter %1-skillemrket.?At least one time component must appear after the %1-delimiter. QtXmlPatterns>Dag %1 er ugyldig for mnet %2.Day %1 is invalid for month %2. QtXmlPatternsJDag %1 er udenfor intervallet %2..%3.#Day %1 is outside the range %2..%3. QtXmlPatternsDivision af vrdi af typen %1 med %2 (ikke et tal) er ikke tilladt.@Dividing a value of type %1 by %2 (not-a-number) is not allowed. QtXmlPatternsRDivision (%1) med nul (%2) er udefineret.(Division (%1) by zero (%2) is undefined. QtXmlPatternsElement %1 kan ikke serialiseres fordi det optrder udenfor dokument-elementet.OElement %1 can't be serialized because it appears outside the document element. QtXmlPatterns`Heltalsdivision (%1) med nul (%2) er udefineret.0Integer division (%1) by zero (%2) is undefined. QtXmlPatterns`Modulusdivision (%1) med nul (%2) er udefineret.0Modulus division (%1) by zero (%2) is undefined. QtXmlPatternsNMned %1 er udenfor intervallet %2..%3.%Month %1 is outside the range %2..%3. QtXmlPatterns Netvrk timeout.Network timeout. QtXmlPatternshIngen operand i en heltalsdivision, %1, kan vre %2.1No operand in an integer division, %1, can be %2. QtXmlPatternsPOverflow: Kan ikke reprsentere dato %1."Overflow: Can't represent date %1. QtXmlPatternsLOverflow: Dato kan ikke reprsenteres.$Overflow: Date can't be represented. QtXmlPatternsDen frste operand i en heltalsdivision, %1, kan ikke vre uendeligt (%2).FThe first operand in an integer division, %1, cannot be infinity (%2). QtXmlPatternsxDen anden operand i en division, %1, kan ikke vre nul (%2).:The second operand in a division, %1, cannot be zero (%2). QtXmlPatternsDTidspunkt %1:%2:%3.%4 er ugyldigt.Time %1:%2:%3.%4 is invalid. QtXmlPatternsTidspunkt 24:%1:%2.%3 er ugyldigt. Timetal er 24, men minutter, sekunder og millisekunder er ikke alle 0; _Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0;  QtXmlPatternslVed cast til %1 fra %2, kan kildevrdien ikke vre %3.:When casting to %1 from %2, the source value cannot be %3. QtXmlPatternsRr %1 er ugyldigt da det begynder med %2.-Year %1 is invalid because it begins with %2. QtXmlPatternsMuted VolumeSliderLydstyrke: %1% Volume: %1% VolumeSliderqstopmotion-2.3.2-Source/translations/qt_fr.qm000644 000000 000000 00000762177 12536560630 021553 0ustar00rootroot000000 000000 H5H5&H5H5H5L8LVEf@fhffWfoffgl;C>D@}`@C6UC`By$5Dm5 heFuIy QG( yƟ ~X ^XB]6QHt]3*!nw6$ &S. (2S(4(4(4'(52(5f*yM*yZ*y*T%*0[|*0+Fk+Fm+L2+f6+f +zfo+Ml+Z+;+zf+7Y+B+ +& +l ++įM+į[)+įs+f334r37:9;f=A@BjH̺C:C:{F0i3Fn4Fn4nGHw9LHw9I'I#I_IdtIJ+MJ+!GJ6NJ6h?J6hJ6J6ltJ6oDJ6J6J6 J6!J6IJcbjJK3L %(LZ%L4LhnLbV"VE;wW` WWTWTWT<X~oX9=mXX˙pX=Y# YnzY@YZ+AZgA5Z$=Z [;^P_[=[f3EL[f3*\\]4\]4O\]4w\\\\FatgcZlGt>} |^|^||A c~avvZ VJԱ*\ -f-g)CHMdϲ4L„5°]u.*6CdIAIM[ȵFg+I5UÉ$yXtDD^%8EIɵnlɵnCɵnJgɵncɵnɵnɵn:ɵn \0 B Bv*Z'w<fMr1)dad4FqpT۔Y $>GHcxB8,+ɤ]D<pNJ55v#Qd%UT%UTy(Ŏ*4O-ct23C?2?NFRxNkyUiWW~Q]G-`nz` jt7lg lyzQUl}oivty.$1!lb%0"=<e4+)MOU 66k^6:^-M9ZRT=~.?;EE1{{S=8A;&τnA,M[y&LQt oCCVnՆ` ng.NVml@Mk!ME(E3 nwKw :6e4^B IP )#ڎ$pP 4'$BI'UK!e&h)G*/eG+C+,0,N^h1E:ϭ;\;t<?4_EByEcFrFlNjO{tOZf+[ \cO\,g`j>b(vb-cփ5 fg&4 VjCmn[PqY~qK tuNu(+a{>z}kaRi}^#B ~61u*_'y)\sK&$$h$:s5G+0(Hu6<ʁUr^;K3@LM֊gz nf'Y,Enq;y8ω#aGO-5I+~T>bAZ n%7^Z-N=w &HE&r,n,}./D4!(5,@8k?CrIxSe KL"LOݺR>UXmYM(YM3W^3eh^TiYnnn`4sscsjsvw@)%x/^d2"%}ۊgqat4e] ]=&~mI9IKILEI/I\IRITIZlQ-I0Y0Ni0y0/"/^//..I2.1>1z111uD,uD7dD oe,4t,[,,$ ,U],B]->2rV_|>ɘe%5$Ai 4;8fR>fRG>]ݿ-<SUJA _s?9N'~N)zQ~*cW )S!Pq/VfR |T4,Ub-   Q O `,)+L rBbi l.t"o$!$%CTA&~ & )2TX)+ц,/`53 653V8384";_?"e%?>uAqYFuKNK-;M N><RU5BV|"@Z ]B]Iieg^:k; y^P{yΐw?Ji05t=7F(=:xΞ9"t8 =G%&n nn|ǥm @ +@A+T+DD`nW=t7{y1T;$p/xA$r}9\#C`s$SϾ6N[%dk@:{,BEIC-C59OUC^7ƨ59ƨV˾Iҝz>Xلi[է?U؊=.؊=Z>i}Hzܓ7ߺfwf~kt\_롥c(` +!*=jN{omrD$^!DDĕ   8 5Ui$i5~b~bo@{MS t  `!!G%?E{'F)ў4+u5n+3,8//0/V14~6 ?8Ȕ<l&? 2AD]G(GbLAUOrLfPѧQ6SRC+SnUTlUUNUUyUTAYĻ`Z"RZ"Z"Z"[[=]k*]^n&_PJQ_P_p/`ud`d`e?i-.i7kQWm?$QoN)xy;d{/{S}u:z}w}wKy}w_}ۨеhsX1$lLO{r'0BqnvttfYd&..K3PiU> tu5DwY^V^tt\t3t_tu@t)-n$lx_ 9aUspFgCFXʢoʢKʬ#ƴdpdh%d5dCdO59Fejэi+=RNS㵾]VDHxkJyUzUpd)TelBfhwVA 2>,%342N+6.i7D 9!,:d:%T?;CU]CUDD)E[PGrINJ0KAU| V7/Xw\\D]/t$arPld!n8gXp&tAw-3y'|}wZ}$@}$K9}$"~9:"4Dϗ-Zd~VNID<L>?{9`N'qNoiK<t··ý uX׳m þ/5fC (e=tB }U eV7'E&ȥKvU$ONSu:-%51TWS e~2li~8W,DMѭbi9%ǯ7b2#j#%p%%d"\'J-.n.-5kEM;%=r=:?]*?b.@J!x@TCtIEflNP7cP0V%0&V%1XU BZV`}awbDCbGTfd<gAHhI 9i$*lsf x1 !z*2|QRţ d$dJlk\UUc(.zPc.:$4C5Q IQ,8X<m'e%nJ<b†5igCU*%ʴ5kʴ5ףʶm8 ^ ?g}hԄܴ۔#D'N^dWAF5QF5mYp>+>|%4Ny&DI=lIAs9j p[ }$i qe1 ڤ ڤs ڥd dQ Ee E { AcC Ac) N *3 35 35~ ix `B b6 bb! b` b`$ d gU_ i3X kk la[ lf lsZ qv qv` qzG\ tN uh xq |o7 |R |{A = J< ˧ tBu t` ` . F~ I 4 [ K ).X F>    le \t  u P  wz B! ҉ 4 .+ > = U C KZ f n` V %  u" Y+g 0 KO  쉥( 팤q E] l~E %' 5s 2j ' / C- Q = q#  D5  } 9 o' Ąˮ Q ) ) ) */ .>aB 5J 7u ;W+  e= ee e{ f1*V f*2 g5U< gn k,D n$ rD"KD t o> `: Sd n- çl $v B vB ȯ'4 $ lC) ˔&@ }p P[F P +> 4 ~tO .X 68 >>^ p v"E :f7 f 8 f  4F .% = ( s; s AA. 9 1  9j 05 r$? ߆ m,E 5T ݡ( N 2 ! #-t( #-t} #$ ' ~ 0NaN 5T AW CU% E9B G] I L[ Lg Mc\8 P..u RH SHJ VM W? Z8 [" \OtB ]$m c f)9 f) 2 f=K io> l#># luE m`S wB4 xR yr }QI ę f H7 H H G ^ ) n' С([ $& .@FK I iŝ <R B  N9 [ {  zdR9 (2 % J<& J 0 C t.N k ӇN  Mw Ly N>U / ̺&| &  -D'} .Y x? ۷ݦ r. k- k U)8m T>7 <R u S 09 $r?5   ,  7! IY * %%= hT Nb 9  xH= a I ~N y !p $ %6b4 )Ε .e 2; 7F >/t >0 >2[ >N >ZI > > >p >s: > ?t| DT3 G(C I`D Id L MbAd P@ QT RV RV٫ S.T SGr S Y Yo [ hۮ j7o m( pe sL u( vh  BJ  Tm Tc T7 T  L< ol Z D7   W ,' ,13 S )d )d} T`E f .mv .D .d . . . .  R"  a az P yQ a_ v e." x0 c hNb ɾd% ɾd'@ e ̈́^x >@ ҂ ӏ Ӵ [ ~ >e % uR t; R$ oo  |# ] b#8 Je Xtu n 9 )f t ۰ a[K  &p :b8 Uqkv  b] ʜd f f fd   * $} #  HB #$r #= %ncw % (I$K (N +>g# +kz 0EY 64V ;ɾ Fg K9 Ptm~ Ptص R"y S,C T>6. ^Uj) c dBU fe fe g hQ$. iFC&9 i; i& jN jӮb kGnva l" m9 n u:C u#) uZ v `g v&O v{ w wJ w w} w}J w} |[ uH ) 3 < J? bߧ ל |+ ^  }X S R %7q : xN` "; U^ ɰe6 Fq 7 X? Mp bo Y &   x_ D@  + t5l t5y $ M >x= n, " )4 3! SE$R wl>Y @aU;T^֣,\vgT^pSdpS!a9$+4&-ֽ'*[*՞+,/E] /E\/ExD4Qt$7SI_9@KOO_wS5XRuX+[ d[ 7a.Ua.a%!gcMi$(nyGvɅGoy$y?.~;b%1,>*e)_z4Evh'!4SNl'N6^u:^tZ56DBZfzS5BL3Ӯ`tӮ`Ӯ`uA>$r\ ݖϭmUڎ[yʏ4>^pRrFrjjY6  * : G tlD+"#]$UE%4~%4'|;*],-j-vY0i)4051c@1cy*2wT4FDT~F74](HEJd:KQL$.sO{\Pd&WO^[{*c5c5]c d#{g3܇iCQlppqii v)[yCUs{`n{~a26$Y51&&Du$t {Yh`n6[>8vzͣ;;hkt"Nƪ E*"~gdLR r]rE4-1ozkyį֠U"H'T/S44aLntޙBPr5t2ab dڢU]iNFermer l'onglet Close Tab CloseButton<indfini> Debugger::JSAgentWatchData0[Tableau de longueur %1][Array of length %1]Debugger::JSAgentWatchDataFausse erreur ! Fake error! FakeReplyURL invalide Invalid URL FakeReply propos de %1About %1MAC_APPLICATION_MENUMasquer %1Hide %1MAC_APPLICATION_MENU$Masquer les autres Hide OthersMAC_APPLICATION_MENUPrfrences...Preferences...MAC_APPLICATION_MENUQuitter %1Quit %1MAC_APPLICATION_MENUServicesServicesMAC_APPLICATION_MENUTout afficherShow AllMAC_APPLICATION_MENUAccessibilit AccessibilityPhonon::Communication CommunicationPhonon::JeuxGamesPhonon::MusiqueMusicPhonon::Notifications NotificationsPhonon:: VidoVideoPhonon::><html>Basculement vers le priphrique audio <b>%1</b><br/>dont le niveau de prfrence est plus lev ou qui est spcifiquement configur pour ce flux.</html>Switching to the audio playback device %1
which has higher preference or is specifically configured for this stream.Phonon::AudioOutput&<html>Basculement vers le priphrique audio <b>%1</b><br/>qui vient juste d'tre disponible et dont le niveau de prfrence est plus lev.</html>xSwitching to the audio playback device %1
which just became available and has higher preference.Phonon::AudioOutput<html>Le priphrique audio <b>%1</b> ne fonctionne pas.<br/>Repli sur <b>%2</b>.</html>^The audio playback device %1 does not work.
Falling back to %2.Phonon::AudioOutput8Revenir au priphrique '%1'Revert back to device '%1'Phonon::AudioOutputAttention: Vous n'avez apparemment pas installes les plugins de base de GStreamer. Le support audio et vido est dsactiv~Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabledPhonon::Gstreamer::Backend Attention: Vous n'avez apparemment pas install le paquet gstreamer0.10-plugins-good. Des fonctionnalits vido ont t desactives.Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled.Phonon::Gstreamer::BackendUn codec requis est manquant. Vous devez installer le codec suivant pour jouer le contenu: %0`A required codec is missing. You need to install the following codec(s) to play this content: %0Phonon::Gstreamer::MediaObjectImpossible de dmarrer la lecture. Vrifiez votre installation de GStreamer et assurez-vous d'avoir install libgstreamer-plugins-base.wCannot start playback. Check your GStreamer installation and make sure you have libgstreamer-plugins-base installed.Phonon::Gstreamer::MediaObjectLImpossible de dcoder le mdia source.Could not decode media source.Phonon::Gstreamer::MediaObjectPImpossible de localiser le mdia source.Could not locate media source.Phonon::Gstreamer::MediaObjectImpossible d'ouvrir le priphrique audio. Celui-ci est dj en cours d'utilisation.:Could not open audio device. The device is already in use.Phonon::Gstreamer::MediaObjectHImpossible d'ouvrir le mdia source.Could not open media source.Phonon::Gstreamer::MediaObject0Type de source invalide.Invalid source type.Phonon::Gstreamer::MediaObjectZAssistant de script d'aide au codec manquant.&Missing codec helper script assistant.Phonon::Gstreamer::MediaObjecthchec de l'installation du plugin pour le codec : %0.Plugin codec installation failed for codec: %0Phonon::Gstreamer::MediaObject(Autorisation refuse Access denied Phonon::MMFExiste djAlready exists Phonon::MMFSortie audio Audio Output Phonon::MMFfLes composants audio ou vido n'ont pas pu tre lus-Audio or video components could not be played Phonon::MMF,Erreur de sortie audioAudio output error Phonon::MMF(Connexion impossibleCould not connect Phonon::MMFErreur GDN DRM error Phonon::MMF$Erreur du dcodeur Decoder error Phonon::MMFDconnect Disconnected Phonon::MMFUtilisIn use Phonon::MMF6Bande passante insuffisanteInsufficient bandwidth Phonon::MMFURL invalide Invalid URL Phonon::MMF$Protocole invalideInvalid protocol Phonon::MMF Erreur multicastMulticast error Phonon::MMF<Erreur de communication rseauNetwork communication error Phonon::MMF*Rseau non disponibleNetwork unavailable Phonon::MMFAucune erreurNo error Phonon::MMFIntrouvable Not found Phonon::MMFPas prt Not ready Phonon::MMFNon support Not supported Phonon::MMF(Mmoire insuffisante Out of memory Phonon::MMFDpassementOverflow Phonon::MMF$Chemin introuvablePath not found Phonon::MMF(Autorisation refusePermission denied Phonon::MMF.Erreur du serveur proxyProxy server error Phonon::MMF4Serveur proxy non supportProxy server not supported Phonon::MMFAlerte serveur Server alert Phonon::MMF,Streaming non supportStreaming not supported Phonon::MMF8Priphrique audio de sortieThe audio output device Phonon::MMFSoupassement Underflow Phonon::MMF(Erreur inconnue (%1)Unknown error (%1) Phonon::MMF,Erreur de sortie vidoVideo output error Phonon::MMF0Erreur de tlchargementDownload error Phonon::MMF::AbstractMediaPlayerFErreur lors de l'ouverture de l'URLError opening URL Phonon::MMF::AbstractMediaPlayerJErreur lors de l'ouverture du fichierError opening file Phonon::MMF::AbstractMediaPlayerTerreur lors de l'ouverture de la ressourceError opening resource Phonon::MMF::AbstractMediaPlayer~erreur lors de l'ouverture de la source : ressource non ouverte)Error opening source: resource not opened Phonon::MMF::AbstractMediaPlayer8chec de l'ouverture du clipLoading clip failed Phonon::MMF::AbstractMediaPlayer*Pas prt pour lectureNot ready to play Phonon::MMF::AbstractMediaPlayer Lecture terminePlayback complete Phonon::MMF::AbstractMediaPlayer:Le rglage du volume a chouSetting volume failed Phonon::MMF::AbstractMediaPlayerFL'obtention de la position a chouGetting position failed Phonon::MMF::AbstractVideoPlayer8L'ouverture du clip a chouOpening clip failed Phonon::MMF::AbstractVideoPlayer2La mise en pause a chou Pause failed Phonon::MMF::AbstractVideoPlayer*La recherche a chou Seek failed Phonon::MMF::AbstractVideoPlayer %1 Hz%1 HzPhonon::MMF::AudioEqualizerFL'obtention de la position a chouGetting position failedPhonon::MMF::AudioPlayer6Erreur de l'affichage vidoVideo display errorPhonon::MMF::DsaVideoPlayer ActivEnabledPhonon::MMF::EffectFactory,Ratio HF du dclin (%)Decay HF ratio (%) Phonon::MMF::EnvironmentalReverb(Temps de dclin (ms)Decay time (ms) Phonon::MMF::EnvironmentalReverbDensit (%) Density (%) Phonon::MMF::EnvironmentalReverbDiffusion (%) Diffusion (%) Phonon::MMF::EnvironmentalReverb*Dlai rflexions (ms)Reflections delay (ms) Phonon::MMF::EnvironmentalReverb,Niveau rflexions (mB)Reflections level (mB) Phonon::MMF::EnvironmentalReverb6Dlai de rverbration (ms)Reverb delay (ms) Phonon::MMF::EnvironmentalReverb8Niveau de rverbration (mB)Reverb level (mB) Phonon::MMF::EnvironmentalReverbNiveau HF pice Room HF level Phonon::MMF::EnvironmentalReverb"Niveau pice (mB)Room level (mB) Phonon::MMF::EnvironmentalReverbErreur lors de l'ouverture de la source: type de mdia non dtermin8Error opening source: media type could not be determinedPhonon::MMF::MediaObject|Erreur lors de l'ouverture de la source : ressource compresse,Error opening source: resource is compressedPhonon::MMF::MediaObjectxErreur lors de l'ouverture de la source : ressource invalide(Error opening source: resource not validPhonon::MMF::MediaObjectvErreur lors de l'ouverture de la source: type non support(Error opening source: type not supportedPhonon::MMF::MediaObjectEchec lors de l'tablissement du point d'accs Internet requisFailed to set requested IAPPhonon::MMF::MediaObjectNiveau (%) Level (%)Phonon::MMF::StereoWidening6Erreur de l'affichage vidoVideo display errorPhonon::MMF::SurfaceVideoPlayerSon coupMutedPhonon::VolumeSliderUtilisez le slider pour ajuster le volume. La position la plus gauche est 0%, la plus droite est %1%WUse this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%Phonon::VolumeSliderVolume: %1% Volume: %1%Phonon::VolumeSliderHLa squence %1, %2 n'est pas dfinie%1, %2 not definedQ3Accel>Squence ambigu %1 non traiteAmbiguous %1 not handledQ3AccelSupprimerDelete Q3DataTableFauxFalse Q3DataTableInsrerInsert Q3DataTableVraiTrue Q3DataTableActualiserUpdate Q3DataTable%1 Impossible de trouver le fichier. Vrifiez le chemin et le nom du fichier.+%1 File not found. Check path and filename. Q3FileDialogSuppri&mer&Delete Q3FileDialog&Non&No Q3FileDialog&OK&OK Q3FileDialog&Ouvrir&Open Q3FileDialog&Renommer&Rename Q3FileDialog&Enregistrer&Save Q3FileDialog&Non tri &Unsorted Q3FileDialog&Oui&Yes Q3FileDialogb<qt>Voulez-vous vraiment supprimer %1 "%2"?</qt>1Are you sure you wish to delete %1 "%2"? Q3FileDialog*Tous les fichiers (*) All Files (*) Q3FileDialog.Tous les fichiers (*.*)All Files (*.*) Q3FileDialogAttributs Attributes Q3FileDialog,Prcdent (historique)Back Q3FileDialogAnnulerCancel Q3FileDialog6Copie ou dplace un fichierCopy or Move a File Q3FileDialog0Crer un nouveau dossierCreate New Folder Q3FileDialogDateDate Q3FileDialogSupprimer %1 Delete %1 Q3FileDialog$Affichage dtaill Detail View Q3FileDialogDossierDir Q3FileDialogDossiers Directories Q3FileDialogDossier:  Directory: Q3FileDialog ErreurError Q3FileDialogFichierFile Q3FileDialog$&Nom de fichier:  File &name: Q3FileDialog&&Type de fichier:  File &type: Q3FileDialog0Chercher dans le dossierFind Directory Q3FileDialogInaccessible Inaccessible Q3FileDialogAffichage liste List View Q3FileDialog"Chercher &dans:  Look &in: Q3FileDialogNomName Q3FileDialogNouveau dossier New Folder Q3FileDialog$Nouveau dossier %1 New Folder %1 Q3FileDialog"Nouveau dossier 1 New Folder 1 Q3FileDialog.Aller au dossier parentOne directory up Q3FileDialog OuvrirOpen Q3FileDialog OuvrirOpen  Q3FileDialog>Contenu du fichier prvisualisPreview File Contents Q3FileDialogHInformations du fichier prvisualisPreview File Info Q3FileDialogR&echargerR&eload Q3FileDialogLecture seule Read-only Q3FileDialog Lecture-criture Read-write Q3FileDialogLecture: %1Read: %1 Q3FileDialog Enregistrer sousSave As Q3FileDialog.Slectionner un dossierSelect a Directory Q3FileDialog:Afficher les fic&hiers cachsShow &hidden files Q3FileDialog TailleSize Q3FileDialogTriSort Q3FileDialogTrier par &date Sort by &Date Q3FileDialogTrier par &nom Sort by &Name Q3FileDialog"Trier par ta&ille Sort by &Size Q3FileDialogFichier spcialSpecial Q3FileDialog>Lien symbolique vers un dossierSymlink to Directory Q3FileDialog>Lien symbolique vers un fichierSymlink to File Q3FileDialogNLien symbolique vers un fichier spcialSymlink to Special Q3FileDialogTypeType Q3FileDialogcriture seule Write-only Q3FileDialogcriture: %1 Write: %1 Q3FileDialogle dossier the directory Q3FileDialogle fichierthe file Q3FileDialog$le lien symbolique the symlink Q3FileDialogBImpossible de crer le dossier %1Could not create directory %1 Q3LocalFs,Impossible d'ouvrir %1Could not open %1 Q3LocalFs@Impossible de lire le dossier %1Could not read directory %1 Q3LocalFs`Impossible de supprimer le fichier ou dossier %1%Could not remove file or directory %1 Q3LocalFs>Impossible de renommer %1 en %2Could not rename %1 to %2 Q3LocalFs,Impossible d'crire %1Could not write %1 Q3LocalFs Personnaliser... Customize... Q3MainWindowAlignerLine up Q3MainWindowNOpration interrompue par l'utilisateurOperation stopped by the userQ3NetworkProtocolAnnulerCancelQ3ProgressDialogAppliquerApply Q3TabDialogAnnulerCancel Q3TabDialogPar dfautDefaults Q3TabDialogAideHelp Q3TabDialogOKOK Q3TabDialogCop&ier&Copy Q3TextEditCo&ller&Paste Q3TextEdit&Rtablir&Redo Q3TextEdit&Annuler&Undo Q3TextEditEffacerClear Q3TextEditCo&uperCu&t Q3TextEdit"Tout slectionner Select All Q3TextEdit FermerClose Q3TitleBar Ferme la fentreCloses the window Q3TitleBar`Contient des commandes pour manipuler la fentre*Contains commands to manipulate the window Q3TitleBarAffiche le nom de la fentre et contient des contrles pour la manipulerFDisplays the name of the window and contains controls to manipulate it Q3TitleBarBAffiche la fentre en plein cranMakes the window full screen Q3TitleBarMaximiserMaximize Q3TitleBarRduireMinimize Q3TitleBar8Dplace la fentre l'cartMoves the window out of the way Q3TitleBar\Rend une fentre minimise son aspect normal&Puts a maximized window back to normal Q3TitleBar\Rend une fentre minimise son aspect normal&Puts a minimized window back to normal Q3TitleBar Restaurer en bas Restore down Q3TitleBar"Restaurer en haut Restore up Q3TitleBarSystmeSystem Q3TitleBarPlus...More... Q3ToolBar(inconnu) (unknown) Q3UrlOperatorLe protocole `%1' ne permet pas de copier ou de dplacer des fichiersIThe protocol `%1' does not support copying or moving files or directories Q3UrlOperatorzLe protocole `%1' ne permet pas de crer de nouveaux dossiers;The protocol `%1' does not support creating new directories Q3UrlOperatorpLe protocole `%1' ne permet pas de recevoir des fichiers0The protocol `%1' does not support getting files Q3UrlOperatorLe protocole `%1' ne permet pas de lister les fichiers d'un dossier6The protocol `%1' does not support listing directories Q3UrlOperatorlLe protocole `%1' ne permet pas d'envoyer des fichiers0The protocol `%1' does not support putting files Q3UrlOperatorLe protocole `%1' ne permet pas de supprimer des fichiers ou des dossiers@The protocol `%1' does not support removing files or directories Q3UrlOperatorLe protocole `%1' ne permet pas de renommer des fichiers ou des dossiers@The protocol `%1' does not support renaming files or directories Q3UrlOperator@Le protocole '%1' n'est pas gr"The protocol `%1' is not supported Q3UrlOperator&Annuler&CancelQ3Wizard&Terminer&FinishQ3Wizard &Aide&HelpQ3Wizard&Suivant >&Next >Q3Wizard< &Prcdent< &BackQ3Wizard"Connexion refuseConnection refusedQAbstractSocket"Connexion expireConnection timed outQAbstractSocket Hte introuvableHost not foundQAbstractSocket:Rseau impossible rejoindreNetwork unreachableQAbstractSocketDOpration sur socket non supporte$Operation on socket is not supportedQAbstractSocket8Le socket n'est pas connectSocket is not connectedQAbstractSocket0Opration socket expireSocket operation timed outQAbstractSocket$Tout &slectionner &Select AllQAbstractSpinBox&Augmenter&Step upQAbstractSpinBox&Diminuer Step &downQAbstractSpinBox CocherCheckQAccessibleButtonAppuyerPressQAccessibleButtonDcocherUncheckQAccessibleButtonActiverActivate QApplicationRActive la fentre principale du programme#Activates the program's main window QApplicationbL'excutable '%1' requiert Qt %2 (Qt %3 prsent).,Executable '%1' requires Qt %2, found Qt %3. QApplicationJErreur: bibliothque Qt incompatibleIncompatible Qt Library Error QApplicationLTRTranslate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.QT_LAYOUT_DIRECTION QApplication&Annuler&Cancel QAxSelect&Objet COM:  COM &Object: QAxSelectOKOK QAxSelect@Slectionner un contrle ActiveXSelect ActiveX Control QAxSelect CocherCheck QCheckBoxChangerToggle QCheckBoxDcocherUncheck QCheckBoxH&Ajouter aux couleurs personnalises&Add to Custom Colors QColorDialog"Couleurs de &base &Basic colors QColorDialog0&Couleurs personnalises&Custom colors QColorDialog&Vert: &Green: QColorDialog&Rouge: &Red: QColorDialog&Saturation: &Sat: QColorDialog&Valeur: &Val: QColorDialogCanal a&lpha: A&lpha channel: QColorDialogBle&u: Bl&ue: QColorDialog&Teinte: Hu&e: QColorDialog0Slectionner une couleur Select Color QColorDialog FermerClose QComboBoxFauxFalse QComboBox OuvrirOpen QComboBoxVraiTrue QComboBox %1 : existe djQSystemSemaphore%1: already existsQCoreApplication"%1 : n'existe pasQSystemSemaphore%1: does not existQCoreApplication$%1 : ftok a chouQSystemSemaphore%1: ftok failedQCoreApplication%1 : cl videQSystemSemaphore%1: key is emptyQCoreApplicationF%1 : plus de ressources disponiblesQSystemSemaphore%1: out of resourcesQCoreApplication.%1: permission refuse%1: permission deniedQCoreApplication>%1 : impossible de crer la clQSystemSemaphore%1: unable to make keyQCoreApplication.%1 : erreur inconnue %2QSystemSemaphore%1: unknown error %2QCoreApplicationJIncapable de soumettre la transactionUnable to commit transaction QDB2DriverBIncapable d'tablir une connexionUnable to connect QDB2DriverDIncapable d'annuler la transactionUnable to rollback transaction QDB2DriverLImpossible d'activer l'auto-soumissionUnable to set autocommit QDB2DriverBImpossible d'attacher la variableUnable to bind variable QDB2Result@Impossible d'excuter la requteUnable to execute statement QDB2ResultDImpossible de rcuprer le premierUnable to fetch first QDB2ResultDImpossible de rcuprer le suivantUnable to fetch next QDB2ResultVImpossible de rcuprer l'enregistrement %1Unable to fetch record %1 QDB2ResultBImpossible de prparer la requteUnable to prepare statement QDB2ResultAMAM QDateTimeEditPMPM QDateTimeEditamam QDateTimeEditpmpm QDateTimeEditHL'animation est une classe abstraiteAnimation is an abstract classQDeclarativeAbstractAnimationbImpossible d'animer la proprit inexistante "%1")Cannot animate non-existent property "%1"QDeclarativeAbstractAnimationlImpossible d'animer la proprit en lecture seule "%1"&Cannot animate read-only property "%1"QDeclarativeAbstractAnimationZImpossible de slectionner une dure ngativeCannot set a duration of < 0QDeclarativeAnchorAnimationL'ancre baseline ne peut pas etre combine l'usage des ancres haut, bas ou vcenter.SBaseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.QDeclarativeAnchorstImpossible d'ancrer un bord horizontal un bord vertical.3Cannot anchor a horizontal edge to a vertical edge.QDeclarativeAnchorstImpossible d'ancrer un bord vertical un bord horizontal.3Cannot anchor a vertical edge to a horizontal edge.QDeclarativeAnchorsRImpossible d'ancrer l'lment lui mme.Cannot anchor item to self.QDeclarativeAnchorsJImpossible d'ancrer un lment nul.Cannot anchor to a null item.QDeclarativeAnchorsImpossible d'ancrer un lment qui n'est pas un parent ou partage le mme parent.8Cannot anchor to an item that isn't a parent or sibling.QDeclarativeAnchorsImpossible de spcifier la fois une ancre gauche, droite et hcenter.0Cannot specify left, right, and hcenter anchors.QDeclarativeAnchorsImpossible de spcifier la fois une ancre haut, bas et vcenter.0Cannot specify top, bottom, and vcenter anchors.QDeclarativeAnchorszBoucle potentielle dans les ancres dtecte pour le centrage.*Possible anchor loop detected on centerIn.QDeclarativeAnchorsBoucle potentielle dans les ancres dtecte pour le remplissage.&Possible anchor loop detected on fill.QDeclarativeAnchorsBoucle potentielle dans les ancres dtecte pour l'ancre horizontale.3Possible anchor loop detected on horizontal anchor.QDeclarativeAnchorsBoucle potentielle dans les ancres dtecte pour l'ancre verticale.1Possible anchor loop detected on vertical anchor.QDeclarativeAnchorsNQt a t compil sans support de QMovie'Qt was built without support for QMovieQDeclarativeAnimatedImageHApplication est une classe abstraite Application is an abstract classQDeclarativeApplicationzImpossible de changer l'animation affecte un comportement.3Cannot change the animation assigned to a Behavior.QDeclarativeBehaviorrBoucle dtecte dans l'affectation pour la proprit "%1"'Binding loop detected for property "%1"QDeclarativeBindingrBoucle dtecte dans l'affectation pour la proprit "%1"'Binding loop detected for property "%1"QDeclarativeCompiledBindingsTL'alias de proprit n'a pas d'emplacementQDeclarativeCompiler@"%1" ne peut pas oprer sur "%2""%1" cannot operate on "%2"QDeclarativeCompilerz"%1.%2" n'est pas disponible dans cette version du composant.5"%1.%2" is not available due to component versioning.QDeclarativeCompilerV"%1.%2" n'est pas disponible dans %3 %4.%5.%"%1.%2" is not available in %3 %4.%5.QDeclarativeCompilerjLa configuration spcifie ne peut tre utilise ici.'Attached properties cannot be used hereQDeclarativeCompilerVUn seul lien peut tre assign des listes$Can only assign one binding to listsQDeclarativeCompilerImpossible d'assigner directement une valeur une proprit groupe4Cannot assign a value directly to a grouped propertyQDeclarativeCompilerImpossible d'assigner une valeur un signal (un script excuter est attendu)@Cannot assign a value to a signal (expecting a script to be run)QDeclarativeCompilerImpossible d'assigner plusieurs valeurs une proprit de script2Cannot assign multiple values to a script propertyQDeclarativeCompilerImpossible d'assigner plusieurs valeurs une proprit singulire4Cannot assign multiple values to a singular propertyQDeclarativeCompilerTImpossible d'assigner un objet une listeCannot assign object to listQDeclarativeCompiler\Impossible d'assigner un objet une proprit Cannot assign object to propertyQDeclarativeCompilerbImpossible d'assigner des primitives des listes!Cannot assign primitives to listsQDeclarativeCompilerxImpossible d'attacher une proprit par dfaut inexistante.Cannot assign to non-existent default propertyQDeclarativeCompilerlImpossible d'attacher une proprit inexistante "%1"+Cannot assign to non-existent property "%1"QDeclarativeCompilernImpossible de crer une spcification du composant vide+Cannot create empty component specificationQDeclarativeCompilerTImpossible de remplacer la proprit FINALCannot override FINAL propertyQDeclarativeCompilerLes lments du composant ne peuvent pas contenir des proprits autres que id;Component elements may not contain properties other than idQDeclarativeCompilerLes objets composants ne peuvent pas dclarer de nouvelles fonctions./Component objects cannot declare new functions.QDeclarativeCompilerLes objets composants ne peuvent pas dclarer de nouvelles proprits.0Component objects cannot declare new properties.QDeclarativeCompilerLes objets composants ne peuvent pas dclarer de nouveaux signaux.-Component objects cannot declare new signals.QDeclarativeCompiler<Proprit par dfaut en doubleDuplicate default propertyQDeclarativeCompiler0Nom de mthode en doubleDuplicate method nameQDeclarativeCompiler4Nom de proprit en doubleDuplicate property nameQDeclarativeCompiler.Nom de signal en doubleDuplicate signal nameQDeclarativeCompiler<Impossible de crer l'lment.Element is not creatable.QDeclarativeCompiler:Affectation de proprit videEmpty property assignmentQDeclarativeCompiler4Affectation de signal videEmpty signal assignmentQDeclarativeCompilerlid masque illgalement la proprit JavaScript globale-ID illegally masks global JavaScript propertyQDeclarativeCompilerfLes ids ne peuvent pas commencer par une majuscule)IDs cannot start with an uppercase letterQDeclarativeCompilerLes ids ne peuvent contenir que des lettres, des nombres ou des tirets bas7IDs must contain only letters, numbers, and underscoresQDeclarativeCompilerpLes ids doivent commencer par une lettre ou un tiret bas*IDs must start with a letter or underscoreQDeclarativeCompiler.Nom de mthode invalideIllegal method nameQDeclarativeCompiler2Nom de proprit invalideIllegal property nameQDeclarativeCompiler,Nom de signal invalideIllegal signal nameQDeclarativeCompilerhL'affectation du signal est incorrectement spcifie'Incorrectly specified signal assignmentQDeclarativeCompilervRfrence d'alias invalide. Impossible de trouver l'id "%1"/Invalid alias reference. Unable to find id "%1"QDeclarativeCompilerZL'affectation de l'objet attach est invalide"Invalid attached object assignmentQDeclarativeCompilertLe corps de la spcification du composant n'est pas valide$Invalid component body specificationQDeclarativeCompilerXL'id de composant spcifie n'est pas valide"Invalid component id specificationQDeclarativeCompiler id vide invalideInvalid empty IDQDeclarativeCompilerLAccs invalide une proprit groupeInvalid grouped property accessQDeclarativeCompilerAffectation de proprit invalide : "%1"est une proprit en lecture seule9Invalid property assignment: "%1" is a read-only propertyQDeclarativeCompilerlAffectation de proprit invalide : vecteur 3D attendu/Invalid property assignment: 3D vector expectedQDeclarativeCompilerfAffectation de proprit invalide : boolen attendu-Invalid property assignment: boolean expectedQDeclarativeCompilerhAffectation de proprit invalide : couleur attendue+Invalid property assignment: color expectedQDeclarativeCompilerbAffectation de proprit invalide : date attendue*Invalid property assignment: date expectedQDeclarativeCompilervAffectation de proprit invalide : date et heure attendues.Invalid property assignment: datetime expectedQDeclarativeCompiler^Affectation de proprit invalide : int attendu)Invalid property assignment: int expectedQDeclarativeCompilerdAffectation de proprit invalide : nombre attendu,Invalid property assignment: number expectedQDeclarativeCompilerbAffectation de proprit invalide : point attendu+Invalid property assignment: point expectedQDeclarativeCompilerjAffectation de proprit invalide : rectangle attendu*Invalid property assignment: rect expectedQDeclarativeCompilerdAffectation de proprit invalide : script attendu,Invalid property assignment: script expectedQDeclarativeCompilerfAffectation de proprit invalide : taille attendue*Invalid property assignment: size expectedQDeclarativeCompilerfAffectation de proprit invalide : chane attendue,Invalid property assignment: string expectedQDeclarativeCompilerdAffectation de proprit invalide : heure attendue*Invalid property assignment: time expectedQDeclarativeCompilerpAffectation de proprit invalide : numration inconnue0Invalid property assignment: unknown enumerationQDeclarativeCompilerpAffectation de proprit invalide : unsigned int attendu2Invalid property assignment: unsigned int expectedQDeclarativeCompilertAffectation de proprit invalide : type "%1" non support2Invalid property assignment: unsupported type "%1"QDeclarativeCompiler`Affectation de proprit invalide : url attendue)Invalid property assignment: url expectedQDeclarativeCompilerBImbrication de proprit invalideInvalid property nestingQDeclarativeCompiler4Type de proprit invalideInvalid property typeQDeclarativeCompilerDLa proprit utilise est invalideInvalid property useQDeclarativeCompilerNUtilisation invalide de la proprit idInvalid use of id propertyQDeclarativeCompilerJUtilisation invalide d'espace de nomsInvalid use of namespaceQDeclarativeCompilerLes noms des mthodes ne peuvent pas commencer par une majuscule3Method names cannot begin with an upper case letterQDeclarativeCompiler0Objet attach inexistantNon-existent attached objectQDeclarativeCompilerRCe n'est pas un nom de proprit attacheNot an attached property nameQDeclarativeCompilerBAffectation de proprit attendueProperty assignment expectedQDeclarativeCompiler\Une valeur a dj t attribue la proprit*Property has already been assigned a valueQDeclarativeCompilerLes noms des proprits ne peuvent pas commencer par une majuscule5Property names cannot begin with an upper case letterQDeclarativeCompilerXValeur de proprit attribue plusieurs fois!Property value set multiple timesQDeclarativeCompiler|Les noms de signaux ne peuvent pas commencer par une majuscule3Signal names cannot begin with an upper case letterQDeclarativeCompiler^Une seule affectation de proprit est attendue#Single property assignment expectedQDeclarativeCompiler<Affectation d'objet inattendueUnexpected object assignmentQDeclarativeCompiler*l'id n'est pas uniqueid is not uniqueQDeclarativeCompiler"URL vide invalideInvalid empty URLQDeclarativeComponentfcreateObject : la valeur fournie n'est pas un objet$createObject: value is not an objectQDeclarativeComponenthImposible d'assigner la proprit inexistante "%1"+Cannot assign to non-existent property "%1"QDeclarativeConnectionsrConnexions: les lments imbriqus ne sont pas autoriss'Connections: nested objects not allowedQDeclarativeConnections6Connexions: script attenduConnections: script expectedQDeclarativeConnections<Connexions: erreur de syntaxeConnections: syntax errorQDeclarativeConnections8Transaction en lecture seuleRead-only TransactionQDeclarativeEngine8la transaction SQL a choueSQL transaction failedQDeclarativeEnginenSQL : la version de la base de donnes est incompatibleSQL: database version mismatchQDeclarativeEngine\Version incompatible: %1 attendue, %2 trouve'Version mismatch: expected %1, found %2QDeclarativeEnginedexecuteSql a t appel en dehors de transaction()'executeSql called outside transaction()QDeclarativeEngine^transaction: la fonction de rappel est absentetransaction: missing callbackQDeclarativeEnginePback est une proprit criture uniqueback is a write-once propertyQDeclarativeFlipableRfront est une proprit criture uniquefront is a write-once propertyQDeclarativeFlipableB"%1" : le rpertoire n'existe pas"%1": no such directoryQDeclarativeImportDatabase@- %1 n'est pas un espace de noms- %1 is not a namespaceQDeclarativeImportDatabasej- les espaces de noms imbriqus ne sont pas autoriss- nested namespaces not allowedQDeclarativeImportDatabasepl'importation "%1" n'a pas de qmldir ni d'espace de noms*import "%1" has no qmldir and no namespaceQDeclarativeImportDatabaseJest ambigu. Trouv dans %1 et dans %2#is ambiguous. Found in %1 and in %2QDeclarativeImportDatabasevest ambigu. Trouv dans %1 dans les versions %2.%3 et %4.%54is ambiguous. Found in %1 in version %2.%3 and %4.%5QDeclarativeImportDatabase6est instanci rcursivementis instantiated recursivelyQDeclarativeImportDatabase"n'est pas un type is not a typeQDeclarativeImportDatabase rpertoire locallocal directoryQDeclarativeImportDatabasefla dfinition "%2" du module "%1% n'est pas lisible(module "%1" definition "%2" not readableQDeclarativeImportDatabaseBle module "%1" n'est pas installmodule "%1" is not installedQDeclarativeImportDatabase`le plugin "%2" du module "%1" n'a pas t trouv!module "%1" plugin "%2" not foundQDeclarativeImportDatabasefla version %2.%3 du module "%1" n'est pas installe*module "%1" version %2.%3 is not installedQDeclarativeImportDatabasepimpossible de charger le plugin pour le module "%1" : %2+plugin cannot be loaded for module "%1": %2QDeclarativeImportDatabaseKeyNavigation est disponible uniquement via les proprits attaches7KeyNavigation is only available via attached properties!QDeclarativeKeyNavigationAttachedvKeys est disponible uniquement via les proprits attaches.Keys is only available via attached propertiesQDeclarativeKeysAttachedrListElement: ne peut pas contenir des lments imbriqus+ListElement: cannot contain nested elementsQDeclarativeListModelzListElement: ne peut pas utiliser la proprit rserve "id".ListElement: cannot use reserved "id" propertyQDeclarativeListModelListElement: ne peut pas utiliser script comme valeur pour une proprit1ListElement: cannot use script for property valueQDeclarativeListModelHListModel: proprit indfinie '%1'"ListModel: undefined property '%1'QDeclarativeListModelLappend : une valeur n'est pas un objetappend: value is not an objectQDeclarativeListModel~insert : l'index %1 est hors de la plage de valeurs admissiblesinsert: index %1 out of rangeQDeclarativeListModelLinsert : une valeur n'est pas un objetinsert: value is not an objectQDeclarativeListModel\move : hors de la plage de valeurs admissiblesmove: out of rangeQDeclarativeListModel~remove : l'index %1 est hors de la plage de valeurs admissiblesremove: index %1 out of rangeQDeclarativeListModelvset : l'index %1 est hors de la plage de valeurs admissibleset: index %1 out of rangeQDeclarativeListModelFset : une valeur n'est pas un objetset: value is not an objectQDeclarativeListModelLe chargeur n'est pas compatible avec le chargement d'lments non-visuels.4Loader does not support loading non-visual elements.QDeclarativeLoaderImpossible de conserver l'aspect lors d'une transformation complexe5Unable to preserve appearance under complex transformQDeclarativeParentAnimationImpossible de conserver l'aspect lors d'une mise l'chelle non uniforme5Unable to preserve appearance under non-uniform scaleQDeclarativeParentAnimationImpossible de conserver l'aspect lors d'une mise l'chelle gale 0.Unable to preserve appearance under scale of 0QDeclarativeParentAnimationImpossible de conserver l'aspect lors d'une transformation complexe5Unable to preserve appearance under complex transformQDeclarativeParentChangeImpossible de conserver l'aspect lors d'une mise l'chelle non uniforme5Unable to preserve appearance under non-uniform scaleQDeclarativeParentChangeImpossible de conserver l'aspect lors d'une mise l'chelle gale 0.Unable to preserve appearance under scale of 0QDeclarativeParentChange2Type de paramtre attenduExpected parameter typeQDeclarativeParser2Type de proprit attenduExpected property typeQDeclarativeParser$jeton attendu '%1'Expected token `%1'QDeclarativeParser&Nom de type attenduExpected type nameQDeclarativeParserjImpossible de commencer un identifiant par un chiffre,Identifier cannot start with numeric literalQDeclarativeParser"Caractre illgalIllegal characterQDeclarativeParser>Squence d'chappement illgaleIllegal escape sequenceQDeclarativeParserVSyntaxe illgale pour un nombre exponentiel%Illegal syntax for exponential numberQDeclarativeParserNSquence d'chappement Unicode illgaleIllegal unicode escape sequenceQDeclarativeParserLqualificatif id d'importation invalideInvalid import qualifier IDQDeclarativeParser^Modificateur invalide pour le type de propritInvalid property type modifierQDeclarativeParser`Drapeau '%0' invalid pour l'expression rgulire$Invalid regular expression flag '%0'QDeclarativeParserhDclaration JavaScript en dehors de l'lment Script-JavaScript declaration outside Script elementQDeclarativeParser^L'importation de bibliothque exige une version!Library import requires a versionQDeclarativeParserdvaleur de proprit attribue plusieurs reprises!Property value set multiple timesQDeclarativeParserZLa lecture seule n'est pas encore implmenteReadonly not yet supportedQDeclarativeParser"Qt" est un nom rserv et ne peut pas tre utilis comme qualificatif1Reserved name "Qt" cannot be used as an qualifierQDeclarativeParser~Les qualificatifs d'importation de script doivent tre uniques.(Script import qualifiers must be unique.QDeclarativeParserZL'importation de script exige un qualificatif"Script import requires a qualifierQDeclarativeParser"Erreur de syntaxe Syntax errorQDeclarativeParserJCommentaire non ferm en fin de ligneUnclosed comment at end of fileQDeclarativeParser^Chane de caractres non ferme en fin de ligneUnclosed string at end of lineQDeclarativeParser`Modificateur inattendu pour le type de proprit!Unexpected property type modifierQDeclarativeParser(jeton inattendu '%1'Unexpected token `%1'QDeclarativeParservSquence antislash non termine pour l'expression rgulire2Unterminated regular expression backslash sequenceQDeclarativeParser^Classe non termine pour l'expression rgulire%Unterminated regular expression classQDeclarativeParser^lment non termin pour l'expression rgulire'Unterminated regular expression literalQDeclarativeParserHImpossible d'attribuer une dure < 0Cannot set a duration of < 0QDeclarativePauseAnimation0Impossible d'ouvrir: %1Cannot open: %1QDeclarativePixmap8Erreur de dcodage: %1: %2Error decoding: %1: %2QDeclarativePixmap`Impossible d'obtenir l'image du fournisseur: %1%Failed to get image from provider: %1QDeclarativePixmapHImpossible d'attribuer une dure < 0Cannot set a duration of < 0QDeclarativePropertyAnimationhNe peut pas assigner la proprit inexistante "%1"+Cannot assign to non-existent property "%1"QDeclarativePropertyChangesrNe peut pas assigner la proprit en lecture seule "%1"(Cannot assign to read-only property "%1"QDeclarativePropertyChangesPropertyChanges n'est pas compatible avec la cration d'objets spcifiques un tat.APropertyChanges does not support creating state-specific objects.QDeclarativePropertyChangesZImpossible d'instancier le dlgu de curseur%Could not instantiate cursor delegateQDeclarativeTextInputVImpossible de charger le dlgu de curseurCould not load cursor delegateQDeclarativeTextInput %1 %2%1 %2QDeclarativeTypeLoadertL'espace de noms %1 ne peut pas tre utilis comme un type%Namespace %1 cannot be used as a typeQDeclarativeTypeLoader>Le type %1 n'est pas disponibleType %1 unavailableQDeclarativeTypeLoaderxImpossible d'assigner un objet la proprit %1 d'un signal-Cannot assign an object to signal property %1QDeclarativeVMEzImpossible d'assigner un objet la proprit d'une interface*Cannot assign object to interface propertyQDeclarativeVMETImpossible d'assigner un objet une listeCannot assign object to listQDeclarativeVMEImpossible d'assigner un objet de type %1 sans mthode par dfaut3Cannot assign object type %1 with no default methodQDeclarativeVMEhImpossible d'assigner la valeur %1 la proprit %2%Cannot assign value %1 to property %2QDeclarativeVMEImpossible de connecter le signal/slot %1 %vs. %2 pour cause d'incompatibilit0Cannot connect mismatched signal/slot %1 %vs. %2QDeclarativeVMEImpossible d'attribuer les proprits %1 car ce dernier est nul)Cannot set properties on %1 as it is nullQDeclarativeVMEHImpossible de crer un objet attach Unable to create attached objectQDeclarativeVMENImpossible de crer un objet de type %1"Unable to create object of type %1QDeclarativeVMEXUn composant dlgu doit tre de type Item.%Delegate component must be Item type.QDeclarativeVisualDataModel\Qt a t compil sans support pour xmlpatterns,Qt was built without support for xmlpatternsQDeclarativeXmlListModelbUne requte XmlRole ne doit pas commencer par '/'(An XmlRole query must not start with '/'QDeclarativeXmlListModelRolenUne requte XmlListModel doit commencer par '/' ou "//"1An XmlListModel query must start with '/' or "//"QDeclarativeXmlRoleList QDialQDialQDial"Poigne du slider SliderHandleQDialTachymtre SpeedoMeterQDialTerminerDoneQDialog*Qu'est-ce que c'est? What's This?QDialog&Annuler&CancelQDialogButtonBox&Fermer&CloseQDialogButtonBox&Non&NoQDialogButtonBox&OK&OKQDialogButtonBoxEnregi&strer&SaveQDialogButtonBox&Oui&YesQDialogButtonBoxAbandonnerAbortQDialogButtonBoxAppliquerApplyQDialogButtonBoxAnnulerCancelQDialogButtonBox FermerCloseQDialogButtonBox.Fermer sans enregistrerClose without SavingQDialogButtonBox$Ne pas enregistrerDiscardQDialogButtonBox$Ne pas enregistrer Don't SaveQDialogButtonBoxAideHelpQDialogButtonBoxIgnorerIgnoreQDialogButtonBoxNon to&ut N&o to AllQDialogButtonBoxOKOKQDialogButtonBox OuvrirOpenQDialogButtonBoxRinitialiserResetQDialogButtonBox@Restaurer les valeurs par dfautRestore DefaultsQDialogButtonBoxRessayerRetryQDialogButtonBoxEnregistrerSaveQDialogButtonBox Tout EnregistrerSave AllQDialogButtonBoxOui &tout Yes to &AllQDialogButtonBox*Dernire Modification Date Modified QDirModelTypeMatch OS X FinderKind QDirModelNomName QDirModel TailleSize QDirModelTypeAll other platformsType QDirModel FermerClose QDockWidgetAttacherDock QDockWidgetDtacherFloat QDockWidget MoinsLessQDoubleSpinBoxPlusMoreQDoubleSpinBox&OK&OK QErrorMessage>&Afficher ce message de nouveau&Show this message again QErrorMessage,Message de dbogage: Debug Message: QErrorMessage Erreur fatale:  Fatal Error: QErrorMessage Avertissement: Warning: QErrorMessageHImpossible de crer %1 pour critureCannot create %1 for outputQFileFImpossible d'ouvrir %1 pour lectureCannot open %1 for inputQFileBImpossible d'ouvrir pour critureCannot open for outputQFileRImpossible de supprimer le fichier sourceCannot remove source fileQFile:Le fichier destination existeDestination file existsQFile6Impossible d'crire un blocFailure to write blockQFileAucun moteur de fichier disponible ou celui-ci ne supporte pas UnMapExtensionBNo file engine available or engine does not support UnMapExtensionQFile|Ne renommera pas le fichier squentiel avec la copie par blocs0Will not rename sequential file using block copyQFile%1 Dossier introuvable. Veuillez vrifier que le nom du dossier est correct.K%1 Directory not found. Please verify the correct directory name was given. QFileDialog%1 Fichier introuvable. Veuillez vrifier que le nom du fichier est correct.A%1 File not found. Please verify the correct file name was given. QFileDialogdLe fichier %1 existe dj. Voulez-vous l'craser?-%1 already exists. Do you want to replace it? QFileDialog&Choisir&Choose QFileDialogSuppri&mer&Delete QFileDialog &Nouveau dossier &New Folder QFileDialog&Ouvrir&Open QFileDialog&Renommer&Rename QFileDialog&Enregistrer&Save QFileDialog'%1' est protg en criture. Voulez-vous quand mme le supprimer?9'%1' is write protected. Do you want to delete it anyway? QFileDialog AliasMac OS X FinderAlias QFileDialog*Tous les fichiers (*) All Files (*) QFileDialog.Tous les fichiers (*.*)All Files (*.*) QFileDialogRtes-vous sr de vouloir supprimer '%1'?!Are sure you want to delete '%1'? QFileDialog,Prcdent (historique)Back QFileDialog$Affichage dtaillChange to detail view mode QFileDialogAffichage listeChange to list view mode QFileDialogFImpossible de supprimer le dossier.Could not delete directory. QFileDialog0Crer un nouveau dossierCreate New Folder QFileDialog0Crer un nouveau dossierCreate a New Folder QFileDialog$Affichage dtaill Detail View QFileDialogDossiers Directories QFileDialogDossier:  Directory: QFileDialog UnitDrive QFileDialogFichierFile QFileDialog$&Nom de fichier:  File &name: QFileDialogFichier DossierMatch Windows Explorer File Folder QFileDialog&Fichiers de type: Files of type: QFileDialog0Chercher dans le dossierFind Directory QFileDialogDossierAll other platformsFolder QFileDialogSuccesseurForward QFileDialogPrcdentGo back QFileDialogSuivant Go forward QFileDialogDossier parentGo to the parent directory QFileDialogAffichage liste List View QFileDialogVoir dans: Look in: QFileDialog Poste de travail My Computer QFileDialogNouveau dossier New Folder QFileDialog OuvrirOpen QFileDialogDossier parentParent Directory QFileDialog(Emplacements rcents Recent Places QFileDialogSupprimerRemove QFileDialog Enregistrer sousSave As QFileDialogRaccourciAll other platformsShortcut QFileDialogAfficherShow  QFileDialog:Afficher les fic&hiers cachsShow &hidden files QFileDialogInconnuUnknown QFileDialog %1 Go%1 GBQFileSystemModel %1 Ko%1 KBQFileSystemModel %1 Mo%1 MBQFileSystemModel %1 To%1 TBQFileSystemModel%1 octet(s) %1 byte(s)QFileSystemModel%1 octets%1 bytesQFileSystemModel<b>Le nom "%1" ne peut pas tre utilis.</b><p>Essayez un autre nom avec moins de caractres ou sans ponctuation.oThe name "%1" can not be used.

Try using another name, with fewer characters or no punctuations marks.QFileSystemModelOrdinateurComputerQFileSystemModel*Dernire modification Date ModifiedQFileSystemModel.Nom de fichier invalideInvalid filenameQFileSystemModelTypeMatch OS X FinderKindQFileSystemModel Poste de travail My ComputerQFileSystemModelNomNameQFileSystemModel TailleSizeQFileSystemModelTypeAll other platformsTypeQFileSystemModelTousAny QFontDatabase ArabeArabic QFontDatabaseArmnienArmenian QFontDatabaseBengaliBengali QFontDatabaseExtra-grasBlack QFontDatabaseGrasBold QFontDatabaseCyrilliqueCyrillic QFontDatabaseDemiDemi QFontDatabaseDemi-gras Demi Bold QFontDatabaseDvanagari Devanagari QFontDatabaseGorgienGeorgian QFontDatabaseGrecGreek QFontDatabaseGujaratiGujarati QFontDatabaseGurmukhiGurmukhi QFontDatabase HbreuHebrew QFontDatabaseItaliqueItalic QFontDatabaseJaponaisJapanese QFontDatabaseKannadaKannada QFontDatabase KhmerKhmer QFontDatabase CorenKorean QFontDatabaseLaoLao QFontDatabase LatinLatin QFontDatabase MaigreLight QFontDatabaseMalayalam Malayalam QFontDatabaseMyanmarMyanmar QFontDatabaseN'KoN'Ko QFontDatabase NormalNormal QFontDatabaseObliqueOblique QFontDatabase OghamOgham QFontDatabase OriyaOriya QFontDatabaseRuniqueRunic QFontDatabase"Chinois SimplifiSimplified Chinese QFontDatabaseSinhalaSinhala QFontDatabaseSymboleSymbol QFontDatabaseSyriaqueSyriac QFontDatabase TamoulTamil QFontDatabase TeluguTelugu QFontDatabase ThnaThaana QFontDatabaseThaThai QFontDatabaseTibtainTibetan QFontDatabase(Chinois TraditionnelTraditional Chinese QFontDatabaseVietnamien Vietnamese QFontDatabase&Police&Font QFontDialog&Taille&Size QFontDialog&Soulign &Underline QFontDialog EffetsEffects QFontDialog St&yle de police Font st&yle QFontDialogExempleSample QFontDialog$Choisir une police Select Font QFontDialog &Barr Stri&keout QFontDialog&&Systme d'critureWr&iting System QFontDialogFchec du changement de dossier: %1Changing directory failed: %1QFtp"Connect l'hteConnected to hostQFtp(Connect l'hte %1Connected to host %1QFtpBchec de la connexion l'hte %1Connecting to host failed: %1QFtp Connexion fermeConnection closedQFtp0Connexion donne refuse&Connection refused for data connectionQFtp:Connexion l'hte %1 refuseConnection refused to host %1QFtp@Connexion expire vers l'hte %1Connection timed out to host %1QFtp*Connexion %1 fermeConnection to %1 closedQFtpLchec de la cration d'un dossier: %1Creating directory failed: %1QFtpNchec du tlchargement du fichier: %1Downloading file failed: %1QFtpHte %1 trouv Host %1 foundQFtp&Hte %1 introuvableHost %1 not foundQFtpHte trouv Host foundQFtp@chec du listage du dossier: %1Listing directory failed: %1QFtp&chec du login: %1Login failed: %1QFtpNon connect Not connectedQFtpRchec de la suppression d'un dossier: %1Removing directory failed: %1QFtpRchec de la suppression d'un fichier: %1Removing file failed: %1QFtpErreur inconnue Unknown errorQFtp<chec du tldchargement: %1Uploading file failed: %1QFtp<Aucun nom d'hte n'a t donnNo host name given QHostInfoErreur inconnue Unknown error QHostInfo Hte introuvableHost not foundQHostInfoAgent&Nom d'hte invalideInvalid hostnameQHostInfoAgent<Aucun nom d'hte n'a t donnNo host name givenQHostInfoAgent.Adresse de type inconnuUnknown address typeQHostInfoAgentErreur inconnue Unknown errorQHostInfoAgent0Authentification requiseAuthentication requiredQHttp"Connect l'hteConnected to hostQHttp(Connect l'hte %1Connected to host %1QHttp Connexion fermeConnection closedQHttp"Connexion refuseConnection refusedQHttpFConnexion refuse (ou dlai expir)!Connection refused (or timed out)QHttp*Connexion %1 fermeConnection to %1 closedQHttp$Donnes corrompuesData corruptedQHttpNErreur lors de l'criture de la rponse Error writing response to deviceQHttp0chec de la requte HTTPHTTP request failedQHttpzConnexion HTTPS requise mais le support SSL n'est pas compil:HTTPS connection requested but SSL support not compiled inQHttpHte %1 trouv Host %1 foundQHttp&Hte %1 introuvableHost %1 not foundQHttpHte trouv Host foundQHttpHL'hte requiert une authentificationHost requires authenticationQHttp,Fragment HTTP invalideInvalid HTTP chunked bodyQHttp>Entte de rponse HTTP invalideInvalid HTTP response headerQHttp,Aucun serveur spcifiNo server set to connect toQHttpLLe proxy requiert une authentificationProxy authentication requiredQHttpLLe proxy requiert une authentificationProxy requires authenticationQHttp&Requte interrompueRequest abortedQHttp>La poigne de main SSL a chouSSL handshake failedQHttpHConnexion interrompue par le serveur%Server closed connection unexpectedlyQHttpFMthode d'authentification inconnueUnknown authentication methodQHttpErreur inconnue Unknown errorQHttp4Protocole spcifi inconnuUnknown protocol specifiedQHttp8Longueur du contenu invalideWrong content lengthQHttp0Authentification requiseAuthentication requiredQHttpSocketEngineNPas de rponse HTTP de la part du proxy(Did not receive HTTP response from proxyQHttpSocketEngineTErreur de communication avec le proxy HTTP#Error communicating with HTTP proxyQHttpSocketEnginenErreur dans le reqte d'authentification reue du proxy/Error parsing authentication request from proxyQHttpSocketEnginepLa connexion au serveur proxy a t ferme prmaturment#Proxy connection closed prematurelyQHttpSocketEngine4Connexion au proxy refuseProxy connection refusedQHttpSocketEngine<Le proxy a rejet la connexionProxy denied connectionQHttpSocketEngineLLa connexion au serveur proxy a expir!Proxy server connection timed outQHttpSocketEngine2Serveur proxy introuvableProxy server not foundQHttpSocketEngineNLa transaction n'a pas pu tre dmarreCould not start transaction QIBaseDriverPErreur d'ouverture de la base de donnesError opening database QIBaseDriverJIncapable de soumettre la transactionUnable to commit transaction QIBaseDriverDIncapable d'annuler la transactionUnable to rollback transaction QIBaseDriver>Impossible d'allouer la requteCould not allocate statement QIBaseResult@Impossible de dcrire la requte"Could not describe input statement QIBaseResult@Impossible de dcrire la requteCould not describe statement QIBaseResultRImpossible de rcuperer l'lment suivantCould not fetch next item QIBaseResult@Impossible de trouver le tableauCould not find array QIBaseResultVImpossible de trouver le tableau de donnesCould not get array data QIBaseResultdImpossible d'avoir les informations sur la requteCould not get query info QIBaseResultdImpossible d'avoir les informations sur la requteCould not get statement info QIBaseResultBImpossible de prparer la requteCould not prepare statement QIBaseResultJImpossible de dmarrer la transactionCould not start transaction QIBaseResult>Impossible de fermer la requteUnable to close statement QIBaseResultJIncapable de soumettre la transactionUnable to commit transaction QIBaseResult6Impossible de crer un BLOBUnable to create BLOB QIBaseResult@Impossible d'excuter la requteUnable to execute query QIBaseResult6Impossible d'ouvrir le BLOBUnable to open BLOB QIBaseResult4Impossible de lire le BLOBUnable to read BLOB QIBaseResult6Impossible d'crire le BLOBUnable to write BLOB QIBaseResultVAucun espace disponible sur le priphriqueNo space left on device QIODeviceDAucun fichier ou dossier de ce nomNo such file or directory QIODevice(Autorisation refusePermission denied QIODeviceLTrop de fichiers ouverts simultanmentToo many open files QIODeviceErreur inconnue Unknown error QIODevice$Processeur frontalFEP QInputContext2Mthode d'entre Mac OS XMac OS X input method QInputContextPMthode de saisie processeur frontal S60S60 FEP input method QInputContext0Mthode d'entre WindowsWindows input method QInputContextXIMXIM QInputContext(Mthode d'entre XIMXIM input method QInputContext(Entrer une valeur: Enter a value: QInputDialogN'%1' n'est pas un objet ELF valide (%2)"'%1' is an invalid ELF object (%2)QLibrary6'%1' n'est pas un objet ELF'%1' is not an ELF objectQLibrary@'%1' n'est pas un objet ELF (%2)'%1' is not an ELF object (%2)QLibraryZImpossible de charger la bibliothque %1: %2Cannot load library %1: %2QLibraryfImpossible de rsoudre le symbole "%1" dans %2: %3$Cannot resolve symbol "%1" in %2: %3QLibrary^Impossible de dcharger la bibliothque %1: %2Cannot unload library %1: %2QLibrarylDonnes de vrification du plugin diffrente dans '%1')Plugin verification data mismatch in '%1'QLibrary\Le fichier '%1' n'est pas un plugin Qt valide.'The file '%1' is not a valid Qt plugin.QLibraryLe plugin '%1' utilise une bibliothque Qt incompatible. (%2.%3.%4) [%5]=The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]QLibraryLe plugin '%1' utilise une bibliothque Qt incompatible. (Il est impossible de mlanger des bibliothques 'debug' et 'release'.)WThe plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)QLibraryLe plugin '%1' utilise une bibliothque Qt incompatible. Cl attendue "%2", reue "%3"OThe plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"QLibraryRLa bibliothque partage est introuvable.!The shared library was not found.QLibraryErreur inconnue Unknown errorQLibraryCop&ier&Copy QLineEditCo&ller&Paste QLineEdit&Rtablir&Redo QLineEdit&Annuler&Undo QLineEditCo&uperCu&t QLineEditSupprimerDelete QLineEdit"Tout slectionner Select All QLineEdit4%1: Address dj utilise%1: Address in use QLocalServer$%1: Erreur de nom%1: Name error QLocalServer.%1: Permission refuse%1: Permission denied QLocalServer.%1: Erreur inconnue %2%1: Unknown error %2 QLocalServer2%1 : Autorisation refuse%1: Access denied QLocalSocket0%1: Erreur de connexion%1: Connection error QLocalSocket,%1: Connexion refuse%1: Connection refused QLocalSocket4%1: Datagramme trop grand%1: Datagram too large QLocalSocket"%1: Nom invalide%1: Invalid name QLocalSocket*%1: Connexion ferme%1: Remote closed QLocalSocket:%1: Erreur d'accs au socket%1: Socket access error QLocalSocket@%1: L'opration socket a expir%1: Socket operation timed out QLocalSocketD%1: Erreur de ressource du socket%1: Socket resource error QLocalSocketH%1: L'opration n'est pas supporte)%1: The socket operation is not supported QLocalSocket(%1: erreur inconnue%1: Unknown error QLocalSocket.%1: Erreur inconnue %2%1: Unknown error %2 QLocalSocketJImpossible de dmarrer la transactionUnable to begin transaction QMYSQLDriverLImpossible de soumettre la transactionUnable to commit transaction QMYSQLDriverDImpossible d'tablir une connexionUnable to connect QMYSQLDriverPImpossible d'ouvrir la base de donnes 'Unable to open database ' QMYSQLDriverFImpossible d'annuler la transactionUnable to rollback transaction QMYSQLDriverVImpossible d'attacher les valeurs de sortieUnable to bind outvalues QMYSQLResult>Impossible d'attacher la valeurUnable to bind value QMYSQLResultRImpossible d'excuterla prochaine requteUnable to execute next query QMYSQLResult@Impossible d'excuter la requteUnable to execute query QMYSQLResult@Impossible d'excuter la requteUnable to execute statement QMYSQLResultFImpossible de rcuperer des donnesUnable to fetch data QMYSQLResultHImpossible de prparer l'instructionUnable to prepare statement QMYSQLResultRImpossible de rinitialiser l'instructionUnable to reset statement QMYSQLResultTImpossible de stocker le prochain rsultatUnable to store next result QMYSQLResultBImpossible de stocker le rsultatUnable to store result QMYSQLResultbImpossible de stocker les rsultats de la requte!Unable to store statement results QMYSQLResult(Sans titre) (Untitled)QMdiArea%1 - [%2] %1 - [%2] QMdiSubWindow&Fermer&Close QMdiSubWindow&Dplacer&Move QMdiSubWindow&Restaurer&Restore QMdiSubWindow&Taille&Size QMdiSubWindow - [%1]- [%1] QMdiSubWindow FermerClose QMdiSubWindowAideHelp QMdiSubWindowMa&ximiser Ma&ximize QMdiSubWindowMaximiserMaximize QMdiSubWindowMenuMenu QMdiSubWindowRd&uire Mi&nimize QMdiSubWindowRduireMinimize QMdiSubWindowRestaurerRestore QMdiSubWindow Restaurer en bas Restore Down QMdiSubWindow OmbrerShade QMdiSubWindow.&Rester au premier plan Stay on &Top QMdiSubWindowRestaurerUnshade QMdiSubWindow FermerCloseQMenuExcuterExecuteQMenu OuvrirOpenQMenuActionsActionsQMenuBar<h3> propos de Qt</h3><p>Ce programme utilise Qt version %1.</p>8

About Qt

This program uses Qt version %1.

 QMessageBox d<p>Qt est une bibliothque logicielle C++ pour le dveloppement d applications multiplateformes.</p><p>Qt fournit une portabilit source unique pour MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux et les principales variantes commerciales d Unix. Qt est galement disponible pour appareils intgrs comme Qt pour Embedded Linux et Qt pour Windows CE.</p><p>Il existe trois options de licence diffrentes conues pour s adapter aux besoins d utilisateurs varis.</p><p>Qt concde sous notre contrat de licence commerciale est destine au dveloppement de logiciels propritaires/commerciaux dont vous ne souhaitez pas partager le code source avec des tiers ou qui ne peuvent se conformer aux termes de la LGPL GNU version 2.1 ou GPL GNU version 3.0.</p><p>Qt concde sous la LGPL GNU version 2.1 est destine au dveloppement d applications Qt (propritaires ou libres) condition que vous vous conformiez aux conditions gnrales de la LGPL GNU version 2.1.</p><p>Qt concde sous la licence publique gnrale GNU version 3.0 est destine au dveloppement d applications Qt lorsque vous souhaitez utiliser ces applications avec d autres logiciels soumis aux termes de la GPL GNU version 3.0 ou lorsque vous acceptez les termes de la GPL GNU version 3.0.</p><p>Veuillez consulter<a href="http: //qt.digia.com/product/licensing">qt.digia.com/product/licensing</a> pour un aperu des concessions de licences Qt.</p><p>Copyright (C) 2012 Digia Plc et/ou ses filiales.</p><p>Qt est un produit Digia. Voir <a href="http: //qt.digia.com/">qt.digia.com</a> pour de plus amples informations.</p>

Qt is a C++ toolkit for cross-platform application development.

Qt provides single-source portability across MS Windows, Mac OS X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.

Qt is available under three different licensing options designed to accommodate the needs of our various users.

Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.

Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.

Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.

Please see qt.digia.com/product/licensing for an overview of Qt licensing.

Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).

Qt is a Digia product. See qt.digia.com for more information.

 QMessageBox propos de QtAbout Qt QMessageBoxAideHelp QMessageBox*Cacher les dtails...Hide Details... QMessageBoxOKOK QMessageBox,Montrer les dtails...Show Details... QMessageBoxSlectionner IM Select IMQMultiInputContextDSlectionneur de mthode de saisieMultiple input method switcherQMultiInputContextPluginSlectionneur de mthode de saisie qui utilise le menu contextuel des widgets de texteMMultiple input method switcher that uses the context menu of the text widgetsQMultiInputContextPluginXUn autre socket coute dj sur le mme port4Another socket is already listening on the same portQNativeSocketEngineTentative d'utiliser un socket IPv6 sur une plateforme qui ne supporte pas IPv6=Attempt to use IPv6 socket on a platform with no IPv6 supportQNativeSocketEngine"Connexion refuseConnection refusedQNativeSocketEngine"Connexion expireConnection timed outQNativeSocketEngine^Le datagramme tait trop grand pour tre envoyDatagram was too large to sendQNativeSocketEngine"Hte inaccessibleHost unreachableQNativeSocketEngine<Descripteur de socket invalideInvalid socket descriptorQNativeSocketEngineErreur rseau Network errorQNativeSocketEngine6L'opration rseau a expirNetwork operation timed outQNativeSocketEngine:Rseau impossible rejoindreNetwork unreachableQNativeSocketEngine0Operation sur non-socketOperation on non-socketQNativeSocketEngine(Manque de ressourcesOut of resourcesQNativeSocketEngine(Autorisation refusePermission deniedQNativeSocketEngine"Protocol non grProtocol type not supportedQNativeSocketEngine<L'adresse n'est pas disponibleThe address is not availableQNativeSocketEngine,L'adresse est protgeThe address is protectedQNativeSocketEngine@L'adresse lie est dj en usage#The bound address is already in useQNativeSocketEnginedLe type de proxy est invalide pour cette opration,The proxy type is invalid for this operationQNativeSocketEngineFL'hte distant a ferm la connexion%The remote host closed the connectionQNativeSocketEngineXImpossible d'initialiser le socket broadcast%Unable to initialize broadcast socketQNativeSocketEngineZImpossible d'initialiser le socket asynchrone(Unable to initialize non-blocking socketQNativeSocketEngineBImpossible de recevoir un messageUnable to receive a messageQNativeSocketEngine>Impossible d'envoyer un messageUnable to send a messageQNativeSocketEngine&Impossible d'crireUnable to writeQNativeSocketEngineErreur inconnue Unknown errorQNativeSocketEngine<Opration socket non supporteUnsupported socket operationQNativeSocketEngine@Erreur lors de l'ouverture de %1Error opening %1QNetworkAccessCacheBackend"URI invalide: %1Invalid URI: %1QNetworkAccessDataBackend|L'hte distant a ferm sa connexion de faon prmature sur %13Remote host closed the connection prematurely on %1QNetworkAccessDebugPipeBackend8Erreur de socket sur %1: %2Socket error on %1: %2QNetworkAccessDebugPipeBackendLErreur lors de l'criture dans %1: %2Write error writing to %1: %2QNetworkAccessDebugPipeBackendbImpossible d'ouvrir %1: le chemin est un dossier#Cannot open %1: Path is a directoryQNetworkAccessFileBackendJErreur lors de l'ouverture de %1: %2Error opening %1: %2QNetworkAccessFileBackend8Erreur de lecture de %1: %2Read error reading from %1: %2QNetworkAccessFileBackendRRequte d'ouverture de fichier distant %1%Request for opening non-local file %1QNetworkAccessFileBackend8Erreur d'criture de %1: %2Write error writing to %1: %2QNetworkAccessFileBackendbImpossible d'ouvrir %1: le chemin est un dossierCannot open %1: is a directoryQNetworkAccessFtpBackendPErreur lors du tlchargement de %1: %2Error while downloading %1: %2QNetworkAccessFtpBackendBErreur lors de l'envoi de %1: %2Error while uploading %1: %2QNetworkAccessFtpBackenddConnexion %1 a chou: authentification requise0Logging in to %1 failed: authentication requiredQNetworkAccessFtpBackend$Aucun proxy trouvNo suitable proxy foundQNetworkAccessFtpBackend$Aucun proxy trouvNo suitable proxy foundQNetworkAccessHttpBackend@L'accs au rseau est dsactiv.Network access is disabled.QNetworkAccessManager~Erreur lors du tlchargement de %1 - le serveur a rpondu: %2)Error downloading %1 - server replied: %2 QNetworkReply2Erreur de session rseau.Network session error. QNetworkReply:Le protocole "%1" est inconnuProtocol "%1" is unknown QNetworkReply2Erreur rseau temporaire.Temporary network failure. QNetworkReply"Opration annuleOperation canceledQNetworkReplyImpl.Configuration invalide.Invalid configuration.QNetworkSession"Erreur de roaming Roaming errorQNetworkSessionPrivateImplTLe roaming a t annul ou est impossible.'Roaming was aborted or is not possible.QNetworkSessionPrivateImpl^Session annule par l'utilisateur ou le systme!Session aborted by user or systemQNetworkSessionPrivateImpllL'opration requise n'est pas suporte par le systme.7The requested operation is not supported by the system.QNetworkSessionPrivateImplrla session a t annule par l'utilisateur ou le systme..The session was aborted by the user or system.QNetworkSessionPrivateImplbLa configuration spcifie ne peut tre utilise.+The specified configuration cannot be used.QNetworkSessionPrivateImplErreur inconnueUnidentified ErrorQNetworkSessionPrivateImpl6Erreur de session inconnue.Unknown session error.QNetworkSessionPrivateImplJImpossible de dmarrer la transactionUnable to begin transaction QOCIDriverNImpossible d'enregistrer la transactionUnable to commit transaction QOCIDriver2L'initialisation a chou QOCIDriverUnable to initialize QOCIDriver>Impossible d'ouvrir une sessionUnable to logon QOCIDriverFImpossible d'annuler la transactionUnable to rollback transaction QOCIDriver>Impossible d'allouer la requteUnable to alloc statement QOCIResultrImpossible d'attacher la colonne pour une execution batch'Unable to bind column for batch execute QOCIResult>Impossible d'attacher la valeurUnable to bind value QOCIResultRImpossible d'excuter l'instruction batch!Unable to execute batch statement QOCIResult@Impossible d'exctuer la requteUnable to execute statement QOCIResultTImpossible d'obtenir le type de la requteUnable to get statement type QOCIResult>Impossible de passer au suivantUnable to goto next QOCIResultBImpossible de prparer la requteUnable to prepare statement QOCIResultJIncapable de soumettre la transactionUnable to commit transaction QODBCDriverBIncapable d'tablir une connexionUnable to connect QODBCDriverImpossible de se connecter - Le pilote ne supporte pas toutes les fonctionnalits ncessairesEUnable to connect - Driver doesn't support all functionality required QODBCDriverJImpossible de dsactiver l'autocommitUnable to disable autocommit QODBCDriverBImpossible d'activer l'autocommitUnable to enable autocommit QODBCDriverDIncapable d'annuler la transactionUnable to rollback transaction QODBCDriver"QODBCResult::reset: Impossible d'utiliser 'SQL_CURSOR_STATIC' comme attribut de requte. Veuillez vrifier la configuration de votre pilote ODBCyQODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResultBImpossible d'attacher la variableUnable to bind variable QODBCResult@Impossible d'exctuer la requteUnable to execute statement QODBCResult.Impossible de rcuprerUnable to fetch QODBCResultDImpossible de rcuprer le premierUnable to fetch first QODBCResultDImpossible de rcuprer le dernierUnable to fetch last QODBCResultDImpossible de rcuprer le suivantUnable to fetch next QODBCResultHImpossible de rcuprer le prcedentUnable to fetch previous QODBCResultBImpossible de prparer la requteUnable to prepare statement QODBCResult"%1" est un doublon d'un nom de role existant et sera dsactiv.:"%1" duplicates a previous role name and will be disabled.QObject Hte introuvableHost not foundQObject2Serveur de son PulseAudioPulseAudio Sound ServerQObject.Requte invalide : "%1"invalid query: "%1"QObjectNomNameQPPDOptionsModel ValeurValueQPPDOptionsModelJImpossible de dmarrer la transactionCould not begin transaction QPSQLDriverLImpossible de soumettre la transactionCould not commit transaction QPSQLDriverFImpossible d'annuler la transactionCould not rollback transaction QPSQLDriverDImpossible d'tablir une connexionUnable to connect QPSQLDriver0Impossible de s'inscrireUnable to subscribe QPSQLDriver8Impossible de se dsinscrireUnable to unsubscribe QPSQLDriver<Impossible de crer la requteUnable to create query QPSQLResultBImpossible de prparer la requteUnable to prepare statement QPSQLResult Centimtres (cm)Centimeters (cm)QPageSetupWidgetFormulaireFormQPageSetupWidgetHauteur: Height:QPageSetupWidgetPouces (in) Inches (in)QPageSetupWidgetPaysage LandscapeQPageSetupWidget MargesMarginsQPageSetupWidget Millimtres (mm)Millimeters (mm)QPageSetupWidgetOrientation OrientationQPageSetupWidgetDimensions:  Page size:QPageSetupWidget PapierPaperQPageSetupWidget&Source du papier:  Paper source:QPageSetupWidgetPoints (pts) Points (pt)QPageSetupWidgetPortraitPortraitQPageSetupWidgetPaysage inversReverse landscapeQPageSetupWidget Portrait inversReverse portraitQPageSetupWidgetLargeur: Width:QPageSetupWidgetmarge basse bottom marginQPageSetupWidgetmarge gauche left marginQPageSetupWidgetmarge droite right marginQPageSetupWidgetmarge haute top marginQPageSetupWidget:Le plugin n'a pas t charg.The plugin was not loaded. QPluginLoaderErreur inconnue Unknown error QPluginLoaderD%1 existe. Voulez-vous l'craser?/%1 already exists. Do you want to overwrite it? QPrintDialog%1 est un dossier. Veuillez choisir un nom de fichier diffrent.7%1 is a directory. Please choose a different file name. QPrintDialog &Options << QPrintDialog &Options >> QPrintDialogIm&primer&Print QPrintDialog@<qt>voulez-vous l'craser?</qt>%Do you want to overwrite it? QPrintDialogA0 QPrintDialog$A0 (841 x 1189 mm)A0 (841 x 1189 mm) QPrintDialogA1 QPrintDialog"A1 (594 x 841 mm)A1 (594 x 841 mm) QPrintDialogA2 QPrintDialog"A2 (420 x 594 mm)A2 (420 x 594 mm) QPrintDialogA3 QPrintDialog"A3 (297 x 420 mm)A3 (297 x 420 mm) QPrintDialogA4 QPrintDialog"A4 (210 x 297 mm)%A4 (210 x 297 mm, 8.26 x 11.7 inches) QPrintDialogA5 QPrintDialog"A5 (148 x 210 mm)A5 (148 x 210 mm) QPrintDialogA6 QPrintDialog"A6 (105 x 148 mm)A6 (105 x 148 mm) QPrintDialogA7 QPrintDialog A7 (74 x 105 mm)A7 (74 x 105 mm) QPrintDialogA8 QPrintDialogA8 (52 x 74 mm)A8 (52 x 74 mm) QPrintDialogA9 QPrintDialogA9 (37 x 52 mm)A9 (37 x 52 mm) QPrintDialogAlias: %1 Aliases: %1 QPrintDialogB0 QPrintDialog&B0 (1000 x 1414 mm)B0 (1000 x 1414 mm) QPrintDialogB1 QPrintDialog$B1 (707 x 1000 mm)B1 (707 x 1000 mm) QPrintDialogB10 QPrintDialog B10 (31 x 44 mm)B10 (31 x 44 mm) QPrintDialogB2 QPrintDialog"B2 (500 x 707 mm)B2 (500 x 707 mm) QPrintDialogB3 QPrintDialog"B3 (353 x 500 mm)B3 (353 x 500 mm) QPrintDialogB4 QPrintDialog"B4 (250 x 353 mm)B4 (250 x 353 mm) QPrintDialogB5 QPrintDialog"B5 (176 x 250 mm)%B5 (176 x 250 mm, 6.93 x 9.84 inches) QPrintDialogB6 QPrintDialog"B6 (125 x 176 mm)B6 (125 x 176 mm) QPrintDialogB7 QPrintDialog B7 (88 x 125 mm)B7 (88 x 125 mm) QPrintDialogB8 QPrintDialogB8 (62 x 88 mm)B8 (62 x 88 mm) QPrintDialogB9 QPrintDialogB9 (44 x 62 mm)B9 (44 x 62 mm) QPrintDialogC5E QPrintDialog$C5E (163 x 229 mm)C5E (163 x 229 mm) QPrintDialogPersonnalisCustom QPrintDialogDLE QPrintDialog$DLE (110 x 220 mm)DLE (110 x 220 mm) QPrintDialog Executive QPrintDialogRExecutive (7,5 x 10 pouces, 191 x 254 mm))Executive (7.5 x 10 inches, 191 x 254 mm) QPrintDialogImpossible d'crire dans le fichier %1. Veuillez choisir un nom de fichier diffrent.=File %1 is not writable. Please choose a different file name. QPrintDialog"Le fichier existe File exists QPrintDialogFolio QPrintDialog(Folio (210 x 330 mm)Folio (210 x 330 mm) QPrintDialogLedger QPrintDialog*Ledger (432 x 279 mm)Ledger (432 x 279 mm) QPrintDialogLegal QPrintDialogJLegal (8.5 x 14 pouces, 216 x 356 mm)%Legal (8.5 x 14 inches, 216 x 356 mm) QPrintDialogLetter QPrintDialogLLetter (8,5 x 11 pouces, 216 x 279 mm)&Letter (8.5 x 11 inches, 216 x 279 mm) QPrintDialogFichier local Local file QPrintDialogOKOK QPrintDialogImprimerPrint QPrintDialog6Imprimer dans un fichier...Print To File ... QPrintDialogImprimer tout Print all QPrintDialog2Imprimer la page courantePrint current page QPrintDialog*Imprimer la slection Print range QPrintDialog*Imprimer la slectionPrint selection QPrintDialog<Imprimer dans un fichier (PDF)Print to File (PDF) QPrintDialogJImprimer dans un fichier (PostScript)Print to File (Postscript) QPrintDialogTabloid QPrintDialog.Tablode (279 x 432 mm)Tabloid (279 x 432 mm) QPrintDialog|La valeur 'de' ne peut pas tre plus grande que la valeur ''.7The 'From' value cannot be greater than the 'To' value. QPrintDialogUS Common #10 Envelope QPrintDialogJUS Common #10 Envelope (105 x 241 mm)%US Common #10 Envelope (105 x 241 mm) QPrintDialog,Ecriture du fichier %1 Write %1 file QPrintDialog"connect en locallocally connected QPrintDialoginconnuunknown QPrintDialog%1%%1%QPrintPreviewDialog FermerCloseQPrintPreviewDialog"Exporter vers PDF Export to PDFQPrintPreviewDialog0Exporter vers PostScriptExport to PostScriptQPrintPreviewDialogPremire page First pageQPrintPreviewDialogAjuster la pageFit pageQPrintPreviewDialog$Ajuster la largeur Fit widthQPrintPreviewDialogPaysage LandscapeQPrintPreviewDialogDernire page Last pageQPrintPreviewDialogPage suivante Next pageQPrintPreviewDialogMise en page Page SetupQPrintPreviewDialogMise en page Page setupQPrintPreviewDialogPortraitPortraitQPrintPreviewDialogPage prcdente Previous pageQPrintPreviewDialogImprimerPrintQPrintPreviewDialog.Aperu avant impression Print PreviewQPrintPreviewDialog&Afficher deux pagesShow facing pagesQPrintPreviewDialogLAfficher un aperu de toutes les pagesShow overview of all pagesQPrintPreviewDialog.Afficher une seule pageShow single pageQPrintPreviewDialogZoom avantZoom inQPrintPreviewDialogZoom arrireZoom outQPrintPreviewDialog AvancAdvancedQPrintPropertiesWidgetFormulaireFormQPrintPropertiesWidgetPageQPrintPropertiesWidgetAssemblerCollateQPrintSettingsOutputCouleurColorQPrintSettingsOutputMode de couleur Color ModeQPrintSettingsOutput CopiesCopiesQPrintSettingsOutputCopies : Copies:QPrintSettingsOutputPage courante Current PageQPrintSettingsOutput(Impression en duplexDuplex PrintingQPrintSettingsOutputFormulaireFormQPrintSettingsOutputDgrad de gris GrayscaleQPrintSettingsOutputCt long Long sideQPrintSettingsOutput AucunNoneQPrintSettingsOutputOptionsOptionsQPrintSettingsOutput(Paramtres de sortieOutput SettingsQPrintSettingsOutput Pages Pages fromQPrintSettingsOutputImprimer tout Print allQPrintSettingsOutput*Imprimer la slection Print rangeQPrintSettingsOutputInverseReverseQPrintSettingsOutputSlection SelectionQPrintSettingsOutputCt court Short sideQPrintSettingsOutputtoQPrintSettingsOutput&Nom: &Name: QPrintWidget... QPrintWidgetFormulaireForm QPrintWidgetEmplacement:  Location: QPrintWidget*&Fichier de sortie:  Output &file: QPrintWidgetP&roprits P&roperties QPrintWidget PrvisualisationPreview QPrintWidgetImprimantePrinter QPrintWidgetType : Type: QPrintWidgetlImpossible d'ouvrir la redirection d'entre en lecture,Could not open input redirection for readingQProcesstImpossible d'ouvrir la redirection de sortie pour criture-Could not open output redirection for writingQProcess<Erreur de lecture du processusError reading from processQProcessFErreur d"criture vers le processusError writing to processQProcess,Aucun programme dfiniNo program definedQProcess*Le processus plantProcess crashedQProcessNLe dmarrage du processus a chou: %1Process failed to start: %1QProcess>Operation de processus a expirProcess operation timed outQProcess<Erreur de ressouce (fork): %1!Resource error (fork failure): %1QProcessAnnulerCancelQProgressDialog OuvrirOpen QPushButton CocherCheck QRadioButtonRsyntaxe invalide pour classe de caractrebad char class syntaxQRegExp>syntaxe invalide pour lookaheadbad lookahead syntaxQRegExp@syntaxe invalide pour rptitionbad repetition syntaxQRegExp"option dsactivedisabled feature usedQRegExp$catgorie invalideinvalid categoryQRegExp&intervalle invalideinvalid intervalQRegExp,valeur octale invalideinvalid octal valueQRegExp0rencontr limite internemet internal limitQRegExp4dlmiteur gauche manquantmissing left delimQRegExp>aucune erreur ne s'est produiteno error occurredQRegExpfin impromptueunexpected endQRegExp`Erreur lors de l'ouverture de la base de donnesError opening databaseQSQLite2DriverJImpossible de dmarrer la transactionUnable to begin transactionQSQLite2DriverLImpossible de soumettre la transactionUnable to commit transactionQSQLite2DriverHImpossible de rpter la transactionUnable to rollback transactionQSQLite2Driver@Impossible d'excuter la requteUnable to execute statementQSQLite2ResultJImpossible de rcuprer les rsultatsUnable to fetch resultsQSQLite2ResultbErreur lors de la fermeture de la base de donnesError closing database QSQLiteDriver`Erreur lors de l'ouverture de la base de donnesError opening database QSQLiteDriverJImpossible de dmarrer la transactionUnable to begin transaction QSQLiteDriverJIncapable de soumettre la transactionUnable to commit transaction QSQLiteDriverFImpossible d'annuler la transactionUnable to rollback transaction QSQLiteDriverPas de requteNo query QSQLiteResult<Nombre de paramtres incorrectParameter count mismatch QSQLiteResultHImpossible d'attacher les paramtresUnable to bind parameters QSQLiteResult@Impossible d'excuter la requteUnable to execute statement QSQLiteResultBImpossible de rcuprer la rangeUnable to fetch row QSQLiteResultLImpossible de rinitialiser la requteUnable to reset statement QSQLiteResultCondition ConditionQScriptBreakpointsModelNombre de coups Hit-countQScriptBreakpointsModelIdentifiantIDQScriptBreakpointsModel Nombre d'ignors Ignore-countQScriptBreakpointsModelLieuLocationQScriptBreakpointsModelUn seul coup Single-shotQScriptBreakpointsModelSupprimerDeleteQScriptBreakpointsWidget CrerNewQScriptBreakpointsWidget6&Chercher dans le script...&Find in Script...QScriptDebugger$Effacer la console Clear ConsoleQScriptDebuggerBEffacer les rsultats du dbogageClear Debug OutputQScriptDebugger8Effacer le journal d'erreursClear Error LogQScriptDebuggerContinuerContinueQScriptDebugger Ctrl+FCtrl+FQScriptDebuggerCtrl+F10Ctrl+F10QScriptDebugger Ctrl+GCtrl+GQScriptDebuggerDboguerDebugQScriptDebuggerF10F10QScriptDebuggerF11F11QScriptDebuggerF3F3QScriptDebuggerF5F5QScriptDebuggerF9F9QScriptDebugger"Rsultat &suivant Find &NextQScriptDebugger&Chercher &prcdentFind &PreviousQScriptDebugger Aller la ligne Go to LineQScriptDebuggerInterrompre InterruptQScriptDebuggerLigne: Line:QScriptDebugger&Excuter au curseur Run to CursorQScriptDebugger4Excuter au nouveau scriptRun to New ScriptQScriptDebuggerShift+F11 Shift+F11QScriptDebuggerShift+F3Shift+F3QScriptDebuggerShift+F5Shift+F5QScriptDebugger$Pas pas dtaill Step IntoQScriptDebugger"Pas pas sortantStep OutQScriptDebugger&Pas pas principal Step OverQScriptDebugger2Basculer le point d'arrtToggle BreakpointQScriptDebugger<img src=": /qt/scripttools/debugging/images/wrap.png">&nbsp;La recherche est revenue au dbutJ Search wrappedQScriptDebuggerCodeFinderWidget&Sensible la casseCase SensitiveQScriptDebuggerCodeFinderWidget FermerCloseQScriptDebuggerCodeFinderWidgetSuivantNextQScriptDebuggerCodeFinderWidgetPrcdentPreviousQScriptDebuggerCodeFinderWidgetMots complets Whole wordsQScriptDebuggerCodeFinderWidgetNomNameQScriptDebuggerLocalsModel ValeurValueQScriptDebuggerLocalsModel NiveauLevelQScriptDebuggerStackModelEmplacementLocationQScriptDebuggerStackModelNomNameQScriptDebuggerStackModel:Condition du point d'arrt: Breakpoint Condition: QScriptEdit6Dsactiver le point d'arrtDisable Breakpoint QScriptEdit0Activer le point d'arrtEnable Breakpoint QScriptEdit2Basculer le point d'arrtToggle Breakpoint QScriptEditPoints d'arrt BreakpointsQScriptEngineDebuggerConsoleConsoleQScriptEngineDebugger*Rsultats du dbogage Debug OutputQScriptEngineDebugger"Journal d'erreurs Error LogQScriptEngineDebuggerScripts chargsLoaded ScriptsQScriptEngineDebugger LocauxLocalsQScriptEngineDebugger,Dbogueur de script QtQt Script DebuggerQScriptEngineDebuggerChercherSearchQScriptEngineDebuggerPileStackQScriptEngineDebuggerAffichageViewQScriptEngineDebugger FermerCloseQScriptNewBreakpointWidget En basBottom QScrollBarBord gauche Left edge QScrollBarAligner en-bas Line down QScrollBarAlignerLine up QScrollBarPage suivante Page down QScrollBarPage prcdente Page left QScrollBarPage suivante Page right QScrollBarPage prcdentePage up QScrollBarPositionPosition QScrollBarBord droit Right edge QScrollBar&Dfiler vers le bas Scroll down QScrollBar"Dfiler jusqu'ici Scroll here QScrollBar,Dfiler vers la gauche Scroll left QScrollBar,Dfiler vers la droite Scroll right QScrollBar(Dfiler vers le haut Scroll up QScrollBarEn hautTop QScrollBarR%1: le fichier de cls UNIX n'existe pas%1: UNIX key file doesn't exist QSharedMemory %1: existe dj%1: already exists QSharedMemoryR%1: taille de cration est infrieur 0%1: create size is less then 0 QSharedMemory"%1: n'existe pas%1: doesn't exist QSharedMemory"%1: n'existe pas%1: doesn't exists QSharedMemory$%1: ftok a chou%1: ftok failed QSharedMemory(%1: taille invalide%1: invalid size QSharedMemory%1: cl vide%1: key is empty QSharedMemory %1: non attach%1: not attached QSharedMemoryF%1: plus de ressources disponibles%1: out of resources QSharedMemory.%1: permission refuse%1: permission denied QSharedMemoryD%1: la requte de taille a chou%1: size query failed QSharedMemoryj%1: le systme impose des restrictions sur la taille$%1: system-imposed size restrictions QSharedMemory<%1: impossible de vrrouiller%1: unable to lock QSharedMemory>%1: impossible de crer la cl%1: unable to make key QSharedMemoryV%1: impossible d'affecter la cl au verrou%1: unable to set key on lock QSharedMemory@%1: impossible de dverrouiller%1: unable to unlock QSharedMemory.%1: erreur inconnue %2%1: unknown error %2 QSharedMemory++ QShortcutAjouter favori Add Favorite QShortcut(Rgler la luminositAdjust Brightness QShortcutAltAlt QShortcut$Application gaucheApplication Left QShortcut$Application droiteApplication Right QShortcut,Audio rpter la pisteAudio Cycle Track QShortcutAudio avant Audio Forward QShortcut.Audio lecture alatoireAudio Random Play QShortcutAudio rpter Audio Repeat QShortcutAudio arrire Audio Rewind QShortcut AbsentAway QShortcut,Prcdent (historique)Back QShortcutRetour avant Back Forward QShortcutEffacement Backspace QShortcutTab arrBacktab QShortcutGraves fort Bass Boost QShortcutGraves bas Bass Down QShortcutGraves hautBass Up QShortcutBatterieBattery QShortcutBluetooth Bluetooth QShortcut LivreBook QShortcutNavigateurBrowser QShortcutCDCD QShortcutCalculatrice Calculator QShortcutAppelerCall QShortcut(Focus appareil photo Camera Focus QShortcut4Dclencheur appareil photoCamera Shutter QShortcutVerr Maj Caps Lock QShortcutVerr majCapsLock QShortcutEffacerClear QShortcut Effacer la prise Clear Grab QShortcut FermerClose QShortcut Code input QShortcutCommunaut Community QShortcutContexte1Context1 QShortcutContexte2Context2 QShortcutContexte3Context3 QShortcutContexte4Context4 QShortcut CopierCopy QShortcutCtrlCtrl QShortcut CouperCut QShortcutDOSDOS QShortcut SupprDel QShortcutSupprimerDelete QShortcutAffichageDisplay QShortcutDocuments Documents QShortcutBasDown QShortcut Eisu Shift QShortcut Eisu toggle QShortcutjecterEject QShortcutFinEnd QShortcut EntreEnter QShortcut chapEsc QShortcutchapementEscape QShortcutF%1F%1 QShortcutPrfrs Favorites QShortcutFinancesFinance QShortcutRetournerFlip QShortcut.Successeur (historique)Forward QShortcutJeuGame QShortcut AllerGo QShortcutHangul QShortcut Hangul Banja QShortcutHangul Fin Hangul End QShortcut Hangul Hanja QShortcut Hangul Jamo QShortcut Hangul Jeonja QShortcutHangul PostHanja QShortcutHangul PreHanja QShortcut Hangul Romaja QShortcutHangul Special QShortcutHangul dbut Hangul Start QShortcutRaccrocherHangup QShortcutHankaku QShortcutAideHelp QShortcutHenkan QShortcutHiberner Hibernate QShortcutHiragana QShortcutHiragana Katakana QShortcutHistoriqueHistory QShortcut DbutHome QShortcut"Bureau domicile Home Office QShortcutPage d'accueil Home Page QShortcutLiens chauds Hot Links QShortcut InserIns QShortcutInsrerInsert QShortcut Kana Lock QShortcut Kana Shift QShortcutKanji QShortcutKatakana QShortcut@Baisser la luminosit du clavierKeyboard Brightness Down QShortcutDAugmenter la luminosit du clavierKeyboard Brightness Up QShortcut2Avec/sans lumire clavierKeyboard Light On/Off QShortcutMenu du clavier Keyboard Menu QShortcutBisLast Number Redial QShortcutLancer (0) Launch (0) QShortcutLancer (1) Launch (1) QShortcutLancer (2) Launch (2) QShortcutLancer (3) Launch (3) QShortcutLancer (4) Launch (4) QShortcutLancer (5) Launch (5) QShortcutLancer (6) Launch (6) QShortcutLancer (7) Launch (7) QShortcutLancer (8) Launch (8) QShortcutLancer (9) Launch (9) QShortcutLancer (A) Launch (A) QShortcutLancer (B) Launch (B) QShortcutLancer (C) Launch (C) QShortcutLancer (D) Launch (D) QShortcutLancer (E) Launch (E) QShortcutLancer (F) Launch (F) QShortcutLancer courrier Launch Mail QShortcutLancer mdia Launch Media QShortcut GaucheLeft QShortcutAmpoule LightBulb QShortcut$Fermer une sessionLogoff QShortcut*Faire suivre l'e-mail Mail Forward QShortcut MarchMarket QShortcutMassyo QShortcutMdia suivant Media Next QShortcutMdia pause Media Pause QShortcutMdia dmarrer Media Play QShortcutMdia prcdentMedia Previous QShortcut"Mdia enregistrer Media Record QShortcutMdia arrt Media Stop QShortcutRunionMeeting QShortcutMenuMenu QShortcutMenu PBMenu PB QShortcut,Messagerie instantane Messenger QShortcutMtaMeta QShortcutBBaisser la luminosit du moniteurMonitor Brightness Down QShortcutFAugmenter la luminosit du moniteurMonitor Brightness Up QShortcutMuhenkan QShortcut"Candidat multipleMultiple Candidate QShortcutMusiqueMusic QShortcutMes sitesMy Sites QShortcutActualitsNews QShortcutNonNo QShortcutVerr numNum Lock QShortcutVerr numNumLock QShortcut,Verrouillage numrique Number Lock QShortcutOuvrir URLOpen URL QShortcut OptionOption QShortcutPage bas Page Down QShortcutPage hautPage Up QShortcut CollerPaste QShortcut PausePause QShortcutPage suivPgDown QShortcutPage prcPgUp QShortcutTlphonePhone QShortcut ImagesPictures QShortcut*Couper l'alimentation Power Off QShortcut$Candidat prcdentPrevious Candidate QShortcutImprimerPrint QShortcutCapture d'cran Print Screen QShortcutRafrachirRefresh QShortcutRechargerReload QShortcutRpondreReply QShortcut RetourReturn QShortcut DroiteRight QShortcutRomaji QShortcut0Faire tourner la fentreRotate Windows QShortcutRotation KB Rotation KB QShortcutRotation PB Rotation PB QShortcutEnregistrerSave QShortcut&conomiseur d'cran Screensaver QShortcut Arrt dfilement Scroll Lock QShortcutArrt dfil ScrollLock QShortcutRechercheSearch QShortcutSlectionnerSelect QShortcutEnvoyerSend QShortcutMajShift QShortcutMagasinShop QShortcut DormirSleep QShortcut EspaceSpace QShortcut2Correcteur orthographique Spellchecker QShortcut Partager l'cran Split Screen QShortcut"Feuille de calcul Spreadsheet QShortcutAttenteStandby QShortcutArrterStop QShortcutSous-titreSubtitle QShortcutSupporterSupport QShortcutSuspendreSuspend QShortcutSystSysReq QShortcutSystmeSystem Request QShortcutTabTab QShortcut"Panneau de tches Task Panel QShortcutTerminalTerminal QShortcut HeureTime QShortcut(Dcrocher/RaccrocherToggle Call/Hangup QShortcut&Mdia Lecture/PauseToggle Media Play/Pause QShortcut OutilsTools QShortcutHaut du menuTop Menu QShortcutTouroku QShortcutVoyagerTravel QShortcutAigus bas Treble Down QShortcutAigus haut Treble Up QShortcut Bande ultralargeUltra Wide Band QShortcutHautUp QShortcut VidoVideo QShortcutAffichageView QShortcutCommande vocale Voice Dial QShortcutVolume bas Volume Down QShortcutVolume muet Volume Mute QShortcutVolume haut  Volume Up QShortcutWWWWWW QShortcutRveillerWake Up QShortcutWebcamraWebCam QShortcutSans filWireless QShortcut&Traitement de texteWord Processor QShortcutXFerXFer QShortcutOuiYes QShortcutZenkaku QShortcutZenkaku Hankaku QShortcutAgrandirZoom In QShortcutRtrcirZoom Out QShortcut iTouchiTouch QShortcutPage suivante Page downQSliderPage prcdente Page leftQSliderPage suivante Page rightQSliderPage prcdentePage upQSliderPositionPositionQSlider6Type d'adresse non supportAddress type not supportedQSocks5SocketEnginePConnexion refuse par le serveur SOCKSv5(Connection not allowed by SOCKSv5 serverQSocks5SocketEngineNconnexion au proxy ferme prmaturment&Connection to proxy closed prematurelyQSocks5SocketEngine4Connexion au proxy refuseConnection to proxy refusedQSocks5SocketEngine4Connexion au proxy expireConnection to proxy timed outQSocks5SocketEngineDErreur gnrale du serveur SOCKSv5General SOCKSv5 server failureQSocks5SocketEngine6L'opration rseau a expirNetwork operation timed outQSocks5SocketEngineBL'authentification proxy a chouProxy authentication failedQSocks5SocketEngineLL'authentification proxy a chou: %1Proxy authentication failed: %1QSocks5SocketEngine,Hte proxy introuvableProxy host not foundQSocks5SocketEngineFErreur de protocole SOCKS version 5SOCKS version 5 protocol errorQSocks5SocketEngine<Commande SOCKSv5 non supporteSOCKSv5 command not supportedQSocks5SocketEngineTTL expir TTL expiredQSocks5SocketEngineHErreur proxy SOCKSv5 inconnue: 0x%1%Unknown SOCKSv5 proxy error code 0x%1QSocks5SocketEngineAnnulerCancelQSoftKeyManagerTerminerDoneQSoftKeyManagerQuitterExitQSoftKeyManagerOKOkQSoftKeyManagerOptionsOptionsQSoftKeyManagerSlectionnerSelectQSoftKeyManager MoinsLessQSpinBoxPlusMoreQSpinBoxAnnulerCancelQSql6Annuler vos modifications?Cancel your edits?QSqlConfirmerConfirmQSqlSupprimerDeleteQSql<Supprimer cet enregistrement?Delete this record?QSqlInsrerInsertQSqlNonNoQSql>Enregistrer les modifications? Save edits?QSqlActualiserUpdateQSqlOuiYesQSql`Impossible de fournir un certificat sans cl, %1,Cannot provide a certificate with no key, %1 QSslSocket^Erreur lors de la cration du contexte SSL (%1)Error creating SSL context (%1) QSslSocket`Erreur lors de la cration de la session SSL, %1Error creating SSL session, %1 QSslSocketbErreur lors de la cration de la session SSL: %1Error creating SSL session: %1 QSslSocketTErreur lors de la poigne de main SSL: %1Error during SSL handshake: %1 QSslSocketbErreur lors du chargement du certificat local, %1#Error loading local certificate, %1 QSslSocket\Erreur lors du chargement de la cl prive, %1Error loading private key, %1 QSslSocket<Erreur lors de la lecture: %1Error while reading: %1 QSslSocketbLa list de chiffrements est invalide ou vide (%1)!Invalid or empty cipher list (%1) QSslSocketHAucun certificat n'a pu tre vrifi!No certificates could be verified QSslSocketAucune erreurNo error QSslSocketPL'un des certificats CA n'est pas valide%One of the CA certificates is invalid QSslSocketbLa cl prive ne certifie pas la cl publique, %1+Private key does not certify public key, %1 QSslSocketLe paramtre de longueur du chemin basicConstraints a t dpassImpossible d'envoyer un messageUnable to send a messageQSymbianSocketEngine&Impossible d'crireUnable to writeQSymbianSocketEngineErreur inconnue Unknown errorQSymbianSocketEngine<Opration socket non supporteUnsupported socket operationQSymbianSocketEngine %1: existe dj%1: already existsQSystemSemaphore"%1: n'existe pas%1: does not existQSystemSemaphoreF%1: plus de ressources disponibles%1: out of resourcesQSystemSemaphore.%1: permission refuse%1: permission deniedQSystemSemaphore.%1: erreur inconnue %2%1: unknown error %2QSystemSemaphore@Impossible d'ouvrir la connexionUnable to open connection QTDSDriverPImpossible d'utiliser la base de donnesUnable to use database QTDSDriver,Dfiler vers la gauche Scroll LeftQTabBar,Dfiler vers la droite Scroll RightQTabBarJOpration sur le socket non supporte$Operation on socket is not supported QTcpServerCop&ier&Copy QTextControlCo&ller&Paste QTextControl&Rtablir&Redo QTextControl&Annuler&Undo QTextControl2Copier l'adresse du &lienCopy &Link Location QTextControlCo&uperCu&t QTextControlSupprimerDelete QTextControl"Tout slectionner Select All QTextControl OuvrirOpen QToolButtonAppuyerPress QToolButtonJCette plateforme ne supporte pas IPv6#This platform does not support IPv6 QUdpSocketRtablirDefault text for redo actionRedo QUndoGroupAnnulerDefault text for undo actionUndo QUndoGroup <vide> QUndoModelRtablirDefault text for redo actionRedo QUndoStackAnnulerDefault text for undo actionUndo QUndoStackJInsrer caractre de contrle Unicode Insert Unicode control characterQUnicodeControlCharacterMenuHLRE Start of left-to-right embedding$LRE Start of left-to-right embeddingQUnicodeControlCharacterMenu,LRM Left-to-right markLRM Left-to-right markQUnicodeControlCharacterMenuFLRO Start of left-to-right override#LRO Start of left-to-right overrideQUnicodeControlCharacterMenu<PDF Pop directional formattingPDF Pop directional formattingQUnicodeControlCharacterMenuHRLE Start of right-to-left embedding$RLE Start of right-to-left embeddingQUnicodeControlCharacterMenu,RLM Right-to-left markRLM Right-to-left markQUnicodeControlCharacterMenuFRLO Start of right-to-left override#RLO Start of right-to-left overrideQUnicodeControlCharacterMenu*ZWJ Zero width joinerZWJ Zero width joinerQUnicodeControlCharacterMenu4ZWNJ Zero width non-joinerZWNJ Zero width non-joinerQUnicodeControlCharacterMenu*ZWSP Zero width spaceZWSP Zero width spaceQUnicodeControlCharacterMenu6Impossible d'afficher l'URLCannot show URL QWebFrameBImpossible d'afficher le mimetypeCannot show mimetype QWebFrame.Le fichier n'existe pasFile does not exist QWebFrame|Chargement du cadre interrompue par le changement de stratgie'Frame load interrupted by policy change QWebFrameRequte bloqueRequest blocked QWebFrameRequte annuleRequest cancelled QWebFrame"%1 (%2x%3 pixels)Title string for images%1 (%2x%3 pixels)QWebPageR%1 jours %2 heures %3 minutes %4 secondesMedia time description&%1 days %2 hours %3 minutes %4 secondsQWebPage@%1 heures %2 minutes %3 secondesMedia time description%1 hours %2 minutes %3 secondsQWebPage,%1 minutes %2 secondesMedia time description%1 minutes %2 secondsQWebPage%1 secondesMedia time description %1 secondsQWebPage%n fichier%n fichiers %n file(s)QWebPage.Ajouter au dictionnaire Learn Spelling context menu itemAdd To DictionaryQWebPage Aligner gauche Align LeftQWebPage Aligner droite Align RightQWebPagelment audioMedia controller element Audio ElementQWebPage|Commandes de lecture et affichage de l'tat de l'lment audioMedia controller element2Audio element playback controls and status displayQWebPage(Commencer la lectureMedia controller elementBegin playbackQWebPageGrasBold context menu itemBoldQWebPage En basBottomQWebPage CentrCenterQWebPagejVrifier la grammaire en mme temps que l'orthographe-Check grammar with spelling context menu itemCheck Grammar With SpellingQWebPage,Vrifier l'orthographe Check spelling context menu itemCheck SpellingQWebPagePVrifier l'orthographe pendant la saisie-Check spelling while typing context menu itemCheck Spelling While TypingQWebPage$Choisir le fichier(title for file button used in HTML forms Choose FileQWebPage>Effacer les recherches rcentes>menu item in Recent Searches menu that empties menu's contentsClear recent searchesQWebPage CopierCopy context menu itemCopyQWebPageCopier l'imageCopy Link context menu item Copy ImageQWebPageCopier le lienCopy Link context menu item Copy LinkQWebPage&tat du film actuelMedia controller elementCurrent movie statusQWebPage,Dure du film en coursMedia controller elementCurrent movie timeQWebPage CouperCut context menu itemCutQWebPagePar dfaut+Default writing direction context menu itemDefaultQWebPage>Supprimer jusqu' la fin du motDelete to the end of the wordQWebPage>Supprimer jusqu'au dbut du motDelete to the start of the wordQWebPage'Writing direction context sub-menu item DirectionQWebPageTemps coulMedia controller element Elapsed TimeQWebPagePolicesFont context sub-menu itemFontsQWebPage*Bouton de plein cranMedia controller elementFullscreen ButtonQWebPagePrcdentBack context menu itemGo BackQWebPageSuivantForward context menu item Go ForwardQWebPage>Cacher Orthographe et Grammairemenu item titleHide Spelling and GrammarQWebPageIgnorer Ignore Grammar context menu itemIgnoreQWebPageIgnorer!Ignore Spelling context menu itemIgnoreQWebPageDure indfinieMedia time descriptionIndefinite timeQWebPageRetraitIndentQWebPage2Insrer une liste pucesInsert Bulleted ListQWebPage6Insrer une liste numroteInsert Numbered ListQWebPage4Insrer une nouvelle ligneInsert a new lineQWebPage:Insrer un nouveau paragrapheInsert a new paragraphQWebPageInspecter!Inspect Element context menu itemInspectQWebPageItaliqueItalic context menu itemItalicQWebPage,Alerte JavaScript - %1JavaScript Alert - %1QWebPage8Confirmation JavaScript - %1JavaScript Confirm - %1QWebPage6Problme de JavaScript - %1JavaScript Problem - %1QWebPage,Invite JavaScript - %1JavaScript Prompt - %1QWebPageJustifiJustifyQWebPage gauche Left edgeQWebPageGauche droiteLeft to Right context menu item Left to RightQWebPage&Diffusion en direct>Media controller status message when watching a live broadcastLive BroadcastQWebPageChargement...9Media controller status message when the media is loading Loading...QWebPage:Chercher dans le dictionnaire'Look Up in Dictionary context menu itemLook Up In DictionaryQWebPage Plug-in manquantMissing Plug-inQWebPageTDplacer le curseur la fin du paragraphe'Move the cursor to the end of the blockQWebPageLDplacer le curseur en fin de document*Move the cursor to the end of the documentQWebPageFDplacer le curseur en fin de ligne&Move the cursor to the end of the lineQWebPagePDplacer le curseur au caractre suivant%Move the cursor to the next characterQWebPageNDplacer le curseur la ligne suivante Move the cursor to the next lineQWebPageDDplacer le curseur au mot suivant Move the cursor to the next wordQWebPageTDplacer le curseur au caractre prcdent)Move the cursor to the previous characterQWebPageRDplacer le curseur la ligne prcdente$Move the cursor to the previous lineQWebPageHDplacer le curseur au mot prcdent$Move the cursor to the previous wordQWebPageTDplacer le curseur au dbut du paragraphe)Move the cursor to the start of the blockQWebPagePDplacer le curseur en dbut de document,Move the cursor to the start of the documentQWebPageJDplacer le curseur en dbut de ligne(Move the cursor to the start of the lineQWebPage2Balayeur de dure du filmMedia controller elementMovie time scrubberQWebPagedCase de dfilement du balayeur de la dure du filmMedia controller elementMovie time scrubber thumbQWebPage<Bouton de dsactivation du sonMedia controller element Mute ButtonQWebPage<Couper le son des pistes audioMedia controller elementMute audio tracksQWebPage.Pas de candidat trouvs"No Guesses Found context menu itemNo Guesses FoundQWebPage4Pas de fichier slectionnJtext to display in file button used in HTML forms when no file is selectedNo file selectedQWebPage0Pas de recherche rcentevLabel for only item in menu that appears when clicking on the search field image, when no searches have been performedNo recent searchesQWebPageOuvrir le cadre*Open Frame in New Window context menu item Open FrameQWebPageOuvrir l'image*Open Image in New Window context menu item Open ImageQWebPageOuvrir le lienOpen Link context menu item Open LinkQWebPage@Ouvrir dans une Nouvelle Fentre$Open in New Window context menu itemOpen in New WindowQWebPageRetrait ngatifOutdentQWebPageContourOutline context menu itemOutlineQWebPagePage bas Page downQWebPagePage gauche Page leftQWebPagePage droite Page rightQWebPagePage hautPage upQWebPage CollerPaste context menu itemPasteQWebPage2Coller et suivre le stylePaste and Match StyleQWebPage PausePauseQWebPageBouton de pauseMedia controller element Pause ButtonQWebPagePause lectureMedia controller elementPause playbackQWebPage"Bouton de lectureMedia controller element Play ButtonQWebPageHRegarder le film en mode plein cranMedia controller elementPlay movie in full-screen modeQWebPage&Recherches rcentesrlabel for first item in the menu that appears when clicking on the search field image, used as embedded menu titleRecent searchesQWebPage<Limite de redirection atteinteRedirection limit reachedQWebPageRechargerReload context menu itemReloadQWebPageDure restanteMedia controller elementRemaining TimeQWebPage,Dure de film restanteMedia controller elementRemaining movie timeQWebPage0Retirer la mise en formeRemove formattingQWebPageRinitialiser5default label for Reset buttons in forms on web pagesResetQWebPageTRamener le film en streaming en temps relMedia controller element#Return streaming movie to real-timeQWebPage<Bouton de retour au temps relMedia controller elementReturn to Real-time ButtonQWebPage6Bouton de retour en arrireMedia controller element Rewind ButtonQWebPage$Rembobiner le filmMedia controller element Rewind movieQWebPage droite Right edgeQWebPageDroite gaucheRight to Left context menu item Right to LeftQWebPage&Enregistrer l'image Download Image context menu item Save ImageQWebPage,Enregistrer le lien...&Download Linked File context menu item Save Link...QWebPage&Dfiler vers le bas Scroll downQWebPage"Dfiler jusqu'ici Scroll hereQWebPage,Dfiler vers la gauche Scroll leftQWebPage,Dfiler vers la droite Scroll rightQWebPage(Dfiler vers le haut Scroll upQWebPage&Chercher sur le Web Search The Web context menu itemSearch The WebQWebPage6Bouton de recherche arrireMedia controller elementSeek Back ButtonQWebPage2Bouton de recherche avantMedia controller elementSeek Forward ButtonQWebPage0Recherche rapide arrireMedia controller elementSeek quickly backQWebPage,Recherche rapide avantMedia controller elementSeek quickly forwardQWebPage"Tout slectionner Select AllQWebPageRSlectionner jusqu' la fin du paragrapheSelect to the end of the blockQWebPageNSlectionner jusqu' la fin du document!Select to the end of the documentQWebPageDSlectionner jusqu'en fin de ligneSelect to the end of the lineQWebPageNSlectionner jusqu'au caractre suivantSelect to the next characterQWebPageLSlectionner jusqu' la ligne suivanteSelect to the next lineQWebPageBSlectionner jusqu'au mot suivantSelect to the next wordQWebPageRSlectionner jusqu'au caractre prcdent Select to the previous characterQWebPagePSlectionner jusqu' la ligne prcdenteSelect to the previous lineQWebPageFSlectionner jusqu'au mot prcdentSelect to the previous wordQWebPageRSlectionner jusqu'au dbut du paragraphe Select to the start of the blockQWebPageNSlectionner jusqu'au dbut du document#Select to the start of the documentQWebPageHSlectionner jusqu'en dbut de ligneSelect to the start of the lineQWebPageBAfficher Orthographe et Grammairemenu item titleShow Spelling and GrammarQWebPage SliderMedia controller elementSliderQWebPageBCurseur de la barre de dfilementMedia controller element Slider ThumbQWebPageOrthographe*Spelling and Grammar context sub-menu itemSpellingQWebPage&Affichage de l'tatMedia controller elementStatus DisplayQWebPageArrterStop context menu itemStopQWebPage Barr StrikethroughQWebPageSoumettreQSubmit (input element) alt text for elements with no alt, title, or valueSubmitQWebPageSoumettre6default label for Submit buttons in forms on web pagesSubmitQWebPage Indice SubscriptQWebPageExposant SuperscriptQWebPage(Orientation du texte$Text direction context sub-menu itemText DirectionQWebPageLe script de cette page semble avoir un problme. Souhaitez-vous arrter le script?RThe script on this page appears to have a problem. Do you want to stop the script?QWebPagedCeci est un index. Veuillez saisir les mots-cl: _text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'3This is a searchable index. Enter search keywords: QWebPageHautTopQWebPageSoulignUnderline context menu item UnderlineQWebPageInconnu+Unknown filesize FTP directory listing itemUnknownQWebPage:Bouton de ractivation du sonMedia controller element Unmute ButtonQWebPageBRactiver le son des pistes audioMedia controller elementUnmute audio tracksQWebPagelment vidoMedia controller element Video ElementQWebPage|Commandes de lecture et affichage de l'tat de l'lment vidoMedia controller element2Video element playback controls and status displayQWebPage&Inspecteur Web - %2Web Inspector - %2QWebPage*Qu'est-ce que c'est ? What's This?QWhatsThisAction*QWidget&Terminer&FinishQWizard &Aide&HelpQWizard&Suivant >&NextQWizard&Suivant >&Next >QWizard< &Prcdent< &BackQWizardAnnulerCancelQWizardSoumettreCommitQWizardContinuerContinueQWizardTerminerDoneQWizardPrcdentGo BackQWizardAideHelpQWizard%1 - [%2] %1 - [%2] QWorkspace&Fermer&Close QWorkspace&Dplacer&Move QWorkspace&Restaurer&Restore QWorkspace&Taille&Size QWorkspaceDr&ouler&Unshade QWorkspace FermerClose QWorkspaceMa&ximiser Ma&ximize QWorkspaceRd&uire Mi&nimize QWorkspaceRduireMinimize QWorkspace Restaurer en bas Restore Down QWorkspaceEnrou&lerSh&ade QWorkspace.Rester au &premier plan Stay on &Top QWorkspacedclaration d'encodage ou dclaration "standalone" attendue lors de la lecture de la dclaration XMLYencoding declaration or standalone declaration expected while reading the XML declarationQXmljerreur dans la dclaration texte d'une entit externe3error in the text declaration of an external entityQXmlune erreur s'est produite pendant l'analyse syntaxique du commentaire$error occurred while parsing commentQXmlune erreur s'est produite pendant l'analyse syntaxique du contenu$error occurred while parsing contentQXmlune erreur s'est produite pendant l'analyse syntaxique de la dfinition du type de document5error occurred while parsing document type definitionQXmlune erreur s'est produite pendant l'analyse syntaxique de l'lement$error occurred while parsing elementQXmlune erreur s'est produite pendant l'analyse syntaxique d'une rfrence&error occurred while parsing referenceQXmlJErreur dclenche par le consommateurerror triggered by consumerQXmlrfrence une entit gnrale externe non autorise dans le DTD;external parsed general entity reference not allowed in DTDQXmlrfrence une entit gnrale externe non autorise dans la valeur d'attributGexternal parsed general entity reference not allowed in attribute valueQXmlrfrence une entit gnrale interne non autorise dans la DTD4internal general entity reference not allowed in DTDQXml4nom d'instruction invalide'invalid name for processing instructionQXml.une lettre est attendueletter is expectedQXmlRplus d'une dfinition de type de document&more than one document type definitionQXml>aucune erreur ne s'est produiteno error occurredQXml$entits rcursivesrecursive entitiesQXmldclaration "standalone" attendue lors de la lecture de la dclaration XMLAstandalone declaration expected while reading the XML declarationQXmltag incongru tag mismatchQXml&caractre inattenduunexpected characterQXml2Fin de fichier inattendueunexpected end of fileQXmlxrfrence une entit non analyse dans le mauvais contexte*unparsed entity reference in wrong contextQXml`une version est attendue dans la dclaration XML2version expected while reading the XML declarationQXmlfvaleur incorrecte pour une dclaration "standalone"&wrong value for standalone declarationQXmlLieu inconnuQXmlPatternistCLIbErreur %1 dans %2, la ligne %3, colonne %4: %5)Error %1 in %2, at line %3, column %4: %5QXmlPatternistCLI,Erreur %1 dans %2: %3Error %1 in %2: %3QXmlPatternistCLIjAvertissement dans %1, la ligne %2, colonne %3: %4(Warning in %1, at line %2, column %3: %4QXmlPatternistCLI4Avertissement dans %1: %2Warning in %1: %2QXmlPatternistCLIX%1 n'est pas un identifiant "PUBLIC" valide.#%1 is an invalid PUBLIC identifier. QXmlStreamL%1 n'est pas un nom d'encodage valide.%1 is an invalid encoding name. QXmlStreamR%1 n'est pas un nom d'instruction valide.-%1 is an invalid processing instruction name. QXmlStream, mais trouv ' , but got ' QXmlStream0Redfinition d'attribut.Attribute redefined. QXmlStreamB%1 n'est pas un encodage supportEncoding %1 is unsupported QXmlStreamlDu contenu avec un encodage incorrect a t rencontr.(Encountered incorrectly encoded content. QXmlStream2Entit '%1' non dclare.Entity '%1' not declared. QXmlStreamAttendu(e) Expected  QXmlStream0donnes texte attendues.Expected character data. QXmlStreamLContenu superflu la fin du document.!Extra content at end of document. QXmlStreamVDclaration d'espace de noms non autorise.Illegal namespace declaration. QXmlStream.Caractre XML invalide.Invalid XML character. QXmlStream"Nom XML invalide.Invalid XML name. QXmlStream>Chane de version XML invalide.Invalid XML version string. QXmlStreamVAttribut invalide dans une dclaration XML.%Invalid attribute in XML declaration. QXmlStreamDRfrence un caractre invalide.Invalid character reference. QXmlStream$Document invalide.Invalid document. QXmlStream8Valeur de l'entit invalide.Invalid entity value. QXmlStream6nom d'instruction invalide.$Invalid processing instruction name. QXmlStreambNDATA dans une dclaration de paramtre d'entit.&NDATA in parameter entity declaration. QXmlStreamdLe prfixe d'espace de noms %1 n'a pas t dclar"Namespace prefix '%1' not declared QXmlStream\Tags ouvrant et fermants ne correspondent pas. Opening and ending tag mismatch. QXmlStream6Fin de document inattendue.Premature end of document. QXmlStream4Entit rcursive dtecte.Recursive entity detected. QXmlStreamnRfrence l'entit externe '%1' en valeur d'attribut.5Reference to external entity '%1' in attribute value. QXmlStreamNRfrence l'entit '%1' non analyse."Reference to unparsed entity '%1'. QXmlStreamZsquence ']]>' non autorise dans le contenu.&Sequence ']]>' not allowed in content. QXmlStreamLe seules valeurs possibles pour "standalone" sont "yes" ou "no"."Standalone accepts only yes or no. QXmlStream,Tag de dpart attendu.Start tag expected. QXmlStreamLe pseudo-attribut "standalone" doit apparatre aprs l'encodage.?The standalone pseudo attribute must appear after the encoding. QXmlStreamInattendu(e) Unexpected ' QXmlStream|Caractre '%1' inattendu pour une valeur d'identifiant public./Unexpected character '%1' in public id literal. QXmlStream4Version XML non supporte.Unsupported XML version. QXmlStreamdLa dclaration XML doit tre en dbut de document.)XML declaration not at start of document. QXmlStream 0.125x0.125xQmlJSDebugger::QmlToolBar0.1x0.1xQmlJSDebugger::QmlToolBar 0.25x0.25xQmlJSDebugger::QmlToolBar0.5x0.5xQmlJSDebugger::QmlToolBar1x1xQmlJSDebugger::QmlToolBarSlectionnerSelectQmlJSDebugger::QmlToolBar OutilsToolsQmlJSDebugger::QmlToolBarAgrandirZoom InQmlJSDebugger::ZoomToolRtrcirZoom OutQmlJSDebugger::ZoomTooldL'lment %1 n'est pas autoris cet emplacement. QtXmlPatternsp%1 et %2 correspondent au dbut et la fin d'une ligne.,%1 and %2 match the start and end of a line. QtXmlPatterns8%1 ne peut pas tre rcupr%1 cannot be retrieved QtXmlPatterns%1 contient 'octets', qui n'est pas autoris pour l'encodage %2.E%1 contains octets which are disallowed in the requested encoding %2. QtXmlPatterns%1 est une type complexe. Caster vers des types complexes n'est pas possible. Cependant, caster vers des types atomiques comme %2 marche.s%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. QtXmlPatterns(%1 est un ivalide %2%1 is an invalid %2 QtXmlPatterns%1 est un flag invalide pour des expressions rgulires. Les flags valides sont: ?%1 is an invalid flag for regular expressions. Valid flags are: QtXmlPatternsH%1 est un URI de namespace invalide.%1 is an invalid namespace URI. QtXmlPatternsj%1 est un modle d'expression rgulire invalide: %2/%1 is an invalid regular expression pattern: %2 QtXmlPatternsV%1 est un nom de mode de template invalide.$%1 is an invalid template mode name. QtXmlPatternsB%1 est un type de schema inconnu.%1 is an unknown schema type. QtXmlPatterns@%1 est un encodage non support.%1 is an unsupported encoding. QtXmlPatternsR%1 n'est pas un caractre XML 1.0 valide.$%1 is not a valid XML 1.0 character. QtXmlPatterns|%1 n'est pas un nom valide pour une instruction de traitement.4%1 is not a valid name for a processing-instruction. QtXmlPatternsR%1 n'est pas une valeur numrique valide."%1 is not a valid numeric literal. QtXmlPatterns%1 n'est pas un nom de destination valide dans une instruction de traitement. Ce doit tre une valeur %2, par ex. %3.Z%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. QtXmlPatternsT%1 n'est pas une valeur valide du type %2.#%1 is not a valid value of type %2. QtXmlPatternsR%1 n'est pas un nombre entier de minutes.$%1 is not a whole number of minutes. QtXmlPatterns%1 n'est pas un type atomique. Il est uniquement possible de caster vers des types atomiques.C%1 is not an atomic type. Casting is only possible to atomic types. QtXmlPatterns%1 n'est pas dans les dclaration d'attribut in-scope. La fonctionnalit d'inport de schma n'est pas supporte.g%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. QtXmlPatternsT%1 n'est pas une valeur valide de type %2.&%1 is not valid as a value of type %2. QtXmlPatterns^%1 correspond des caractres de saut de ligne%1 matches newline characters QtXmlPatterns%1 doit tre suivi par %2 ou %3, et non la fin de la chane de remplacement.J%1 must be followed by %2 or %3, not at the end of the replacement string. QtXmlPatternsn%1 requiert au moins %n argument. %2 est donc invalide.p%1 requiert au moins %n arguments. %2 est donc invalide.=%1 requires at least %n argument(s). %2 is therefore invalid. QtXmlPatternsl%1 prend au maximum %n argument. %2 est donc invalide.n%1 prend au maximum %n arguments. %2 est donc invalide.9%1 takes at most %n argument(s). %2 is therefore invalid. QtXmlPatterns %1 a t appel.%1 was called. QtXmlPatternsLUn commentaire ne peut pas contenir %1A comment cannot contain %1 QtXmlPatternsPUn commentaire ne peut pas finir par %1.A comment cannot end with a %1. QtXmlPatternsUn dclaration de namespace par dfaut doit tre place avant toute fonction, variable ou declaration d'option.^A default namespace declaration must occur before function, variable, and option declarations. QtXmlPatternsUn constructeur direct d'lment est mal-form. %1 est termin par %2.EA direct element constructor is not well-formed. %1 is ended with %2. QtXmlPatterns\Une fonction avec la signature %1 existe dj.0A function already exists with the signature %1. QtXmlPatternsUn module de bibliothque ne peut pas tre valu directement. Il doit tre import d'un module principal.VA library module cannot be evaluated directly. It must be imported from a main module. QtXmlPatternsUn paramtre de fonction ne peut pas tre dclar comme un tunnel.In an XSL-T pattern, function %1 cannot have a third argument. QtXmlPatternsDans un pattern XSL-T, seules les fonctions %1 et %2 (pas %3) peuvent tre utilises pour le matching.OIn an XSL-T pattern, only function %1 and %2, not %3, can be used for matching. QtXmlPatternsDans un pattern XSL-T, le premier argument la fonction %1 doit tre un litral ou une rfrence de variable.yIn an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching. QtXmlPatternsDans un pattern XSL-T, le premier argument la fonction %1 doit tre une chane de caractres quand utilis pour correspondance.hIn an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching. QtXmlPatternsDans la chane de remplacement, %1 peut seulement tre utilis pour chapper lui-mme ou %2 mais pas %3MIn the replacement string, %1 can only be used to escape itself or %2, not %3 QtXmlPatternsDans la chane de remplacement, %1 doit tre suivi par au moins un chiffre s'il n'est pas chapp.VIn the replacement string, %1 must be followed by at least one digit when not escaped. QtXmlPatterns\Division entire (%1) par zro (%2) indfinie.0Integer division (%1) by zero (%2) is undefined. QtXmlPatternsTIl est impossible de se lier au prfixe %1+It is not possible to bind to the prefix %1 QtXmlPatterns\Il est impossible de redclarer le prfixe %1.*It is not possible to redeclare prefix %1. QtXmlPatternsFIl sera impossible de rcuprer %1.'It will not be possible to retrieve %1. QtXmlPatternsIl est impossible d'ajouter des attributs aprs un autre type de noeuds.AIt's not possible to add attributes after any other kind of node. QtXmlPatternshLes correspondances ne sont pas sensibles la casseMatches are case insensitive QtXmlPatternsLes imports de module doivent tre placs avant tout fonction, variable ou dclaration d'option.MModule imports must occur before function, variable, and option declarations. QtXmlPatternsZModule division (%1) par zro (%2) indfinie.0Modulus division (%1) by zero (%2) is undefined. QtXmlPatternsVLe mois %1 est hors de l'intervalle %2..%3.%Month %1 is outside the range %2..%3. QtXmlPatternsLa multiplication d'une valeur du type %1 par %2 ou %3 (plus ou moins infini) est interdite.YMultiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. QtXmlPatternsLe namespace %1 peut seulement tre li %2 (et doit tre pr-dclar).ONamespace %1 can only be bound to %2 (and it is, in either case, pre-declared). QtXmlPatternsLes declarations de namespace doivent tre places avant tout fonction, variable ou dclaration d'option.UNamespace declarations must occur before function, variable, and option declarations. QtXmlPatterns0Le rseau ne rpond pas.Network timeout. QtXmlPatterns@Les fonctions externes ne sont pas supportes. Toutes les fonctions supportes peuvent ter utilises directement sans les dclarer pralablement comme externes{No external functions are supported. All supported functions can be used directly, without first declaring them as external QtXmlPatternsVAucune fonction nomme %1 n'est disponible.&No function with name %1 is available. QtXmlPatternsjAucune fonction avec la signature %1 n'est disponible*No function with signature %1 is available QtXmlPatternsfAucun lien de namespace n'existe pour le prfixe %1-No namespace binding exists for the prefix %1 QtXmlPatternsvAucun lien de namespace n'existe pour le prfixe %1 dans %23No namespace binding exists for the prefix %1 in %2 QtXmlPatternsBAucun template nomm %1 n'existe.No template by name %1 exists. QtXmlPatternsvAucune valeur n'est disponible pour la variable externe %1.=No value is available for the external variable with name %1. QtXmlPatternsDAucune variable nomme %1 n'existeNo variable with name %1 exists QtXmlPatternsAucune des expressions pragma n'est supporte. Une expression par dfault doit tre prsente^None of the pragma expressions are supported. Therefore, a fallback expression must be present QtXmlPatternsSeulement une dclaration %1 peut intervenir lors du prologue de la requte.6Only one %1 declaration can occur in the query prolog. QtXmlPatternsPSeulement un lment %1 peut apparatre.Only one %1-element can appear. QtXmlPatternsSeule le Unicode CodepointCollation est support (%1), %2 n'est pas support.IOnly the Unicode Codepoint Collation is supported(%1). %2 is unsupported. QtXmlPatternsjSeul le prfixe %1 peut tre li %2, et vice versa.5Only the prefix %1 can be bound to %2 and vice versa. QtXmlPatternsL'oprateur %1 ne peut pas tre utilis pour des valeurs atomiques de type %2 ou %3.>Operator %1 cannot be used on atomic values of type %2 and %3. QtXmlPatternspL'oprateur %1 ne peut pas tre utilis pour le type %2.&Operator %1 cannot be used on type %2. QtXmlPatterns`Overflow: impossible de reprsenter la date %1."Overflow: Can't represent date %1. QtXmlPatterns`Overflow: la date ne peut pas tre reprsente.$Overflow: Date can't be represented. QtXmlPatternsErreur: %1Parse error: %1 QtXmlPatternsLe prfixe %1 peut seulement tre li %2 (et doit tre prdclar).LPrefix %1 can only be bound to %2 (and it is, in either case, pre-declared). QtXmlPatterns`Le prfixe %1 est dj dclar dans le prologue.,Prefix %1 is already declared in the prolog. QtXmlPatternszLa Promotion de %1 vers %2 peut causer un perte de prcision./Promoting %1 to %2 may cause loss of precision. QtXmlPatternsNLa cardinalit requise est %1; reu %2./Required cardinality is %1; got cardinality %2. QtXmlPatternsTLe type requis est %1, mais %2 a t reu.&Required type is %1, but %2 was found. QtXmlPatternsLancement d'une feuille de style XSL-T 1.0 avec un processeur 2.0.5Running an XSL-T 1.0 stylesheet with a 2.0 processor. QtXmlPatternsNL'axe %1 n'est pas support dans XQuery$The %1-axis is unsupported in XQuery QtXmlPatternsLa fonctionnalit "Schema Import" n'est pas supporte et les dclarations %1 ne peuvent donc intervenir.WThe Schema Import feature is not supported, and therefore %1 declarations cannot occur. QtXmlPatternsLa fonctionnalit "Schema Validation" n'est pas supporte. Les expressions %1 ne seront pas utilises.VThe Schema Validation Feature is not supported. Hence, %1-expressions may not be used. QtXmlPatternsHL'URI ne peut pas avoir de fragmentsThe URI cannot have a fragment QtXmlPatternsL'attribute %1 peut seulement apparatre sur le premier lment %2.9The attribute %1 can only appear on the first %2 element. QtXmlPatternsL'attribut %1 ne peut pas apparatre sur %2 quand il est fils de %3.?The attribute %1 cannot appear on %2, when it is a child of %3. QtXmlPatternsLe codepoint %1 dans %2 et utilisant l'encodage %3 est un caractre XML invalide.QThe codepoint %1, occurring in %2 using encoding %3, is an invalid XML character. QtXmlPatternsLes donnes d'une instruction de traitement ne peut contenir la chane %1AThe data of a processing instruction cannot contain the string %1 QtXmlPatternsLI'l n'y a pas de collection par dfaut#The default collection is undefined QtXmlPatternsL'encodage %1 est invalide. Il doit contenir uniquement des caractres latins, sans blanc et doit tre conforme l'expression rgulire %2.The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. QtXmlPatternsLe premier argument de %1 ne peut tre du type %2. Il doit tre de type numrique, xs:yearMonthDuration ou xs:dayTimeDuration.uThe first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. QtXmlPatternsLe premier argument de %1 ne peut tre du type %2. Il doit tre de type %3, %4 ou %5.PThe first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. QtXmlPatterns,Le focus est indfini.The focus is undefined. QtXmlPatternsjL'initialisation de la variable %1 dpend d'elle-mme3The initialization of variable %1 depends on itself QtXmlPatterns\L'item %1 ne correspond pas au type requis %2./The item %1 did not match the required type %2. QtXmlPatterns~Le mot-cl %1 ne peut pas apparatre avec un autre nom de mode.5The keyword %1 cannot occur with any other mode name. QtXmlPatterns La dernire tape dans un chemin doit contenir soit des noeuds soit des valeurs atomiques. Cela ne peut pas tre un mlange des deux.kThe last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. QtXmlPatternsjLa fonctionnalit "module import" n'est pas supporte*The module import feature is not supported QtXmlPatterns\Le nom %1 ne se rfre aucun type de schema..The name %1 does not refer to any schema type. QtXmlPatternsLe nom d'un attribut calcul ne peut pas avoir l'URI de namespace %1 avec le nom local %2.ZThe name for a computed attribute cannot have the namespace URI %1 with the local name %2. QtXmlPatterns&Le nom d'une variable lie dans un expression for doit tre different de la variable positionnelle. Les deux variables appeles %1 sont en conflit.The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. QtXmlPatternsLe nom d'une expression d'extension doit tre dans un namespace.;The name of an extension expression must be in a namespace. QtXmlPatternsLe nom d'une option doit avoir un prfixe. Il n'y a pas de namespace par dfaut pour les options.TThe name of an option must have a prefix. There is no default namespace for options. QtXmlPatternsHLe namespace %1 est rserv; c'est pourquoi les fonctions dfinies par l'utilisateur ne peuvent l'utiliser. Essayez le prfixe prdfini %2 qui existe pour ces cas.The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. QtXmlPatternsL'URI de namespace ne peut tre une chane vide quand on le lie un prfixe, %1.JThe namespace URI cannot be the empty string when binding to a prefix, %1. QtXmlPatternsL'URI de namespace dans le nom d'un attribut calcul ne peut pas tre %1.DThe namespace URI in the name for a computed attribute cannot be %1. QtXmlPatternsL'URI de namespace doit tre une constante et ne peut contenir d'expressions.IThe namespace URI must be a constant and cannot use enclosed expressions. QtXmlPatternsLe namespace d'une fonction utilisateur ne peut pas tre vide (essayez le prfixe prdfini %1 qui existe pour ce genre de cas)yThe namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) QtXmlPatternsLLe namespace d'une fonction utilisateur dans un module de bibliothque doit tre quivalent au namespace du module. En d'autres mots, il devrait tre %1 au lieu de %2The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 QtXmlPatterns(Le forme de normalisation %1 n'est pas supporte. Les formes supportes sont %2, %3, %4 et %5, et aucun, ie. une chane vide (pas de normalisation).The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). QtXmlPatterns~Le paramtre %1 est pass mais aucun %2 correspondant n'existe.;The parameter %1 is passed, but no corresponding %2 exists. QtXmlPatternsLe paramtre %1 est requis, mais aucun %2 correspondant n'est fourni.BThe parameter %1 is required, but no corresponding %2 is supplied. QtXmlPatterns>Le prfixe %1 ne peut tre li.The prefix %1 cannot be bound. QtXmlPatternsLe prfixe %1 ne peut tre li. Par dfault, il est dj li au namespace %2.SThe prefix %1 cannot be bound. By default, it is already bound to the namespace %2. QtXmlPatternshLe prfixe doit tre un valide %1; %2 n'e l'est pas./The prefix must be a valid %1, which %2 is not. QtXmlPatternsLe noeuds racine du deuxime argument la fonction %1 doit tre un noeuds document. %2 n'est pas un document.gThe root node of the second argument to function %1 must be a document node. %2 is not a document node. QtXmlPatternsLe deuxime argument de %1 ne peut tre du type %2. Il doit tre de type %3, %4 ou %5.QThe second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. QtXmlPatternsLe nom de destination dans une instruction de traitement ne peut tre %1. %2 est invalide.~The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid. QtXmlPatternsZLe namespace cible d'un %1 ne peut tre vide.-The target namespace of a %1 cannot be empty. QtXmlPatternsLa valeur de l'attribut %1 de l'lement %2 doit tre %3 ou %4, et pas %5.IThe value for attribute %1 on element %2 must either be %3 or %4, not %5. QtXmlPatternsLa valeur de l'attribut %1 doit tre du type %2, %3 n'en est pas.=The value of attribute %1 must be of type %2, which %3 isn't. QtXmlPatternsLa valeur de l'attribut de version XSL-T doit tre du type %1, et non %2.TThe value of the XSL-T version attribute must be a value of type %1, which %2 isn't. QtXmlPatterns:La variable %1 est inutiliseThe variable %1 is unused QtXmlPatternsCe processeur ne comprend pas les Schemas. C'est pourquoi %1 ne peut pas tre utilis.CThis processor is not Schema-aware and therefore %1 cannot be used. QtXmlPatternsJL'heure %1: %2: %3.%4 est invalide.Time %1:%2:%3.%4 is invalid. QtXmlPatternsHeure 24: %1: %2.%3 est invalide. L'heure est 24 mais les minutes, secondes et millisecondes ne sont pas 0;_Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0;  QtXmlPatternsLes lment d'une feuille de style de haut niveau doivent tre dans un namespace non nul; %1 ne l'est pas.NTop level stylesheet elements must be in a non-null namespace, which %1 isn't. QtXmlPatternsDeux attributs de dclarations de namespace ont le mme nom: %1.$.=>>,u>5y@ImS6 C6F6ޅs?u~Zme#TD'^$8FEn_FɮlUNuP\ze@ENpA]qY,.SPznt %5#P? J}K4|q|.] C9 CP!@?#GN#GեB~ M%M%֮NGVnqiwqNy@y91BA47<РIvn*PSc#ZxvNqƒvլjCJ؃Ęuܓ~釥v?:<D.$ v*15^';^Se[7l 2l 2vQ}{.*s47f!71VnS5dIs*nr_T '+1GI_PYujZ-]h`^wlVDHLJPf$lt֣s֣F1܄!2  GZP ֑,Bn]/jz< 2N`E^z~SK~z#O#-EX {JPa+[B6N?=PO\!]Rg!.oc*zF{^}d߱-76_QAM*CW/sӏx9"0 Q# $ 6 q M , \. .8 5zM 5' Ehsa Po [‚G7 h>: h>C h>ys h>F lat qT zr t C;  @j,B Ƚ/ ȽR v I .M  q"o *z 53t [5 eeu ee5 h h h4 s( sa xj ^! s` sa ! s I R( v vTT n ۰o 1 !Q " &i‚ ;  b`j f pP~a yNe |> ~ H P ğ T  f' <; ͷ) > w :<   >V Ч / -du& 0 Gj~ Gj KCl N0wg ]? ]- ]Oi g k}M@ oX= oZ +!6  @  Yi| D= 1hQ v I- IO FcP :  ߚ 4` 4 Ps. bq8< h  ,y=! ?N. Mԇ W%{9 `jP i$FX w P Pf  P0 PSI  N  y/ yR8SV\?PGch LN~J"s^Ѻ&mYB.06;SVȑ5kv>kw5xMoci9[t0\tA=p-GOwT/`h#=mc͟k nuȺ6Du>~ ÓG۴y)/^y)R[)4dtEia &ber&About AboutDialog&Lizenzabkommen&Licence Agreement AboutDialog$&Systeminformation &System Info AboutDialog&Dank an &Thanks To AboutDialogA&utorenA&uthors AboutDialogInfoAbout AboutDialog6Erstellungszeitpunkt: %1 %2Build time: %1 %2 AboutDialogMitwirkende Contributors AboutDialogTschechischCzech AboutDialogDnischDanish AboutDialogFranzsischFrench AboutDialogDeutschGerman AboutDialogHauptentwicklerMain developers AboutDialogOKOK AboutDialogLName und Version des Betriebssystems: #Operating system name and version:  AboutDialogBVersion der Qt Laufzeitumgebung: Qt runtime version:  AboutDialogSchwedischSwedish AboutDialogDies ist das qStopMotion Programm um Stopmotion-Animationsfilme zu erstellen.HThis is the qStopMotion application for creating stop motion animations. AboutDialogDieses Programm wird unter den Bedingungen der GPL v2 bereitgestellt.:This program is distributed under the terms of the GPL v2. AboutDialogbersetzung Translation AboutDialog$Unbekanntes Mac OSUnknown Mac OS AboutDialog,Unbekanntes Windows OSUnknown Windows OS AboutDialogVersion: Version:  AboutDialogundand AboutDialogdqStopMotion ist ein Fork von stopmotion fr Linux..qStopMotion is a fork of stopmotion for linux. AboutDialogTon hinzufgen Add SoundAnimationProjectnDie ausgewhlte Ton-Datei kann nicht zum lesen geffnet werden. berprfen Sie, dass die Rechte richtig gesetzt sind. Die Animation wird ohne Ton abgespielt wenn Sie abspielen whlen.Cannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play.AnimationProjectZAbspeichern der Szenen auf die Festplatte ...Saving scenes to disk ...AnimationProjectDie ausgewhlte Ton-Datei hat kein gltiges Ton-Format. Die Animation wird ohne Ton abgespielt, wenn Sie abspielen whlen.The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play.AnimationProject&Schlieen&CloseCameraControllerDialog4&Zurcksetzen auf Standard&Reset to DefaultCameraControllerDialog,Zurcksetzen abbrechen Abort ResetCameraControllerDialog`Automatische Hintergrundbeleuchtungskompensation Automatic Backlight CompensationCameraControllerDialog.Automatische HelligkeitAutomatic BrightnessCameraControllerDialog4Automatisch Farbe zulassenAutomatic Color EnableCameraControllerDialog,Automatischer KontrastAutomatic ContrastCameraControllerDialog.Automatische BelichtungAutomatic ExposureCameraControllerDialog0Automatische BildschrfeAutomatic FocusCameraControllerDialog0Automatische VerstrkungAutomatic GainCameraControllerDialog&Automatisches GammaAutomatic GammaCameraControllerDialog*Automatischer Farbton Automatic HueCameraControllerDialog&Automatische BlendeAutomatic IrisCameraControllerDialog*Automatischer Schwenk Automatic PanCameraControllerDialog$Automatische RolleAutomatic RollCameraControllerDialog,Automatische SttigungAutomatic SaturationCameraControllerDialog(Automatische SchrfeAutomatic SharpnessCameraControllerDialog(Automatische NeigungAutomatic TiltCameraControllerDialog4Automatischer WeiabgleichAutomatic White BalanceCameraControllerDialog$Automatischer ZoomAutomatic ZoomCameraControllerDialogHHintergrundbeleuchtungskompensation:Backlight Compensation:CameraControllerDialogHelligkeit: Brightness:CameraControllerDialogKamerasteuerungCamera ControlCameraControllerDialogFarbe zulassen: Color Enable:CameraControllerDialogKontrast: Contrast:CameraControllerDialogBelichtung: Exposure:CameraControllerDialogBildschrfe:Focus:CameraControllerDialogVerstrkung:Gain:CameraControllerDialog Gamma:Gamma:CameraControllerDialogFarbton:Hue:CameraControllerDialogBlende:Iris:CameraControllerDialogSchwenk:Pan:CameraControllerDialogNZurcksetzen der Kameraeinstellungen...Reset Camera Settings...CameraControllerDialogVWiederherstellen der Kameraeinstellungen...Restore Camera Settings...CameraControllerDialog Rolle:Roll:CameraControllerDialogSttigung: Saturation:CameraControllerDialogSchrfe: Sharpness:CameraControllerDialogNeigung:Tilt:CameraControllerDialogBildqualitt Video QualityCameraControllerDialogWeiabgleich:White Balance:CameraControllerDialog Zoom:Zoom:CameraControllerDialog6qStopMotion KamerasteuerungqStopMotion Camera ControllerCameraControllerDialog&Abbrechen&CancelDescriptionDialog&OK&OKDescriptionDialog*&Projektbeschreibung:&Project Description:DescriptionDialog&&Szenebeschreibung:&Scene Description:DescriptionDialog,A&ufnahmebeschreibung:&Take Description:DescriptionDialogInformation InformationDescriptionDialog&ProjektbeschreibungProject DescriptionDescriptionDialog"SzenebeschreibungScene DescriptionDescriptionDialog(AufnahmebeschreibungTake DescriptionDescriptionDialog~Das Zeichen '|' ist in der Projektbeschreibung nicht gestattet.Bilder pro Sekunde</h4> <p>Hiermit knnen sie die Geschwindigkeit einstellen, mi der die Animation im <b>Bildbetrachter</b> abluft.</p> <p>Um die Animation zu starten, drcken sie den <b>Start</b> Knopf.</p>

FPS chooser

By changing the value in this chooser you set which speed the animation in the FrameView should run at.

To start an animation press the Run Animation button.

 ExportWidgetAVIAVI ExportWidgetUnten knnen sie auswhlen, welches Programm benutzt werden soll, um ein neues Projekt zu einer Videodatei zu encodieren.ZBelow you can set which program should be used for encoding a new project to a video file. ExportWidgetUnten knnen sie auswhlen, welches Programm benutzt werden soll, um das aktuelle Projekt zu einer Videodatei zu encodieren.iBelow you can set which program should be used for encoding the currently active project to a video file. ExportWidgetDurchsuchenBrowse ExportWidget8Whlen sie die Ausgabe-DateiChoose output file ExportWidgetMchten sie jedesmal nach einem Dateinamen gefragt werden, wenn sie Export whlen ?JDo you want to be asked for an output file everytime you choose to export? ExportWidget(Encoder Applikation:Encoder Application: ExportWidget*Encoder EinstellungenEncoder settings ExportWidget Gre der Bilder Frame Size ExportWidget&Bilder pro Sekunde:Frames per Second: ExportWidget&Full HD (1900x1080)Full HD (1900x1080) ExportWidget&HD Ready (1280x720)HD Ready (1280x720) ExportWidgetMP4MP4 ExportWidgetNeinNo ExportWidget4Einstellungen AusgabedateiOutput file settings ExportWidgetPAL D (704x576)PAL D (704x576) ExportWidgetQVGA (320x240)QVGA (320x240) ExportWidgetSVGA (800x600)SVGA (800x600) ExportWidgetVWhlen sie die Standard Ausgabe-Dateinamen:Set default output file: ExportWidgetVGA (640x480) VGA (640x480) ExportWidgetVideo Format: Video Format: ExportWidgetVideo Gre: Video Size: ExportWidgetJaYes ExportWidget ffmpegffmpeg ExportWidget libavlibav ExportWidgetzDas Bild kann nicht in das Projektverzeichnis kopiert werden!.Can't copy the image to the project directory!ExposureDas Bild kann nicht in das temporre Verzeichnis kopiert werden!0Can't copy the image to the temporary directory!ExposuretDas Bild kann im Projektverzeichnis nicht gelscht werden!2Can't remove the image from the project directory!ExposurezDas Bild kann im temporre Verzeichnis nicht gelscht werden!2Can't remove the image in the temporary directory!ExposureDas Bild kann nicht im neuen Format in das temporre Verzeichnis gespeichert werden!GCan't save the image in the new file format to the temporary directory!ExposureKritischCriticalExposureSchlieenCloseExternalCommandDialogFehlgeschlagen!Failed!ExternalCommandDialog*Eingabe zum Programm:Input to program:ExternalCommandDialog<Ausgabe von exterenem KommandoOutput from external commandExternalCommandDialogErgebnisResultExternalCommandDialogAbschickenSubmitExternalCommandDialogErfolgreich! Successful!ExternalCommandDialogAnwendenApply GeneralDialogSchlieenClose GeneralDialog0Allgemeine EinstellungenGeneral Settings GeneralDialog$BilddigitalisiererGrabber GeneralDialogBildimport Image Import GeneralDialogBildumwandlungImage Transformation GeneralDialog6Einstellungen neues ProjektNew Project Values GeneralDialogEinstellungen Preferences GeneralDialog Video Export GeneralDialog2qStopMotion EinstellungenqStopMotion Preferences GeneralDialog\Einfgen des neuen Bildes am Ende der Aufnahme'Append new frame at the end of the take GeneralWidget8Funktion des AufnahmeknopfesCapture Button Functionality GeneralWidget FarbeColor GeneralWidget"Gitterlinienfarbe Grid Color: GeneralWidgetGitterlinienGrid Functionality GeneralWidget2Anzahl horizontale LinienHorizontal Lines GeneralWidgetrEinfgen des neuen Bildes hinter dem hervorgehobenen Bild%Insert new frame after selected frame GeneralWidgetlEinfgen des neuen Bildes vor dem hervorgehobenen Bild%Insert new frame bevor selected frame GeneralWidgetSpracheLanguage GeneralWidget.Anzahl vertikale LinienVertical Lines GeneralWidgetHier knnen sie auswhlen, welche Bilddigitalisierer verwendet werden sollen, um Bilder von der Kamera aufzunehmen. Der Kontroller kann zur Steuerung von Focus, Zoom und anderen Funktionen verwendet werden, wenn er zur Verfgung steht.Below you can select which image grabber should be used for grabbing images from the camera. If available the controller can be used to control focus, zoom and other functionality. GrabberWidgetBKamera Kontroller (Experimentell) Camera Controller (Experimental) GrabberWidget<Gphoto2 Quelle (Experimentell)Gphoto2 Source (Experimental) GrabberWidget8BilddigitalisiererfunktionenGrabber Functionality GrabberWidgetInformation Information GrabberWidgetBMicrosoft Media Foundation Quelle!Microsoft Media Foundation Source GrabberWidgetxZum aktivieren der nderungen bitte qStopMotion neu starten!4Pease restart qStopMotion to activate the changings! GrabberWidget,Video 4 Linux 2 QuelleVideo 4 Linux 2 Source GrabberWidget&Zurck &Backward HelpBrowser&Schlieen&Close HelpBrowser&Vorwrts&Forward HelpBrowserS&tartseite&Home HelpBrowser2qStopMotion Hilfe BrowserqStopMotion Help Browser HelpBrowser4berprfe den Foto GrabberCheck image grabberImageGrabberFacade2berprfe die Foto QuelleCheck image sourcesImageGrabberFacadeRInitialisierung des Foto Grabbers fehlgeschlagen. Dies kann passieren, wen man von einem gestrtem Gert aufnehmen mchte. Bitte whle ein anderes Gert im Aufnahme-Tab.Image grabber initialization failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab.ImageGrabberFacadeEs wurde keine nutzbare Foto Quelle gefunden. Bitte ein Video Gert an den Computer anschlieen.SNo usable video image source found. Please connect on video device on the computer.ImageGrabberFacade0,10.1 ImportWidget5,05.0 ImportWidgetBMPBMP ImportWidgetUnten knnen sie auswhlen, welche Bilderquelle verwendet werden soll, um Bilder in ein neues Projekt zu importieren.[Below you can set which image sources should be used for importing images to a new project. ImportWidgetUnten knnen sie auswhlen, welche Bildquelle benutzt werden soll, um Bilder in das aktuelle Projekt zu importieren.jBelow you can set which image sources should be used for importing images to the currently active project. ImportWidget(Gre der BildquelleDefault Grabber Size ImportWidget&Bilder pro Sekunde:Frames per second: ImportWidget&Full HD (1900x1080)Full HD (1900x1080) ImportWidget&HD Ready (1280x720)HD Ready (1280x720) ImportWidgetBildformat: Image Format: ImportWidgetBildqualitt:Image Quality: ImportWidgetBildgre: Image Size: ImportWidget0Einstellungen BildimportImage import settings ImportWidgetJPEGJPEG ImportWidget4Einstellungen Live-AnsichtLive view settings ImportWidgetMaxMax ImportWidgetMinMin ImportWidgetPAL D (704x576)PAL D (704x576) ImportWidgetQVGA (320x240)QVGA (320x240) ImportWidgetSVGA (800x600)SVGA (800x600) ImportWidgetTIFFTIFF ImportWidgetVGA (640x480) VGA (640x480) ImportWidget &Info&About MainWindowGUI &Kamerasteuerung&Camera Controller MainWindowGUI&Bearbeiten&Edit MainWindowGUIE&xportieren&Export MainWindowGUI &Datei&File MainWindowGUI &Hilfe&Help MainWindowGUI&Neu&New MainWindowGUI&ffnen&Open MainWindowGUI&Beenden&Quit MainWindowGUI&Speichern&Save MainWindowGUI&Rckgngig&Undo MainWindowGUI"&Rckgngig Liste &Undo stack MainWindowGUI&Fenster&Windows MainWindowGUI<h4>ber Qt</h4> <p>Dies zeigt eine kleine Informationsbox, in der Sie allgemeine Informationen zur Qt Bibliothek lesen knnen.</p>

About Qt

This will display a small information box where you can read general information about the Qt library.

 MainWindowGUIt<h4>ber</h4> <p>Dies zeigt eine kleine Informationsbox, in der Sie sowohl allgemeine Informationen als auch die Namen der Entwickler dieses exzelenten Stckes Software lesen knnen.</p>

About

This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.

 MainWindowGUI<h4>Cinelerra</h4> <p>Exportiert die aktuelle Animation als ein <em>cinelerra-cv</em> Projekt.</p>Ein Assistent wird sie fhren.

Cinelerra

Exports the current animation as a cinelerra-cv project.

You will be given a wizard to guide you. MainWindowGUI<h4>Bild ID</h4><p>Diese Feld zeigt die ID des aktiven Bildes an</p>W

Exposure ID

This area displays the id of the currently selected exposure

 MainWindowGUI<h4>Bildanzeige</h4><p> In diesem Bereich sehen sie das gewhlte Bild. Hier laufen auch die Animationen ab, wenn sie <b>Start</b> drcken.</p>

FrameView

In this area you can see the selected frame. You can also play animations in this window by pressing the Play button.

 MainWindowGUI<h4>Hilfe</h4> <p>Dieser Knopf fhrt sie zum qStopMotion Handbuch</p>S

Help

This button will bring up a dialog with the qStopMotion manual

 MainWindowGUIn<h4>Neu</h4> <p>Erzeugt ein <em>neues</em> Project.</p>3

New

Creates a new project.

 MainWindowGUI<h4>ffnen</h4> <p><em>ffnet</em> eine qStopMotion Projektdatei.</p>?

Open

Opens a qStopMotion project file.

 MainWindowGUI <h4>Einstellungen der Anwendung</h4> <p>Dies ffnet ein Fenster in dem sie die Einstellungen der Anwendung <em>ndern</em> knnen.</p>

Preferences of the application

This will opens a window where you can change the preferences of the application.

 MainWindowGUI<h4>Projekt ID</h4><p>Dieses Feld zeigt die ID des aktiven Projektes an</p>S

Project ID

This area displays the id of the currently active project

 MainWindowGUI <h4>Eigenschaften des Projektes</h4> <p>Dies ffnet ein Fenster in dem sie die Eigenschaften des Projektes <em>ndern</em> knnen.</p>

Properties of the project

This will opens a window where you can change properties of the animation project.

 MainWindowGUIj<h4>Beenden</h4> <p><em>Beendet</em> das Program.</p>0

Quit

Quits the program.

 MainWindowGUI<h4>Wiederherstellen</h4> <p>Die letzte Operation wird wiederhergestellt. Sie knnen dies mehrmals tun.</p>v

Redo

Redoes your last operation. You can press redo several times to redo several operations.

 MainWindowGUI<h4>Speichern als</h4> <p>Speichert die aktuelle Animation als qStopMotion Projekt.</p>[

Save As

Saves the current animation as a qStopMotion project file.

 MainWindowGUI<h4>Speichern</h4> <p>Speichert die aktuelle Animation als qStopMotion Projektdatei. </p>

Save

Saves the current animation as a qStopMotion project file.
If this project has been saved before it will automatically be saved to the previously selected file.

 MainWindowGUI<h4>Szene ID</h4><p>Dieses Feld zeigt die ID der aktiven Szene an</p>Q

Scene ID

This area displays the id of the currently selected scene

 MainWindowGUI<h4>Aufnahme ID</h4><p>Dieses Feld zeigt die ID der aktiven Aufnahme an</p>O

Take ID

This area displays the id of the currently selected take

 MainWindowGUI<h4>Bildleiste</h4> <p>In diesem Bereich sehen sie Bilder und Szenen der Animation. Sie diese hin und herschieben.</p><p>Mit den <b>Pfeiltasten</b> oder <b>x</b> und <b>z</b> navigieren sie ein Bild vor oder zurck</p>

TimeLine

In this area you can see the frames and scenes in the animations and build the animation by moving the them around.

You can switch to the next and the previous frame using the arrow buttons or x and z

 MainWindowGUI<h4>Rckgngig</h4> <p>Macht eine oder mehrerer Aktionen rckgngig</p>u

Undo

Undoes your last operation. You can press undo several time to undo earlier operations.

 MainWindowGUI<h4>Video</h4> <p>Exportiert das aktuelle Projekt als <em>Videodatei</em>.</p>Ein Assistent wird sie dabei untersttzen.l

Video

Exports the current project as video.

You will be given a wizard to guide you. MainWindowGUI<h4>was ist das ?</h4> <p>Der Mauszeiger ..ndert sich und zeigt hilfreiche Informationen uber das angeklickte Objekt.</p>

What's This

This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.

 MainWindowGUI"AVI Filme (*.avi)AVI Videos (*.avi) MainWindowGUIInfoAbout MainWindowGUIber &Qt About &Qt MainWindowGUIber QtAbout Qt MainWindowGUI"Bilder hinzufgen Add Frames MainWindowGUI Szene hinzufgen Add Scene MainWindowGUI&Aufnahme hinzufgenAdd Take MainWindowGUIAbbrechenCancel MainWindowGUI:Whlen sie eine Projekt-DateiChoose project file MainWindowGUICinelerra Cinelerra MainWindowGUIFStelle Verbindung zur Kamera her...Connecting camera... MainWindowGUIDeutschEnglish MainWindowGUI&Existierende BilderExisting Images MainWindowGUI(In Datei exportierenExport to file MainWindowGUI2In Videodatei exportierenExport to video file MainWindowGUIExportieren ... Exporting ... MainWindowGUIBild ID:  Exposure ID:  MainWindowGUI HilfeHelp MainWindowGUIInformation Information MainWindowGUIBilder einfgen Insert Frames MainWindowGUISzene einfgen Insert Scene MainWindowGUI"Aufnahme einfgen Insert Take MainWindowGUI"MP4 Filme (*.mp4)MP4 Videos (*.mp4) MainWindowGUINeues Projekt New project MainWindowGUIKein Standardnamen fr die Ausgabedatei vorgegeben. berprfen sie die Einstellungen im Eigenschaften-Dialog des Projektes!`No default output file name defined. Check your settings in the properties dialo of the project! MainWindowGUInFr den Video-Export ist kein Encoder ausgewhlt. Sie knnen dies im Eigenschaften-Dialog des Projekts ndern. Video-Export wird erst mglich, wenn sie einen Encoder ausgewhlt haben.No encoder selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an encoder to use! MainWindowGUIzFr den Video-Export ist kein Videoformat ausgewhlt. Sie knnen dies im Eigenschaften-Dialog des Projekts ndern. Video-Export wird erst mglich, wenn sie ein Videoformat ausgewhlt haben.No video format selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an video format to use! MainWindowGUI4&Zuletzt geffnete Dateien Open &Recent MainWindowGUIProjekt ffnen Open project MainWindowGUIEinstellungen Preferences MainWindowGUI:Einstellungen fr qStopMotionPreferences of qStopMotion MainWindowGUIProjektProject MainWindowGUIProjekt (*.%1)Project (*.%1) MainWindowGUIProjekt ID:  Project ID:  MainWindowGUIEigenschaften Properties MainWindowGUIJEigenschaften des Animationsprojektes#Properties of the animation project MainWindowGUIBeendenQuit MainWindowGUI"&WiederherstellenRe&do MainWindowGUILos geht's !Ready to rumble ;-) MainWindowGUIAufnahme Recording MainWindowGUI WiederherstellenRedo MainWindowGUIBilder lschen Remove Frames MainWindowGUISzene lschen Remove Scene MainWindowGUI Aufnahme lschen Remove Take MainWindowGUI Speichern &unterSave &As MainWindowGUISpeichern alsSave As MainWindowGUI"Projekt speichern Save project MainWindowGUI*Projekt speichern alsSave project As MainWindowGUISzene 001 Scene 001 MainWindowGUISzene ID:  Scene ID:  MainWindowGUI.Whle Image Grabber ausSelect image grabber MainWindowGUIAufnahme 01Take 01 MainWindowGUIAufnahme ID:  Take ID:  MainWindowGUIDas Projekt The Project MainWindowGUIDas Zeichen '|' ist im Namen der Projektdatei nicht gestattet und wird entfernt.NThe character '|' is not allowed in the project file name and will be removed. MainWindowGUIIn jedem Projekt-Verzeichnis darf nur ein Projekt-Datei existieren.BThe project directory must not contain more than one project file. MainWindowGUIDer ausgewhlte Encoder ist auf diesem Computer nicht installiert. Installiere diesen Encoder oder whle einen anderen aus!bThe selected encoder is not installed on your computer. Install the encoder or select another one! MainWindowGUIIm offenen Projekt existieren schon Bilder. Mchten Sie diese Bilder in das neue Format oder die neue Qualitt konvertieren?oThere are some images in the open project. Do you want to convert the images to the new file format or quality? MainWindowGUIrEs gibt ungespeicherte nderungen. Mchten sie speichern?/There are unsaved changes. Do you want to save? MainWindowGUIRckgngigUndo MainWindowGUI:Nicht gespeicherte nderungenUnsaved changes MainWindowGUI VideoVideo MainWindowGUIWarnungWarning MainWindowGUI&Was ist das? What's &This MainWindowGUIWas ist das? What's This MainWindowGUIxSie msen im Einstellungs-Men einen Videograbber auswhlen.TYou have to define an image grabber to use. This can be set in the preferences menu. MainWindowGUISie msen einen Image Grabber auswhlen. Dies kann auf dem Aufnahme Tab erfolgen.VYou have to define an image grabber to use. This can be set on the recording tool tab. MainWindowGUIJqStopMotion - Neues Animationsprojekt#qStopMotion - New Animation Project MainWindowGUI<qStopMotion - Rckgngig ListeqStopMotion - Undo stack MainWindowGUI~Einstellungsdatei kann nicht in Sicherungskopie kopiert werden!+Can't copy preferences file to backup file!PreferencesToolSicherheitskopie der Einstellungsdatei kann nicht gelscht werden!%Can't remove preferences backup file!PreferencesToolPXML Datei kann nicht geffnet werden: %1Couldn't open XML file: %1PreferencesToolKritischCriticalPreferencesToolDOM Parser DOM ParserPreferencesTooljFehler beim verarbeiten in Zeile %1, Spalte %2: %3 %4(Parse error at line %1, column %2: %3 %4PreferencesToolJEigenschaften des AnimationsprojektesAnimation Project Properties ProjectDialogAnwendenApply ProjectDialogSchlieenClose ProjectDialogBildimport Image Import ProjectDialogBildumwandlungImage Transformation ProjectDialogEigenschaften Properties ProjectDialogVideo Export Video Export ProjectDialogDie Zugriffsrechte des Bildverzeichnisses knnen nicht gendert werden!0Can't change permissions of the image directory!ProjectSerializerDie Zugriffsrechte des Projektverzeichnisses knnen nicht gendert werden!2Can't change permissions of the project directory!ProjectSerializerDie Zugriffsrechte des Tonverzeichnisses knnen nicht gendert werden!0Can't change permissions of the sound directory!ProjectSerializerjProjektdatei kann nicht zur Sicherung kopiert werden!&Can't copy the project file to backup!ProjectSerializerXBilderverzeichnis kann nicht erzeugt werden!Can't create image directory!ProjectSerializerZProjektverzeichnis kann nicht erzeugt werden!Can't create project directory!ProjectSerializerRTonverzeichnis kann nicht erzeugt werden!Can't create sound directory!ProjectSerializerDie alte Sicherheitskopie der Projektdatei kann nicht gelscht werden!(Can't remove old backup of project file!ProjectSerializerZAlte Projektdatei kann nicht gelscht werden!"Can't remove the old project file!ProjectSerializerPXML Datei kann nicht geffnet werden: %1Couldn't open XML file: %1ProjectSerializerKritischCriticalProjectSerializerDOM Parser DOM ParserProjectSerializerjFehler beim verarbeiten in Zeile %1, Spalte %2: %3 %4(Parse error at line %1, column %2: %3 %4ProjectSerializer <h4>Einfgen von Bildern (CTRL+F)</h4> <p>Bettige diesen Knopf um neue <em>Bilder</em> am Ende der Aufnahme <em>anzuhngen</em>.</p>m

Append Frames (CTRL+F)

Click on this button to append frames at the end of the take.

 ProjectTab@<h4>Einfgen einer neuen Szene (CTRL+E)</h4> <p>Bettige diesen Knopf um eine neue <em>Szene</em> zu erzeugen und am Ende der Animation <em>anzuhngen</em>.</p>

Append new Scene (CTRL+E)

Click this button to create a new scene and append it at the end of the animation.

 ProjectTabL<h4>Einfgen einer neuen Aufnahme (CTRL+E)</h4> <p>Bettige diesen Knopf um eine neue <em>Aufnahme</em> zu erzeugen und an das Ende der Szene <em>anzuhngen</em>.</p>

Append new Take (CTRL+E)

Click this button to create a new take and append it to the end of the scene.

 ProjectTab<h4>Einfgen von Bildern (CTRL+F)</h4> <p>Bettige diesen Knopf um neue <em>Bilder</em> vor dem ausgewhlten Bild <em>einzufgen</em>.</p>o

Insert Frames (CTRL+F)

Click on this button to insert frames bevor the selected frame.

 ProjectTabJ<h4>Einfgen einer neuen Szene (CTRL+E)</h4> <p>Bettige diesen Knopf um eine neue <em>Szene</em> zu erzeugen und vor der ausgewhlten Szene <em>einzufgen</em>.</p>

Insert new Scene (CTRL+E)

Click this button to create a new scene and insert it bevor the selected scene.

 ProjectTab\<h4>Einfgen einer neuen Aufnahme (CTRL+E)</h4> <p>Bettige diesen Knopf um eine neue <em>Aufnahme</em> zu erzeugen und vor der ausgewhlten Aufnahme <em>einzufgen</em>.</p>

Insert new Take (CTRL+E)

Click this button to create a new take and insert it bevor the selected take.

 ProjectTab<h4>ffne Bildbearbeitungsprogramm</h4> <p>Bettige diesen Knopf um das Bildbearbeitungsprogramm zu ffnen</p> <p>Es ist auch mglich, Bilder von der Zeitleiste in das Bildbearbeitungsprogramm zu verschieben.</p>

Launch Photo Editor

Click this button to open the active frame in the photo editor

Note that you can also drag images from the frame bar and drop them on the photo editor

 ProjectTab<h4>Lsche Bild (SHIFT+Delete)</h4> <p>Bettige diesen Knopf um das ausgewhlte <em>Bild</em> zu <em>lschen</em>.</p>u

Remove Frame (Delete)

Click this button to remove the selected frame from the take.

 ProjectTab<h4>Lsche Scene (SHIFT+Delete)</h4> <p>Bettige diesen Knopf um die ausgewhlte <em>Szene</em> zu <em>lschen</em>.</p>

Remove Scene (SHIFT+Delete)

Click this button to remove the selected scene from the animation.

 ProjectTab<h4>Lsche Aufnahme (SHIFT+Delete)</h4> <p>Bettige diesen Knopf um die ausgewhlte <em>Aufnahme</em> zu <em>lschen</em>.</p>~

Remove Take (SHIFT+Delete)

Click this button to remove the selected take from the animation.

 ProjectTab"Bilder hinzufgen Add Frames ProjectTab&Aufnahme hinzufgenAdd Take ProjectTab@Whlen sie Bilder zum hinzufgenChoose frames to add ProjectTabBearbeitenEdit ProjectTabLDer Start von Gimp ist fehlgeschlagen!Failed to start Gimp! ProjectTab BilderFrames ProjectTabBilder einfgen Insert Frames ProjectTab"Aufnahme einfgen Insert Take ProjectTabKeine Szene ausgewhlt. Bitte eine Szene im Projektbaum auswhlen.=No scene selected. Please select a scene in the project tree. ProjectTabKeine Aufnahme ausgewhlt. Bitte eine Aufnahme im Projektbaum auswhlen.;No take selected. Please select a take in the project tree. ProjectTabProjektbaum Project Tree ProjectTabSzene 000 Scene 000 ProjectTab SzenenScenes ProjectTabAufnahme 00Take 00 ProjectTabAufnahmenTakes ProjectTabFDas ausgewhlte Bild ist beschdigtThe active frame is corrupt ProjectTabLEs ist kein Bild zum ffnen ausgewhlt There is no active frame to open ProjectTabWarnungWarning ProjectTabZGimp ist auf Ihrem Computer nicht installiert-You do not have Gimp installed on your system ProjectTab<h4>Anzahl der Bilder</h4> <p>Mit diesem Regler knnen sie einstellen, wieviele Vorgnger-Bilder der Animation im Kamerabild eingeblendet werden sollten. Im playback-Modus: wie viele Bilder abgespielt werden. </p> <p>Dadurch knnen sie besser sehen wie das nchste Bild im Verhltnis zu den vorhergehenden Bildern sein wird. Dies ermglicht gleichmssige Bewegungsablufe!</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 ProjectWidgetAufnahmeCapture ProjectWidgetUnterschiedDiff ProjectWidget0Einstellungen BildquelleImage grabber settings ProjectWidget Media FoundationMedia Foundation ProjectWidgetMischenMix ProjectWidget$Anzahl der Bilder:Number of images: ProjectWidgetPlaybackPlayback ProjectWidgetAufnahme Recording ProjectWidget2Aufnehme einzelner BilderSingle frame capture ProjectWidget8Video 4 Linux 2 (USB WebCam)Video 4 Linux 2 (USB WebCam) ProjectWidget4gphoto (USB Kompaktkamera)gphoto (USB Compact Camera) ProjectWidget &Nein&No QtFrontend&OK&OK QtFrontend&Ja&Yes QtFrontend0Zugriffsreche berprfenCheck Permissions QtFrontend*Verzeichnis erstellenCreate directory QtFrontend"WiederherstellungRecovery QtFrontendEs sieht so aus, als wurde qStopmotion bei der letzten Nutzung nicht ordentlich beendet. Mchten Sie die letzte Sitzung wiederherstellen?]Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? QtFrontendBSie haben nicht die notwendigen Rechte, um qStopMotion zu verwenden. Sie bentigen Rechte zum erzeugen des Verzeichnisses .qstopmotion in Ihrem Home-Verzeichnis.You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. QtFrontend0Sie haben nicht die notwendigen Rechte, um qStopMotion zu verwenden. Sie bentigen Rechte zum lesen, schreiben und ausfhren im Verzeichnis .qstopmotionYou do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. QtFrontendRqStopMotion - Wiederhergestelltes ProjektqStopMotion - Recovered Project QtFrontend<h4>Anzahl der Bilder</h4> <p>Mit diesem Regler knnen sie einstellen, wieviele Vorgnger-Bilder der Animation im Kamerabild eingeblendet werden sollten. Im playback-Modus: wie viele Bilder abgespielt werden. </p> <p>Dadurch knnen sie besser sehen wie das nchste Bild im Verhltnis zu den vorhergehenden Bildern sein wird. Dies ermglicht gleichmssige Bewegungsablufe.</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 RecordingTab<h4>Kamera ein/aus (K)</h4> <p>Hiermit knnen sie die Kamera ein- und ausschalten</p>[

Toggle camera on/off (C)

Click this button to toggle the camera on and off

 RecordingTab KameraCamera RecordingTabAufnahmeCapture RecordingTabUnterschiedDiff RecordingTabInformation Information RecordingTabMischenMix RecordingTabEs ist kein Projekt aktiv. Bitte ein neues Projekt erzeugen oder ein existierendes Projekt ffnen.KNo active project. Please create a new project or open an existing project. RecordingTabEs ist keine Szene und keine Aufnahme ausgewhlt. Bitte auf der Projektseite eine Szene und eine Aufnahme auswhlen.SNo scene and no take selected. Please select a scene and a take on the project tab. RecordingTabEs ist keine Aufnahme ausgewhlt. Bitte auf der Projektseite eine Aufnahme auswhlen.:No take selected. Please select a take on the project tab. RecordingTab,Wird nicht untersttzt Not Supported RecordingTab$Anzahl der Bilder:Number of images: RecordingTabPlaybackPlayback RecordingTabAufnahme Recording RecordingTabAuflsung: Resolution: RecordingTab2Aufnahme einzelner BilderSingle frame capture RecordingTabVideo Quelle: Video Source: RecordingTabFTondatei kann nicht kopiert werden!Can't copy sound file!SceneHTondatei kann nicht gelscht werden!Can't remove sound file!SceneKritischCriticalScene&Schlieen&Close StartDialog&OK&OK StartDialog><h2>Neues Projekt beginnen</h2>

Create a new Project

 StartDialogD<h2>Das letzte Projekt ffnen</h2>

Open last Project

 StartDialog8<h2>Projektdatei ffnen</h2>

Open project file

 StartDialoghffnen und fortsetzen eines existierenden Projektes.%Open and continue a existing project. StartDialog"Pfad zum Projekt:Project path:  StartDialog6Ein neues Projekt beginnen.Start a new Project. StartDialogDLaden der Bilder in die ZeitleisteLoad images to time lineTimeLineh<h4>Bild aufnehmen (Leertaste)</h4> <p>Mit diesem Knopf knnen sie einzelne Bilder aufnehmen und der Animation hizufgen. Das geht auch in dem sie die <b>Leertaste</b> drcken</p>

Capture Frame (Space)

Click on this button to capture a frame from the camera an put it in the animation

This can also be done by pressing the Space key

ToolBarX<h4>Erstes Bild der Aufnahme (J, Links)</h4>*

First frame of the take (J, Left)

ToolBar\<h4>Letztes Bild der Aufnahme (L, Rechts)</h4>*

Last frame of the take (L, Right)

ToolBar*<h4>ein Bild vor</h4>

Next frame (L, Right)

ToolBar8<h4>Animation abspielen</h4>

Play animation (K, P)

ToolBar0<h4>ein Bild zurck</h4>!

Previous frame (J, Left)

ToolBar&Animation abspielenRunning animationToolBar0%0%TransformWidget100%100%TransformWidgetUnten knnen sie auswhlen, welche Bilderumwandlung verwendet werden soll, um Bilder eines neues Projektes umzuwandeln. Wenn sie ausschneiden auswhlen mssen sie auch die Ausrichtung einstellen.Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping.TransformWidgetUnten knnen sie auswhlen, welche Bilderumwandlung verwendet werden soll, um Bilder des aktuellen Projektes umzuwandeln. Wenn sie ausschneiden auswhlen mssen sie auch die Ausrichtung einstellen.Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping.TransformWidgetTAusschneiden eines Teiles des KamerabildesClip a part of the imageTransformWidget.Gesamtes Bild skalierenScale the whole imageTransformWidget8Einstellungen BildumwandlungTransformation settingsTransformWidget4Vergrerungseinstellungen Zoom settingsTransformWidget6Vergrern des KamerabildesZoom the imageTransformWidget$Vergrerungswert: Zoom value:TransformWidget>Bild hinzufgen (%1,%2,%3) '%4'Add exposure (%1,%2,%3) '%4'UndoExposureAdd:Bild einfgen (%1,%2,%3) '%4'Insert exposure (%1,%2,%3) '%4'UndoExposureInsert6Bild verschieben (%1,%2,%3)Move exposure (%1,%2,%3)UndoExposureMove.Bild lschen (%1,%2,%3)Remove exposure (%1,%2,%3)UndoExposureRemoveLBild auswhlen (%1,%2,%3)-->(%4,%5,%6)'Select exposure (%1,%2,%3)-->(%4,%5,%6)UndoExposureSelect$Neues Projekt '%1'New project '%1'UndoProjectNew&Projekt ffnen '%1'Open project '%1'UndoProjectOpen4Szene hinzufgen (%1) '%2'Add scene (%1) '%2' UndoSceneAdd0Szene einfgen (%1) '%2'Insert scene (%1) '%2'UndoSceneInsert2Szene verschieben (%1,%2)Move scene (%1,%2) UndoSceneMove$Szene lschen (%1)Remove scene (%1)UndoSceneRemove6Szene auswhlen (%1)-->(%2)Select scene (%1)-->(%2)UndoSceneSelect@Aufnahme hinzufgen (%1,%2) '%3'Add take (%1,%2) '%3' UndoTakeAdd<Aufnahme einfgen (%1,%2) '%3'Insert take (%1,%2) '%3'UndoTakeInsert8Aufnahme verschieben (%1,%2)Move take (%1,%2) UndoTakeMove0Aufnahme lschen (%1,%2)Remove take (%1,%2)UndoTakeRemoveHAufnahme auswhlen (%1,%2)-->(%3,%4)Select take (%1,%2)-->(%3,%4)UndoTakeSelectqstopmotion-2.3.2-Source/translations/qstopmotion_se.ts000644 000000 000000 00000412541 13011043104 023474 0ustar00rootroot000000 000000 AboutDialog This is the qStopMotion application for creating stop motion animations. Detta är programmet qStopMotion för att skapa stopmotion-animation. Version: Version: qStopMotion is a fork of stopmotion for linux. qStopMotion är en avgrening av Stopmotion for Linux. and och &About &Om Main developers Huvudutvecklare Contributors A&uthors Skapare Translation Översättning French Franska Danish Swedish German Czech &Thanks To &Tack till This program is distributed under the terms of the GPL v2. Detta program är distribuerat under GPL v2. &Licence Agreement &Licensavtal Qt runtime version: Qt runtimeversion: Operating system name and version: Operativsystemets namn och version: Unknown Windows OS Unknown Mac OS Build time: %1 %2 Byggtid: %1 %2 &System Info &Systeminformation OK OK About Om AnimationProject Saving scenes to disk ... disk eller skiva? Sparar scener till disk ... Add Sound Lägg till ljud Cannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play. The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play. Den valda ljudfilen är inte i ett fungerande ljudformat. Animationen visas utan ljud om du väljer att spela. CameraControllerDialog qStopMotion Camera Controller Video Quality Automatic Brightness Brightness: Automatic Contrast Contrast: Automatic Saturation Saturation: Automatic Hue Hue: Automatic Gamma Gamma: Automatic Sharpness Sharpness: Automatic Backlight Compensation Backlight Compensation: Automatic White Balance White Balance: Automatic Gain Gain: Automatic Color Enable Color Enable: Camera Control Automatic Exposure Exposure: Automatic Zoom Zoom: Automatic Focus Focus: Automatic Pan Pan: Automatic Tilt Tilt: Automatic Iris Iris: Automatic Roll Roll: &Reset to Default &Close &Stäng Restore Camera Settings... Reset Camera Settings... Abort Reset CompositingTab First Group Box inte säker på vad group box är... rätt översatt? Första grupprutan Second Group Box inte säker på vad group box är... rätt översatt? Andra grupprutan Third Group Box inte säker på vad group box är... rätt översatt? Tredje grupprutan <h4>First Button</h4> <h4>Första knappen</h4> <h4>Second Button</h4> <h4>Andra knappen</h4> <h4>Third Button</h4> <h4>Tredje knappen</h4> DefaultTab Recording Inspelning Single frame capture Enbildstagning Camera Kamera Test Source Testkälla USB Source USBkälla FireWire Source Firewirekälla DirectShow Source DirectShowkälla Capture Fångst Mix Mixa Diff Skillnad Playback Uppspelning Number of images: Antal bilder: <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Antal bilder</h4> <p>Genom att ändra värdet på skjutreglaget bestämmer du hur många tidigare bilder i animationen som skall mixas över kamerabilder eller, om du befinner dig i uppspelningsläge, hur många bilder som skall spelas upp.</p> <p>Genom att mixa tidigare bild(er) över kamerabilder så ser du lättare hur nästa bild ser ut i relation till de tidigare och därigenom få en mjukare stopmotionanimation!</p> FPS chooser BPSväljare <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>BPSväljare</h4> <p>Genom att ändra värdet i denna inställning bestämmer du i vilken hastighet animationen i <b>Bildvisaren</b> skall spelas upp i.</p> <p>För att spela upp en animation trycker du på <b>Spela animation</b>knappen.</p> DescriptionDialog &Project Description: &Projektbeskrivning: &Scene Description: &Scenbeskrivning: &Take Description: &Tagningsbeskrivning: &OK &Ok &Cancel &Avbryt Project Description Prjektbeskrivning Scene Description Scenbeskrivning Take Description Tagningsbeskrivning Information Information The character '|' is not allowed in the project description. Tecknet '|' är inte tillåtet i projektbeskrivningen. The character '|' is not allowed in the scene description. Tecknet '|' är inte tillåtet i scenbeskrivningen. The character '|' is not allowed in the take description. Tecknet '|' är inte tillåtet i tagningsbeskrivningen. DomainFacade Critical Kritiskt Can't open history file to write entry! Kan inte öppna historiefilen för att lägga till post! Can't open history file to recover project! Kan inte öppna historiefilen för att återskapa projektet! Can't copy image to temp directory! Kan inte kopiera bild till temporära katalogen! ExportTab Below you can set which program/process qStopMotion should use for encoding the currently active project to a video file. inte riktig nöjd med */kodning... -David Här bestämmer du vilket program/kodning qStopMotion ska använda för att rendera aktiva projektet till en videofil. Encoder settings Kodningsinställningar Encoder Application: Kodningsprogram: ffmpeg ffmpeg Video Format: Videoformat: AVI gemener? AVI MP4 gemener? MP4 Video Size: Videostorlek: Frame Size Bildstorlek QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGQ (800x600) SVGQ (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080 Full HD (1900x1080) Project Frames per Second: Välj bildrutor per sekund: <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>BPSväljare</h4> <p>Genom att ändra värdet i denna inställning bestämmer du i vilken hastighet animationen i <b>Bildvisaren</b> skall spelas upp i.</p> <p>För att spela upp en animation trycker du på <b>Spela animation</b>knappen</p> Output file settings inte en direkt översättning men låter bättre än alternativen... Filrenderingsinställningar Do you want to be asked for an output file everytime you choose to export? kanske inte 100... Vill du bli tillfrågad om var du vill spara din fil varje gång du väljer att exportera? Yes Ja No Nej Set default output file: inte direkt översatt här heller... Förvald renderingsfil: Browse Bläddra Choose output file Välj renderingsfil ExportWidget Below you can set which program should be used for encoding a new project to a video file. Below you can set which program should be used for encoding the currently active project to a video file. Encoder settings Kodningsinställningar Encoder Application: Kodningsprogram: ffmpeg ffmpeg libav Video Format: Videoformat: AVI AVI MP4 MP4 Video Size: Videostorlek: Frame Size Bildstorlek QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGA (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080) Full HD (1900x1080)) {1900x?} Frames per Second: <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> Output file settings Filrenderingsinställningar Do you want to be asked for an output file everytime you choose to export? Vill du bli tillfrågad om var du vill spara din fil varje gång du väljer att exportera? Yes Ja No Nej Set default output file: Förvald renderingsfil: Browse Bläddra Choose output file Välj renderingsfil Exposure Critical Kritiskt Can't copy the image to the temporary directory! Can't remove the image from the project directory! Can't save the image in the new file format to the temporary directory! Can't copy the image to the project directory! Can't remove the image in the temporary directory! Can't move image to temporary directory! Kan inte flytta bild till temporära katalogen! Can't copy image to temporary directory! Kan inte kopiera bild till temporära katalogen! Can't move image to project directory! Kan inte flytta bild till projektkatalogen! ExternalCommandDialog Input to program: Inmatning till program: Submit Skicka Close Stäng Output from external command Utdata från externt kommando Result Resultat Failed! Misslyckades! Successful! Lyckades! GeneralDialog Preferences Apply Verkställ Close Stäng qStopMotion Preferences General Settings New Project Values Image Import Image Transformation Video Export Grabber &General Settings &Generella inställningar Video &Export Video&exportering GeneralTab Language Språk Capture Button Functionality Fångstknappens funktion Insert new frame bevor selected frame Lägg till ny bildruta före vald ruta Insert new frame after selected frame Lägg till ny bildruta efter vald ruta Append new frame at the end of the take Lägg till ny bildruta efter tagningens slut GeneralWidget Language Språk Capture Button Functionality Fångstknappens funktion Insert new frame bevor selected frame Lägg till ny bildruta före vald ruta Insert new frame after selected frame Lägg till ny bildruta efter vald ruta Append new frame at the end of the take Lägg till ny bildruta efter tagningens slut Grid Functionality Vertical Lines Horizontal Lines Grid Color: Color GrabberWidget Below you can select which image grabber should be used for grabbing images from the camera. If available the controller can be used to control focus, zoom and other functionality. Grabber Functionality Video 4 Linux 2 Source Camera Controller (Experimental) Microsoft Media Foundation Source Gphoto2 Source (Experimental) Information Information Pease restart qStopMotion to activate the changings! GstreamerDeviceGrabber Device %1 Enhet %1 GstreamerDv1394Grabber Device %1 Enhet %1 GstreamerGrabber Video test device Video testenhet Device %1 Enhet %1 GstreamerV4L2Grabber Device %1 Enhet %1 GstreamerVideoTestGrabber Video test device Video testenhet HelpBrowser qStopMotion Help Browser qStopMotion hjälpvisare &Backward &Bakåt &Home &Hem &Forward &Framåt &Close &Stäng ImageGrabber Check image grabber Kontrollera bildfångstenheten Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Bildfångs misslyckades. Detta kan hända om du försöker fånga bilder från en ogiltig källa. Kontrollera inställningarna för fångstenheten i inställningsmenyn. ImageGrabberFacade Check image sources No usable video image source found. Please connect on video device on the computer. Check image grabber Kontrollera bildfångstenheten Image grabber initialization failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab. ImportWidget Below you can set which image sources should be used for importing images to a new project. Below you can set which image sources should be used for importing images to the currently active project. Test Source Testkälla Image import settings Image Format: JPEG TIFF BMP Image Quality: Min Max Image Size: Default Grabber Size QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGA (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080) Full HD (1900x1080)) {1900x?} Live view settings Frames per second: 0.1 5.0 MainWindowGUI Select image grabber You have to define an image grabber to use. This can be set in the preferences menu. Du måste ange en bildfångstenhet att använda. Detta kan anges i inställningsmenyn. qStopMotion - No Animation Project qStopMotion - Inget animationsprojekt Ready to rumble ;-) Nu åker vi ;-) &New &Ny &Open &Öppna &Save &Spara Save &As Sp&ara som Video Video Cinelerra Cinelerra Properties &Quit Avsluta &Undo &Ångra Re&do Gör om Insert Scene Infoga scen Add Scene Lägg till scen Remove Scene Ta bort scen Insert Take Infoga tagning Add Take Lägg till tagning Remove Take Ta bort tagning Insert Frames Infoga bildrutor Add Frames Lägg till bildrutor Remove Frames Ta bort bildrutor &Configure qStopMotion &Konfigurera qSotpMotion What's &This Förklaring &Undo stack &Ångringslista &Help &Hjälp About &Qt Om &Qt &About Om Project ID: ProjektID: Scene ID: ScenID: Take ID: TagningsID: Exposure ID: ExponeringsID: &File &Fil &Export &Exportera &Edit R&edigera &Settings In&ställningar &View &Visa Recording Inspelning Project Projekt <h4>Properties of the project</h4> <p>This will opens a window where you can <em>change</em> properties of the animation project.</p> Properties of the animation project <h4>Preferences of the application</h4> <p>This will opens a window where you can <em>change</em> the preferences of the application.</p> Preferences of qStopMotion Cancel Avbryt Connecting camera... Ansluter kamera... You have to define an image grabber to use. This can be set on the recording tool tab. Existing Images There are some images in the open project. Do you want to convert the images to the new file format or quality? The Project Projektet Scene 001 Scen 001 Take 01 Tagning 01 qStopMotion - New Animation Project qStopMotion - Nytt animationsprojekt Choose project file Välj projektfil Project (*.%1) Projekt (*.%1) Save As Spara som Information Information The character '|' is not allowed in the project file name and will be removed. Tecknet '|' är inte tillåtet i filnamnet och kommer att tas bort. Warning Varning The project directory must not contain more than one project file. The selected encoder is not installed on your computer. Install the encoder or select another one! Cannot find any registered encoder to be used for video export. This can be set in the preferences menu. Export to video will not be possible until you have set an encoder to use! Kan inte hitta någon registrerad kodare för videoexport. En sådan kan anges i inställningsmenyn. Videoexportering är inte möjligt förrän en videokodare är angiven! AVI Videos (*.avi) gemener? AVIvideor (*.avi) MP4 Videos (*.mp4) gemener? MP4videor (*.mp4) Export to video file Exportera till videofil No default output file name defined. Check your settings in the preferences menu! Inget förvalt videofilnamn att exportera till satt. Kontrollera dina inställningar i menyn! The registered encoder is not valid. Check your settings in the preferences menu! Den registrerade kodare är ogiltig. Kontrollera dina inställningar i menyn! Exporting ... Exporterar... Export to file Exportera till fil qStopMotion - Undo stack qStopMotion - Ångringslista English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Svenska Open &Recent &Öppna tidigare Preferences &Camera Controller &Windows <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Nytt</h4> <p>Skapar ett <em>nytt</em> projekt.</p> New project Nytt projekt <h4>Open</h4> <p><em>Opens</em> a qStopMotion project file.</p> <h4>Öppna</h4> <p><em>Öppnar</em> en qStopMotion projektfil.</p> Open project Öppna projekt <h4>Save</h4> <p><em>Saves</em> the current animation as a qStopMotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Spara</h4> <p><em>Sparar</em>den aktuella animationen som en qStopMotion projektfil. <BR>Om projektet sparats tidigare så sparas det automatiskt till samma projektfil.</p> Save project Spara projekt <h4>Save As</h4> <p><em>Saves</em> the current animation as a qStopMotion project file.</p> <h4>Spara som</h4> <p><em>Sparar</em>den aktuella animationen som en qStopMotion projektfil.</p> Save project As Spara projekt som <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4> <p>Exporterar den aktuella animationen som <em>video</em>.</p>En guide hjälper dig. <h4>Cinelerra</h4> <p>Exports the current animation as a <em>cinelerra-cv</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4> <p>Exporterar den aktuella animationen som ett <em>Cinelerra-cv</em> projekt.</p>En guide hjälper dig. <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Avsluta</h4> <p><em>Avslutar</em> programmet.</p> Quit Avsluta <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Ångra</h4> <p><em>Ångrar</em> senaste händelsen. Du kan trycka flera gånger för att ångra fler steg.</p> Undo Ångra <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Gör om</h4> <p><em>Gör om</em> senaste händelsen. Du kan trycka flera gånger för att göra om fler steg.</p> Redo Gör om <h4>Configure qStopMotion</h4> <p>This will opens a window where you can <em>configure</em> qStopMotion with various input and output devices.</p> <h4>Konfigurera qStopMotion</h4> <p>Detta öppnar ett fönster där du kan<em>konfigurera</em> qStopMotion med flera in- och utdataenheter.</p> Configure qStopMotion Konfigurera qStopMotion <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Förklaring</h4> <p>Klicka på olika element som knappar för att få upp information liknande denna.</p> What's This Förklaring <h4>Help</h4> <p>This button will bring up a dialog with the qStopMotion manual</p> <h4>Hjälp</h4> <p>Denna knapp öppnar qStopMotionmanualen</p> Help Hjälp <h4>About Qt</h4> <p>This will display a small information box where you can read general information about the Qt library.</p> <h4>Om Qt</h4> <p>Här får du en informationsruta med generell information om Qt-bibliotket.</p> About Qt Om Qt <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Om</h4> <p>Här får du en informationsruta med generell information om detta fantastiska program och dess utvecklare.</p> About Om <h4>Project ID</h4><p>This area displays the id of the currently active project</p> <h4>ProjektID</h4><p>Här får du reda på aktuella projektets ID.</p> <h4>Scene ID</h4><p>This area displays the id of the currently selected scene</p> <h4>ScenID</h4><p>Här får du reda på aktuella scenens ID.</p> <h4>Take ID</h4><p>This area displays the id of the currently selected take</p> <h4>TagningsID</h4><p>Här får du reda på aktuella tagningens ID.</p> <h4>Exposure ID</h4><p>This area displays the id of the currently selected exposure</p> <h4>ExponeringsID</h4><p>Här får du reda på aktuella exponeringens ID.</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Bildvisare</h4><p> Här kan du se vald bildruta. Du kan också spela animationer i detta fönster genom att trycka på <b>Spela</b>knappen.</p> <h4>TimeLine</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> "and scenes"!? kan man? <h4>Tidsaxel</h4> <p>Här kan du se animationens bildrutor och scener. Du kan arrangera om sekvenser genom att flytta bilder.</p><p>Du kan växla mellan nästa och tidigare bildrutor med<b>piltangenterna</b> eller <b>x</b> och <b>z</b></p> No encoder selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an encoder to use! No video format selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an video format to use! No default output file name defined. Check your settings in the properties dialo of the project! Unsaved changes Osparande ändringar There are unsaved changes. Do you want to save? Det finns osparade ändringar. Vill du spara? PreferencesDialog Apply Verkställ Close Stäng Preferences Menu Inställningsmeny &General Settings &Generella inställningar Video &Export Video&exportering &Default Values &Standardvärden PreferencesTool DOM Parser DOM tolk Couldn't open XML file: %1 Kunde inte öppna XMLfil: %1 Parse error at line %1, column %2: %3 %4 Tolkningsfel på rad %1, kolumn %2: %3 %4 Critical Kritiskt Can't remove preferences backup file! Kan inte ta bort backupfilen för inställningar! Can't copy preferences file to backup file! Kan inte kopiera inställningar till backupfilen! ProjectDialog Properties Apply Verkställ Close Stäng Animation Project Properties Image Import Image Transformation Video Export Video &Export Video&exportering ProjectSerializer DOM Parser DOMtolk Couldn't open XML file: %1 Kunde inte öppna XMLfil: %1 Parse error at line %1, column %2: %3 %4 Tolkningsfel på rad %1, kolumn %2: %3 %4 Critical Kritiskt Can't remove old backup of project file! Kan inte ta bort gammal backup av projektfil! Can't rename project file to backup! Kan inte döpa om projektfil till backup! Can't copy the project file to backup! Can't remove the old project file! Can't create project directory! Kan inte skapa projektkatalog! Can't change permissions of the project directory! Kan inte ändra rättigheter för projektkatalogen! Can't create image directory! Kan inte skapa bildkatalog! Can't change permissions of the image directory! Kan inte ändra rättigheter för bildkatalogen! Can't create sound directory! Kan inte skapa ljudkatalog! Can't change permissions of the sound directory! Kan inte ändra rättigheter för ljudkatalogen! ProjectTab Project Tree Projektträd Scenes Scener Takes Tagningar Frames Bildrutor Edit Redigera Scene 000 Scen 000 Take 00 Take 00 Insert Take Infoga tagning No scene selected. Please select a scene in the project tree. Ingen scen vald. Välj en scen i projektträdet. Add Take Lägg till tagning Insert Frames Infoga bildrutor No take selected. Please select a take in the project tree. Ingen tagning vald. Välj en tagning i projektträdet. Add Frames Lägg till bildrutor Warning Varning There is no active frame to open Det finns ingen aktiv bildruta att öppna The active frame is corrupt Den aktiva bildrutan är trasig <h4>Insert new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>insert</em> it bevor the selected scene.</p> <h4>Infoga ny scen (CTRL+E)</h4> <p>Klicka på denna knapp för att skapa en ny <em>scen</em> och <em>infoga</em> den före vald scen.</p> <h4>Append new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>append</em> it at the end of the animation.</p> <h4>Lägg till ny scen (CTRL+E)</h4> <p>Klicka på denna knapp för att skapa en ny <em>scen</em> och <em>lägga till</em> den i slutet av animationen.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>scene</em> from the animation.</p> <h4>Ta bort scen (SHIFT+Delete)</h4> <p>Klicka på denna knapp för att <em>ta bort</em> den valda <em>scenen</em> från animationen.</p> <h4>Insert new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>insert</em> it bevor the selected take.</p> <h4>Infoga ny tagning (CTRL+E)</h4> <p>Klicka på denna knapp för att skapa en ny <em>tagning</em> och <em>infoga</em> den före vald tagning.</p> <h4>Append new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>append</em> it to the end of the scene.</p> <h4>Lägg till ny tagning (CTRL+E)</h4> <p>Klicka på denna knapp för att skapa en ny <em>tagning</em> och <em>lägga till</em> den i slutet av scenen.</p> <h4>Remove Take (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>take</em> from the animation.</p> <h4>Ta bort tagning (SHIFT+Delete)</h4> <p>Klicka på denna knapp för att <em>ta bort</em> den valda <em>tagningen</em> från animationen.</p> <h4>Insert Frames (CTRL+F)</h4> <p>Click on this button to <em>insert frames</em> bevor the selected frame.</p> <h4>Infoga bildrutor (CTRL+E)</h4> <p>Klicka på denna knapp för att lägga till <em>bildrutor</em> och <em>infoga</em> dem före vald bildruta.</p> <h4>Append Frames (CTRL+F)</h4> <p>Click on this button to <em>append frames</em> at the end of the take.</p> <h4>Lägg till bildrutor (CTRL+E)</h4> <p>Klicka på denna knapp för att lägga till <em>bildrutor</em> dem i slutet av tagningen.</p> <h4>Remove Frame (Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>frame</em> from the take.</p> <h4>Ta bort bildruta (Delete)</h4> <p>Klicka på denna knapp för att <em>ta bort</em> den valda <em>bildrutan</em> från tagningen.</p> <h4>Launch Photo Editor</h4> <p>Click this button to open the active frame in the photo editor</p> <p>Note that you can also drag images from the frame bar and drop them on the photo editor</p> <h4>Starta fotoredigerare</h4> <p>Klicka på denna knapp för att öppna vald bild i fotoredigeringsprogrammet.</p> <p>Du kan också dra bilder från tidsaxeln och släppa dem över fotoredigeraren.</p> Choose frames to add Välj bilder att lägga till You do not have Gimp installed on your system Gimp är inte installerat på ditt system Failed to start Gimp! Misslyckades med att starta Gimp! ProjectWidget Recording Inspelning Single frame capture Enbildstagning Camera Kamera Test Source Testkälla USB Source USBkälla FireWire Source Firewirekälla DirectShow Source DirectShowkälla Image grabber settings Video 4 Linux 2 (USB WebCam) gphoto (USB Compact Camera) Media Foundation Capture Fångst Mix Mixa Diff Skillnad Playback Uppspelning Number of images: Antal bilder: <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Antal bilder</h4> <p>Genom att ändra värdet på skjutreglaget bestämmer du hur många tidigare bilder i animationen som skall mixas över kamerabilder eller, om du befinner dig i uppspelningsläge, hur många bilder som skall spelas upp.</p> <p>Genom att mixa tidigare bild(er) över kamerabilder så ser du lättare hur nästa bild ser ut i relation till de tidigare och därigenom få en mjukare stopmotionanimation!</p> QtFrontend Create directory Skapa katalog You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. Du har inte tillräckliga rättigheter för att köra qStopMotion. Du behöver rättighet att skapa en .qstopmotion-katalog i din hemkatalog. Check Permissions Kontrollera rättigheter You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. Du har inte tillräckliga rättigheter för att köra qStopMotion. Du behöver rättighet att läsa, skriva och köra filer som program i .qstopmotion-katalogen. &Yes &Ja &No &Nej &OK &Ok Recovery Återskapande Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? Något orsakade att qStopMotion oväntat avslutades vid senaste användningen. Vill du återskapa? qStopMotion - Recovered Project qStopMotion - Återskapat projekt RecordingTab Auto Auto Camera Kamera Capture Fångst Recording Inspelning Single frame capture Enbildstagning Video Source: Resolution: Mix Mixa Diff Skillnad Playback Uppspelning <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Växla mellan kamera på/av (C)</h4> <p>Klicka på denna knapp för att växla mellan kamera på eller av</p> Number of images: Antal bilder: <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Antal bilder</h4> <p>Genom att ändra värdet på skjutreglaget bestämmer du hur många tidigare bilder i animationen som skall mixas över kamerabilder eller, om du befinner dig i uppspelningsläge, hur många bilder som skall spelas upp.</p> <p>Genom att mixa tidigare bild(er) över kamerabilder så ser du lättare hur nästa bild ser ut i relation till de tidigare och därigenom få en mjukare stopmotionanimation!</p> Not Supported Information Information No active project. Please create a new project or open an existing project. Inget aktivt projekt. Skapa ett nytt projekt eller öppna ett existerande projekt. No scene and no take selected. Please select a scene and a take on the project tab. Ingen scen eller tagning vald. Välj en scen och en tagning under projektfliken. No take selected. Please select a take on the project tab. Ingen tagning vald. Välj en tagning under projektfliken. Scene Critical Kritiskt Can't remove sound file! Kan inte ta bort ljudfil! Can't copy sound file! Can't move sound file! Kan inte flytta ljudfil! StartDialog <h2>Create a new Project</h2> <h2>Skapa ett nytt projekt</h2> Start a new Project. Starta ett nytt projekt. <h2>Open last Project</h2> <h2>Öppna senaste projektet</h2> Project path: Sökväg till projekt: <h2>Open project file</h2> <h2>Öppna projektfil</h2> Open and continue a existing project. Öppna och fortsätt ett tidigare projekt. &OK &Ok &Close &Stäng TimeLine Load images to time line Ladda bilder till tidsaxeln ToolBar Running animation Spelar animation <h4>Play animation (K, P)</h4> <h4>Spela animation (K, P)</h4> <h4>First frame of the take (J, Left)</h4> <h4>Tagningens första bildruta (J, Left)</h4> <h4>Previous frame (J, Left)</h4> <h4>Föregående bildruta (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Nästa bildruta (L, Right)</h4> <h4>Last frame of the take (L, Right)</h4> <h4>Tagningens sista bildruta (L, Right)</h4> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Fånga bildruta (Mellanslag)</h4> <p>Klicka på denna knapp för att <em>fånga</em> en bildruta från kameran och lägga till i animationen.</p> <p> Detta kan också göras genom att trycka<b>Mellanslagstangenten</b></p>. TransformWidget Transformation settings Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping. Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping. Scale the whole image Clip a part of the image Zoom the image Zoom settings Zoom value: 0% 100% UndoExposureAdd Add exposure (%1,%2,%3) '%4' Lägg till exponering (%1,%2,%3) '%4' UndoExposureInsert Insert exposure (%1,%2,%3) '%4' Infoga exponering (%1,%2,%3) '%4' UndoExposureMove Move exposure (%1,%2,%3) Flytta exponering (%1,%2,%3) UndoExposureRemove Remove exposure (%1,%2,%3) Ta bort exponering (%1,%2,%3) UndoExposureSelect Select exposure (%1,%2,%3)-->(%4,%5,%6) Välj exponering (%1,%2,%3)-->(%4,%5,%6) UndoProjectNew New project '%1' Nytt projekt '%1' UndoProjectOpen Open project '%1' Öppna projekt '%1' UndoSceneAdd Add scene (%1) '%2' Lägg till scen (%1) '%2' UndoSceneInsert Insert scene (%1) '%2' Infoga scen (%1) '%2' UndoSceneMove Move scene (%1,%2) Flytta scen (%1,%2) UndoSceneRemove Remove scene (%1) Ta bort scen (%1) UndoSceneSelect Select scene (%1)-->(%2) Välj scen (%1)-->(%2) UndoTakeAdd Add take (%1,%2) '%3' Lägg till tagning (%1,%2) '%3' UndoTakeInsert Insert take (%1,%2) '%3' Infoga tagning (%1,%2) '%3' UndoTakeMove Move take (%1,%2) Flytta tagning (%1,%2) UndoTakeRemove Remove take (%1,%2) Ta bort tagning (%1,%2) UndoTakeSelect Select take (%1,%2)-->(%3,%4) Välj tagning (%1,%2)-->(%3,%4) ViewTab First Group Box inte säker på vad group box är... rätt översatt? Första grupprutan Second Group Box inte säker på vad group box är... rätt översatt? Andra grupprutan Third Group Box inte säker på vad group box är... rätt översatt? Tredje grupprutan <h4>First Button</h4> <h4>Första knappen</h4> <h4>Second Button</h4> <h4>Andra knappen</h4> <h4>Third Button</h4> <h4>Tredje knappen</h4> qstopmotion-2.3.2-Source/translations/qt_da.ts000644 000000 000000 00001043654 12536560630 021532 0ustar00rootroot000000 000000 MAC_APPLICATION_MENU Services Tjenester Hide %1 Skjul %1 Hide Others Skjul andre Show All Vis alle Preferences... Indstillinger… Quit %1 Slut %1 About %1 Om %1 AudioOutput <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Audio-playback-enheden<b>%1</b> virker ikke.<br/>Falder tilbage til <b>%2</b>.</html> <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> <html>Skifter til audio-playback-enheden, <b>%1</b><br/>der lige er blevet tilgængelig og har en højere præference.</html> Revert back to device '%1' Gå tilbage til enheden '%1' CloseButton Close Tab Luk fane Phonon:: Notifications Meddelelser Music Musik Video Communication Kommunikation Games Spil Accessibility Tilgængelighed Phonon::Gstreamer::Backend Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled. Advarsel: Det ser ikke ud til, at gstreamer0.10-plugins-good pakken er installeret. Nogle videofunktioner er deaktiveret. Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabled Advarsel: Det ser ikke ud til, at base GStreamer plugins er installeret. Al audio- og videosupport er deaktiveret Phonon::Gstreamer::MediaObject Cannot start playback. Check your Gstreamer installation and make sure you have libgstreamer-plugins-base installed. Kan ikke starte playback. Tjek Gstreamer-installationen og kontrollér, at libgstreamer-plugins-base er installeret. A required codec is missing. You need to install the following codec(s) to play this content: %0 Der mangler et codec. Følgende codecs skal installeres for at afspille dette indhold: %0 Could not open media source. Kunne ikke åbne mediekilden. Invalid source type. Ugyldig kilde. Could not locate media source. Kunne ikke lokalisere mediekilden. Could not open audio device. The device is already in use. Kunne ikke åbne lydenheden. Enheden er allerede i brug. Could not decode media source. Kunne ikke afkode mediekilden. Phonon::VolumeSlider Volume: %1% Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1% Anvend denne skyder til at indstille lydstyrken. Længst til venstre er 0% og længst til højre er %1% Q3Accel %1, %2 not defined %1, %2 ikke definerede Ambiguous %1 not handled Tvetydig %1 ikke behandlet Q3DataTable True Sandt False Falsk Insert Indsæt Update Opdater Delete Slet Q3FileDialog Copy or Move a File Kopiér eller flyt en fil Read: %1 Læs: %1 Write: %1 Skriv: %1 Cancel Annuller All Files (*) Alle filer (*) Name Navn Size Størrelse Type Date Dato Attributes Attributter &OK &OK Look &in: Kig &i: File &name: Fil&navn: File &type: Fil&type: Back Tilbage One directory up En mappe op Create New Folder Opret ny folder List View Listevisning Detail View Detaljevisning Preview File Info Vis filinformation Preview File Contents Vis filindhold Read-write Læs-skriv Read-only Skrivebeskyttet Write-only Write-only Inaccessible Utilgængelig Symlink to File Symlink til Fil Symlink to Directory Symlink til katalog Symlink to Special Symlink til Speciel File Fil Dir Katalog Special Speciel Open Åbn Save As Gem som &Open &Åbn &Save &Gem &Rename &Omdøb &Delete &Slet R&eload Gen&indlæs Sort by &Name Sortér efter n&avn Sort by &Size Sortér efter s&tørrelse Sort by &Date Sortér efter &dato &Unsorted &Usorteret Sort Sortér Show &hidden files Vis s&kjulte filer the file filen the directory kataloget the symlink symlinket Delete %1 Slet %1 <qt>Are you sure you wish to delete %1 "%2"?</qt> <qt>Er du sikker på, at du vil slette %1 "%2"?</qt> &Yes &Ja &No &Nej New Folder 1 Ny folder 1 New Folder Ny folder New Folder %1 Ny folder %1 Find Directory Find katalog Directories Kataloger Directory: Katalog: Error Fejl %1 File not found. Check path and filename. %1 Filen blev ikke fundet. Kontrollér sti og filnavn. All Files (*.*) Alle filer (*.*) Open Åbn Select a Directory Vælg et katalog Q3LocalFs Could not read directory %1 Kunne ikke læse katalog %1 Could not create directory %1 Kunne ikke oprette katalog %1 Could not remove file or directory %1 Kunne ikke fjerne fil eller katalog %1 Could not rename %1 to %2 Kunne ikke omdøbe %1 to %2 Could not open %1 Kunne ikke åbne %1 Could not write %1 Kunne ikke skrive %1 Q3MainWindow Line up Linie op Customize... Tilpas... Q3NetworkProtocol Operation stopped by the user Brugeren stoppede handlingen Q3ProgressDialog Cancel Annuller Q3TabDialog OK Apply Udfør Help Hjælp Defaults Standarder Cancel Annuller Q3TextEdit &Undo &Fortryd &Redo &Gendan Cu&t &Klip &Copy K&opiér &Paste &Sæt ind Clear Ryd Select All Markér alt Q3TitleBar System Restore up Gendan op Minimize Minimer Restore down Gendan ned Maximize Maksimér Close Luk Contains commands to manipulate the window Indeholder kommandoer til indstilling af vinduet Puts a minimized back to normal Sætter et minimeret vindue til normal størrelse Moves the window out of the way Flytter vinduet væk Puts a maximized window back to normal Sætter et maksimeret vindue til normal størrelse Makes the window full screen Gør vinduet til fuld skærm Closes the window Lukker vinduet Displays the name of the window and contains controls to manipulate it Viser vinduets navn og indeholder kontroller til indstilling af vinduet Q3ToolBar More... Mere... Q3UrlOperator The protocol `%1' is not supported Protokollen '%1' understøttes ikke The protocol `%1' does not support listing directories Protokollen '%1' understøtter ikke opremsning af kataloger The protocol `%1' does not support creating new directories Protokollen '%1' understøtter ikke oprettelse af nye kataloger The protocol `%1' does not support removing files or directories Protokollen '%1' understøtter ikke, at filer eller kataloger fjernes The protocol `%1' does not support renaming files or directories Protokollen '%1' understøtter ikke, at filer eller kataloger omdøbes The protocol `%1' does not support getting files Protokollen '%1' understøtter ikke hentning af filer The protocol `%1' does not support putting files Protokollen '%1' understøtter ikke upload af filer The protocol `%1' does not support copying or moving files or directories Protokollen '%1' understøtter ikke kopiering eller flytning af filer eller kataloger (unknown) (ukendt) Q3Wizard &Cancel &Annuller < &Back < &Tilbage &Next > &Næste > &Finish &Udfør &Help &Hjælp QAbstractSocket Host not found Host blev ikke fundet Connection refused Forbindelse afvist Connection timed out Forbindelsen timed out Operation on socket is not supported Socket-operation ikke understøttet Socket operation timed out Socket-operation timed out Socket is not connected Socket ikke forbundet Network unreachable Netværket er ikke tilgængeligt QAbstractSpinBox &Step up &Trin op Step &down Trin &ned &Select All &Vælg alle QApplication Activate Aktivér Executable '%1' requires Qt %2, found Qt %3. Eksekverbar '%1' kræver Qt %2, ikke fundet Qt %3. Incompatible Qt Library Error Inkompatibel Qt Library fejl QT_LAYOUT_DIRECTION Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. Activates the program's main window Aktiverer programmets hovedvindue QAxSelect Select ActiveX Control Vælg ActiveX-kontrol OK &Cancel &Annuller COM &Object: COM &Objekt: QCheckBox Uncheck Fjern markering Check Kryds af Toggle Slå til/fra QColorDialog Hu&e: Ton&e: &Sat: &Mæt: &Val: &Vær: &Red: &Rød: &Green: &Grøn: Bl&ue: Bl&å: A&lpha channel: Al&fa-kanal: Select Color Vælg farve &Basic colors &Basisfarver &Custom colors &Egne farver &Add to Custom Colors &Føj til egne farver QComboBox Open Åbn False Falsk True Sandt Close Luk QCoreApplication %1: key is empty QSystemSemaphore %1: nøgle er tom %1: unable to make key QSystemSemaphore %1: kunne ikke lave nøgle %1: ftok failed QSystemSemaphore %1: ftok mislykkedes QDB2Driver Unable to connect Kunne ikke skabe forbindelse Unable to commit transaction Kunne ikke gennemføre transaktion Unable to rollback transaction Kunne ikke tilbagetrække transaktion Unable to set autocommit Kunne ikke aktivere autocommit QDB2Result Unable to execute statement Kunne ikke udføre statement Unable to prepare statement Kunne ikke forberede udsagn Unable to bind variable Kunne ikke binde variabel Unable to fetch record %1 Kunne ikke hente post %1 Unable to fetch next Kunne ikke hente næste Unable to fetch first Kunne ikke hente første QDateTimeEdit AM am PM pm QDial QDial SpeedoMeter Speedometer SliderHandle QDialog What's This? Hvad er dette? Done Udført QDialogButtonBox OK &OK &Save &Gem Save Gem Open Åbn &Cancel &Annuller Cancel Annuller &Close &Luk Close Luk Apply Udfør Reset Nulstil Help Hjælp Don't Save Gem ikke Discard Kassér &Yes &Ja Yes to &All Ja til &alle &No &Nej N&o to All Ne&j til alle Save All Gem alle Abort Afbryd Retry Prøv igen Ignore Ignorer Restore Defaults Gendan standardværdier Close without Saving Luk uden at gemme QDirModel Name Navn Size Størrelse Kind Match OS X Finder Type Type All other platforms Date Modified Ændringsdato QDockWidget Close Luk Dock Låst Float Flydende QDoubleSpinBox More Mere Less Mindre QErrorMessage Debug Message: Debug-besked: Warning: Advarsel: Fatal Error: Fatal fejl: &Show this message again &Vis denne besked igen &OK QFile Destination file exists Destinationsfil findes Cannot remove source file Kan ikke fjerne kildefil Cannot open %1 for input Kan ikke åbne %1 til input Cannot open for output Kan ikke åbne til output Failure to write block Kunne ikke skrive blok Cannot create %1 for output Kunne ikke oprette %1 til output QFileDialog All Files (*) Alle filer (*) Directories Kataloger &Open &Åbn &Save &Gem Open Åbn %1 already exists. Do you want to replace it? %1 findes allerede. Ønsker du at erstatte den? %1 File not found. Please verify the correct file name was given. %1 Filen kunne ikke findes. Kontrollér, at det rigtige filnavn er indtastet. My Computer Min computer &Rename &Omdøb &Delete &Slet Show &hidden files Vis s&kjulte filer Back Tilbage Parent Directory Ovenliggende katalog List View Listevisning Detail View Detaljevisning Files of type: Filer af typen: Directory: Katalog: %1 Directory not found. Please verify the correct directory name was given. %1 Katalog kunne ikke findes. Kontrollér, at det rigtige katalognavn er indtastet. '%1' is write protected. Do you want to delete it anyway? '%1' er skrivebeskyttet. Ønsker du alligevel at slette? Are sure you want to delete '%1'? Er du sikker på, at '%1' skal slettes? Could not delete directory. Kunne ikke slette kataloget. Recent Places Aktuelle steder All Files (*.*) Alle filer (*.*) Save As Gem som Drive Drev File Fil Unknown Ukendt Find Directory Find katalog Show Vis Forward Frem New Folder Ny folder &New Folder &Ny folder &Choose &Vælg Remove Fjern File &name: &Filnavn: Look in: Søg i: Create New Folder Opret ny folder QFileSystemModel Invalid filename Ugyldigt filnavn <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. <b>Navnet, %1, kan ikke benyttes.</b><p>Brug et andet navn med færre tegn og ingen kommatering. Name Navn Size Størrelse Kind Match OS X Finder Type Type All other platforms Date Modified Ændringsdato My Computer Min computer Computer %1 TB %1 TB %1 GB %1 GB %1 MB %1 MB %1 KB %1 KB' %1 bytes %1 bytes QFontDatabase Normal Bold Fed Demi Bold Black Sort Demi Light Lys Italic Kursiv Oblique Skråt Any Alle Latin Greek Græsk Cyrillic Kyrillisk Armenian Armensk Hebrew Hebræisk Arabic Arabisk Syriac Syrisk Thaana Devanagari Bengali Bengalsk Gurmukhi Gujarati Oriya Tamil Telugu Kannada Malayalam Sinhala Thai Thailandsk Lao Tibetan Tibetansk Myanmar Georgian georgisk Khmer Simplified Chinese Forenklet kinesisk Traditional Chinese Traditionelt kinesisk Japanese Japansk Korean Koreansk Vietnamese Vietnamesisk Symbol Ogham Runic QFontDialog &Font S&krifttype Font st&yle S&til &Size &Størrelse Effects Effekter Stri&keout &Overstreget &Underline &Understreg Sample Eksempel Wr&iting System Skr&ivesystem Select Font Vælg skrifttype QFtp Not connected Ingen forbindelse Host %1 not found Vært %1 ikke fundet Connection refused to host %1 Forbindelse til vært %1 afvist Connection timed out to host %1 Forbindelsen timed out til host %1 Connected to host %1 Tilsluttet vært %1 Connection refused for data connection Dataforbindelse afvist Unknown error Ukendt fejl Connecting to host failed: %1 Forbindelse til vært mislykkedes: %1 Login failed: %1 Login mislykkedes: %1 Listing directory failed: %1 Opremsning af katalogindhold mislykkedes: %1 Changing directory failed: %1 Ændring af katalog mislykkedes: %1 Downloading file failed: %1 Downloading af fil mislykkedes: %1 Uploading file failed: %1 Uploading af fil mislykkedes: %1 Removing file failed: %1 Det mislykkedes at fjerne fil: %1 Creating directory failed: %1 Oprettelse af katalog mislykkedes: %1 Removing directory failed: %1 Det mislykkedes at fjerne katalog: %1 Connection closed Forbindelse lukket Host %1 found Vært %1 fundet Connection to %1 closed Forbindelse til %1 lukket Host found Vært fundet Connected to host Tilsluttet vært QHostInfo Unknown error Ukendt fejl QHostInfoAgent Host not found Vært ikke fundet Unknown address type Ukendt adressetype Unknown error Ukendt fejl QHttp Unknown error Ukendt fejl Request aborted Forespørgsel blev annulleret No server set to connect to Ingen server at forbinde til Wrong content length Forkert indholdslængde Server closed connection unexpectedly Serveren afsluttede uventet forbindelsen Unknown authentication method Ukendt autentifikationsmetode Error writing response to device Skrivefejl mens der blev skrevet til enheden Connection refused Forbindelse afvist Host %1 not found Vært %1 ikke fundet HTTP request failed HTTP anmodning mislykkedes Invalid HTTP response header Ugyldig HTTP-svar-header Invalid HTTP chunked body Ugyldig HTTP chunked body Host %1 found Vært %1 fundet Connected to host %1 Tilsluttet vært %1 Connection to %1 closed Forbindelse til %1 lukket Host found Vært fundet Connected to host Tilsluttet vært Connection closed Forbindelse lukket Proxy authentication required Kræver proxy-autentificering Authentication required Autentificering påkrævet Connection refused (or timed out) Forbindelse blev afvist (eller tid udløb) Proxy requires authentication Proxy kræver autentificering Host requires authentication Vært kræver autentificering Data corrupted Data er ødelagt Unknown protocol specified En ukendt protokol blev angivet SSL handshake failed SSL handshake mislykkedes HTTPS connection requested but SSL support not compiled in Der blevet anmodet om en HTTPS-forbindelse, men SSL understøttelse er ikke kompileret ind QHttpSocketEngine Did not receive HTTP response from proxy Modtog ikke HTTP-svar fra proxy Error parsing authentication request from proxy Fejl under fortolking af autentificeringsanmodning fra proxy Authentication required Autentificering påkrævet Proxy denied connection Proxy nægtede forbindelse Error communicating with HTTP proxy Fejl under kommunikation med HTTP-proxy Proxy server not found Proxy-server kunne ikke findes Proxy connection refused Proxy-forbindelse nægtede Proxy server connection timed out Proxy-serverforbindelse timed out Proxy connection closed prematurely Proxy-forbindelse afsluttede i utide QIBaseDriver Error opening database Der opstod fejl ved åbning af database Could not start transaction Kunne ikke påbegynde transaktionen Unable to commit transaction Kunne ikke gennemføre transaktionen Unable to rollback transaction Kunne ikke tilbagetrække transaktionen QIBaseResult Unable to create BLOB Kunne ikke oprette BLOB Unable to write BLOB Kunne ikke skrive BLOB Unable to open BLOB Kunne ikke åbne BLOB Unable to read BLOB Kunne ikke læse BLOB Could not find array Kunne ikke finde array Could not get array data Kunne ikke hente arraydata Could not get query info Kunne ikke hente forespørgselsinfo Could not start transaction Kunne ikke påbegynde transaktionen Unable to commit transaction Kunne ikke gennemføre transaktionen Could not allocate statement Kunne ikke allokere statement Could not prepare statement Kunne ikke forberede udsagn Could not describe input statement Kunne ikke beskrive input-statement Could not describe statement Kunne ikke beskrive statement Unable to close statement Kunne ikke lukke udsagn Unable to execute query Kunne ikke udføre forespørgsel Could not fetch next item Kunne ikke hente næste element Could not get statement info Kunne ikke hente udsagnsinformation QIODevice Permission denied Tilladelse nægtet Too many open files Der er for mange åbne filer No such file or directory Fil eller katalog findes ikke No space left on device Ingen plads tilbage på enheden Unknown error Ukendt fejl QInputContext XIM XIM input method XIM input-metode Windows input method Windows input-metode Mac OS X input method Mac OS X input-metode QInputDialog Enter a value: Indtast en værdi: QLibrary Could not mmap '%1': %2 Plugin verification data mismatch in '%1' Plugin-verifikationsdata er sat forkert sammen i '%1' Could not unmap '%1': %2 Der var ikke muligt at lave unmap på '%1': %2 The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] Plugin '%1' bruger inkompatibelt Qt-bibliotek. (%2.%3.%4) [%5] The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3" Plugin '%1' bruger inkompatibelt Qt-bibliotek. Forventet build key "%2", hentede "%3"' Unknown error Ukendt fejl' The shared library was not found. DSO blev ikke fundet. The file '%1' is not a valid Qt plugin. Filen '%1' er ikke et gyldigt Qt-plugin. The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) Plugin '%1' bruger inkompatibelt Qt-bibliotek. (Ikke muligt at mikse debug og release-biblioteker) Cannot load library %1: %2 Kan ikke indlæse bibliotek %1: %2 Cannot unload library %1: %2 Kan ikke afregistrere bibliotek %1: %2 Cannot resolve symbol "%1" in %2: %3 Kan ikke løse symbol "%1" i %2: %3 QLineEdit &Undo &Fortryd &Redo &Gendan Cu&t K&lip &Copy &Kopiér &Paste &Sæt ind Delete Slet Select All Markér alt QLocalServer %1: Name error %1: Navnefejl %1: Permission denied %1: Tilladelse nægtet %1: Address in use %1: Adresse i brug %1: Unknown error %2 %1: Ukendt fejl %2 QLocalSocket %1: Connection refused %1: Forbindelse afvist %1: Remote closed %1: Den anden ende lukkede %1: Invalid name %1: Ugyldigt navn %1: Socket access error %1: Fejl i socket-adgang %1: Socket resource error %1: Fejl i socket-ressource %1: Socket operation timed out %1: Socket-handling timed out %1: Datagram too large %1: Datagram er for stort %1: Connection error %1: Forbindelsesfejl %1: The socket operation is not supported %1: Socket-handlingen understøttes ikke %1: Unknown error %1: Ukendt fejl %1: Unknown error %2 %1: Ukendt fejl %2 QMYSQLDriver Unable to open database ' Kunne ikke åbne databasen ' Unable to connect Kunne ikke forbinde Unable to begin transaction Kunne ikke påbegynde transaktionen Unable to commit transaction Kunne ikke gennemføre transaktionen Unable to rollback transaction Kunne ikke tilbagetrække transaktionen QMYSQLResult Unable to fetch data Kunne ikke hente data Unable to execute query Kunne ikke udføre forespørgsel Unable to store result Kunne ikke gemme resultatet Unable to prepare statement Kunne ikke forberede udsagn Unable to reset statement Kunne ikke nulstille udsagn Unable to bind value Kunne ikke tildele værdi Unable to execute statement Kunne ikke udføre udsagn Unable to bind outvalues Kunne ikke binde udværdier Unable to store statement results Kunne ikke gemme udsagnsresultater Unable to execute next query Kunne ikke udføre næste forespørgsel Unable to store next result Kunne ikke gemme næste resultat QMdiArea (Untitled) (Uden titel) QMdiSubWindow %1 - [%2] Close Luk Minimize Minimér Restore Down Gendan Ned &Restore &Gendan &Move &Flyt &Size &Størrelse Mi&nimize Mi&nimér Ma&ximize Ma&ksimér Stay on &Top Bliv &oppe &Close &Luk - [%1] Maximize Maksimér Unshade Fjern skygge Shade Skygge Restore Gendan Help Hjælp Menu QMenu Close Luk Open Åbn Execute Udfør QMessageBox Help Hjælp OK <h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.digia.com/product/licensing">qt.digia.com/product/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).</p><p>Qt is a Digia product. See <a href="http://qt.digia.com/">qt.digia.com</a> for more information.</p> <h3>Om Qt</h3><p>Dette program anvender Qt version %1.</p><p>Qt er et C++ toolkit til cross-platform applikationsudvikling.</p><p>Qt tilbyder single-source portabilitet til MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, og alle større kommercielle Unix-varianter. Qt er også tilgængeligt til indlejrede systemer som Qt for Embedded Linux and Qt for Windows CE.</p>Qt er tilgængeligt under tre forskellige licenser skabt med henblik på at imødekomme forskellige brugeres behov.</p><p>Qt licenseret under vores kommercielle licensaftale er passende for udvikling af proprietær/kommerciel software, hvor du ikke ønsker at dele sourcekode med tredie part, eller på anden vis ikke kan tiltræde vilkårerne i GNU LGPL version 2.1 eller GNU GPL version 3.0</p><p>Qt licenseret under GLU General Public License version 3.0 er passende for udvikling af Qt applikationer, hvor du ønsker at bruge softwaren i kombination med software under vilkårerne i GNU GPL version 3.0, eller hvor du ellers er villig til at overholde vilkårerne i GNU GPL version 3.0</p><p>See venligst <a href="http://qt.digia.com/product/licensing">qt.digia.com/product/licensing</a> for et overblik over Qt licensforhold.</p><p>Qt er et Digia produkt. Se <a href="http://qt.digia.com/">qt.digia.com</a> for yderligere information.</p> About Qt Om Qt <p>This program uses Qt version %1.</p> <p>Dette program bruger Qt-version %1.</p> Show Details... Vis detaljer... Hide Details... Skjul detaljer... <h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Digia product. See <a href="http://qt.digia.com/">qt.digia.com</a> for more information.</p> <h3>Om Qt</h3>%1<p>Qt er et C++ toolkit til cross-platform applikationsudvikling.</p><p>Qt tilbyder single-source portabilitet til MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, og alle større kommercielle Unix-varianter. Qt er også tilgængeligt til indlejrede systemer som Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt er et Digia produkt. Se <a href="http://qt.digia.com/">qt.digia.com</a> for yderligere information.</p> <p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://qt.digia.com/company/model/">qt.digia.com/company/model/</a> for an overview of Qt licensing.</p> <p>Dette program bruger Qt Open Source Edition version %1.</p><p>Qt Open Source Edition er beregnet til udvikling af Open Source applikationer. En kommerciel Qt licens er nødvendig til udvikling af proprietære (lukket sourcekode) applikationer.</p><p>Se venligst <a href="http://qt.digia.com/company/model/">qt.digia.com/company/model/</a> for et overblik over Qt licensforhold.</p> QMultiInputContext Select IM Markér IM QMultiInputContextPlugin Multiple input method switcher Multiple input metode-switcher Multiple input method switcher that uses the context menu of the text widgets Multiple input metode-switcher, der benytter tekstkontrollernes kontekstmenuer QNativeSocketEngine The remote host closed the connection Fjern-hosten lukkede forbindelsen Network operation timed out Netværksoperationen timed out Out of resources Ikke flere ressourcer Unsupported socket operation Socket-operation ikke understøttet Protocol type not supported Protokoltypen understøttes ikke Invalid socket descriptor Ugyldig socket-deskriptor Network unreachable Netværket er ikke tilgængeligt Permission denied Tilladelse nægtet Connection timed out Forbindelsen timed out Connection refused Forbindelse afvist The bound address is already in use Den bundne adresse er allerede i brug The address is not available Adressen er ikke tilgængelig The address is protected Adressen er beskyttet Unable to send a message Kunne ikke sende en besked Unable to receive a message Kunne ikke modtage en besked Unable to write Kunne ikke skrive Network error Netværksfejl Another socket is already listening on the same port En anden socket lytter allerede på samme port Unable to initialize non-blocking socket Kunne ikke initialisere non-blocking socket Unable to initialize broadcast socket Kunne ikke initialisere broadcast-socket Attempt to use IPv6 socket on a platform with no IPv6 support Forsøg på at bruge IPv6-socket på en platform uden IPv6-support Host unreachable Vært er ikke tilgængelig Datagram was too large to send Datagrammet var for stort til at blive sendt Operation on non-socket Handling på non-socket Unknown error Ukendt fejl The proxy type is invalid for this operation Proxytypen er ugyldig til denne handling QNetworkAccessCacheBackend Error opening %1 Der opstod fejl i at åbne %1 QNetworkAccessFileBackend Request for opening non-local file %1 Anmodning om at åbne ikke-lokal fil %1 Error opening %1: %2 Der opstod fejl i at åbne %1: %2 Write error writing to %1: %2 Skrivefejl mens der blev skrevet til %1: %2 Cannot open %1: Path is a directory Kan ikke åbne %1: Stien er et katalog Read error reading from %1: %2 Læsefejl mens der blev læst fra %1: %2 QNetworkAccessFtpBackend No suitable proxy found Ingen passende proxy blev fundet Cannot open %1: is a directory Kan ikke åbne %1: Er et katalog Logging in to %1 failed: authentication required Der opstod fejl i at logge på %1: Autentificering kræves Error while downloading %1: %2 Der opstod fejl i at downloade %1: %2 Error while uploading %1: %2 Der opstod fejl i at uploade %1: %2 QNetworkAccessHttpBackend No suitable proxy found Ingen passende proxy blev fundet QNetworkReply Error downloading %1 - server replied: %2 Der opstod fejl i at downloade %1 - serveren svarede: %2 Protocol "%1" is unknown Protokollen "%1" er ukendt QNetworkReplyImpl Operation canceled Handling blev annulleret QOCIDriver Unable to logon Kunne ikke logge på Unable to initialize QOCIDriver Kunne ikke initialisere Unable to begin transaction Kunne ikke påbegynde transaktionen Unable to commit transaction Kunne ikke gennemføre transaktionen Unable to rollback transaction Kunne ikke tilbagetrække transaktionen QOCIResult Unable to bind column for batch execute Kunne ikke tildele kolonne til batch-udførsel Unable to execute batch statement Kunne ikke udføre batch-udsagn Unable to goto next Kunne ikke gå til den næste Unable to alloc statement Kunne ikke allokere udsagn Unable to prepare statement Kunne ikke forberede udsagn Unable to bind value Kunne ikke tildele værdi Unable to execute select statement Kunne ikke udføre det valgte udsagn Unable to execute statement Kunne ikke udføre udsagn QODBCDriver Unable to connect Kunne ikke forbinde Unable to connect - Driver doesn't support all needed functionality Kunne ikke forbinde. Driveren understøtter ikke alle de nødvendige funktionaliteter Unable to disable autocommit Kunne ikke slå auto-udfør fra Unable to commit transaction Kunne ikke gennemføre transaktionen Unable to rollback transaction Kunne ikke tilbagetrække transaktionen Unable to enable autocommit Kunne ikke slå auto-udfør til QODBCResult QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult::reset: Kunne ikke indstille 'SQL_CURSOR_STATIC' til udsagnsattribut. Kontrollér ODBC-driver-konfigurationen Unable to execute statement Kunne ikke udføre udsagn Unable to fetch next Kunne ikke hente den næste Unable to prepare statement Kunne ikke forberede udsagn Unable to bind variable Kunne ikke tildele variabel Unable to fetch last Kunne ikke hente den sidste Unable to fetch Kunne ikke hente Unable to fetch first Kunne ikke hente den første Unable to fetch previous Kunne ikke hente den forrige QObject Home Hjem Operation not supported on %1 Handling blev ikke understøttet på %1 Invalid URI: %1 Ugyldig URI: %1 Write error writing to %1: %2 Skrivefejl mens der blev skrevet til %1: %2 Read error reading from %1: %2 Læsefejl mens der blev læst fra %1: %2 Socket error on %1: %2 Socket-fejl på %1: %2 Remote host closed the connection prematurely on %1 Fjern-host lukkede forbindelsen for tidligt på %1 Protocol error: packet of size 0 received Protokolfejl: Pakke på størrelsen 0 modtaget No host name given Hostnavn mangler QPPDOptionsModel Name Navn Value Værdi QPSQLDriver Unable to connect Kunne ikke skabe forbindelse Could not begin transaction Kunne ikke påbegynde transaktion Could not commit transaction Kunne ikke gennemføre transaktion Could not rollback transaction Kunne ikke tilbagetrække transaktion Unable to subscribe Kunne ikke tilmelde Unable to unsubscribe Kunne ikke afmelde QPSQLResult Unable to create query Kunne ikke oprette forespørgsel Unable to prepare statement Kunne ikke forberede udsagn QPageSetupWidget Centimeters (cm) Centimeter (cm) Millimeters (mm) Millimeter (mm) Inches (in) Points (pt) Point (pt) Form Paper Papir Page size: Sidestørrelse: Width: Vidde: Height: Højde: Paper source: Papirkilde: Orientation Portrait Portræt Landscape Landskab Reverse landscape Omvendt landskab Reverse portrait Omvendt portræt Margins Margener top margin Margen - øverst left margin Margen - venstre right margin Margen - højre bottom margin Margen - bund QPluginLoader Unknown error Ukendt fejl The plugin was not loaded. Plugin blev ikke indlæst. QPrintDialog locally connected lokalt forbundet Aliases: %1 Aliasser: %1 unknown Ukendt A0 (841 x 1189 mm) A1 (594 x 841 mm) A2 (420 x 594 mm) A3 (297 x 420 mm) A4 (210 x 297 mm, 8.26 x 11.7 inches) A5 (148 x 210 mm) A6 (105 x 148 mm) A7 (74 x 105 mm) A8 (52 x 74 mm) A9 (37 x 52 mm) B0 (1000 x 1414 mm) B1 (707 x 1000 mm) B2 (500 x 707 mm) B3 (353 x 500 mm) B4 (250 x 353 mm) B5 (176 x 250 mm, 6.93 x 9.84 inches) B6 (125 x 176 mm) B7 (88 x 125 mm) B8 (62 x 88 mm) B9 (44 x 62 mm) B10 (31 x 44 mm) C5E (163 x 229 mm) DLE (110 x 220 mm) Executive (7.5 x 10 inches, 191 x 254 mm) Folio (210 x 330 mm) Ledger (432 x 279 mm) Legal (8.5 x 14 inches, 216 x 356 mm) Letter (8.5 x 11 inches, 216 x 279 mm) Tabloid (279 x 432 mm) US Common #10 Envelope (105 x 241 mm) OK Print Udskriv Print To File ... Udskriv til fil... Print range Udskriftsområde Print all Udskriv alle File %1 is not writable. Please choose a different file name. Filen %1 kan ikke skrives. Vælg et andet filnavn. %1 already exists. Do you want to overwrite it? %1 findes allerede. Ønsker du at overskrive? File exists Fil findes <qt>Do you want to overwrite it?</qt> <qt>Ønsker du at overskrive?</qt> Print selection Udskriv markerede %1 is a directory. Please choose a different file name. %1 er et katalog. Vælg et andet filnavn. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 C5E DLE Executive Folio Ledger Legal Letter Tabloid US Common #10 Envelope Custom Brugerdefineret &Options >> &Indstillinger>> &Print &Udskriv &Options << &Indstillinger<< Print to File (PDF) Udskriv til fil (PDF) Print to File (Postscript) Udskriv til fil (Postscript) Local file Lokal fil Write %1 file Skriv %1 fil The 'From' value cannot be greater than the 'To' value. 'Fra'-værdien kan ikke være større end 'til'-værdien. QPrintPreviewDialog Page Setup Sideopsætning %1% Print Preview Vis udskrift Next page Næste side Previous page Forrige side First page Første side Last page Sidste side Fit width Tilpas bredde Fit page Tilpas siden Zoom in Zoom ind Zoom out Zoom ud Portrait Portræt Landscape Landskab Show single page Vis enkelt side Show facing pages Vis sideopslag Show overview of all pages Vis oversigt af alle sider Print Udskriv Page setup Sideopsætning Close Luk Export to PDF Eksportér til PDF Export to PostScript Eksportér til PostScript QPrintPropertiesWidget Form Form Page Side Advanced Avanceret QPrintSettingsOutput Form Copies Kopier Print range Udskriv sider Print all Udskriv alle Pages from Sider fra to til Selection Valg Output Settings Udskriftsindstillinger Copies: Kopier: Collate Samordne Reverse Omvendt Options Valgmuligheder Color Mode Farvetilstand Color Farve Grayscale Gråskala Duplex Printing Dobbelsidet None Ingen Long side Bog Short side Tavle QPrintWidget Form Printer ' &Name: &Navn: P&roperties &Egenskaber Location: Placering: Preview Vis udskrift Type: Output &file: Udskrifts&fil: ... QProcess Could not open input redirection for reading Kunne ikke åbne input redirection for læsning Could not open output redirection for writing Kunne ikke åbne output redirection for skrivning Resource error (fork failure): %1 Ressource fejl (fork fejl): %1 Process operation timed out Proces-operation time out Error reading from process Fejl ved læsning fra proces Error writing to process Fejl ved skrivning til proces Process crashed Proces crashede No program defined Intet program defineret Process failed to start Processen kunne ikke starte QProgressDialog Cancel Annuller QPushButton Open Åbn QRadioButton Check Kontrollér QRegExp no error occurred der opstod ingen fejl disabled feature used deaktiveret funktion blev brugt bad char class syntax dårlig char class syntaks bad lookahead syntax dårlig lookahead syntaks bad repetition syntax dårlig gentagelsessyntaks invalid octal value ugyldigt oktal-tal missing left delim Manglende venstre delimiter unexpected end uventet afslutning met internal limit nåede interne grænse QSQLite2Driver Error to open database Der opstod fejl ved åbning af database Unable to begin transaction Kunne ikke påbegynde transaktionen Unable to commit transaction Kunne ikke gennemføre transaktionen Unable to rollback Transaction Kunne ikke tilbagetrække transaktion QSQLite2Result Unable to fetch results Kunne ikke hente resultater Unable to execute statement Kunne ikke udføre statement QSQLiteDriver Error opening database Der opstod fejl ved åbning af database Error closing database Der opstod fejl ved lukning af database Unable to begin transaction Kunne ikke påbegynde transaktionen Unable to commit transaction Kunne ikke gennemføre transaktion Unable to rollback transaction Kunne ikke tilbagetrække transaktion QSQLiteResult Unable to fetch row Kunne ikke hente række Unable to execute statement Kunne ikke udføre udsagn Unable to reset statement Kunne ikke nulstille udsagn Unable to bind parameters Unable to bind parameters Parameter count mismatch Misforhold i parametertælling No query Ingen forespørgesel QScrollBar Scroll here Scroll her Left edge Venstre kant Top Øverst Right edge Højre kant Bottom Bund Page left Side venstre Page up Side øverst Page right Side højre Page down Side ned Scroll left Scroll til venstre Scroll up Scroll op Scroll right Scroll til højre Scroll down Scroll ned Line up Linie op Position Placering Line down Linie ned QSharedMemory %1: unable to set key on lock %1: Kunne ikke oprette nøgle %1: create size is less then 0 %1: create size is less then 0 %1: unable to lock %1: Kunne ikke låse %1: unable to unlock %1: Kunne ikke oprette nøgle %1: permission denied %1: Tilladelse nægtet %1: already exists %1: Findes allerede %1: doesn't exists %1: Findes ikke %1: out of resources %1: Ikke flere ressourcer %1: unknown error %2 %1: ukendt fejl %2 %1: key is empty %1: nøgle er tom %1: unix key file doesn't exists %1: Kunne ikke oprette nøgle %1: ftok failed %1: ftok mislykkedes %1: unable to make key %1: Kunne ikke oprette nøgle %1: system-imposed size restrictions %1: System-pålagte størrelsesrestriktioner %1: not attached %1: Ikke vedhæftet %1: invalid size %1: Ugyldig størrelse %1: key error %1: Nøglefejl %1: size query failed %1: Størrelsesforespørgsel mislykkedes QShortcut Space Esc Tab Backtab Tilbage-tabulator Backspace Tilbage Return Enter Ins Del Pause Print Udskriv SysReq Home End Left Venstre Up Op Right Højre Down Ned PgUp PgDown CapsLock ' NumLock ScrollLock Menu Help Hjælp Back Tilbage Forward Frem Stop Refresh Opdater Volume Down Lydstyrke ned Volume Mute Lydstyrke mute Volume Up Lydstyrke op Bass Boost Bass Up Bass op Bass Down Bass ned Treble Up Diskant op Treble Down Diskant ned Media Play Media Stop Media Previous Media forrige Media Next Media næste Media Record Favorites Search Søg Standby Open URL Åbn URL Launch Mail Start mail Launch Media Start Media Launch (0) Start (0) Launch (1) Start (1) Launch (2) Start (2) Launch (3) Start (3) Launch (4) Start (4) Launch (5) Start (5) Launch (6) Start (6) Launch (7) Start (7) Launch (8) Start (8) Launch (9) Start (9) Launch (A) Start (A) Launch (B) Start (B) Launch (C) Start (C) Launch (D) Start (D) Launch (E) Start (E) Launch (F) Start (F) Print Screen Page Up Page Down Caps Lock Num Lock Number Lock Scroll Lock Insert Delete Escape System Request Select Væg Yes Ja No Nej Context1 Kontekst1 Context2 Kontekst2 Context3 Kontekst3 Context4 Kontekst4 Call Ring til Hangup Læg på Flip Vend Ctrl Shift Alt Meta + F%1 Home Page Startside QSlider Page left Side venstre Page up Side op Position Placering Page right Side højre Page down Side ned QSocks5SocketEngine Connection to proxy refused Proxy-forbindelse nægtede Connection to proxy closed prematurely Proxy-forbindelse afsluttede i utide Proxy host not found Proxy-host kunne ikke findes Connection to proxy timed out Proxy-serverforbindelse timed out Proxy authentication failed Proxy autentificering mislykkedes Proxy authentication failed: %1 Proxy autentificering mislykkedes: %1 SOCKS version 5 protocol error SOCKS version 5 protokolfejl General SOCKSv5 server failure General SOCKSv5 serverfejl Connection not allowed by SOCKSv5 server Forbindelse ikke tilladt a SOCKSv5-server TTL expired TTL udløbet SOCKSv5 command not supported SOCKSv5-kommando ikke understøttet Address type not supported Adressetype understøttes ikke Unknown SOCKSv5 proxy error code 0x%1 Ukendt SOCKSv5 proxy fejlkode 0x%1 Network operation timed out Netværksoperationen timed out QSpinBox More Mere Less Mindre QSql Delete Slet Delete this record? Slet denne post? Yes Ja No Nej Insert Indsæt Update Opdater Save edits? Gem ændringer? Cancel Annuller Confirm Bekræft Cancel your edits? Skal dine ændringer annulleres? QSslSocket Unable to write data: %1 Kunne ikke skrive data: %1 Error while reading: %1 Der opstod en fejl under læsning af: %1 Error during SSL handshake: %1 Der opstod en fejl under SSL handshake: %1 Error creating SSL context (%1) Der opstod fejl under oprettelse af SSL-kontekst (%1) Invalid or empty cipher list (%1) Ugyldig eller tom chifferliste (%1) Error creating SSL session, %1 Der opstod fejl under oprettelse af SSL-session, %1 Error creating SSL session: %1 Der opstod fejl under oprettelse af SSL-session, %1 Cannot provide a certificate with no key, %1 Kan ikke give et certifikat uden nøgle, %1 Error loading local certificate, %1 Der opstod fejl under indlæsning af lokalt certifikat, %1 Error loading private key, %1 Der opstod fejl under indlæsning af privat nøgle, %1 Private key does not certificate public key, %1 Privat-nøgle autoriserer ikke offentlig-nøgle, %1 QSystemSemaphore %1: out of resources %1: Ikke flere ressourcer %1: permission denied %1: Tilladelse nægtet %1: already exists %1: Findes allerede %1: does not exist %1: Findes ikke %1: unknown error %2 %1: Ukendt fejl %2 QTDSDriver Unable to open connection Kunne ikke etablere forbindelsen Unable to use database Kunne ikke bruge databasen QTabBar Scroll Left Scroll til venstre Scroll Right Scroll til højre QTcpServer Operation on socket is not supported Socket-operation ikke understøttet QTextControl &Undo &Fortryd &Redo &Gendan Cu&t K&lip &Copy &Kopiér Copy &Link Location Kopiér l&ink &Paste &Sæt ind Delete Slet Select All Markér alt QToolButton Press Tryk på Open Åbn QUdpSocket This platform does not support IPv6 Denne platform understøtter ikke IPv6 QUndoGroup Undo Fortryd Redo Gendan QUndoModel <empty> <tom> QUndoStack Undo Fortryd Redo Gendan QUnicodeControlCharacterMenu LRM Left-to-right mark RLM Right-to-left mark ZWJ Zero width joiner ZWNJ Zero width non-joiner ZWSP Zero width space LRE Start of left-to-right embedding RLE Start of right-to-left embedding LRO Start of left-to-right override RLO Start of right-to-left override PDF Pop directional formatting Insert Unicode control character QWebFrame Request cancelled Anmodning annulleret Request blocked Anmodning blokeret Cannot show URL Kan ikke vise URL Frame load interruped by policy change Billedindlæsning afbrudt af ændringer i retningslinier Cannot show mimetype Kan ikke vise MIME-type File does not exist Filen findes ikke QWebPage Bad HTTP request Dårlig HTTP-anmodning Submit default label for Submit buttons in forms on web pages Send Submit Submit (input element) alt text for <input> elements with no alt, title, or value Send Reset default label for Reset buttons in forms on web pages Nulstil This is a searchable index. Enter search keywords: text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' Dette er et søgeindeks. Indtast søgeord: Choose File title for file button used in HTML forms Vælg fil No file selected text to display in file button used in HTML forms when no file is selected Der er ikke valgt en fil Open in New Window Open in New Window context menu item Åbn i nyt vindue Save Link... Download Linked File context menu item Gem link... Copy Link Copy Link context menu item Kopiér link Open Image Open Image in New Window context menu item Åbn billede Save Image Download Image context menu item Gem billede Copy Image Copy Link context menu item Kopiér billede Open Frame Open Frame in New Window context menu item Åbn faneblad Copy Copy context menu item Kopiér Go Back Back context menu item Gå tilbage Go Forward Forward context menu item Gå frem Stop Stop context menu item Stop Reload Reload context menu item Genindlæs Cut Cut context menu item Klip Paste Paste context menu item Sæt ind No Guesses Found No Guesses Found context menu item Der er ikke fundet nogen gæt Ignore Ignore Spelling context menu item Ignorér Add To Dictionary Learn Spelling context menu item Tilføj til ordbog Search The Web Search The Web context menu item Søg på nettet Look Up In Dictionary Look Up in Dictionary context menu item Slå op i ordbog Open Link Open Link context menu item Åbn link Ignore Ignore Grammar context menu item Ignorér Spelling Spelling and Grammar context sub-menu item Stavekontrol Show Spelling and Grammar menu item title Vis stave- og grammatikkontrol Hide Spelling and Grammar menu item title Skjul stave- og grammatikkontrol Check Spelling Check spelling context menu item Kør stavekontrol Check Spelling While Typing Check spelling while typing context menu item Kør stavekontrol mens der tastes Check Grammar With Spelling Check grammar with spelling context menu item Kør grammatikkontrol sammen med stavekontrol Fonts Font context sub-menu item Skrifttyper Bold Bold context menu item Fed Italic Italic context menu item Kursiv Underline Underline context menu item Understreget Outline Outline context menu item Kontur Direction Writing direction context sub-menu item Retning Text Direction Text direction context sub-menu item Tekstretning Default Default writing direction context menu item Standard LTR Left to Right context menu item RTL Right to Left context menu item Inspect Inspect Element context menu item Inspicér No recent searches Label for only item in menu that appears when clicking on the search field image, when no searches have been performed Ingen aktuelle søgninger Recent searches label for first item in the menu that appears when clicking on the search field image, used as embedded menu title Aktuelle søgninger Clear recent searches menu item in Recent Searches menu that empties menu's contents Ryd aktuelle søgninger Unknown Unknown filesize FTP directory listing item Ukendt %1 (%2x%3 pixels) Title string for images %1 (%2x%3 pixels) Web Inspector - %2 Web-inspektør - %2 Scroll here Scroll her Left edge Venstre kant Top Right edge Højre kant Bottom Bund Page left Side venstre Page up Side øverst Page right Side højre Page down Side ned Scroll left Scroll til venstre Scroll up Scroll op Scroll right Scroll til højre Scroll down Scroll ned %n file(s) number of chosen file %n fil %n filer JavaScript Alert - %1 JavaScript alert - %1 JavaScript Confirm - %1 JavaScript Bekræft - %1 JavaScript Prompt - %1 JavaScript Prompt - %1 Move the cursor to the next character Flyt markør til næste tegn Move the cursor to the previous character Flyt markør til forrige tegn Move the cursor to the next word Flyt markør til næste ord Move the cursor to the previous word Flyt markør til forrige ord Move the cursor to the next line Flyt markør til næste linie Move the cursor to the previous line Flyt markør til forrige linie Move the cursor to the start of the line Flyt markør til starten af linien Move the cursor to the end of the line Flyt markør til slutningen af linien Move the cursor to the start of the block Flyt markør til starten af sektionen Move the cursor to the end of the block Flyt markør til slutningen af sektionen Move the cursor to the start of the document Flyt markør til starten af dokumentet Move the cursor to the end of the document Flyt markør til slutningen af dokumentet Select all Markér alt Select to the next character Vælg til næste tegn Select to the previous character Vælg til forrige tegn Select to the next word Vælg til næste ord Select to the previous word Vælg til forrige ord Select to the next line Vælg til næste linie Select to the previous line Vælg til forrige linie Select to the start of the line Vælg til starten af linien Select to the end of the line Vælg til slutningen af linien Select to the start of the block Vælg til starten af sektionen Select to the end of the block Vælg til slutningen af sektionen Select to the start of the document Vælg til starten af dokumentet Select to the end of the document Vælg til slutningen af dokumentet Delete to the start of the word Slet til starten af ordet Delete to the end of the word Slet til slutningen af ordet Insert a new paragraph Indsæt et nyt afsnit Insert a new line Insert ny linie QWhatsThisAction What's This? Hvad er dette? QWidget * QWizard Go Back Gå tilbage Continue Fortsæt Commit Udfør Done Færdig Help Hjælp < &Back < &Tilbage &Finish &Afslut Cancel Annuller &Help &Hjælp &Next &Næste &Next > &Næste > QWorkspace &Restore &Gendan &Move &Flyt &Size &Størrelse Mi&nimize Mi&nimér Ma&ximize Ma&ksimér &Close &Luk Stay on &Top Bliv på &toppen Sh&ade Sk&ygge %1 - [%2] Minimize Minimer Restore Down Gendan ned Close Luk &Unshade &Fjern skygge QXml no error occurred der opstod ingen fejl error triggered by consumer Fejltilstand rejst af datamodtager unexpected end of file uventet afslutning på fil more than one document type definition mere end én definition på dokumenttype error occurred while parsing element der opstod fejl under fortolking af element tag mismatch error occurred while parsing content der opstod fejl under fortolking af indhold unexpected character uventet tegn invalid name for processing instruction Ugyldigt navn for processing instruction version expected while reading the XML declaration version forventet under læsning af XML-deklaration wrong value for standalone declaration Forkert værdi for fri deklaration encoding declaration or standalone declaration expected while reading the XML declaration Enkodningsdeklaration eller fri deklaration forventet ved læsning af XML-deklaration standalone declaration expected while reading the XML declaration fri deklaration forventet ved læsning af XML-deklaration error occurred while parsing document type definition der opstod fejl under fortolking af dokumenttypedefinition letter is expected bogstav forventet error occurred while parsing comment der opstod fejl under fortolking af kommentar error occurred while parsing reference der opstod fejl under fortolking af reference internal general entity reference not allowed in DTD intern generel entitetsreference ikke tilladt i DTD external parsed general entity reference not allowed in attribute value Eksternt parset generel entitetsreference ikke tilladt i attributværdi external parsed general entity reference not allowed in DTD Eksternt parset generel entitetsreference ikke tilladt i DTD unparsed entity reference in wrong context ufortolket enhedsreference i forkert kontekst recursive entities rekursive entiteter error in the text declaration of an external entity fejl i tekstdeklaration på en ekstern enhed QXmlStream Extra content at end of document. Ekstra indhold sidst i dokumentet. Invalid entity value. Ugyldig enhedsværdi. Invalid XML character. Ugyldigt XML-tegn. Sequence ']]>' not allowed in content. Sekvens ']]>' ikke tilladt i indhold. Namespace prefix '%1' not declared Navnerumspræfiks '%1' ikke deklareret Attribute redefined. Attribut redefineret. Unexpected character '%1' in public id literal. Uventet tegn '%1' i public id værdi. Invalid XML version string. Ugyldigt XML-versionsstreng. Unsupported XML version. XML-version understøttes ikke. %1 is an invalid encoding name. %1 er et ugyldigt enkodningsnavn. Encoding %1 is unsupported Enkodning %1 er ikke understøttet Standalone accepts only yes or no. Invalid attribute in XML declaration. Ugyldig attribut i XML-deklaration. Premature end of document. Dokument sluttede for tidligt. Invalid document. Ugyldigt dokument. Expected Forventet , but got ' , men fik ' Unexpected ' Uventet ' Expected character data. Forventet tegndata. Recursive entity detected. Rekursiv entitet opdaget. Start tag expected. Start-tag forventet. XML declaration not at start of document. XML-deklaration ikke i starten af dokumentet. NDATA in parameter entity declaration. NDATA i parameterentitetsdeklaration. %1 is an invalid processing instruction name. %1 er et ugyldigt processing-instruction-navn. Invalid processing instruction name. Ugyldigt processing-instruction-navn. Illegal namespace declaration. Ulovligt navnerumsdeklaration. Invalid XML name. Ugyldigt XML-navn. Opening and ending tag mismatch. Åbner og afslutter tag-mismatch. Reference to unparsed entity '%1'. Reference to ufortolket enhed '%1'. Entity '%1' not declared. Enheden '%1' ikke deklareret. Reference to external entity '%1' in attribute value. Reference til ekstern enhed '%1' i attributværdi. Invalid character reference. Ugyldig tegnreference. Encountered incorrectly encoded content. Indhold med forkert enkodning læst. The standalone pseudo attribute must appear after the encoding. Den frie pseudo-attribut skal optræde efter enkodningen. %1 is an invalid PUBLIC identifier. %1 er en ugyldig PUBLIC identifier. QtXmlPatterns An %1-attribute with value %2 has already been declared. En %1-attribut med værdi %2 er allerede erklæret. An %1-attribute must have a valid %2 as value, which %3 isn't. En %1-attribut skal have en gyldig %2 som værdi, hvilket %3 ikke er. Network timeout. Netværk timeout. Element %1 can't be serialized because it appears outside the document element. Element %1 kan ikke serialiseres fordi det optræder udenfor dokument-elementet. Year %1 is invalid because it begins with %2. År %1 er ugyldigt da det begynder med %2. Day %1 is outside the range %2..%3. Dag %1 er udenfor intervallet %2..%3. Month %1 is outside the range %2..%3. Måned %1 er udenfor intervallet %2..%3. Overflow: Can't represent date %1. Overflow: Kan ikke repræsentere dato %1. Day %1 is invalid for month %2. Dag %1 er ugyldig for månet %2. Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; Tidspunkt 24:%1:%2.%3 er ugyldigt. Timetal er 24, men minutter, sekunder og millisekunder er ikke alle 0; Time %1:%2:%3.%4 is invalid. Tidspunkt %1:%2:%3.%4 er ugyldigt. Overflow: Date can't be represented. Overflow: Dato kan ikke repræsenteres. At least one component must be present. Mindst en komponent skal være tilstede. At least one time component must appear after the %1-delimiter. Mindst en tidskomponent skal optræde efter %1-skillemærket. No operand in an integer division, %1, can be %2. Ingen operand i en heltalsdivision, %1, kan være %2. The first operand in an integer division, %1, cannot be infinity (%2). Den første operand i en heltalsdivision, %1, kan ikke være uendeligt (%2). The second operand in a division, %1, cannot be zero (%2). Den anden operand i en division, %1, kan ikke være nul (%2). %1 is not a valid value of type %2. %1 er ikke en gyldig værdi af typen %2. When casting to %1 from %2, the source value cannot be %3. Ved cast til %1 fra %2, kan kildeværdien ikke være %3. Integer division (%1) by zero (%2) is undefined. Heltalsdivision (%1) med nul (%2) er udefineret. Division (%1) by zero (%2) is undefined. Division (%1) med nul (%2) er udefineret. Modulus division (%1) by zero (%2) is undefined. Modulusdivision (%1) med nul (%2) er udefineret. Dividing a value of type %1 by %2 (not-a-number) is not allowed. Division af værdi af typen %1 med %2 (ikke et tal) er ikke tilladt. Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. A value of type %1 cannot have an Effective Boolean Value. Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values. Value %1 of type %2 exceeds maximum (%3). Value %1 of type %2 is below minimum (%3). A value of type %1 must contain an even number of digits. The value %2 does not. %1 is not valid as a value of type %2. Operator %1 cannot be used on type %2. Operator %1 cannot be used on atomic values of type %2 and %3. The namespace URI in the name for a computed attribute cannot be %1. The name for a computed attribute cannot have the namespace URI %1 with the local name %2. Type error in cast, expected %1, received %2. When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed. No casting is possible with %1 as the target type. It is not possible to cast from %1 to %2. Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated. It's not possible to cast the value %1 of type %2 to %3 Failure when casting from %1 to %2: %3 A comment cannot contain %1 A comment cannot end with a %1. No comparisons can be done involving the type %1. Operator %1 is not available between atomic values of type %2 and %3. An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place. A library module cannot be evaluated directly. It must be imported from a main module. No template by name %1 exists. A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type. A positional predicate must evaluate to a single numeric value. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid. %1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. The data of a processing instruction cannot contain the string %1 No namespace binding exists for the prefix %1 No namespace binding exists for the prefix %1 in %2 %1 is an invalid %2 %1 takes at most %n argument(s). %2 is therefore invalid. %1 requires at least %n argument(s). %2 is therefore invalid. The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. %1 is not a valid XML 1.0 character. The first argument to %1 cannot be of type %2. If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. %1 was called. %1 must be followed by %2 or %3, not at the end of the replacement string. In the replacement string, %1 must be followed by at least one digit when not escaped. In the replacement string, %1 can only be used to escape itself or %2, not %3 %1 matches newline characters %1 and %2 match the start and end of a line. Matches are case insensitive Whitespace characters are removed, except when they appear in character classes %1 is an invalid regular expression pattern: %2 %1 is an invalid flag for regular expressions. Valid flags are: If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. It will not be possible to retrieve %1. The root node of the second argument to function %1 must be a document node. %2 is not a document node. The default collection is undefined %1 cannot be retrieved The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). A zone offset must be in the range %1..%2 inclusive. %3 is out of range. %1 is not a whole number of minutes. Required cardinality is %1; got cardinality %2. The item %1 did not match the required type %2. %1 is an unknown schema type. Only one %1 declaration can occur in the query prolog. The initialization of variable %1 depends on itself No variable by name %1 exists The variable %1 is unused Version %1 is not supported. The supported XQuery version is 1.0. The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. No function with signature %1 is available A default namespace declaration must occur before function, variable, and option declarations. Namespace declarations must occur before function, variable, and option declarations. Module imports must occur before function, variable, and option declarations. It is not possible to redeclare prefix %1. Prefix %1 is already declared in the prolog. The name of an option must have a prefix. There is no default namespace for options. The Schema Import feature is not supported, and therefore %1 declarations cannot occur. The target namespace of a %1 cannot be empty. The module import feature is not supported No value is available for the external variable by name %1. A construct was encountered which only is allowed in XQuery. A template by name %1 has already been declared. The keyword %1 cannot occur with any other mode name. The value of attribute %1 must of type %2, which %3 isn't. The prefix %1 can not be bound. By default, it is already bound to the namespace %2. A variable by name %1 has already been declared. A stylesheet function must have a prefixed name. The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 A function already exists with the signature %1. No external functions are supported. All supported functions can be used directly, without first declaring them as external An argument by name %1 has already been declared. Every argument name must be unique. When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal. In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching. In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching. In an XSL-T pattern, function %1 cannot have a third argument. In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching. In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can. %1 is an invalid template mode name. The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. The Schema Validation Feature is not supported. Hence, %1-expressions may not be used. None of the pragma expressions are supported. Therefore, a fallback expression must be present Each name of a template parameter must be unique; %1 is duplicated. The %1-axis is unsupported in XQuery %1 is not a valid name for a processing-instruction. %1 is not a valid numeric literal. No function by name %1 is available. The namespace URI cannot be the empty string when binding to a prefix, %1. %1 is an invalid namespace URI. It is not possible to bind to the prefix %1 Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared). Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared). Two namespace declaration attributes have the same name: %1. The namespace URI must be a constant and cannot use enclosed expressions. An attribute by name %1 has already appeared on this element. A direct element constructor is not well-formed. %1 is ended with %2. The name %1 does not refer to any schema type. %1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. %1 is not an atomic type. Casting is only possible to atomic types. %1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. The name of an extension expression must be in a namespace. empty zero or one exactly one one or more zero or more Required type is %1, but %2 was found. Promoting %1 to %2 may cause loss of precision. The focus is undefined. It's not possible to add attributes after any other kind of node. An attribute by name %1 has already been created. Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported. Attribute %1 can't be serialized because it appears at the top level. %1 is an unsupported encoding. %1 contains octets which are disallowed in the requested encoding %2. The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character. Ambiguous rule match. In a namespace constructor, the value for a namespace cannot be an empty string. The prefix must be a valid %1, which %2 is not. The prefix %1 cannot be bound. Only the prefix %1 can be bound to %2 and vice versa. Circularity detected The parameter %1 is required, but no corresponding %2 is supplied. The parameter %1 is passed, but no corresponding %2 exists. The URI cannot have a fragment Element %1 is not allowed at this location. Text nodes are not allowed at this location. Parse error: %1 The value of the XSL-T version attribute must be a value of type %1, which %2 isn't. Running an XSL-T 1.0 stylesheet with a 2.0 processor. Unknown XSL-T attribute %1. Attribute %1 and %2 are mutually exclusive. In a simplified stylesheet module, attribute %1 must be present. If element %1 has no attribute %2, it cannot have attribute %3 or %4. Element %1 must have at least one of the attributes %2 or %3. At least one mode must be specified in the %1-attribute on element %2. Attribute %1 cannot appear on the element %2. Only the standard attributes can appear. Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes. Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes. Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes. XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is. The attribute %1 must appear on element %2. The element with local name %1 does not exist in XSL-T. Element %1 must come last. At least one %1-element must occur before %2. Only one %1-element can appear. At least one %1-element must occur inside %2. When attribute %1 is present on %2, a sequence constructor cannot be used. Element %1 must have either a %2-attribute or a sequence constructor. When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor. Element %1 cannot have children. Element %1 cannot have a sequence constructor. The attribute %1 cannot appear on %2, when it is a child of %3. A parameter in a function cannot be declared to be a tunnel. This processor is not Schema-aware and therefore %1 cannot be used. Top level stylesheet elements must be in a non-null namespace, which %1 isn't. The value for attribute %1 on element %2 must either be %3 or %4, not %5. Attribute %1 cannot have the value %2. The attribute %1 can only appear on the first %2 element. At least one %1 element must appear as child of %2. VolumeSlider Muted Volume: %1% Lydstyrke: %1% qstopmotion-2.3.2-Source/translations/qt_se.qm000644 000000 000000 00000177455 12536560630 021552 0ustar00rootroot000000 000000 =sʉE[EMՇ{+8AAOK[yL2]l 9pMnM_EKETwbw!en)ĺ*/e5;vJBy<OJZfE`n/cփu(< P$$s(4^ n?,]X@;y9&H\/\PIxS,YML!YMUh^/i#ssct~wFL|ۊ.N+]]IIII6IIǐII0Yliy@|IL\ uDPuDW)o,,h,,H,p0ɘe5$ WfR fRFcNFc!9PqSV8V- ccf%C`?"jKNɮMjRs]Zg]`}ky^{yG%JYǥ\+†t{y[rw%,uC-5Aƨƨ]˾`ҝz է?ufy~bF&~bHRo }!_+3/4/6 GKWLAUUdU{~ZZZ-Zi^ne LiPqiWy;i}u$}wo}wB}wjettq..yPLDt&tUtw3_ Flwʢ3+ʢd3dlddFd~59^?U~Bw ^2<6QCU](DK U|FarLt }wZ3}$2}$}$/Z~K<8Pt /VEJu Twi~5kEXU E*bDçgA0i$x1 z*27dQU5}z=[mKn!MC: ʴ5ogʴ5ԄݧDdF5SF5pzYIIEvAsh 3 }$m qeT- ڤu Ek> Eh Ac AcGP 35 K!?BO bbη b` b` i3" larq |}( t I tG T = &{ w yz > 1 bB k KD %'B   ) */ 7uo =J B T^ ] `Z ` c( d e v eE f1M gn k, rD" xz ~` " 9& I% I+Q I5R ; mN X J %p( , ,@( )9 ˔I P%O P= N[ V 68 :- f  f A 4] s sD AAR` 7c m, #-t~: 0N) E9 L% Lכ Mc\:N S_ Vc ]$1d f) f)B io> m` w  H? H@ $C .@W < i5  hI ̥ J JDZ t. k Ӈ  ̺I -DJ k k U)W <1 0  O  V t xHZ .-H 7FM >R >S >T >Y >eO >f > > DT I, RVG RV֡ RV S.ǻ S( Yk [ j7o? p- . Ba , T0 Ti T T c 2 )d~ V .0 .[ .jJ . .| .! a| y r"  t6 :bX) ʜ+ +>. 0E* ;ɾ Ptp Pt fe fe{ g iFC iE i u w wŒ wӷ w} w} w} M Uo ^r R X D t5p= t5 qY } )` nT'gT('*%*/E'U/EzTI_XXRue[ va.7vɅy$;~YUSdB$|Fݖ[y w C"#$U4%4:%4G-vϣ0i){0S1c{&2wT=DHJdYL$.2c5c5yC{~a`g0CN>kyPnt2*h(iT2%1, %2 r inte definierad%1, %2 not definedQ3Accel4Tvetydigt %1 hanteras inteAmbiguous %1 not handledQ3AccelTa bortDelete Q3DataTable FalsktFalse Q3DataTable InfogaInsert Q3DataTableSantTrue Q3DataTableUppdateraUpdate Q3DataTablep%1 Filen hittades inte. Kontrollera skvg och filnamn.+%1 File not found. Check path and filename. Q3FileDialog&Ta bort&Delete Q3FileDialog&Nej&No Q3FileDialog&OK&OK Q3FileDialog &ppna&Open Q3FileDialog&Byt namn&Rename Q3FileDialog &Spara&Save Q3FileDialog&Osorterad &Unsorted Q3FileDialog&Ja&Yes Q3FileDialogh<qt>r du sker p att du vill ta bort %1 "%2"?</qt>1Are you sure you wish to delete %1 "%2"? Q3FileDialogAlla filer (*) All Files (*) Q3FileDialog Alla filer (*.*)All Files (*.*) Q3FileDialogAttribut Attributes Q3FileDialogTillbakaBack Q3FileDialog AvbrytCancel Q3FileDialog8Kopiera eller ta bort en filCopy or Move a File Q3FileDialogSkapa ny mappCreate New Folder Q3FileDialog DatumDate Q3FileDialogTa bort %1 Delete %1 Q3FileDialogDetaljvy Detail View Q3FileDialogKatalogDir Q3FileDialogKataloger Directories Q3FileDialogKatalog: Directory: Q3FileDialogFelError Q3FileDialogFilFile Q3FileDialogFil&namn: File &name: Q3FileDialogFil&typ: File &type: Q3FileDialogHitta katalogFind Directory Q3FileDialogOtillgnglig Inaccessible Q3FileDialog Listvy List View Q3FileDialogLeta &i: Look &in: Q3FileDialogNamnName Q3FileDialogNy mapp New Folder Q3FileDialogNy mapp %1 New Folder %1 Q3FileDialogNy mapp 1 New Folder 1 Q3FileDialog En katalog upptOne directory up Q3FileDialog ppnaOpen Q3FileDialog ppnaOpen  Q3FileDialog6Frhandsgranska filinnehllPreview File Contents Q3FileDialog<Frhandsgranska filinformationPreview File Info Q3FileDialogUppdat&eraR&eload Q3FileDialogSkrivskyddad Read-only Q3FileDialogLs-skriv Read-write Q3FileDialogLs: %1Read: %1 Q3FileDialogSpara somSave As Q3FileDialogVlj en katalogSelect a Directory Q3FileDialog"Visa &dolda filerShow &hidden files Q3FileDialogStorlekSize Q3FileDialogSorteraSort Q3FileDialog(Sortera efter &datum Sort by &Date Q3FileDialog&Sortera efter &namn Sort by &Name Q3FileDialog,Sortera efter &storlek Sort by &Size Q3FileDialogSpecialSpecial Q3FileDialog6Symbolisk lnk till katalogSymlink to Directory Q3FileDialog.Symbolisk lnk till filSymlink to File Q3FileDialog6Symbolisk lnk till specialSymlink to Special Q3FileDialogTypType Q3FileDialogLsskyddad Write-only Q3FileDialogSkriv: %1 Write: %1 Q3FileDialogkatalogen the directory Q3FileDialog filenthe file Q3FileDialog"symboliska lnken the symlink Q3FileDialog<Kunde inte skapa katalogen %1Could not create directory %1 Q3LocalFs(Kunde inte ppna %1Could not open %1 Q3LocalFs8Kunde inte lsa katalogen %1Could not read directory %1 Q3LocalFsXKunde inte ta bort filen eller katalogen %1%Could not remove file or directory %1 Q3LocalFsJKunde inte byta namn p %1 till %2Could not rename %1 to %2 Q3LocalFs4Kunde inte skriva till %1Could not write %1 Q3LocalFsAnpassa... Customize... Q3MainWindowRada uppLine up Q3MainWindow@tgrden stoppades av anvndarenOperation stopped by the userQ3NetworkProtocol AvbrytCancelQ3ProgressDialogVerkstllApply Q3TabDialog AvbrytCancel Q3TabDialogStandardvrdenDefaults Q3TabDialog HjlpHelp Q3TabDialogOKOK Q3TabDialog&Kopiera&Copy Q3TextEditKlistra &in&Paste Q3TextEdit&Gr om&Redo Q3TextEdit &ngra&Undo Q3TextEditTmClear Q3TextEditKlipp u&tCu&t Q3TextEditMarkera alla Select All Q3TextEdit StngClose Q3TitleBar Stnger fnstretCloses the window Q3TitleBar`Innehller kommandon fr att manipulera fnstret*Contains commands to manipulate the window Q3TitleBarVisar namnet p fnstret och innehller kontroller fr att manipulera detFDisplays the name of the window and contains controls to manipulate it Q3TitleBar4Gr fnstret till helskrmMakes the window full screen Q3TitleBarMaximeraMaximize Q3TitleBarMinimeraMinimize Q3TitleBar2Flyttar fnstret ur vgenMoves the window out of the way Q3TitleBarnterstller ett maximerat fnster tillbaka till normalt&Puts a maximized window back to normal Q3TitleBarLterstller ett minimerat till normaltPuts a minimized back to normal Q3TitleBarterstll nedt Restore down Q3TitleBarterstll uppt Restore up Q3TitleBar SystemSystem Q3TitleBar Mer...More... Q3ToolBar(oknt) (unknown) Q3UrlOperatorProtokollet \"%1\" har inte std fr att kopiera eller flytta filer eller katalogerIThe protocol `%1' does not support copying or moving files or directories Q3UrlOperatorxProtokollet \"%1\" har inte std fr att skapa nya kataloger;The protocol `%1' does not support creating new directories Q3UrlOperatorhProtokollet \"%1\" har inte std fr att hmta filer0The protocol `%1' does not support getting files Q3UrlOperatorpProtokollet \"%1\" har inte std fr att lista kataloger6The protocol `%1' does not support listing directories Q3UrlOperatorhProtokollet \"%1\" har inte std fr att lmna filer0The protocol `%1' does not support putting files Q3UrlOperatorProtokollet \"%1\" har inte std fr att ta bort filer eller kataloger@The protocol `%1' does not support removing files or directories Q3UrlOperatorProtokollet \"%1\" har inte std fr att byta namn p filer eller kataloger@The protocol `%1' does not support renaming files or directories Q3UrlOperator8Protokollet \"%\" stds inte"The protocol `%1' is not supported Q3UrlOperator&Avbryt&CancelQ3Wizard&Frdig&FinishQ3Wizard &Hjlp&HelpQ3Wizard&Nsta >&Next >Q3Wizard< Till&baka< &BackQ3Wizard(Anslutningen nekadesConnection refusedQAbstractSocketHTidsgrnsen fr anslutning verstegsConnection timed outQAbstractSocket(Vrden hittades inteHost not foundQAbstractSocket0Ntverket r inte nbartNetwork unreachableQAbstractSocket0Uttaget r inte anslutetSocket is not connectedQAbstractSocketHTidsgrns fr uttagstgrd verstegsSocket operation timed outQAbstractSocket&Stega uppt&Step upQAbstractSpinBoxStega &nedt Step &downQAbstractSpinBoxAktiveraActivate QApplicationDAktiverar programmets huvudfnster#Activates the program's main window QApplicationVBinren \"%1\" krver Qt %2, hittade Qt %3.,Executable '%1' requires Qt %2, found Qt %3. QApplication<Inkompatibelt Qt-biblioteksfelIncompatible Qt Library Error QApplicationLTRQT_LAYOUT_DIRECTION QApplication&Avbryt&Cancel QAxSelectCOM-&objekt: COM &Object: QAxSelectOKOK QAxSelect(Vlj ActiveX ControlSelect ActiveX Control QAxSelect KryssaCheck QCheckBox VxlaToggle QCheckBoxAvkryssaUncheck QCheckBox:&Lgg till i anpassade frger&Add to Custom Colors QColorDialog&Basfrger &Basic colors QColorDialog"&Anpassade frger&Custom colors QColorDialog &Grn:&Green: QColorDialog &Rd:&Red: QColorDialog&Mttnad:&Sat: QColorDialog&Ljushet:&Val: QColorDialogAlfa&kanal:A&lpha channel: QColorDialog Bl&:Bl&ue: QColorDialogNya&ns:Hu&e: QColorDialog StngClose QComboBox FalsktFalse QComboBox ppnaOpen QComboBoxSantTrue QComboBoxBKunde inte verkstlla transaktionUnable to commit transaction QDB2Driver$Kunde inte anslutaUnable to connect QDB2DriverJKunde inte rulla tillbaka transaktionUnable to rollback transaction QDB2DriverZKunde inte stlla in automatisk verkstllningUnable to set autocommit QDB2Driver2Kunde inte binda variabelUnable to bind variable QDB2Result2Kunde inte kra frgesatsUnable to execute statement QDB2Result.Kunde inte hmta frstaUnable to fetch first QDB2Result,Kunde inte hmta nstaUnable to fetch next QDB2Result4Kunde inte hmta posten %1Unable to fetch record %1 QDB2Result<Kunde inte frbereda frgesatsUnable to prepare statement QDB2ResultAMAM QDateTimeEditPMPM QDateTimeEditamam QDateTimeEditpmpm QDateTimeEditVad r det hr? What's This?QDialog&Avbryt&CancelQDialogButtonBox &Stng&CloseQDialogButtonBox&Nej&NoQDialogButtonBox&OK&OKQDialogButtonBox &Spara&SaveQDialogButtonBox&Ja&YesQDialogButtonBox AvbrytAbortQDialogButtonBoxVerkstllApplyQDialogButtonBox AvbrytCancelQDialogButtonBox StngCloseQDialogButtonBoxFrkastaDiscardQDialogButtonBoxSpara inte Don't SaveQDialogButtonBox HjlpHelpQDialogButtonBoxIgnoreraIgnoreQDialogButtonBoxN&ej till alla N&o to AllQDialogButtonBoxOKOKQDialogButtonBox ppnaOpenQDialogButtonBoxterstllResetQDialogButtonBox0terstll standardvrdenRestore DefaultsQDialogButtonBoxFrsk igenRetryQDialogButtonBox SparaSaveQDialogButtonBoxSpara allaSave AllQDialogButtonBoxJa till &alla Yes to &AllQDialogButtonBoxndringsdatum Date Modified QDirModelSortKind QDirModelNamnName QDirModelStorlekSize QDirModelTypType QDirModel StngClose QDockWidget MindreLessQDoubleSpinBoxMerMoreQDoubleSpinBox&OK&OK QErrorMessage6&Visa detta meddelande igen&Show this message again QErrorMessage,Felskningsmeddelande:Debug Message: QErrorMessagedesdigert fel: Fatal Error: QErrorMessageVarning:Warning: QErrorMessage%1 Katalogen hittades inte. Kontrollera att det korrekta katalognamnet angavs.K%1 Directory not found. Please verify the correct directory name was given. QFileDialog%1 Filen hittades inte. Kontrollera att det korrekta filnamnet angavs.A%1 File not found. Please verify the correct file name was given. QFileDialogJ%1 finns redan. Vill du erstta den?-%1 already exists. Do you want to replace it? QFileDialog&Ta bort&Delete QFileDialog &ppna&Open QFileDialog&Byt namn&Rename QFileDialog &Spara&Save QFileDialogd\"%1\" r skrivskyddad. Vill du ta bort den nd?9'%1' is write protected. Do you want to delete it anyway? QFileDialogAlla filer (*) All Files (*) QFileDialog Alla filer (*.*)All Files (*.*) QFileDialogTr du sker p att du vill ta bort \"%1\"?!Are sure you want to delete '%1'? QFileDialogTillbakaBack QFileDialog:Kunde inte ta bort katalogen.Could not delete directory. QFileDialogSkapa ny mappCreate New Folder QFileDialogDetaljerad vy Detail View QFileDialogKataloger Directories QFileDialogKatalog: Directory: QFileDialog EnhetDrive QFileDialogFilFile QFileDialogFil&namn: File &name: QFileDialogFiler av typen:Files of type: QFileDialogHitta katalogFind Directory QFileDialog FramtForward QFileDialog Listvy List View QFileDialogMin dator My Computer QFileDialogNy mapp New Folder QFileDialog ppnaOpen QFileDialogFrldrakatalogParent Directory QFileDialogSpara somSave As QFileDialog"Visa &dolda filerShow &hidden files QFileDialog OkntUnknown QFileDialogndringsdatum Date ModifiedQFileSystemModelSortKindQFileSystemModelMin dator My ComputerQFileSystemModelNamnNameQFileSystemModelStorlekSizeQFileSystemModelTypTypeQFileSystemModel&Typsnitt&Font QFontDialog&Storlek&Size QFontDialog&Understruken &Underline QFontDialogEffekterEffects QFontDialogT&ypsnittsstil Font st&yle QFontDialogTestSample QFontDialogVlj typsnitt Select Font QFontDialogGenomstru&ken Stri&keout QFontDialogSkr&ivsystemWr&iting System QFontDialogBByte av katalog misslyckades: %1Changing directory failed: %1QFtp(Ansluten till vrdenConnected to hostQFtp.Ansluten till vrden %1Connected to host %1QFtpPAnslutning till vrden misslyckades: %1Connecting to host failed: %1QFtp&Anslutningen stngdConnection closedQFtpLAnslutning vgrades fr dataanslutning&Connection refused for data connectionQFtpHAnslutningen till vrden %1 vgradesConnection refused to host %1QFtp:Anslutningen till %1 stngdesConnection to %1 closedQFtpPSkapandet av katalogen misslyckades: %1Creating directory failed: %1QFtpPNedladdningen av filen misslyckades: %1Downloading file failed: %1QFtp$Vrden %1 hittades Host %1 foundQFtp.Vrden %1 hittades inteHost %1 not foundQFtpVrden hittades Host foundQFtpNListning av katalogen misslyckades: %1Listing directory failed: %1QFtp8Inloggning misslyckades: %1Login failed: %1QFtpInte ansluten Not connectedQFtpTBorttagning av katalogen misslyckades: %1Removing directory failed: %1QFtpLBorttagning av filen misslyckades: %1Removing file failed: %1QFtpOknt fel Unknown errorQFtpPUppladdningen av filen misslyckades: %1Uploading file failed: %1QFtpOknt fel Unknown error QHostInfo(Vrden hittades inteHost not foundQHostInfoAgentOknd adresstypUnknown address typeQHostInfoAgentOknt fel Unknown errorQHostInfoAgent$Ansluten till vrdConnected to hostQHttp.Ansluten till vrden %1Connected to host %1QHttp&Anslutningen stngdConnection closedQHttp(Anslutningen nekadesConnection refusedQHttp:Anslutningen till %1 stngdesConnection to %1 closedQHttp2HTTP-begran misslyckadesHTTP request failedQHttp$Vrden %1 hittades Host %1 foundQHttp.Vrden %1 hittades inteHost %1 not foundQHttpVrden hittades Host foundQHttp2Ogiltig HTTP chunked bodyInvalid HTTP chunked bodyQHttp.Ogiltig HTTP-svarshuvudInvalid HTTP response headerQHttpLIngen server instlld att ansluta tillNo server set to connect toQHttpBegran avbrtsRequest abortedQHttpHServern stngde ovntat anslutningen%Server closed connection unexpectedlyQHttpOknt fel Unknown errorQHttp$Fel innehllslngdWrong content lengthQHttp:Kunde inte starta transaktionCould not start transaction QIBaseDriver4Fel vid ppning av databasError opening database QIBaseDriverBKunde inte verkstlla transaktionUnable to commit transaction QIBaseDriverJKunde inte rulla tillbaka transaktionUnable to rollback transaction QIBaseDriver:Kunde inte allokera frgesatsCould not allocate statement QIBaseResultNKunde inte beskriva inmatningsfrgesats"Could not describe input statement QIBaseResult:Kunde inte beskriva frgesatsCould not describe statement QIBaseResult6Kunde inte hmta nsta postCould not fetch next item QIBaseResult,Kunde inte hitta kedjaCould not find array QIBaseResult.Kunde inte f kedjedataCould not get array data QIBaseResultDKunde inte g frgesatsinformationCould not get query info QIBaseResultDKunde inte f frgesatsinformationCould not get statement info QIBaseResult<Kunde inte frbereda frgesatsCould not prepare statement QIBaseResult:Kunde inte starta transaktionCould not start transaction QIBaseResult6Kunde inte stnga frgesatsUnable to close statement QIBaseResultBKunde inte verkstlla transaktionUnable to commit transaction QIBaseResult*Kunde inte skapa BLOBUnable to create BLOB QIBaseResult2Kunde inte kra frgesatsUnable to execute query QIBaseResult*Kunde inte ppna BLOBUnable to open BLOB QIBaseResult(Kunde inte lsa BLOBUnable to read BLOB QIBaseResult,Kunde inte skriva BLOBUnable to write BLOB QIBaseResult>Inget ledigt utrymme p enhetenNo space left on device QIODevice:Ingen sdan fil eller katalogNo such file or directory QIODevicetkomst nekadPermission denied QIODevice*Fr mnga ppna filerToo many open files QIODeviceOknt fel Unknown error QIODevice0Mac OS X-inmatningsmetodMac OS X input method QInputContext.Windows-inmatningsmetodWindows input method QInputContextXIMXIM QInputContext&XIM-inmatningsmetodXIM input method QInputContextOknt fel Unknown errorQLibrary&Kopiera&Copy QLineEditKlistra &in&Paste QLineEdit&Gr om&Redo QLineEdit &ngra&Undo QLineEditKlipp &utCu&t QLineEditTa bortDelete QLineEditMarkera alla Select All QLineEdit<Kunde inte pbrja transaktionUnable to begin transaction QMYSQLDriverBKunde inte verkstlla transaktionUnable to commit transaction QMYSQLDriver$Kunde inte anslutaUnable to connect QMYSQLDriver:Kunde inte ppna databasen \"Unable to open database ' QMYSQLDriverJKunde inte rulla tillbaka transaktionUnable to rollback transaction QMYSQLDriver2Kunde inte binda utvrdenUnable to bind outvalues QMYSQLResult,Kunde inte binda vrdeUnable to bind value QMYSQLResult2Kunde inte kra frgesatsUnable to execute query QMYSQLResult2Kunde inte kra frgesatsUnable to execute statement QMYSQLResult*Kunde inte hmta dataUnable to fetch data QMYSQLResult<Kunde inte frbereda frgesatsUnable to prepare statement QMYSQLResult>Kunde inte terstlla frgesatsUnable to reset statement QMYSQLResult2Kunde inte lagra resultatUnable to store result QMYSQLResultPKunde inte lagra resultat frn frgesats!Unable to store statement results QMYSQLResult%1 - [%2] %1 - [%2] QMdiSubWindow &Stng&Close QMdiSubWindow&Flytta&Move QMdiSubWindowte&rstll&Restore QMdiSubWindow&Storlek&Size QMdiSubWindow StngClose QMdiSubWindow HjlpHelp QMdiSubWindowMa&ximera Ma&ximize QMdiSubWindowMaximeraMaximize QMdiSubWindowMenyMenu QMdiSubWindowMi&nimera Mi&nimize QMdiSubWindowMinimeraMinimize QMdiSubWindowterstll nedt Restore Down QMdiSubWindow&Stanna kvar vers&t Stay on &Top QMdiSubWindow StngCloseQMenuKrExecuteQMenu ppnaOpenQMenu Om QtAbout Qt QMessageBox HjlpHelp QMessageBox Dlj detaljer,,,Hide Details... QMessageBoxOKOK QMessageBox Visa detaljer...Show Details... QMessageBox(Vlj inmatningsmetod Select IMQMultiInputContextFVxlare fr flera inmatningsmetoderMultiple input method switcherQMultiInputContextPluginVxlare fr flera inmatningsmetoder som anvnder sammanhangsmenyn fr textwidgarMMultiple input method switcher that uses the context menu of the text widgetsQMultiInputContextPluginVEtt annat uttag lyssnar redan p samma port4Another socket is already listening on the same portQNativeSocketEngineFrsk att anvnda IPv6-uttag p en plattform som saknar IPv6-std=Attempt to use IPv6 socket on a platform with no IPv6 supportQNativeSocketEngine*Anslutningen vgradesConnection refusedQNativeSocketEngineHTidsgrnsen fr anslutning verstegsConnection timed outQNativeSocketEngineHDatagram fr fr stor fr att skickaDatagram was too large to sendQNativeSocketEngine(Vrden r inte nbarHost unreachableQNativeSocketEngine0Ogiltig uttagsbeskrivareInvalid socket descriptorQNativeSocketEngineNtverksfel Network errorQNativeSocketEngineLTidsgrns fr ntverkstgrd verstegsNetwork operation timed outQNativeSocketEngine0Ntverket r inte nbartNetwork unreachableQNativeSocketEngine(tgrd p icke-uttagOperation on non-socketQNativeSocketEngine Slut p resurserOut of resourcesQNativeSocketEnginetkomst nekadPermission deniedQNativeSocketEngine2Protokolltypen stds inteProtocol type not supportedQNativeSocketEngine8Adressen r inte tillgngligThe address is not availableQNativeSocketEngine&Adressen r skyddadThe address is protectedQNativeSocketEngine:Bindningsadress anvnds redan#The bound address is already in useQNativeSocketEngine@Fjrrvrden stngde anslutningen%The remote host closed the connectionQNativeSocketEngineNKunde inte initiera uttag fr broadcast%Unable to initialize broadcast socketQNativeSocketEngineTKunde inte initiera icke-blockerande uttag(Unable to initialize non-blocking socketQNativeSocketEngineBKunde inte ta emot ett meddelandeUnable to receive a messageQNativeSocketEngine@Kunde inte skicka ett meddelandeUnable to send a messageQNativeSocketEngine"Kunde inte skrivaUnable to writeQNativeSocketEngineOknt fel Unknown errorQNativeSocketEngine2Uttagstgrden stds inteUnsupported socket operationQNativeSocketEngine<Kunde inte pbrja transaktionUnable to begin transaction QOCIDriverBKunde inte verkstlla transaktionUnable to commit transaction QOCIDriver&Kunde inte logga inUnable to logon QOCIDriverJKunde inte rulla tillbaka transaktionUnable to rollback transaction QOCIDriver:Kunde inte allokera frgesatsUnable to alloc statement QOCIResultNKunde inte binda kolumn fr satskrning'Unable to bind column for batch execute QOCIResult,Kunde inte binda vrdeUnable to bind value QOCIResult2Kunde inte kra satsfrga!Unable to execute batch statement QOCIResult2Kunde inte kra frgesatsUnable to execute statement QOCIResult0Kunde inte g till nstaUnable to goto next QOCIResult<Kunde inte frbereda frgesatsUnable to prepare statement QOCIResultBKunde inte verkstlla transaktionUnable to commit transaction QODBCDriver$Kunde inte anslutaUnable to connect QODBCDriverKunde inte ansluta - Drivrutinen har inte std fr all ndvndig funktionalitetCUnable to connect - Driver doesn't support all needed functionality QODBCDriver\Kunde inte inaktivera automatisk verkstllningUnable to disable autocommit QODBCDriverXKunde inte aktivera automatisk verkstllningUnable to enable autocommit QODBCDriverJKunde inte rulla tillbaka transaktionUnable to rollback transaction QODBCDriverQODBCResult::reset: Kunde inte stlla in \"SQL_CURSOR_STATIC\" som frgesatsattribut. Kontrollera konfigurationen fr din ODBC-drivrutinyQODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult2Kunde inte binda variabelUnable to bind variable QODBCResult2Kunde inte kra frgesatsUnable to execute statement QODBCResult.Kunde inte hmta frstaUnable to fetch first QODBCResult,Kunde inte hmta nstaUnable to fetch next QODBCResult<Kunde inte frbereda frgesatsUnable to prepare statement QODBCResultHomeHomeQObjectNamnNameQPPDOptionsModel VrdeValueQPPDOptionsModel<Kunde inte pbrja transaktionCould not begin transaction QPSQLDriverBKunde inte verkstlla transaktionCould not commit transaction QPSQLDriverJKunde inte rulla tillbaka transaktionCould not rollback transaction QPSQLDriver$Kunde inte anslutaUnable to connect QPSQLDriver,Kunde inte skapa frgaUnable to create query QPSQLResult<Kunde inte frbereda frgesatsUnable to prepare statement QPSQLResultLiggande LandscapeQPageSetupWidgetSidstorlek: Page size:QPageSetupWidgetPappersklla: Paper source:QPageSetupWidgetStendePortraitQPageSetupWidgetOknt fel Unknown error QPluginLoaderR%1 finns redan. Vill du skriva ver den?/%1 already exists. Do you want to overwrite it? QPrintDialog$A0 (841 x 1189 mm)A0 (841 x 1189 mm) QPrintDialog"A1 (594 x 841 mm)A1 (594 x 841 mm) QPrintDialog"A2 (420 x 594 mm)A2 (420 x 594 mm) QPrintDialog"A3 (297 x 420 mm)A3 (297 x 420 mm) QPrintDialogDA4 (210 x 297 mm, 8.26 x 11.7 tum)%A4 (210 x 297 mm, 8.26 x 11.7 inches) QPrintDialog"A5 (148 x 210 mm)A5 (148 x 210 mm) QPrintDialog"A6 (105 x 148 mm)A6 (105 x 148 mm) QPrintDialog A7 (74 x 105 mm)A7 (74 x 105 mm) QPrintDialogA8 (52 x 74 mm)A8 (52 x 74 mm) QPrintDialogA9 (37 x 52 mm)A9 (37 x 52 mm) QPrintDialogAlias: %1 Aliases: %1 QPrintDialog&B0 (1000 x 1414 mm)B0 (1000 x 1414 mm) QPrintDialog$B1 (707 x 1000 mm)B1 (707 x 1000 mm) QPrintDialog B10 (31 x 44 mm)B10 (31 x 44 mm) QPrintDialog"B2 (500 x 707 mm)B2 (500 x 707 mm) QPrintDialog"B3 (353 x 500 mm)B3 (353 x 500 mm) QPrintDialog"B4 (250 x 353 mm)B4 (250 x 353 mm) QPrintDialogDB5 (176 x 250 mm, 6.93 x 9.84 tum)%B5 (176 x 250 mm, 6.93 x 9.84 inches) QPrintDialog"B6 (125 x 176 mm)B6 (125 x 176 mm) QPrintDialog B7 (88 x 125 mm)B7 (88 x 125 mm) QPrintDialogB8 (62 x 88 mm)B8 (62 x 88 mm) QPrintDialogB9 (44 x 62 mm)B9 (44 x 62 mm) QPrintDialog$C5E (163 x 229 mm)C5E (163 x 229 mm) QPrintDialog$DLE (110 x 220 mm)DLE (110 x 220 mm) QPrintDialogLExecutive (7.5 x 10 tum, 191 x 254 mm))Executive (7.5 x 10 inches, 191 x 254 mm) QPrintDialogfFilen %1 r inte skrivbar. Vlj ett annat filnamn.=File %1 is not writable. Please choose a different file name. QPrintDialog(Folio (210 x 330 mm)Folio (210 x 330 mm) QPrintDialog*Ledger (432 x 279 mm)Ledger (432 x 279 mm) QPrintDialogDLegal (8.5 x 14 tum, 216 x 356 mm)%Legal (8.5 x 14 inches, 216 x 356 mm) QPrintDialogFLetter (8.5 x 11 tum, 216 x 279 mm)&Letter (8.5 x 11 inches, 216 x 279 mm) QPrintDialogOKOK QPrintDialogSkriv utPrint QPrintDialog*Skriv ut till fil ...Print To File ... QPrintDialogSkriv ut alla Print all QPrintDialog$Skriv ut intervall Print range QPrintDialog,Tabloid (279 x 432 mm)Tabloid (279 x 432 mm) QPrintDialogJUS Common #10 Envelope (105 x 241 mm)%US Common #10 Envelope (105 x 241 mm) QPrintDialoglokalt anslutenlocally connected QPrintDialog okntunknown QPrintDialog StngCloseQPrintPreviewDialogLiggande LandscapeQPrintPreviewDialogStendePortraitQPrintPreviewDialogSorteraCollateQPrintSettingsOutput KopiorCopiesQPrintSettingsOutputSidor frn Pages fromQPrintSettingsOutputSkriv ut alla Print allQPrintSettingsOutput$Skriv ut intervall Print rangeQPrintSettingsOutputVal SelectionQPrintSettingsOutputtilltoQPrintSettingsOutputSkrivarePrinter QPrintWidget AvbrytCancelQProgressDialog ppnaOpen QPushButton KryssaCheck QRadioButton4felaktig teckenklasssyntaxbad char class syntaxQRegExp.felaktig seframtsyntaxbad lookahead syntaxQRegExp4felaktig upprepningssyntaxbad repetition syntaxQRegExp8inaktiverad funktion anvndsdisabled feature usedQRegExp*ogiltigt oktalt vrdeinvalid octal valueQRegExp$ndde intern grnsmet internal limitQRegExp2saknar vnster avgrnsaremissing left delimQRegExp&inga fel intrffadeno error occurredQRegExpovntat slutunexpected endQRegExp4Fel vid ppning av databasError to open databaseQSQLite2Driver<Kunde inte pbrja transaktionUnable to begin transactionQSQLite2DriverBKunde inte verkstlla transaktionUnable to commit transactionQSQLite2DriverJKunde inte rulla tillbaka transaktionUnable to rollback TransactionQSQLite2Driver2Kunde inte kra frgesatsUnable to execute statementQSQLite2Result2Kunde inte hmta resultatUnable to fetch resultsQSQLite2Result8Fel vid stngning av databasError closing database QSQLiteDriver4Fel vid ppning av databasError opening database QSQLiteDriver<Kunde inte pbrja transaktionUnable to begin transaction QSQLiteDriverBKunde inte verkstlla transaktionUnable to commit transaction QSQLiteDriverJKunde inte rulla tillbaka transaktionUnable to rollback transaction QSQLiteDriver6Parameterantal stmmer inteParameter count mismatch QSQLiteResult6Kunde inte binda parametrarUnable to bind parameters QSQLiteResult2Kunde inte kra frgesatsUnable to execute statement QSQLiteResult(Kunde inte hmta radUnable to fetch row QSQLiteResult>Kunde inte terstlla frgesatsUnable to reset statement QSQLiteResultNederkantBottom QScrollBarVnsterkant Left edge QScrollBarRad nedt Line down QScrollBarRada uppLine up QScrollBarSida nedt Page down QScrollBarSida vnster Page left QScrollBarSida hger Page right QScrollBarSida upptPage up QScrollBarPositionPosition QScrollBarHgerkant Right edge QScrollBarRulla nedt Scroll down QScrollBarRulla hr Scroll here QScrollBarRulla vnster Scroll left QScrollBarRulla hger Scroll right QScrollBarRulla uppt Scroll up QScrollBarverkantTop QScrollBar++ QShortcutAltAlt QShortcut BaktBack QShortcutBacksteg Backspace QShortcutBacktabBacktab QShortcutFrstrk bas Bass Boost QShortcutSnk bas Bass Down QShortcutHj basBass Up QShortcutRing uppCall QShortcutCaps Lock Caps Lock QShortcutCapsLockCapsLock QShortcutSammanhang1Context1 QShortcutSammanhang2Context2 QShortcutSammanhang3Context3 QShortcutSammanhang4Context4 QShortcutCtrlCtrl QShortcutDelDel QShortcut DeleteDelete QShortcutNedDown QShortcutEndEnd QShortcut EnterEnter QShortcutEscEsc QShortcut EscapeEscape QShortcutF%1F%1 QShortcutFavoriter Favorites QShortcutVndFlip QShortcut FramtForward QShortcutLgg pHangup QShortcut HjlpHelp QShortcutHomeHome QShortcutHemsida Home Page QShortcutInsIns QShortcut InsertInsert QShortcutStarta (0) Launch (0) QShortcutStarta (1) Launch (1) QShortcutStarta (2) Launch (2) QShortcutStarta (3) Launch (3) QShortcutStarta (4) Launch (4) QShortcutStarta (5) Launch (5) QShortcutStarta (6) Launch (6) QShortcutStarta (7) Launch (7) QShortcutStarta (8) Launch (8) QShortcutStarta (9) Launch (9) QShortcutStarta (A) Launch (A) QShortcutStarta (B) Launch (B) QShortcutStarta (C) Launch (C) QShortcutStarta (D) Launch (D) QShortcutStarta (E) Launch (E) QShortcutStarta (F) Launch (F) QShortcutStarta e-post Launch Mail QShortcutStarta media Launch Media QShortcutVnsterLeft QShortcutMedia nsta Media Next QShortcutMedia spela upp Media Play QShortcut Media fregendeMedia Previous QShortcutMedia spela in Media Record QShortcutMedia stopp Media Stop QShortcutMenyMenu QShortcutMetaMeta QShortcutNejNo QShortcutNum LockNum Lock QShortcutNumLockNumLock QShortcutNumber Lock Number Lock QShortcutppna urlOpen URL QShortcutPage Down Page Down QShortcutPage UpPage Up QShortcut PausePause QShortcut PgDownPgDown QShortcutPgUpPgUp QShortcut PrintPrint QShortcutPrint Screen Print Screen QShortcutUppdateraRefresh QShortcut ReturnReturn QShortcut HgerRight QShortcutScroll Lock Scroll Lock QShortcutScrollLock ScrollLock QShortcutSkSearch QShortcutVljSelect QShortcut ShiftShift QShortcutMellanslagSpace QShortcutAvvaktaStandby QShortcut StoppaStop QShortcut SysReqSysReq QShortcutSystem RequestSystem Request QShortcutTabTab QShortcutSnk diskant Treble Down QShortcutHj diskant Treble Up QShortcutUppUp QShortcutSnk volym Volume Down QShortcutVolym tyst Volume Mute QShortcutHj volym Volume Up QShortcutJaYes QShortcutSida nedt Page downQSliderSida vnster Page leftQSliderSida hger Page rightQSliderSida upptPage upQSliderPositionPositionQSliderLTidsgrns fr ntverkstgrd verstegsNetwork operation timed outQSocks5SocketEngine MindreLessQSpinBoxMerMoreQSpinBox AvbrytCancelQSql2Avbryt dina redigeringar?Cancel your edits?QSqlBekrftaConfirmQSqlTa bortDeleteQSql&Ta bort denna post?Delete this record?QSql InfogaInsertQSqlNejNoQSql&Spara redigeringar? Save edits?QSqlUppdateraUpdateQSqlJaYesQSql6Kunde inte ppna anslutningUnable to open connection QTDSDriver8Kunde inte anvnda databasenUnable to use database QTDSDriverRulla vnster Scroll LeftQTabBarRulla hger Scroll RightQTabBar&Kopiera&Copy QTextControlKlistra &in&Paste QTextControl&Gr om&Redo QTextControl &ngra&Undo QTextControl$Kopiera &lnkplatsCopy &Link Location QTextControlKlipp u&tCu&t QTextControlTa bortDelete QTextControlMarkera alla Select All QTextControl ppnaOpen QToolButton TryckPress QToolButtonHDenna plattform saknar std fr IPv6#This platform does not support IPv6 QUdpSocket Gr omRedo QUndoGroup ngraUndo QUndoGroup <tom> QUndoModel Gr omRedo QUndoStack ngraUndo QUndoStack:Infoga unicode-kontrolltecken Insert Unicode control characterQUnicodeControlCharacterMenu U+202A$LRE Start of left-to-right embeddingQUnicodeControlCharacterMenu U+200ELRM Left-to-right markQUnicodeControlCharacterMenu U+202D#LRO Start of left-to-right overrideQUnicodeControlCharacterMenu U+202CPDF Pop directional formattingQUnicodeControlCharacterMenu U+202B$RLE Start of right-to-left embeddingQUnicodeControlCharacterMenu U+200FRLM Right-to-left markQUnicodeControlCharacterMenu U+202E#RLO Start of right-to-left overrideQUnicodeControlCharacterMenu U+200DZWJ Zero width joinerQUnicodeControlCharacterMenu U+200CZWNJ Zero width non-joinerQUnicodeControlCharacterMenu U+200BZWSP Zero width spaceQUnicodeControlCharacterMenuNederkantBottomQWebPageIgnoreraIgnoreQWebPageIgnorera Ignore Grammar context menu itemIgnoreQWebPageVnsterkant Left edgeQWebPageSida nedt Page downQWebPageSida vnster Page leftQWebPageSida hger Page rightQWebPageSida upptPage upQWebPageterstllResetQWebPageHgerkant Right edgeQWebPageRulla nedt Scroll downQWebPageRulla hr Scroll hereQWebPageRulla vnster Scroll leftQWebPageRulla hger Scroll rightQWebPageRulla uppt Scroll upQWebPage StoppaStopQWebPageverkantTopQWebPage OkntUnknownQWebPageVad r det hr? What's This?QWhatsThisAction**QWidget&Frdig&FinishQWizard &Hjlp&HelpQWizard&Nsta >&Next >QWizard< Till&baka< &BackQWizard AvbrytCancelQWizard HjlpHelpQWizard%1 - [%2] %1 - [%2] QWorkspace &Stng&Close QWorkspace&Flytta&Move QWorkspacete&rstll&Restore QWorkspace&Storlek&Size QWorkspaceA&vskugga&Unshade QWorkspace StngClose QWorkspaceMa&ximera Ma&ximize QWorkspaceMi&nimera Mi&nimize QWorkspaceMinimeraMinimize QWorkspaceterstll nedt Restore Down QWorkspaceSkugg&aSh&ade QWorkspace&Stanna kvar vers&t Stay on &Top QWorkspacekodningsdeklarering eller fristende deklarering frvntades vid lsning av XML-deklareringenYencoding declaration or standalone declaration expected while reading the XML declarationQXmlXfel i textdeklareringen av en extern entitet3error in the text declaration of an external entityQXmlPfel intrffade vid tolkning av kommentar$error occurred while parsing commentQXmlNfel intrffade vid tolkning av innehll$error occurred while parsing contentQXmljfel intrffade vid tolkning av dokumenttypsdefinition5error occurred while parsing document type definitionQXmlLfel intrffade vid tolkning av element$error occurred while parsing elementQXmlNfel intrffade vid tolkning av referens&error occurred while parsing referenceQXml2fel utlstes av konsumenterror triggered by consumerQXmlpextern tolkad allmn entitetsreferens tillts inte i DTD;external parsed general entity reference not allowed in DTDQXmlextern tolkad allmn entitetsreferens tillts inte i attributvrdeGexternal parsed general entity reference not allowed in attribute valueQXmlbintern allmn entitetsreferens tillts inte i DTD4internal general entity reference not allowed in DTDQXmlPogiltigt namn fr behandlingsinstruktion'invalid name for processing instructionQXml&bokstav frvntadesletter is expectedQXmlBfler n en dokumenttypsdefinition&more than one document type definitionQXml&inga fel intrffadeno error occurredQXml&rekursiva entiteterrecursive entitiesQXmlfristende deklarering frvntades vid lsning av XML-deklareringAstandalone declaration expected while reading the XML declarationQXml"tagg stmmer inte tag mismatchQXmlovntat teckenunexpected characterQXml*ovntat slut p filenunexpected end of fileQXmlRotolkad entitetsreferens i fel sammanhang*unparsed entity reference in wrong contextQXmlhversion frvntades vid lsning av XML-deklareringen2version expected while reading the XML declarationQXmlHfel vrde fr fristende deklarering&wrong value for standalone declarationQXmlqstopmotion-2.3.2-Source/translations/qstopmotion_fr.qm000644 000000 000000 00000172013 13011043104 023460 0ustar00rootroot000000 000000 *0Mu*5B+fM+N+NH+įN939GjGoWHw99+Hw9cHϞJ67J69dJ6Jcb=K LMPjX|yYbDZ\[z'\^Cu`af *lV=)A )ڄ;ڄ J1\Yn)RLr1K%TQc+NkO*pwOt@~Vx?E^jN +j1.lt+:2+k.ͣ$>$.|+=>Μ>,u>5y@MʠhL86 W6A6Fޅzs@w~pvm#TDd'^%8EnXFɮgxUNub\u e@EFpAqY-.JPzt 5A5#RK  J}0K4x.  C: C!!@#GG#GLB~ M%M%]NoVnkirqN}%t@t92BA4<3Iqn+iPc%ZsvNƒqլjCJ7؃eĘpܓ~釥q<:=.$ *15^(d;^SYe[7l 2l 2>vJ{.*48jft!8fVn5ܑI*%nr_T ',GIxPYpcZ-]h9`^rl.VH˲L P`dlo֣x֣F2y܄!3m  GZI ֑BnVxjz\ w2NZZAO^zޢ~SD!~v!~#GW#. Xq {JH+[w6N@APO]g!oc+zB[{^զ}d&7_QW(/{ӏ~9" Q$Z %< 6 -] US .8 5un 5 Ehs Po [‚B h> h>@ h>t h> lao qT zm' 5 f t{ C; { @j, Ƚ0 ȽKx q IT . , q" * 542 [5 eep ee hz% h h s( sa^ xj ^ s` sa~ ! 8 I R} v vM n ۰ 1 ! # ;  b` f pP~[3 yN |>i J ' b _ <! :  ( >Oi Ч /z -du{; 0 Gj Gj| KCq N0rZ ].d ]G g k}E oQ> oS +!7B y  J Yc D> 1bF v I. IH Fc| ;X w ߚ 4A 4 Ps/} bq8  z ,y> ?N Mԇ `jHv i$A w PF P Z P1c PK 2 N  y/ yJSO/IeϱGc LN,s^C.06;VS_Vȑ5kv>fUw5sDo\9t8\tvjdpx<GOT0`h#>qc͟ k duȺ7Du?~ ÓC9wy)0>y)K-v)t4^E iA &propos&About AboutDialog$Accord de &licence&Licence Agreement AboutDialog.&Information du systme &System Info AboutDialog &Remerciements  &Thanks To AboutDialogA&uteursA&uthors AboutDialogA proposAbout AboutDialog8Moment de la cration: %1 %2Build time: %1 %2 AboutDialogParticipants Contributors AboutDialogTchqueCzech AboutDialog DanoisDanish AboutDialogFranaisFrench AboutDialogAllemandGerman AboutDialog.Dveloppeurs principauxMain developers AboutDialogOKOK AboutDialogRnom et version du systme d'exploitation:#Operating system name and version:  AboutDialogBVersion du temps d'xecution Qt: Qt runtime version:  AboutDialog SudeSwedish AboutDialogC'est le programme qStopMotion pour crer des animations en volume.HThis is the qStopMotion application for creating stop motion animations. AboutDialogxCe programme est mis en place sous les conditions de GPL v2.:This program is distributed under the terms of the GPL v2. AboutDialogTraduction Translation AboutDialogMac OS inconnuUnknown Mac OS AboutDialog$Windows OS inconnuUnknown Windows OS AboutDialogVersion:  Version:  AboutDialogetand AboutDialogxqStopMotion est un fork des animations en volume pour linux..qStopMotion is a fork of stopmotion for linux. AboutDialogAjouter le son Add SoundAnimationProjectxIl n'est pas possible d'ouvrir le fichier audio pour le lire. Veuillez vrifier si vous avez mis les bons droits d'accs. L'animation est visualise sans son si vous choisissez de le lire.Cannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play.AnimationProjectVEnregistrer les scnes sur le disque dur...Saving scenes to disk ...AnimationProjectLe fichier audio choisi n'a pas de format audio valide. L'animation est visualise sans son si vous choisissez de le lire.The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play.AnimationProject&Fermer&CloseCameraControllerDialog8&Reinitialisation par dfaut&Reset to DefaultCameraControllerDialog0Annuler Rinitialisation Abort ResetCameraControllerDialogTcompensation automatique du rtroclairage Automatic Backlight CompensationCameraControllerDialog$clart automatiqueAutomatic BrightnessCameraControllerDialogHautorisation automatique de couleursAutomatic Color EnableCameraControllerDialog*Contraste automatiqueAutomatic ContrastCameraControllerDialog,Exposition automatiqueAutomatic ExposureCameraControllerDialog<Nettet automatique de l'imageAutomatic FocusCameraControllerDialog Gain automatiqueAutomatic GainCameraControllerDialog"Gamma automatiqueAutomatic GammaCameraControllerDialog$Nuance automatique Automatic HueCameraControllerDialog Iris automatiqueAutomatic IrisCameraControllerDialog(Rotation automatique Automatic PanCameraControllerDialog Rle automatiqueAutomatic RollCameraControllerDialog,Saturation automatiqueAutomatic SaturationCameraControllerDialog>Profondeur de champ automatiqueAutomatic SharpnessCameraControllerDialog.Inclinaison automatiqueAutomatic TiltCameraControllerDialog<Balance automatique des blancsAutomatic White BalanceCameraControllerDialog Zoom automatiqueAutomatic ZoomCameraControllerDialog>compensation du rtroclairage:Backlight Compensation:CameraControllerDialogClart: Brightness:CameraControllerDialog$Commande de camraCamera ControlCameraControllerDialog2Autorisation de couleurs: Color Enable:CameraControllerDialogContraste: Contrast:CameraControllerDialogExposition: Exposure:CameraControllerDialog&Nettet de l'image:Focus:CameraControllerDialog Gain:Gain:CameraControllerDialog Gamma:Gamma:CameraControllerDialogNuance:Hue:CameraControllerDialog Iris:Iris:CameraControllerDialogRotation:Pan:CameraControllerDialogLRinitialiser les paramtres de camraReset Camera Settings...CameraControllerDialogDRestaurer les paramtres de camraRestore Camera Settings...CameraControllerDialog Rle:Roll:CameraControllerDialogSaturation: Saturation:CameraControllerDialog(Profondeur de champ: Sharpness:CameraControllerDialogInclinaison:Tilt:CameraControllerDialog$Qualit de l'image Video QualityCameraControllerDialog&Balance des blancs:White Balance:CameraControllerDialog Zoom:Zoom:CameraControllerDialogBCommande de la camra qStopMotionqStopMotion Camera ControllerCameraControllerDialog&Annuler&CancelDescriptionDialog&OK&OKDescriptionDialog.&Description du projet:&Project Description:DescriptionDialog2&Description de la scne:&Scene Description:DescriptionDialogB&Description de l'enregistrement:&Take Description:DescriptionDialogInformation InformationDescriptionDialog*Description du projetProject DescriptionDescriptionDialog.Description de la scneScene DescriptionDescriptionDialog>Description de l'enregistrementTake DescriptionDescriptionDialogxLe caractre '|' est interdit dans la description du projet.IPS (images par seconde)</h4> <p>En modifiant cette valeur, vous changez la vitesse de l'animation dans le <b>Cadre de prvisualisation</b>.</p> <p>Pour lire l'animation appuyez sur le bouton <b>Lecture de l'animation</b>.</p>

FPS chooser

By changing the value in this chooser you set which speed the animation in the FrameView should run at.

To start an animation press the Run Animation button.

 ExportWidgetAVIAVI ExportWidgetEn dessous vous pouvez choisir quel programme doit tre utilis pour encoder un nouveau projet en un fichier vido.ZBelow you can set which program should be used for encoding a new project to a video file. ExportWidgetVous pouvez slectionner ci-dessous quel programme / processus qStopMotion doit utiliser pour encoder le projet en cours en un fichier vido.iBelow you can set which program should be used for encoding the currently active project to a video file. ExportWidgetParcourirBrowse ExportWidget<Choisir le fichier destinationChoose output file ExportWidgetxVoulez-vous choisir le fichier destination chaque export ?JDo you want to be asked for an output file everytime you choose to export? ExportWidget4Application de l'encodeur:Encoder Application: ExportWidget0Paramtres de l'encodeurEncoder settings ExportWidget"Taille des images Frame Size ExportWidget&Images par seconde:Frames per Second: ExportWidget8Full HD (1900x1080) {1900x?}Full HD (1900x1080) ExportWidget&HD Ready (1280x720)HD Ready (1280x720) ExportWidgetMP4MP4 ExportWidgetNonNo ExportWidget>Paramtres du fichier de sortieOutput file settings ExportWidgetPAL D (704x576)PAL D (704x576) ExportWidgetQVGA (320x240)QVGA (320x240) ExportWidgetSVGA (800x600)SVGA (800x600) ExportWidgetVDfinir le fichier destination par dfaut :Set default output file: ExportWidgetVGA (640x480) VGA (640x480) ExportWidgetFormat vido: Video Format: ExportWidget0Taille du fichier vido: Video Size: ExportWidgetOuiYes ExportWidget ffmpegffmpeg ExportWidgetvL' image ne peut pas tre copie dans le dossier du projet!.Can't copy the image to the project directory!ExposurexL' image ne peut pas tre copie dans le dossier temporaire!0Can't copy the image to the temporary directory!ExposurerL' image ne peut pas tre supprime du dossier du projet!2Can't remove the image from the project directory!ExposuretL' image ne peut pas tre supprime du dossier temporaire!2Can't remove the image in the temporary directory!ExposureL'image ne peut pas tre enregistr dans un nouveau fichier dans le dossier temporaire!GCan't save the image in the new file format to the temporary directory!ExposureProblmatiqueCriticalExposure FermerCloseExternalCommandDialogchou!Failed!ExternalCommandDialog(Entre au programme:Input to program:ExternalCommandDialog@Sortie de commandements externesOutput from external commandExternalCommandDialogRsultatResultExternalCommandDialogEnvoyerSubmitExternalCommandDialogRussi! Successful!ExternalCommandDialogAppliquerApply GeneralDialog FermerClose GeneralDialog(Paramtres gnralesGeneral Settings GeneralDialogPriphriqueGrabber GeneralDialog$Importer une image Image Import GeneralDialog4transformation d'une imageImage Transformation GeneralDialog6Valeurs d'un nouveau projetNew Project Values GeneralDialogParamtres Preferences GeneralDialog$Exporter une vido Video Export GeneralDialog2Paramtres de qStopMotionqStopMotion Preferences GeneralDialogtInsertion d'une nouvelle image la fin de la prise de vue'Append new frame at the end of the take GeneralWidgetFFonction du bouton d'enregistrementCapture Button Functionality GeneralWidgetCouleurColor GeneralWidget$Couleur de grille: Grid Color: GeneralWidget Lignes de grilleGrid Functionality GeneralWidget&Lignes horizontalesHorizontal Lines GeneralWidgettInsertion d'une nouvelle image aprs l'image mis en relief%Insert new frame after selected frame GeneralWidgetvInsertion d'une nouvelle image avant l'image mise en relief%Insert new frame bevor selected frame GeneralWidget LangueLanguage GeneralWidget"Lignes verticalesVertical Lines GeneralWidgetInformation Information GrabberWidget!Microsoft Media Foundation Source GrabberWidget Pa&ge prcdente &Backward HelpBrowser&Fermer&Close HelpBrowserP&age suivante&Forward HelpBrowser&Table des mati&res&Home HelpBrowser<Explorateur d'aide qStopMotionqStopMotion Help Browser HelpBrowser0Vrifier le priphriqueCheck image grabberImageGrabberFacade0Vrifier le priphriqueCheck image sourcesImageGrabberFacade0.10.1 ImportWidget5.05.0 ImportWidgetBMPBMP ImportWidgetEn dessous vous pouvez choisir quel priphrique doit tre utilis pour importer des images dans un nouveau projet.[Below you can set which image sources should be used for importing images to a new project. ImportWidgetEn dessous vous pouvez choisir quel priphrique doit tre utilis pour importer des images dans le projet activ.jBelow you can set which image sources should be used for importing images to the currently active project. ImportWidget0Grandeur du priphriqueDefault Grabber Size ImportWidget&Images par seconde:Frames per second: ImportWidget8Full HD (1900x1080) {1900x?}Full HD (1900x1080) ImportWidget&HD Ready (1280x720)HD Ready (1280x720) ImportWidgetFormat d'image: Image Format: ImportWidget&Qualit de l'image:Image Quality: ImportWidget"Grandeur d'image: Image Size: ImportWidgetJRglages de l'importation d'une imageImage import settings ImportWidgetJPEGJPEG ImportWidgetFParamtres de l'affichage en directLive view settings ImportWidgetMaxMax ImportWidgetMinMin ImportWidgetPAL D (704x576)PAL D (704x576) ImportWidgetQVGA (320x240)QVGA (320x240) ImportWidgetSVGA (800x600)SVGA (800x600) ImportWidgetTIFFTIFF ImportWidgetVGA (640x480) VGA (640x480) ImportWidgetA &propos&About MainWindowGUI&&Commande de camra&Camera Controller MainWindowGUI&dition&Edit MainWindowGUI&Exporter&Export MainWindowGUI&Fichier&File MainWindowGUI &Aide&Help MainWindowGUI&Nouveau&New MainWindowGUI&Ouvrir&Open MainWindowGUI&Quitter&Quit MainWindowGUI&Enregistrer&Save MainWindowGUIAnnu&ler&Undo MainWindowGUID&Annuler la liste de commandements &Undo stack MainWindowGUI&Fentre&Windows MainWindowGUI4<h4>Concernant Qt</h4> <p>Cela montre une petite bote d'information dans laquelle vous pouvez lire des informations gnrales sur la bibliothque Qt.</p>

About Qt

This will display a small information box where you can read general information about the Qt library.

 MainWindowGUI<h4>A propos</h4> <p>Ceci affiche une petite fentre d'information o vous pouvez lire des informations gnrales aussi bien que les noms des dveloppeurs qui ont cr cet excellent logiciel.</p>

About

This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.

 MainWindowGUI<h4>Cinelerra</h4> <p>Exporte l'animation courante en tant que projet <em>cinelerra-cv</em>.</p>Vous aurez un assistant pour vous guider.

Cinelerra

Exports the current animation as a cinelerra-cv project.

You will be given a wizard to guide you. MainWindowGUI<h4>Description de l'image</h4><p>Ce cadre montre la description de l'image active</p>W

Exposure ID

This area displays the id of the currently selected exposure

 MainWindowGUIZ<h4>Cadre de prvisualisation</h4><p> Dans cette zone, vous pouvez voir l'image slectionne. Vous pouvez aussi voir les animations en pressant le bouton <b>Lecture</b>.</p>

FrameView

In this area you can see the selected frame. You can also play animations in this window by pressing the Play button.

 MainWindowGUI<h4>Aide</h4> <p>Ce bouton affiche le manuel utilisateur de qStopMotion</p>S

Help

This button will bring up a dialog with the qStopMotion manual

 MainWindowGUIp<h4>Nouveau</h4> <p>Cre un <em>nouveau</em> projet.</p>3

New

Creates a new project.

 MainWindowGUIx<h4>Ouvrir</h4> <p><em>Ouvre</em> un projet qStopMotion.</p>?

Open

Opens a qStopMotion project file.

 MainWindowGUI<h4>Paramtres de l'application</h4> <p>Cela ouvre une Fentre dans la quelle vous pouvez <em>changer</em> les paramtres de l'application.</p>

Preferences of the application

This will opens a window where you can change the preferences of the application.

 MainWindowGUI<h4>Description du projet</h4><p>Ce cadre montre la description du projet active</p>S

Project ID

This area displays the id of the currently active project

 MainWindowGUI<h4>Proprits du projet</h4> <p>Cela ouvre une Fentre dans laquelle vous pouvez<em>changer</em> les proprits du projet.</p>

Properties of the project

This will opens a window where you can change properties of the animation project.

 MainWindowGUI<h4>Quitter</h4> <p><em>Quitte</em> le programme Stopmotion.</p>0

Quit

Quits the program.

 MainWindowGUI<h4>Refaire</h4> <p><em>Refait</em> la dernire action annule. Vous pouvez presser Refaire plusieurs fois pour refaire plusieurs actions.</p>v

Redo

Redoes your last operation. You can press redo several times to redo several operations.

 MainWindowGUI<h4>Enregistrer sous</h4> <p><em>Enregistre</em> l'animation courante sous forme de fichier projet qStopMotion.</p>[

Save As

Saves the current animation as a qStopMotion project file.

 MainWindowGUI<h4>Enregistrer</h4> <p><em>Enregistre</em> l'animation courante sous forme de fichier projet qStopMotion. <BR>Si ce projet a t enregistr prcdemment, il sera enregistr automatiquement dans le mme fichier (crasement).</p>

Save

Saves the current animation as a qStopMotion project file.
If this project has been saved before it will automatically be saved to the previously selected file.

 MainWindowGUI<h4>Description de la scne</h4><p>Ce cadre montre la description de la scne active</p>Q

Scene ID

This area displays the id of the currently selected scene

 MainWindowGUI<h4>Description de la prise de vue</h4><p>Ce cadre montre la description de la prise de vue active</p>O

Take ID

This area displays the id of the currently selected take

 MainWindowGUI2<h4>Barre des images</h4>

TimeLine

In this area you can see the frames and scenes in the animations and build the animation by moving the them around.

You can switch to the next and the previous frame using the arrow buttons or x and z

 MainWindowGUI <h4>Annuler</h4> <p><em>Annule</em> la dernire action. Vous pouvez presser Annuler plusieurs fois pour annuler plusieurs actions.</p>u

Undo

Undoes your last operation. You can press undo several time to undo earlier operations.

 MainWindowGUI<h4>Vido</h4> <p>Exporte le projet courant vers un fichier <em>vido</em>.</p>Vous aurez un assistant pour vous guider.l

Video

Exports the current project as video.

You will be given a wizard to guide you. MainWindowGUI2<h4>Qu'est-ce que c'est</h4> <p>Ceci affiche un curseur de souris spcial qui peut tre utilis pour afficher des informations utiles comme celle-ci.</p>

What's This

This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.

 MainWindowGUI$Vidos AVI (*.avi)AVI Videos (*.avi) MainWindowGUIA proposAbout MainWindowGUIConcernant &Qt About &Qt MainWindowGUIConcernant QtAbout Qt MainWindowGUIAjouter l'image Add Frames MainWindowGUI Ajouter la scne Add Scene MainWindowGUI.Ajouter la prise de vueAdd Take MainWindowGUIAnnulerCancel MainWindowGUIJVeuillez choisir le fichier du projetChoose project file MainWindowGUICinelerra Cinelerra MainWindowGUI,Connceter la camra...Connecting camera... MainWindowGUIFrancaisEnglish MainWindowGUI Images existantsExisting Images MainWindowGUI0Exporter vers un fichierExport to file MainWindowGUI<Exporter vers un fichier vidoExport to video file MainWindowGUIExportation ... Exporting ... MainWindowGUI0Description de l'image:  Exposure ID:  MainWindowGUIAideHelp MainWindowGUIInformation Information MainWindowGUIInsrer l'image Insert Frames MainWindowGUI Insrer la scne Insert Scene MainWindowGUI.Insrer la prise de vue Insert Take MainWindowGUI$Vidos MP4 (*.mp4)MP4 Videos (*.mp4) MainWindowGUINouveau projet New project MainWindowGUI(&Rcemment ouvert(s) Open &Recent MainWindowGUI Ouvrir un projet Open project MainWindowGUIParamtres Preferences MainWindowGUI2Paramtres de qStopMotionPreferences of qStopMotion MainWindowGUI ProjetProject MainWindowGUIProjet (*.%1)Project (*.%1) MainWindowGUI.Description du projet:  Project ID:  MainWindowGUIProprits Properties MainWindowGUI@Proprits du projet d'animation#Properties of the animation project MainWindowGUIQuitterQuit MainWindowGUIRe&faireRe&do MainWindowGUI(Top, c'est parti ;-)Ready to rumble ;-) MainWindowGUIEnregistrement Recording MainWindowGUIRefaireRedo MainWindowGUIEffacer l'image Remove Frames MainWindowGUI Effacer la scne Remove Scene MainWindowGUI.Effacer la prise de vue Remove Take MainWindowGUI"Enregistrer &sousSave &As MainWindowGUI Enregistrer sousSave As MainWindowGUI*Enregistrer le projet Save project MainWindowGUI4Enregistrer le projet sousSave project As MainWindowGUIScne 001 Scene 001 MainWindowGUI2Description de la scne:  Scene ID:  MainWindowGUIVVeuillez choisir un priphrique de captureSelect image grabber MainWindowGUIPrise de vue 01Take 01 MainWindowGUI@Description de la prise de vue:  Take ID:  MainWindowGUILe projet The Project MainWindowGUILe caractre '|' est interdit dans le nom du fichier de projet et est effac.NThe character '|' is not allowed in the project file name and will be removed. MainWindowGUIDans le projet ouvert il y a dj des images. Voulez-vous convertir ces images en le nouveau format ou dans la nouvelle qualit?oThere are some images in the open project. Do you want to convert the images to the new file format or quality? MainWindowGUIIl y a des modifications non enregistres. Voulez-vous enregistrer ?/There are unsaved changes. Do you want to save? MainWindowGUIAnnulerUndo MainWindowGUI<Modifications non enregistresUnsaved changes MainWindowGUI VidoVideo MainWindowGUIAttentionWarning MainWindowGUI(&Qu'est-ce que c'est What's &This MainWindowGUI&Qu'est-ce que c'est What's This MainWindowGUIVous devez dfinir un priphrique de capture. Ceci peut tre fait dans la fentre de prfrences.TYou have to define an image grabber to use. This can be set in the preferences menu. MainWindowGUIPqStopMotion - Nouveau projet d'animation#qStopMotion - New Animation Project MainWindowGUI^qStopMotion - Annuler la liste de commandementsqStopMotion - Undo stack MainWindowGUI~Le fichier ne peut pas tre enregistr comme copie de scurit!+Can't copy preferences file to backup file!PreferencesToolIl n'est pas possible d'effacer la copie de scurit du fichier!%Can't remove preferences backup file!PreferencesToolTLe fichier XML ne peut pas tre ouvert: %1Couldn't open XML file: %1PreferencesToolProblmatiqueCriticalPreferencesToolDOM Parser DOM ParserPreferencesToolXErreur la ligne %1, la colonne %2: %3 %4(Parse error at line %1, column %2: %3 %4PreferencesTool@Proprits du projet d'animationAnimation Project Properties ProjectDialogAppliquerApply ProjectDialog FermerClose ProjectDialog$Importer une image Image Import ProjectDialog4Transformation d'une imageImage Transformation ProjectDialogProprits Properties ProjectDialog$Exporter une vido Video Export ProjectDialogIl n'est pas possible de modifier les droits d'accs du rpertoire des images!0Can't change permissions of the image directory!ProjectSerializerIl n'est pas possible de modifier les droits d'accs du dossier du projet!2Can't change permissions of the project directory!ProjectSerializerIl n'est pas possible de modifier les droits d'accs du rprtoire des sons!0Can't change permissions of the sound directory!ProjectSerializer~Le fichier du projet ne peut pas tre copi pour la sauvegarde!&Can't copy the project file to backup!ProjectSerializerpIl n'est pas possible de crer un rpertoire des images!Can't create image directory!ProjectSerializerhIl n'est pas possible de crer un dossier du projet!Can't create project directory!ProjectSerializerlIl n'est pas possible de crer un rprtoire des sons!Can't create sound directory!ProjectSerializerIl n'est pas possible d'effacer la vieille copie de scurit du fichier du projet!(Can't remove old backup of project file!ProjectSerializerfLe vieux fichier du projet ne peut pas tre effac!"Can't remove the old project file!ProjectSerializerTLe fichier XML ne peut pas tre ouvert: %1Couldn't open XML file: %1ProjectSerializerProblmatiqueCriticalProjectSerializerDOM Parser DOM ParserProjectSerializerXErreur la ligne %1, la colonne %2: %3 %4(Parse error at line %1, column %2: %3 %4ProjectSerializer<h4>Ajouter des images (CTRL+F)</h4> <p>Veuillez cliquer ce bouton pour <em>joindre des images</em> la fin de la prise de vue.</p>m

Append Frames (CTRL+F)

Click on this button to append frames at the end of the take.

 ProjectTabJ<h4>Ajouter une nouvelle scne (CTRL+E)</h4> <p>Veuillez cliquer ce bouton pour crer une nouvelle <em>scne</em> et <em>le joindre</em> la fin de l'animation.</p>

Append new Scene (CTRL+E)

Click this button to create a new scene and append it at the end of the animation.

 ProjectTab`<h4>Ajouter une nouvelle prise de vue (CTRL+E)</h4> <p>Veuillez cliquer ce bouton pour crer une nouvelle <em>prise de vue</em> et <em>le joindre</em> la fin de la scne.</p>

Append new Take (CTRL+E)

Click this button to create a new take and append it to the end of the scene.

 ProjectTab <h4>Insertion d'une image (CTRL+F)</h4> <p>Veuillez cliquer ce bouton pour <em>insrer des images</em> avant l'image slectionne.</p>o

Insert Frames (CTRL+F)

Click on this button to insert frames bevor the selected frame.

 ProjectTabX<h4>Insertion d'une nouvelle scne (CTRL+E)</h4> <p>Veuillez cliquer ce bouton pour crer une nouvelle <em>scne</em> et <em>l'insrer</em> avant la scne slectionne.</p>

Insert new Scene (CTRL+E)

Click this button to create a new scene and insert it bevor the selected scene.

 ProjectTab<h4>Insertion d'une nouvelle prise de vue (CTRL+E)</h4> <p>Veuillez cliquer ce bouton pour crer une nouvelle <em>prise de vue</em> et <em>l'insrer</em> avant la prise de vue slectionne.</p>

Insert new Take (CTRL+E)

Click this button to create a new take and insert it bevor the selected take.

 ProjectTab<h4>Dmarrage du programme de traitement d'image</h4> <p>Veuillez cliquer ce bouton pour ouvrir l'image active dans le programme de traitement d'image</p> <p>Il est galement possible de dplacer des images de la barre des images au programme de traitement d'image</p>

Launch Photo Editor

Click this button to open the active frame in the photo editor

Note that you can also drag images from the frame bar and drop them on the photo editor

 ProjectTab<h4>Effacer une image (Delete)</h4> <p>Veuillez cliquer ce bouton pour <em>effacer</em> l'image <em>slectionne</em> de la prise de vue.</p>u

Remove Frame (Delete)

Click this button to remove the selected frame from the take.

 ProjectTab <h4>Effacer une scne (SHIFT+Delete)</h4> <p>Veuillez cliquer ce bouton pour <em>effacer</em> la scne <em>slectionne</em> de l'animation.</p>

Remove Scene (SHIFT+Delete)

Click this button to remove the selected scene from the animation.

 ProjectTab<<h4>Effacer une prise de vue (SHIFT+Delete)</h4> <p>Veuillez cliquer ce bouton pour <em>effacer</em> la prise de vue <em>slectionne</em> de l'animation.</p>~

Remove Take (SHIFT+Delete)

Click this button to remove the selected take from the animation.

 ProjectTab$Ajouter des images Add Frames ProjectTab(Ajouter une positionAdd Take ProjectTab8Choisir les images ajouterChoose frames to add ProjectTabEditionEdit ProjectTab<Le dmarrage de Gimp a chou!Failed to start Gimp! ProjectTab ImagesFrames ProjectTab$Insrer des images Insert Frames ProjectTab(Insrer une position Insert Take ProjectTabAucune scne est selectionne. S'il vous plat choisissez une scne dans l'arbre de projet.=No scene selected. Please select a scene in the project tree. ProjectTabAucune position est selctionne. S'il vous plat choisissez une position dans l'arbre de projet.;No take selected. Please select a take in the project tree. ProjectTabArbre de projet Project Tree ProjectTabScne 000 Scene 000 ProjectTab ScnesScenes ProjectTabPrise de vue 00Take 00 ProjectTabPrises de vueTakes ProjectTab@L'image slectionne est altreThe active frame is corrupt ProjectTabhL'image qui doit tre ouverte n'est pas slectionne There is no active frame to open ProjectTabAttentionWarning ProjectTabXGimp n'est pas install sur votre ordinateur-You do not have Gimp installed on your system ProjectTab<h4>Nombre d'images</h4> <p>En modifiant cette valeur vous pouvez rgler combien d'images prcdentes sont insres dans l'image de la camra ou dans le mode de la lecture, combien d'images se jouent. </p> <p> Ainsi, vous pouvez mieux voir comment l'image prochain se situe par rapport aux images prcdentes. Cela permet des enchanements rguliers des mouvements.</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 ProjectWidgetPrise de vueCapture ProjectWidgetDiffrenceDiff ProjectWidget0Rglages du priphriqueImage grabber settings ProjectWidget MixerMix ProjectWidget"Nombre d'images :Number of images: ProjectWidgetLecturePlayback ProjectWidgetEnregistrement Recording ProjectWidget Faire des photosSingle frame capture ProjectWidgetXgphoto (USB Appareil photographique compact)gphoto (USB Compact Camera) ProjectWidget&Non&No QtFrontend&OK&OK QtFrontend&Oui&Yes QtFrontendHVeuillez vrifier les droits d'accsCheck Permissions QtFrontend Crez un dossierCreate directory QtFrontendRestaurationRecovery QtFrontendProbablement qStopMotion n'a pas t correctement termin lors de le dernire sance. Voulez-vous restaurer la dernire sance?]Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? QtFrontendFVous n'avez pas les permissions ncessaires pour utiliser qStopMotion. Vous avez besoin des permissions pour crer un dossier qstopmotion dans votre dossier local.You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. QtFrontend2Vous n'avez pas les droits d'accs ncessaires pour utiliser qStopMotion. Il vous faut des droits d'accs pour lire, crire et excuter dans .qstopmotionYou do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. QtFrontend:qStopMotion - Projet restaurqStopMotion - Recovered Project QtFrontend<h4>Nombre d'images</h4> <p>En modifiant cette valeur vous pouvez rgler combien d'images prcdentes sont insres dans l'image de la camra ou dans le mode de la lecture, combien d'images se jouent. </p> <p> Ainsi, vous pouvez mieux voir comment l'image prochain se situe par rapport aux images prcdentes. Cela permet des enchanements rguliers des mouvements.</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 RecordingTab <h4>Activer/arrter la camra (C)</h4> <p>Cliquez sur ce bouton pour activer la camra ou l'arrter</p>[

Toggle camera on/off (C)

Click this button to toggle the camera on and off

 RecordingTab CamraCamera RecordingTab SaisieCapture RecordingTabDiffrenceDiff RecordingTabInformation Information RecordingTab MixerMix RecordingTabAucun projet est activ.S'il vous plat crez un nouveau projet ou ouvrez un projet existant.KNo active project. Please create a new project or open an existing project. RecordingTabAucune scne ni une position sont selectionnes. S'il vous plat choisissez une scne et une position sur la tabulation du projet.SNo scene and no take selected. Please select a scene and a take on the project tab. RecordingTabAucune position est selectionne. S'il vous plat choisissez une position sur la tabulation du projet.:No take selected. Please select a take on the project tab. RecordingTabPas soutenu Not Supported RecordingTab"Nombre d'images :Number of images: RecordingTabLecturePlayback RecordingTabEnregistrement Recording RecordingTabRsolution Resolution: RecordingTab Faire des photosSingle frame capture RecordingTabSource vido Video Source: RecordingTabLLe fichier son ne peut pas tre copi!Can't copy sound file!ScenedIl ne'est pas possible d'effacer le fichier audio!Can't remove sound file!SceneProblmatiqueCriticalScene&Fermer&Close StartDialog&OK&OK StartDialog@<h2>Crer un nouveau projet</h2>

Create a new Project

 StartDialogB<h2>Ouvrir le dernier projet</h2>

Open last Project

 StartDialogH<h2>Ouvrir le fichier du projet</h2>

Open project file

 StartDialogNOuvrir et continuer un projet existant.%Open and continue a existing project. StartDialog.Chemin vers le projet: Project path:  StartDialog6Dmarrer un nouveau projet.Start a new Project. StartDialogVCharger les images dans la liste des imagesLoad images to time lineTimeLine<h4>Capturer une Image (Espace)</h4> <p>Cliquez sur ce bouton pour <em>capturer</em> une image depuis la camra et l'insrer dans l'animation</p> <p> Pour ce faire, vous pouvez aussi utiliser le raccourci clavier : la <b>touche Espace</b></p>

Capture Frame (Space)

Click on this button to capture a frame from the camera an put it in the animation

This can also be done by pressing the Space key

ToolBarl<h4>Premire image de la prise de vue (J, Gauche)</h4>*

First frame of the take (J, Left)

ToolBarl<h4>Dernire image de la prise de vue (L, Droite)</h4>*

Last frame of the take (L, Right)

ToolBarF<h4>Image suivante (L, Droite)</h4>

Next frame (L, Right)

ToolBarL<h4>Lecture de l'animation (K, P)</h4>

Play animation (K, P)

ToolBarH<h4>Image pcdente (J, Gauche)</h4>!

Previous frame (J, Left)

ToolBarBAffichage de l'animation en coursRunning animationToolBar0%0%TransformWidget100%100%TransformWidgetEn dessous vous pouvez choisir quel transformation d'image doit tre utilis pour importer une image dans un nouveau projet. Si vous slectionnez couper une partie de l'image vous devez galement rgler l'orientation.Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping.TransformWidgetEn dessous vous pouvez choisir quel transformation d'image doit tre utilise pour importer une image dans le projet activ. Si vous slectionnez couper une partie de l'image vous devez galement rgler l'orientation.Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping.TransformWidget8Couper une partie de l'imageClip a part of the imageTransformWidget8Redimensionnez toute l'imageScale the whole imageTransformWidgetNParamtres d'une transformation d'imageTransformation settingsTransformWidget$Paramtres de zoom Zoom settingsTransformWidgetZoomer l'imageZoom the imageTransformWidgetValeur de zoom Zoom value:TransformWidgetDAjouter exposition (%1,%2,%3) '%4'Add exposure (%1,%2,%3) '%4'UndoExposureAddHInsrer l'exposition (%1,%2,%3) '%4'Insert exposure (%1,%2,%3) '%4'UndoExposureInsert<Bouger l'exposition (%1,%2,%3)Move exposure (%1,%2,%3)UndoExposureMove>Enlever l'exposition (%1,%2,%3)Remove exposure (%1,%2,%3)UndoExposureRemovebSlectionner l'exposition (%1,%2,%3)-->(%4,%5,%6)'Select exposure (%1,%2,%3)-->(%4,%5,%6)UndoExposureSelect&Nouveau projet '%1'New project '%1'UndoProjectNew*Ouvrir le projet '%1'Open project '%1'UndoProjectOpen6Ajouter une scne (%1) '%2'Add scene (%1) '%2' UndoSceneAdd6Insrer une scne (%1) '%2'Insert scene (%1) '%2'UndoSceneInsert8Dplacer une scne (%1) '%2'Move scene (%1,%2) UndoSceneMove,Effacer une scne (%1)Remove scene (%1)UndoSceneRemoveDSlectionner une scne (%1)-->(%2)Select scene (%1)-->(%2)UndoSceneSelectJAjouter une prise de vue (%1,%2) '%3'Add take (%1,%2) '%3' UndoTakeAddJInsrer une prise de vue (%1,%2) '%3'Insert take (%1,%2) '%3'UndoTakeInsertBDplacer une prise de vue (%1,%2)Move take (%1,%2) UndoTakeMove@Effacer une prise de vue (%1,%2)Remove take (%1,%2)UndoTakeRemove^Slectionner une prise de vue (%1,%2)-->(%3,%4)Select take (%1,%2)-->(%3,%4)UndoTakeSelectqstopmotion-2.3.2-Source/translations/qt_de.ts000644 000000 000000 00001374701 12536560630 021536 0ustar00rootroot000000 000000 CloseButton Close Tab Schließen FakeReply Fake error ! Fake error ! Invalid URL Ungültige URL MAC_APPLICATION_MENU Services Dienste Hide %1 %1 ausblenden Hide Others Andere ausblenden Show All Alle anzeigen Preferences... Einstellungen... Quit %1 %1 beenden About %1 Über %1 Phonon:: Notifications Benachrichtigungen Music Musik Video Video Communication Kommunikation Games Spiele Accessibility Eingabehilfen Phonon::AudioOutput <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Das Audiogerät <b>%1</b> funktioniert nicht.<br/>Es wird stattdessen <b>%2</b> verwendet.</html> <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> <html>Das Audiogerät <b>%1</b> wurde aktiviert,<br/>da es gerade verfügbar und höher priorisiert ist.</html> Revert back to device '%1' Zurückschalten zum Gerät '%1' <html>Switching to the audio playback device <b>%1</b><br/>which has higher preference or is specifically configured for this stream.</html> <html>Es wird zum Audiogerät <b>%1</b> geschaltet, <br/>da es höher priorisiert ist oder spezifisch für diesen Stream konfiguriert wurde.</html> Phonon::Gstreamer::Backend Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled. Achtung: Das Paket gstreamer0.10-plugins-good ist nicht installiert. Einige Video-Funktionen stehen nicht zur Verfügung. Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabled Achtung: Die grundlegenden GStreamer-Plugins sind nicht installiert. Die Audio- und Video-Unterstützung steht nicht zur Verfügung. Phonon::Gstreamer::MediaObject Cannot start playback. Check your GStreamer installation and make sure you have libgstreamer-plugins-base installed. Das Abspielen konnte nicht gestartet werden. Bitte überprüfen Sie Ihre GStreamer-Installation und stellen Sie sicher, dass das Paket libgstreamer-plugins-base installiert ist. Missing codec helper script assistant. Der Skript-Hilfsassistent des Codecs fehlt. Plugin codec installation failed for codec: %0 Die Installation des Codec-Plugins ist fehlgeschlagen für: %0 A required codec is missing. You need to install the following codec(s) to play this content: %0 Es sind nicht alle erforderlichen Codecs installiert. Um diesen Inhalt abzuspielen, muss der folgende Codec installiert werden: %0 Could not open media source. Die Medienquelle konnte nicht geöffnet werden. Invalid source type. Ungültiger Typ der Medienquelle. Could not locate media source. Die Medienquelle konnte nicht gefunden werden. Could not open audio device. The device is already in use. Das Audiogerät konnte nicht geöffnet werden, da es bereits in Benutzung ist. Could not decode media source. Die Medienquelle konnte nicht gefunden werden. Phonon::MMF Audio Output Audio-Ausgabe The audio output device Audio-Ausgabegerät No error Kein Fehler Not found Nicht gefunden Out of memory Es ist kein Speicher mehr verfügbar Not supported Nicht unterstützt Overflow Überlauf Underflow Unterlauf Already exists Existiert bereits Path not found Pfad konnte nicht gefunden werden In use Bereits in Verwendung Not ready Nicht bereit Access denied Zugriff verweigert Could not connect Es konnte keine Verbindung hergestellt werden Disconnected Getrennt Permission denied Zugriff verweigert Insufficient bandwidth Unzureichende Bandweite Network unavailable Netzwerk nicht verfügbar Network communication error Fehler bei der Kommunikation über das Netzwerk Streaming not supported Streaming nicht unterstützt Server alert Server alert Invalid protocol Ungültiges Protokoll Invalid URL Ungültige URL Multicast error Multicast-Fehler Proxy server error Fehler bei Proxy-Server-Kommunikation Proxy server not supported Proxy-Server nicht unterstützt Audio output error Fehler bei Audio-Ausgabe Video output error Fehler bei Video-Ausgabe Decoder error Fehler im Decoder Audio or video components could not be played Audio- oder Videokomponenten konnten nicht abgespielt werden DRM error DRM-Fehler Unknown error (%1) Unbekannter Fehler (%1) Phonon::MMF::AbstractMediaPlayer Not ready to play Das Abspielen ist im Grundzustand nicht möglich Error opening file Die Datei konnte nicht geöffnet werden Error opening URL Der URL konnte nicht geöffnet werden Error opening resource Die Ressource konnte nicht geöffnet werden Error opening source: resource not opened Die Quelle konnte nicht geöffnet werden: Ressource nicht geöffnet Setting volume failed Die Lautstärke konnte nicht eingestellt werden Loading clip failed Das Laden des Clips ist fehlgeschlagen Playback complete Abspielen beendet Download error Fehler beim Download Phonon::MMF::AbstractVideoPlayer Pause failed Fehler bei Pause-Funktion Seek failed Suchoperation fehlgeschlagen Getting position failed Die Position konnte nicht bestimmt werden Opening clip failed Der Clip konnte nicht geöffnet werden Phonon::MMF::AudioEqualizer %1 Hz %1 Hz Phonon::MMF::AudioPlayer Getting position failed Die Position konnte nicht bestimmt werden Phonon::MMF::DsaVideoPlayer Video display error Fehler bei der Video-Anzeige Phonon::MMF::EffectFactory Enabled Aktiviert Phonon::MMF::EnvironmentalReverb Decay HF ratio (%) DecayHFRatio: Ratio of high-frequency decay time to the value specified by DecayTime. Hochfrequenz-Abklingverhältnis (%) Decay time (ms) DecayTime: Time over which reverberation is diminished. Abklingzeit (ms) Density (%) Density Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Diffusion value. Dichte (%) Diffusion (%) Diffusion: Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Density value. Diffusion (%) Reflections delay (ms) ReflectionsDelay: Amount of delay between the arrival the direct path from the source and the arrival of the first reflection. Verzögerung des Echos (ms) Reflections level (mB) ReflectionsLevel: Amplitude of reflections. This value is corrected by the RoomLevel to give the final reflection amplitude. Stärke des Echos (mB) Reverb delay (ms) ReverbDelay: Amount of time between arrival of the first reflection and start of the late reverberation. Verzögerung des Nachhalls (ms) Reverb level (mB) ReverbLevel Amplitude of reverberations. This value is corrected by the RoomLevel to give the final reverberation amplitude. Stärke des Nachhalls (mB) Room HF level RoomHFLevel: Amplitude of low-pass filter used to attenuate the high frequency component of reflected sound. Hochfrequenz-Pegel des Raums Room level (mB) RoomLevel: Master volume control for all reflected sound. Pegel des Raums (mB) Phonon::MMF::MediaObject Error opening source: type not supported Die Quelle konnte nicht geöffnet werden: Dieser Typ wird nicht unterstützt Error opening source: resource is compressed Die Quelle konnte nicht geöffnet werden: Die Ressource ist komprimiert Error opening source: resource not valid Die Quelle konnte nicht geöffnet werden: Ungültige Ressource Error opening source: media type could not be determined Die Quelle konnte nicht geöffnet werden: Der Medientyp konnte nicht bestimmt werden Failed to set requested IAP Der angeforderte Internetzugriffspunkt konnte nicht gesetzt werden Phonon::MMF::StereoWidening Level (%) Stärke (%) Phonon::MMF::SurfaceVideoPlayer Video display error Fehler bei der Video-Anzeige Phonon::VolumeSlider Volume: %1% Lautstärke: %1% Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1% Mit diesem Regler stellen Sie die Lautstärke ein. Die Position links entspricht 0%; die Position rechts entspricht %1% Muted Stummschaltung Q3Accel %1, %2 not defined %1, %2 sind nicht definiert Ambiguous %1 not handled Mehrdeutige %1 können nicht verarbeitet werden Q3DataTable True Wahr False Falsch Insert Einfügen Update Aktualisieren Delete Löschen Q3FileDialog Copy or Move a File Datei kopieren oder verschieben Read: %1 Lesen: %1 Write: %1 Schreiben: %1 Cancel Abbrechen All Files (*) Alle Dateien (*) Name Name Size Größe Type Typ Date Datum Attributes Attribute &OK &OK Look &in: Su&chen in: File &name: Datei&name: File &type: Datei&typ: Back Zurück One directory up Ein Verzeichnis zurück Create New Folder Neuen Ordner erstellen List View Liste Detail View Ausführlich Preview File Info Vorschau der Datei-Informationen Preview File Contents Vorschau des Datei-Inhalts Read-write Lesen/Schreiben Read-only Nur Lesen Write-only Nur Schreiben Inaccessible Gesperrt Symlink to File Verknüpfung mit Datei Symlink to Directory Verknüpfung mit Verzeichnis Symlink to Special Verknüpfung mit Spezialdatei File Datei Dir Verzeichnis Special Spezialattribut Open Öffnen Save As Speichern unter &Open &Öffnen &Save S&peichern &Rename &Umbenennen &Delete &Löschen R&eload Erne&ut laden Sort by &Name Nach &Namen sortieren Sort by &Size Nach &Größe sortieren Sort by &Date Nach &Datum sortieren &Unsorted &Unsortiert Sort Sortieren Show &hidden files &Versteckte Dateien anzeigen the file die Datei the directory das Verzeichnis the symlink die Verknüpfung Delete %1 %1 löschen <qt>Are you sure you wish to delete %1 "%2"?</qt> <qt>Sind Sie sicher, dass Sie %1 "%2" löschen möchten?</qt> &Yes &Ja &No &Nein New Folder 1 Neues Verzeichnis 1 New Folder Neues Verzeichnis New Folder %1 Neues Verzeichnis %1 Find Directory Verzeichnis suchen Directories Verzeichnisse Directory: Verzeichnis: Error Fehler %1 File not found. Check path and filename. %1 Datei kann nicht gefunden werden. Überprüfen Sie Pfad und Dateinamen. All Files (*.*) Alle Dateien (*.*) Open Öffnen Select a Directory Wählen Sie ein Verzeichnis Q3LocalFs Could not read directory %1 Konnte Verzeichnis nicht lesen %1 Could not create directory %1 Konnte Verzeichnis nicht erstellen %1 Could not remove file or directory %1 Konnte Datei oder Verzeichnis nicht löschen %1 Could not rename %1 to %2 Konnte nicht umbenannt werden: %1 nach %2 Could not open %1 Konnte nicht geöffnet werden: %1 Could not write %1 Konnte nicht geschrieben werden: %1 Q3MainWindow Line up Ausrichten Customize... Anpassen... Q3NetworkProtocol Operation stopped by the user Operation von Benutzer angehalten Q3ProgressDialog Cancel Abbrechen Q3TabDialog OK OK Apply Anwenden Help Hilfe Defaults Voreinstellungen Cancel Abbrechen Q3TextEdit &Undo &Rückgängig &Redo Wieder&herstellen Cu&t &Ausschneiden &Copy &Kopieren &Paste Einf&ügen Clear Löschen Select All Alles auswählen Q3TitleBar System System Restore up Wiederherstellen Minimize Minimieren Restore down Wiederherstellen Maximize Maximieren Close Schließen Contains commands to manipulate the window Enthält Befehle zum Ändern der Fenstergröße Puts a minimized window back to normal Stellt ein minimiertes Fenster wieder her Moves the window out of the way Minimiert das Fenster Puts a maximized window back to normal Stellt ein maximiertes Fenster wieder her Makes the window full screen Vollbildmodus Closes the window Schließt das Fenster Displays the name of the window and contains controls to manipulate it Zeigt den Namen des Fensters und enthält Befehle zum Ändern Q3ToolBar More... Mehr... Q3UrlOperator The protocol `%1' is not supported Das Protokoll `%1' wird nicht unterstützt The protocol `%1' does not support listing directories Das Protokoll `%1' unterstützt nicht das Auflisten von Verzeichnissen The protocol `%1' does not support creating new directories Das Protokoll `%1' unterstützt nicht das Anlegen neuer Verzeichnisse The protocol `%1' does not support removing files or directories Das Protokoll `%1' unterstützt nicht das Löschen von Dateien oder Verzeichnissen The protocol `%1' does not support renaming files or directories Das Protokoll `%1' unterstützt nicht das Umbenennen von Dateien oder Verzeichnissen The protocol `%1' does not support getting files Das Protokoll `%1' unterstützt nicht das Laden von Dateien The protocol `%1' does not support putting files Das Protokoll `%1' unterstützt nicht das Speichern von Dateien The protocol `%1' does not support copying or moving files or directories Das Protokoll `%1' unterstützt nicht das Kopieren oder Verschieben von Dateien oder Verzeichnissen (unknown) (unbekannt) Q3Wizard &Cancel &Abbrechen < &Back < &Zurück &Next > &Weiter > &Finish Ab&schließen &Help &Hilfe QAbstractSocket Host not found Rechner konnte nicht gefunden werden Connection refused Verbindung verweigert Connection timed out Das Zeitlimit für die Verbindung wurde überschritten Operation on socket is not supported Diese Socket-Operation wird nicht unterstützt Socket operation timed out Das Zeitlimit für die Operation wurde überschritten Socket is not connected Nicht verbunden Network unreachable Das Netzwerk ist nicht erreichbar QAbstractSpinBox &Step up &Inkrementieren Step &down &Dekrementieren &Select All &Alles auswählen QAccessibleButton Press Drücken QApplication QT_LAYOUT_DIRECTION Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. LTR Executable '%1' requires Qt %2, found Qt %3. Die Anwendung '%1' benötigt Qt %2; es wurde aber Qt %3 gefunden. Incompatible Qt Library Error Die Qt-Bibliothek ist inkompatibel Activate Aktivieren Activates the program's main window Aktiviert das Hauptfenster der Anwendung QAxSelect Select ActiveX Control ActiveX-Element auswählen OK OK &Cancel &Abbrechen COM &Object: COM-&Objekt: QCheckBox Uncheck Löschen Check Ankreuzen Toggle Umschalten QColorDialog Hu&e: Farb&ton: &Sat: &Sättigung: &Val: &Helligkeit: &Red: &Rot: &Green: &Grün: Bl&ue: Bla&u: A&lpha channel: A&lphakanal: Select Color Farbauswahl &Basic colors Grundfar&ben &Custom colors &Benutzerdefinierte Farben &Add to Custom Colors Zu benutzerdefinierten Farben &hinzufügen QComboBox Open Öffnen False Falsch True Wahr Close Schließen QCoreApplication %1: key is empty QSystemSemaphore %1: Ungültige Schlüsselangabe (leer) %1: unable to make key QSystemSemaphore %1: Es kann kein Schlüssel erzeugt werden %1: ftok failed QSystemSemaphore %1: ftok-Aufruf ist fehlgeschlagen %1: already exists QSystemSemaphore %1: existiert bereits %1: does not exist QSystemSemaphore %1: Nicht existent %1: out of resources QSystemSemaphore %1: Keine Ressourcen mehr verfügbar %1: permission denied QSystemSemaphore %1: Zugriff verweigert %1: unknown error %2 QSystemSemaphore %1: Unbekannter Fehler %2 QDB2Driver Unable to connect Es kann keine Verbindung aufgebaut werden Unable to commit transaction Die Transaktion kann nicht durchgeführt werden (Operation 'commit' fehlgeschlagen) Unable to rollback transaction Die Transaktion kann nicht rückgängig gemacht werden (Operation 'rollback' fehlgeschlagen) Unable to set autocommit 'autocommit' kann nicht aktiviert werden QDB2Result Unable to execute statement Der Befehl kann nicht ausgeführt werden Unable to prepare statement Der Befehl kann nicht initialisiert werden Unable to bind variable Die Variable kann nicht gebunden werden Unable to fetch record %1 Der Datensatz %1 kann nicht abgeholt werden Unable to fetch next Der nächste Datensatz kann nicht abgeholt werden Unable to fetch first Der erste Datensatz kann nicht abgeholt werden QDateTimeEdit AM AM am am PM PM pm pm QDeclarativeAbstractAnimation Cannot animate non-existent property "%1" Die Eigenschaft "%1" existiert nicht und kann daher nicht animiert werden Cannot animate read-only property "%1" Die Eigenschaft "%1" ist schreibgeschützt und kann daher nicht animiert werden Animation is an abstract class Die Klasse Animation ist abstrakt QDeclarativeAnchorAnimation Cannot set a duration of < 0 Es kann keine Zeitdauer <0 gesetzt werden QDeclarativeAnchors Possible anchor loop detected on fill. Bei der Fülloperation wurde eine potentielle Endlosschleife der Anker festgestellt. Possible anchor loop detected on centerIn. Bei der Operation 'centerIn' wurde eine potentielle Endlosschleife der Anker festgestellt. Cannot anchor to an item that isn't a parent or sibling. Das Ziel eines Anker muss ein Elternelement oder Element der gleichen Ebene sein. Possible anchor loop detected on vertical anchor. Bei einem vertikalen Anker wurde eine potentielle Endlosschleife der Anker festgestellt. Possible anchor loop detected on horizontal anchor. Bei einem horizontalen Anker wurde eine potentielle Endlosschleife der Anker festgestellt. Cannot specify left, right, and hcenter anchors. Ankerangaben für links, rechts und horizontal zentriert dürfen nicht zusammen auftreten. Cannot anchor to a null item. Es kann kein Anker zu einem Null-Element angegeben werden. Cannot anchor a horizontal edge to a vertical edge. Es kann kein Anker zu einer horizontalen oder vertikalen Kante angegeben werden. Cannot anchor item to self. Ein Element kann keinen Anker zu sich selbst haben. Cannot specify top, bottom, and vcenter anchors. Ankerangaben für oben, unten und vertikal zentriert dürfen nicht zusammen auftreten. Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors. Ein Baseline-Anker darf nicht zusammen mit weiteren Ankerangaben für oben, unten und vertikal zentriert verwendet werden. Cannot anchor a vertical edge to a horizontal edge. Vertikale und horizontale Kanten können nicht mit Ankern verbunden werden. QDeclarativeAnimatedImage Qt was built without support for QMovie Diese Version der Qt-Bibliothek wurde ohne Unterstützung für die Klasse QMovie erstellt QDeclarativeApplication Application is an abstract class 'Application' ist eine abstrakte Klasse QDeclarativeBehavior Cannot change the animation assigned to a Behavior. Die zu einem Behavior-Element gehörende Animation kann nicht geändert werden. QDeclarativeBinding Binding loop detected for property "%1" Bei der für die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt QDeclarativeCompiledBindings Binding loop detected for property "%1" Bei der für die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt QDeclarativeCompiler Invalid property assignment: "%1" is a read-only property Ungültige Zuweisung bei Eigenschaft: "%1" ist schreibgeschützt Invalid property assignment: unknown enumeration Ungültige Zuweisung bei Eigenschaft: Unbekannter Aufzählungswert Invalid property assignment: string expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Zeichenkette erwartet Invalid property assignment: url expected Ungültige Zuweisung bei Eigenschaft: Es wird eine URL erwartet Invalid property assignment: unsigned int expected Ungültige Zuweisung bei Eigenschaft: Es wird eine vorzeichenloser Ganzzahlwert erwartet Invalid property assignment: int expected Ungültige Zuweisung bei Eigenschaft: Es wird ein Ganzzahlwert erwartet Invalid property assignment: float expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Gleitkommazahl erwartet Invalid property assignment: double expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Gleitkommazahl (double) erwartet Invalid property assignment: color expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Farbspezifikation erwartet Invalid property assignment: date expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Datumsangabe erwartet Invalid property assignment: time expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Zeitangabe erwartet Invalid property assignment: datetime expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Datumsangabe erwartet Invalid property assignment: point expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Koordinatenangabe für einen Punkt erwartet Invalid property assignment: size expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Größenangabe erwartet Invalid property assignment: rect expected Ungültige Zuweisung bei Eigenschaft: Es werden Parameter für ein Rechteck erwartet Invalid property assignment: boolean expected Ungültige Zuweisung bei Eigenschaft: Es wird ein boolescher Wert erwartet Invalid property assignment: 3D vector expected Ungültige Zuweisung bei Eigenschaft: Es wird ein dreidimensionaler Vektor erwartet Invalid property assignment: unsupported type "%1" Ungültige Zuweisung bei Eigenschaft: Der Typ "%1" ist nicht unterstützt Element is not creatable. Das Element kann nicht erzeugt werden. Component elements may not contain properties other than id Komponenten dürfen außer id keine weiteren Eigenschaften enthalten Invalid component id specification Ungültige Komponentenspezifikation id is not unique ID-Wert nicht eindeutig Invalid component body specification Inhalt der Komponente ungültig Cannot create empty component specification Es kann keine leere Komponentenangabe erzeugt werden Empty signal assignment Leere Signalzuweisung Empty property assignment Leere Eigenschaftszuweisung Attached properties cannot be used here An dieser Stelle können keine Eigenschaften des Typs 'attached' verwendet werden Non-existent attached object Es existiert kein Bezugselement für die Eigenschaft Invalid attached object assignment Ungültige Zuweisung des Bezugselements Cannot assign to non-existent default property Es kann keine Zuweisung erfolgen, da keine Vorgabe-Eigenschaft existiert Cannot assign to non-existent property "%1" Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens '%1" existiert Invalid use of namespace Ungültige Verwendung eines Namensraums Not an attached property name Kein gültiger Name einer Eigenschaft des Typs 'attached' Invalid use of id property Ungültige Verwendung einer Eigenschaft des Typs 'Id' Incorrectly specified signal assignment Angegebene Signalzuweisung ist nicht korrekt Invalid property assignment: number expected Ungültige Zuweisung bei Eigenschaft: Es wird eine Zahl erwartet Component objects cannot declare new properties. Komponentenobjekte können keine neuen Eigenschaften deklarieren. Component objects cannot declare new signals. Komponentenobjekte können keine neuen Signale deklarieren. Component objects cannot declare new functions. Komponentenobjekte können keine neuen Funktionen deklarieren. "%1.%2" is not available in %3 %4.%5. "%1.%2" ist in %3 %4.%5 nicht verfügbar. "%1.%2" is not available due to component versioning. "%1.%2" ist in dieser Version der Komponente nicht verfügbar Cannot assign a value to a signal (expecting a script to be run) Einem Signal können keine Werte zugewiesen werden (es wird ein Skript erwartet) Property has already been assigned a value Der Eigenschaft wurde bereits ein Wert zugewiesen Invalid grouped property access Falsche Gruppierung bei Zugriff auf Eigenschaft Cannot assign a value directly to a grouped property Bei einer Eigenschaft, die Teil einer Gruppierung ist, ist keine direkte Wertzuweisung zulässig Invalid property use Ungültige Verwendung von Eigenschaften Property assignment expected Zuweisung an Eigenschaft erwartet Single property assignment expected Einzelne Zuweisung an Eigenschaft erwartet Unexpected object assignment Unerwartete Zuweisung des Objekts Cannot assign object to list Zuweisung eines Objekts an eine Liste nicht zulässig Can only assign one binding to lists Listen kann nur eine einzige Bindung zugewiesen werden Cannot assign primitives to lists Zuweisung eines einfachen Werts (primitive) an eine Liste nicht zulässig Cannot assign multiple values to a script property Eine Zuweisung mehrerer Werte an eine Skript-Eigenschaft ist nicht zulässig Invalid property assignment: script expected Ungültige Zuweisung bei Eigenschaft: Es wird ein Skript erwartet Cannot assign multiple values to a singular property Eine Zuweisung mehrerer Werte an eine einfache Eigenschaft ist nicht zulässig Cannot assign object to property Zuweisung eines Objekts an eine Eigenschaft nicht zulässig "%1" cannot operate on "%2" "%1" kann nicht auf "%2" angewandt werden Duplicate default property Mehrfaches Auftreten der Vorgabe-Eigenschaft Duplicate property name Mehrfaches Auftreten eines Eigenschaftsnamens Property names cannot begin with an upper case letter Eigenschaftsnamen dürfen nicht mit einem Großbuchstaben beginnen Illegal property name Ungültiger Name der Eigenschaft Duplicate signal name Mehrfaches Auftreten eines Signalnamens Signal names cannot begin with an upper case letter Signalnamen dürfen nicht mit einem Großbuchstaben beginnen Illegal signal name Ungültiger Name für Signal Duplicate method name Mehrfaches Auftreten eines Methodennamens Method names cannot begin with an upper case letter Methodennamen dürfen nicht mit einem Großbuchstaben beginnen Illegal method name Ungültiger Name für Methode Property value set multiple times Mehrfache Zuweisung eines Wertes an eine Eigenschaft Invalid property nesting Ungültige Schachtelung von Eigenschaften Cannot override FINAL property Eine als 'FINAL' ausgewiesene Eigenschaft kann nicht überschrieben werden Invalid property type Ungültiger Typ der Eigenschaft Invalid empty ID Ungültiger (leerer) Id-Wert IDs cannot start with an uppercase letter Id-Werte dürfen nicht mit einem Großbuchstaben beginnen IDs must start with a letter or underscore Id-Werte müssen mit einem Buchstaben oder Unterstrich beginnen IDs must contain only letters, numbers, and underscores Id-Werte dürfen nur Buchstaben oder Unterstriche enthalten ID illegally masks global JavaScript property Der Id-Wert überdeckt eine globale Eigenschaft aus JavaScript No property alias location Alias-Eigenschaft ohne Quellangabe Invalid alias location Ungültige Quellangabe bei Alias-Eigenschaft Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property> Ungültige Alias-Referenz. Eine Alias-Referenz muss in der Form <id>, <id>.<property> or <id>.<value property>.<property> angegeben werden Alias property exceeds alias bounds Die Alias-Eigenschaft überschreitet die Grenzen des Alias Invalid alias reference. An alias reference must be specified as <id> or <id>.<property> Ungültige Referenzierung einer Alias-Eigenschaft. Die Referenz muss in der Form <id> oder <id>.<property> angegeben werden Invalid alias reference. Unable to find id "%1" Ungültige Referenzierung einer Alias-Eigenschaft. Der Id-Wert "%1" konnte nicht gefunden werden QDeclarativeComponent Invalid empty URL Ungültige (leere) URL createObject: value is not an object createObject: Der Wert ist kein Objekt QDeclarativeCompositeTypeManager Resource %1 unavailable Auf die Ressource %1 konnte nicht zugegriffen werden Namespace %1 cannot be used as a type Der Namensraum %1 kann nicht als Typangabe verwendet werden %1 %2 %1 %2 Type %1 unavailable Der Typ %1 ist nicht verfügbar QDeclarativeConnections Cannot assign to non-existent property "%1" Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens "%1" existiert Connections: nested objects not allowed Verbindungen: Verschachtelte Objekte sind nicht zulässig Connections: syntax error Verbindungen: Syntaxfehler Connections: script expected Verbindungen: Skript erwartet QDeclarativeEngine executeSql called outside transaction() 'executeSql' wurde außerhalb von 'transaction()' aufgerufen Read-only Transaction Schreibgeschützte Transaktion Version mismatch: expected %1, found %2 Die Version %2 kann nicht verwendet werden; es wird %1 benötigt SQL transaction failed Die SQL-Transaktion ist fehlgeschlagen transaction: missing callback callback fehlt bei Transaktion SQL: database version mismatch SQL: Die Version der Datenbank entspricht nicht der erwarteten Version QDeclarativeFlipable front is a write-once property 'front' kann nur einmal zugewiesen werden back is a write-once property 'back' kann nur einmal zugewiesen werden QDeclarativeImportDatabase cannot load module "%1": File name case mismatch for "%2" Der Module "%1" kann nicht geladen werden: Der Dateiname "%2" unterscheidet sich in der Groß/Kleinschreibung module "%1" definition "%2" not readable Modul "%1" Definition "%2" kann nicht gelesen werden plugin cannot be loaded for module "%1": %2 Das Plugin des Moduls "%1" kann nicht geladen werden: %2 module "%1" plugin "%2" not found Modul "%1" Plugin "%2" konnte nicht gefunden werden module "%1" version %2.%3 is not installed Modul "%1" Version %2.%3 ist nicht installiert module "%1" is not installed Modul "%1" ist nicht installiert "%1": no such directory Das Verzeichnis "%1" existiert nicht import "%1" has no qmldir and no namespace "qmldir" und Namensraum fehlen bei dem Import "%1" - %1 is not a namespace - %1 ist kein gültiger Namensraum - nested namespaces not allowed - geschachtelte Namensräume sind nicht zulässig local directory Lokales Verzeichnis is ambiguous. Found in %1 and in %2 ist mehrdeutig. Es kommt in %1 und in %2 vor is ambiguous. Found in %1 in version %2.%3 and %4.%5 ist mehrdeutig. Es kommt in %1 in den Version %2.%3 und %4.%5 vor is instantiated recursively wird rekursiv instanziiert is not a type ist kein Typ File name case mismatch for "%2" Die Groß/Kleinschreibung des Dateinamens "%2" stimmt nicht überein QDeclarativeKeyNavigationAttached KeyNavigation is only available via attached properties Tastennavigation ist nur über Eigenschaften des Typs 'attached' verfügbar QDeclarativeKeysAttached Keys is only available via attached properties Die Unterstützung für Tasten ist nur über Eigenschaften des Typs 'attached' verfügbar QDeclarativeLayoutMirroringAttached LayoutDirection attached property only works with Items Eigenschaften des Typs 'attached' können nur mit Elementen der Klasse Item verwendet werden LayoutMirroring is only available via attached properties LayoutMirroring ist nur in Verbindung mit Eigenschaften des Typs "attached" möglich QDeclarativeListModel remove: index %1 out of range remove: Der Index %1 ist außerhalb des gültigen Bereichs insert: value is not an object insert: Der Wert ist kein Objekt insert: index %1 out of range insert: Der Index %1 ist außerhalb des gültigen Bereichs move: out of range move: Außerhalb des gültigen Bereichs append: value is not an object append: Der Wert ist kein Objekt set: value is not an object set: Der Wert ist kein Objekt set: index %1 out of range set: Der Index %1 ist außerhalb des gültigen Bereichs ListElement: cannot contain nested elements ListElement kann keine geschachtelten Elemente enthalten ListElement: cannot use reserved "id" property ListElement: Die "id"-Eigenschaft kann nicht verwendet werden ListElement: cannot use script for property value ListElement: Es kann kein Skript für den Wert der Eigenschaft verwendet werden ListModel: undefined property '%1' ListModel: Die Eigenschaft '%1' ist nicht definiert QDeclarativeLoader Loader does not support loading non-visual elements. Das Laden nicht-visueller Elemente ist nicht unterstützt. QDeclarativeParentAnimation Unable to preserve appearance under complex transform Das Erscheinungsbild kann bei einer komplexen Transformation nicht beibehalten werden Unable to preserve appearance under non-uniform scale Das Erscheinungsbild kann bei einer nicht-uniformen Skalierung nicht beibehalten werden Unable to preserve appearance under scale of 0 Das Erscheinungsbild kann bei einer Skalierung mit 0 nicht beibehalten werden QDeclarativeParentChange Unable to preserve appearance under complex transform Das Erscheinungsbild kann bei einer komplexen Transformation nicht beibehalten werden Unable to preserve appearance under non-uniform scale Das Erscheinungsbild kann bei einer nicht-uniformen Skalierung nicht beibehalten werden Unable to preserve appearance under scale of 0 Das Erscheinungsbild kann bei einer Skalierung mit 0 nicht beibehalten werden QDeclarativeParser Illegal character Ungültiges Zeichen Unclosed string at end of line Zeichenkette am Zeilenende nicht abgeschlossen Illegal escape sequence Ungültige Escape-Sequenz Illegal unicode escape sequence Ungültige Unicode-Escape-Sequenz Unclosed comment at end of file Kommentar am Dateiende nicht abgeschlossen Illegal syntax for exponential number Ungültige Syntax des Exponenten Identifier cannot start with numeric literal Ein Bezeichner darf nicht mit einem numerischen Literal beginnen Unterminated regular expression literal Regulärer Ausdruck nicht abgeschlossen Invalid regular expression flag '%0' Ungültiger Modifikator '%0' bei regulärem Ausdruck Unterminated regular expression backslash sequence Backslash-Sequenz in regulärem Ausdruck nicht abgeschlossen Unterminated regular expression class Klasse im regulären Ausdruck nicht abgeschlossen Syntax error Syntaxfehler Unexpected token `%1' Unerwartetes Element '%1' Expected token `%1' Es wird das Element '%1' erwartet Property value set multiple times Mehrfache Zuweisung eines Wertes an eine Eigenschaft Expected type name Es wird ein Typname erwartet Invalid import qualifier ID Ungültige Id-Angabe bei Import Reserved name "Qt" cannot be used as an qualifier Der reservierte Name "Qt" kann nicht als Bezeichner verwendet werden Script import qualifiers must be unique. Der für den Skript-Import angegebene Qualifizierer muss eindeutig sein. Script import requires a qualifier Der Skript-Import erfordert die Angabe eines Qualifizierers. Library import requires a version Der Import einer Bibliothek erfordert eine Versionsangabe Expected parameter type Es wird eine Typangabe für den Parameter erwartet Invalid property type modifier Ungültiger Modifikator für den Typ der Eigenschaft Unexpected property type modifier Modifikator für den Typ der Eigenschaft an dieser Stelle nicht zulässig Expected property type Typangabe für Eigenschaft erwartet Readonly not yet supported 'read-only' wird an dieser Stelle noch nicht unterstützt JavaScript declaration outside Script element Eine JavaScript-Deklaration ist außerhalb eines Skriptelementes nicht zulässig QDeclarativePauseAnimation Cannot set a duration of < 0 Es kann keine Zeitdauer <0 gesetzt werden QDeclarativePixmap Error decoding: %1: %2 Fehler beim Dekodieren: %1: %2 Failed to get image from provider: %1 Bilddaten konnten nicht erhalten werden: %1 Cannot open: %1 Fehlschlag beim Öffnen: %1 QDeclarativePixmapCache Error decoding: %1: %2 Fehler beim Decodieren: %1: %2 Failed to get image from provider: %1 Bilddaten konnten nicht erhalten werden: %1 Cannot open: %1 Fehlschlag beim Öffnen: %1 Unknown Error loading %1 Unbekannter Fehler beim Laden von %1 QDeclarativePropertyAnimation Cannot set a duration of < 0 Es kann keine Zeitdauer <0 gesetzt werden QDeclarativePropertyChanges PropertyChanges does not support creating state-specific objects. Die Erzeugung von Objekten, die einem Zustand zugeordnet sind, wird von PropertyChanges nicht unterstützt. Cannot assign to non-existent property "%1" Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens '%1" existiert Cannot assign to read-only property "%1" Die Eigenschaft "%1" ist schreibgeschützt und kann daher nicht zugewiesen werden QDeclarativeTextInput Could not load cursor delegate Cursor-Delegate konnte nicht geladen werden Could not instantiate cursor delegate Cursor-Delegate konnte nicht instanziiert werden QDeclarativeTypeData Type %1 unavailable Der Typ %1 ist nicht verfügbar Namespace %1 cannot be used as a type Der Namensraum %1 kann nicht als Typangabe verwendet werden %1 %2 %1 %2 QDeclarativeTypeLoader Script %1 unavailable Das Skript %1 ist nicht verfügbar Type %1 unavailable Der Typ %1 ist nicht verfügbar Namespace %1 cannot be used as a type Der Namensraum %1 kann nicht als Typangabe verwendet werden %1 %2 %1 %2 QDeclarativeVME Unable to create object of type %1 Es konnte kein Objekt des Typs %1 erzeugt werden Cannot assign value %1 to property %2 Der Wert '%1' kann der Eigenschaft %2 nicht zugewiesen werden Cannot assign object type %1 with no default method Der Objekttyp %1 kann nicht zugewiesen werden, da keine Vorgabe-Methode existiert Cannot connect mismatched signal/slot %1 %vs. %2 Es kann keine Verbindung zwischen dem Signal %1 und dem Slot %2 hergestellt werden, da sie nicht zusammenpassen Cannot assign an object to signal property %1 Der Signal-Eigenschaft %1 kann kein Objekt zugewiesen werden Cannot assign object to list Zuweisung eines Objekts an eine Liste nicht zulässig Cannot assign object to interface property Der Eigenschaft der Schnittstelle kann kein Objekt zugewiesen werden Unable to create attached object Es konnte kein 'attached'-Objekt erzeugt werden Cannot set properties on %1 as it is null Es können keine Eigenschaften auf %1 gesetzt werden, da es 'null' ist QDeclarativeVisualDataModel Delegate component must be Item type. Delegate-Komponente muss vom Typ 'Item' sein QDeclarativeXmlListModel Qt was built without support for xmlpatterns Diese Version der Qt-Bibliothek wurde ohne Unterstützung für xmlpatterns erstellt QDeclarativeXmlListModelRole An XmlRole query must not start with '/' Eine XmlRole-Abfrage darf nicht mit '/' beginnen QDeclarativeXmlRoleList An XmlListModel query must start with '/' or "//" Eine XmlListModel-Abfrage muss mit '/' oder "//" beginnen QDial QDial QDial SpeedoMeter Tachometer SliderHandle Schieberegler QDialog What's This? Direkthilfe Done Fertig QDialogButtonBox OK OK Save Speichern &Save S&peichern Open Öffnen Cancel Abbrechen &Cancel &Abbrechen Close Schließen &Close Schl&ießen Apply Anwenden Reset Zurücksetzen Help Hilfe Don't Save Nicht speichern Discard Verwerfen &Yes &Ja Yes to &All Ja, &alle &No &Nein N&o to All N&ein, keine Save All Alles speichern Abort Abbrechen Retry Wiederholen Ignore Ignorieren Restore Defaults Voreinstellungen Close without Saving Schließen ohne Speichern &OK &OK QDirModel Name Name Size Größe Kind Match OS X Finder Art Type All other platforms Typ Date Modified Änderungsdatum QDockWidget Close Schließen Dock Andocken Float Herauslösen QDoubleSpinBox More Mehr Less Weniger QErrorMessage &Show this message again Diese Meldung wieder an&zeigen &OK &OK Debug Message: Debug-Ausgabe: Warning: Achtung: Fatal Error: Fehler: QFile Destination file exists Die Zieldatei existiert bereits Will not rename sequential file using block copy Eine sequentielle Datei kann nicht durch blockweises Kopieren umbenannt werden Cannot remove source file Die Quelldatei kann nicht entfernt werden Cannot open %1 for input %1 kann nicht zum Lesen geöffnet werden Cannot open for output Das Öffnen zum Schreiben ist fehlgeschlagen Failure to write block Der Datenblock konnte nicht geschrieben werden Cannot create %1 for output %1 kann nicht erstellt werden No file engine available or engine does not support UnMapExtension Es ist kein Datei-Engine verfügbar oder der gegenwärtig aktive Engine unterstützt die UnMap-Erweiterung nicht QFileDialog All Files (*) Alle Dateien (*) Back Zurück List View Liste Detail View Details File Datei Open Öffnen Save As Speichern unter &Open &Öffnen &Save S&peichern Recent Places Zuletzt besucht &Rename &Umbenennen &Delete &Löschen Show &hidden files &Versteckte Dateien anzeigen New Folder Neues Verzeichnis Find Directory Verzeichnis suchen Directories Verzeichnisse All Files (*.*) Alle Dateien (*.*) Directory: Verzeichnis: %1 already exists. Do you want to replace it? Die Datei %1 existiert bereits. Soll sie überschrieben werden? %1 File not found. Please verify the correct file name was given. %1 Die Datei konnte nicht gefunden werden. Stellen Sie sicher, dass der Dateiname richtig ist. My Computer Mein Computer Parent Directory Übergeordnetes Verzeichnis Files of type: Dateien des Typs: %1 Directory not found. Please verify the correct directory name was given. %1 Das Verzeichnis konnte nicht gefunden werden. Stellen Sie sicher, dass der Verzeichnisname richtig ist. '%1' is write protected. Do you want to delete it anyway? '%1' ist schreibgeschützt. Möchten Sie die Datei trotzdem löschen? Are sure you want to delete '%1'? Sind Sie sicher, dass Sie '%1' löschen möchten? Could not delete directory. Konnte Verzeichnis nicht löschen. Drive Laufwerk File Folder Match Windows Explorer Ordner Folder All other platforms Order Alias Mac OS X Finder Alias Shortcut All other platforms Symbolischer Link Unknown Unbekannt Show Anzeigen Forward Vorwärts &New Folder &Neues Verzeichnis &Choose &Auswählen Remove Löschen File &name: Datei&name: Look in: Suchen in: Create New Folder Neuen Ordner erstellen Go back Zurück Go forward Vor Go to the parent directory Gehe zum übergeordneten Verzeichnis Create a New Folder Neuen Ordner erstellen Change to list view mode Wechsle zu Listenansicht Change to detail view mode Wechsle zu Detailansicht QFileSystemModel %1 TB %1 TB %1 GB %1 GB %1 MB %1 MB %1 KB %1 KB %1 bytes %1 Byte Invalid filename Ungültiger Dateiname <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. <b>Der Name "%1" kann nicht verwendet werden.</b><p>Versuchen Sie, die Sonderzeichen zu entfernen oder einen kürzeren Namen zu verwenden. Name Name Size Größe Kind Match OS X Finder Art Type All other platforms Typ Date Modified Änderungsdatum My Computer Mein Computer Computer Computer %1 byte(s) %1 byte QFontDatabase Normal Normal Bold Fett Demi Bold Halbfett Black Schwarz Demi Semi Light Leicht Italic Kursiv Oblique Schräggestellt Any Alle Latin Lateinisch Greek Griechisch Cyrillic Kyrillisch Armenian Armenisch Hebrew Hebräisch Arabic Arabisch Syriac Syrisch Thaana Thaana Devanagari Devanagari Bengali Bengalisch Gurmukhi Gurmukhi Gujarati Gujarati Oriya Oriya Tamil Tamilisch Telugu Telugu Kannada Kannada Malayalam Malayalam Sinhala Sinhala Thai Thailändisch Lao Laotisch Tibetan Tibetisch Myanmar Myanmar Georgian Georgisch Khmer Khmer Simplified Chinese Chinesisch (Kurzzeichen) Traditional Chinese Chinesisch (Langzeichen) Japanese Japanisch Korean Koreanisch Vietnamese Vietnamesisch Symbol Symbol Ogham Ogham Runic Runen N'Ko N'Ko QFontDialog &Font &Schriftart Font st&yle Schrifts&til &Size &Größe Effects Effekte Stri&keout Durch&gestrichen &Underline &Unterstrichen Sample Beispiel Select Font Schriftart auswählen Wr&iting System &Schriftsystem QFtp Host %1 found Rechner %1 gefunden Host found Rechner gefunden Connected to host %1 Verbunden mit Rechner %1 Connected to host Verbindung mit Rechner besteht Connection to %1 closed Verbindung mit %1 beendet Connection closed Verbindung beendet Host %1 not found Rechner %1 konnte nicht gefunden werden Connection refused to host %1 Verbindung mit %1 verweigert Connection timed out to host %1 Das Zeitlimit für die Verbindung zu '%1' wurde überschritten Unknown error Unbekannter Fehler Connecting to host failed: %1 Verbindung mit Rechner ist fehlgeschlagen: %1 Login failed: %1 Anmeldung ist fehlgeschlagen: %1 Listing directory failed: %1 Der Inhalt des Verzeichnisses kann nicht angezeigt werden: %1 Changing directory failed: %1 Ändern des Verzeichnisses ist fehlgeschlagen: %1 Downloading file failed: %1 Herunterladen der Datei ist fehlgeschlagen: %1 Uploading file failed: %1 Hochladen der Datei ist fehlgeschlagen: %1 Removing file failed: %1 Löschen der Datei ist fehlgeschlagen: %1 Creating directory failed: %1 Erstellen des Verzeichnisses ist fehlgeschlagen: %1 Removing directory failed: %1 Löschen des Verzeichnisses ist fehlgeschlagen: %1 Not connected Keine Verbindung Connection refused for data connection Verbindung für die Daten Verbindung verweigert QHostInfo Unknown error Unbekannter Fehler No host name given Es wurde kein Hostname angegeben QHostInfoAgent Host not found Rechner konnte nicht gefunden werden Unknown address type Unbekannter Adresstyp Unknown error Unbekannter Fehler No host name given Es wurde kein Hostname angegeben Invalid hostname Ungültiger Rechnername QHttp Connection refused Verbindung verweigert Host %1 not found Rechner %1 konnte nicht gefunden werden Wrong content length Ungültige Längenangabe HTTP request failed HTTP-Anfrage fehlgeschlagen Host %1 found Rechner %1 gefunden Host found Rechner gefunden Connected to host %1 Verbunden mit Rechner %1 Connected to host Verbindung mit Rechner besteht Connection to %1 closed Verbindung mit %1 beendet Connection closed Verbindung beendet Unknown error Unbekannter Fehler Request aborted Anfrage wurde abgebrochen No server set to connect to Für die Verbindung wurde kein Server-Rechner angegeben Server closed connection unexpectedly Der Server hat die Verbindung unerwartet geschlossen Invalid HTTP response header Der Kopfteil der HTTP-Antwort ist ungültig Unknown authentication method Unbekannte Authentifizierungsmethode Invalid HTTP chunked body Der Inhalt (chunked body) der HTTP-Antwort ist ungültig Error writing response to device Beim Schreiben der Antwort auf das Ausgabegerät ist ein Fehler aufgetreten Proxy authentication required Proxy-Authentifizierung erforderlich Authentication required Authentifizierung erforderlich Proxy requires authentication Der Proxy-Server verlangt eine Authentifizierung Host requires authentication Der Hostrechner verlangt eine Authentifizierung Data corrupted Die Daten sind verfälscht SSL handshake failed Im Ablauf des SSL-Protokolls ist ein Fehler aufgetreten. Unknown protocol specified Es wurde ein unbekanntes Protokoll angegeben Connection refused (or timed out) Verbindung verweigert oder Zeitlimit überschritten HTTPS connection requested but SSL support not compiled in Die angeforderte HTTPS-Verbindung kann nicht aufgebaut werden, da keine SSL-Unterstützung vorhanden ist QHttpSocketEngine Did not receive HTTP response from proxy Keine HTTP-Antwort vom Proxy-Server Error parsing authentication request from proxy Fehler beim Auswerten der Authentifizierungsanforderung des Proxy-Servers Authentication required Authentifizierung erforderlich Proxy denied connection Der Proxy-Server hat den Aufbau einer Verbindung verweigert Error communicating with HTTP proxy Fehler bei der Kommunikation mit dem Proxy-Server Proxy server not found Es konnte kein Proxy-Server gefunden werden Proxy connection refused Der Proxy-Server hat den Aufbau einer Verbindung verweigert Proxy server connection timed out Bei der Verbindung mit dem Proxy-Server wurde ein Zeitlimit überschritten Proxy connection closed prematurely Der Proxy-Server hat die Verbindung vorzeitig beendet QIBaseDriver Error opening database Die Datenbankverbindung konnte nicht geöffnet werden Could not start transaction Es konnte keine Transaktion gestartet werden Unable to commit transaction Die Transaktion konnte nicht durchgeführt werden (Operation 'commit' fehlgeschlagen) Unable to rollback transaction Die Transaktion konnte nicht rückgängig gemacht werden (Operation 'rollback' fehlgeschlagen) QIBaseResult Unable to create BLOB Es konnte kein BLOB erzeugt werden Unable to write BLOB Der BLOB konnte nicht geschrieben werden Unable to open BLOB Der BLOB konnte nicht geöffnet werden Unable to read BLOB Der BLOB konnte nicht gelesen werden Could not find array Das Feld konnte nicht gefunden werden Could not get array data Die Daten des Feldes konnten nicht gelesen werden Could not get query info Die erforderlichen Informationen zur Abfrage sind nicht verfügbar Could not start transaction Es konnte keine Transaktion gestartet werden Unable to commit transaction Die Transaktion konnte nicht durchgeführt werden (Operation 'commit' fehlgeschlagen) Could not allocate statement Die Allokation des Befehls ist fehlgeschlagen Could not prepare statement Der Befehl konnte nicht initialisiert werden Could not describe input statement Es konnte keine Beschreibung des Eingabebefehls erhalten werden Could not describe statement Es konnte keine Beschreibung des Befehls erhalten werden Unable to close statement Der Befehl konnte nicht geschlossen werden Unable to execute query Der Befehl konnte nicht ausgeführt werden Could not fetch next item Das nächste Element konnte nicht abgeholt werden Could not get statement info Es ist keine Information zum Befehl verfügbar QIODevice Permission denied Zugriff verweigert Too many open files Zu viele Dateien geöffnet No such file or directory Die Datei oder das Verzeichnis konnte nicht gefunden werden No space left on device Kein freier Speicherplatz auf dem Gerät vorhanden Unknown error Unbekannter Fehler QInputContext XIM XIM FEP FEP XIM input method XIM-Eingabemethode Windows input method Windows-Eingabemethode Mac OS X input method Mac OS X-Eingabemethode S60 FEP input method S60-FEP-Eingabemethode QInputDialog Enter a value: Geben Sie einen Wert ein: QLibrary Could not mmap '%1': %2 Operation mmap fehlgeschlagen für '%1': %2 Plugin verification data mismatch in '%1' Die Prüfdaten des Plugins '%1' stimmen nicht überein Could not unmap '%1': %2 Operation unmap fehlgeschlagen für '%1': %2 The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] Das Plugin '%1' verwendet eine inkompatible Qt-Bibliothek. (%2.%3.%4) [%5] The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3" Das Plugin '%1' verwendet eine inkompatible Qt-Bibliothek. Erforderlicher build-spezifischer Schlüssel "%2", erhalten "%3" Unknown error Unbekannter Fehler The shared library was not found. Die dynamische Bibliothek konnte nicht gefunden werden. The file '%1' is not a valid Qt plugin. Die Datei '%1' ist kein gültiges Qt-Plugin. The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) Das Plugin '%1' verwendet eine inkompatible Qt-Bibliothek. (Im Debug- bzw. Release-Modus erstellte Bibliotheken können nicht zusammen verwendet werden.) Cannot load library %1: %2 Die Bibliothek %1 kann nicht geladen werden: %2 Cannot unload library %1: %2 Die Bibliothek %1 kann nicht entladen werden: %2 Cannot resolve symbol "%1" in %2: %3 Das Symbol "%1" kann in %2 nicht aufgelöst werden: %3 '%1' is not an ELF object (%2) '%1' ist keine ELF-Objektdatei (%2) '%1' is not an ELF object '%1' ist keine ELF-Objektdatei '%1' is an invalid ELF object (%2) '%1' ist keine gültige ELF-Objektdatei (%2) QLineEdit Select All Alles auswählen &Undo &Rückgängig &Redo Wieder&herstellen Cu&t &Ausschneiden &Copy &Kopieren &Paste Einf&ügen Delete Löschen QLocalServer %1: Name error %1: Fehlerhafter Name %1: Permission denied %1: Zugriff verweigert %1: Address in use %1: Die Adresse wird bereits verwendet %1: Unknown error %2 %1: Unbekannter Fehler %2 QLocalSocket %1: Connection refused %1: Der Verbindungsaufbau wurde verweigert %1: Remote closed %1: Die Verbindung wurde von der Gegenseite geschlossen %1: Invalid name %1: Ungültiger Name %1: Socket access error %1: Fehler beim Zugriff auf den Socket %1: Socket resource error %1: Socket-Fehler (Ressourcenproblem) %1: Socket operation timed out %1: Zeitüberschreitung bei Socket-Operation %1: Datagram too large %1: Das Datagramm ist zu groß %1: Connection error %1: Verbindungsfehler %1: The socket operation is not supported %1: Diese Socket-Operation wird nicht unterstützt %1: Unknown error %1: Unbekannter Fehler %1: Unknown error %2 %1: Unbekannter Fehler %2 %1: Access denied %1: Zugriff verweigert QMYSQLDriver Unable to open database ' Die Datenbankverbindung kann nicht geöffnet werden ' Unable to connect Es kann keine Verbindung aufgebaut werden Unable to begin transaction Es kann keine Transaktion gestartet werden Unable to commit transaction Die Transaktion kann nicht durchgeführt werden (Operation 'commit' fehlgeschlagen) Unable to rollback transaction Die Transaktion kann nicht rückgängig gemacht werden (Operation 'rollback' fehlgeschlagen) QMYSQLResult Unable to fetch data Es konnten keine Daten abgeholt werden Unable to execute query Die Abfrage konnte nicht ausgeführt werden Unable to store result Das Ergebnis konnte nicht gespeichert werden Unable to prepare statement Der Befehl konnte nicht initialisiert werden Unable to reset statement Der Befehl konnte nicht zurückgesetzt werden Unable to bind value Der Wert konnte nicht gebunden werden Unable to execute statement Der Befehl konnte nicht ausgeführt werden Unable to bind outvalues Die Ausgabewerte konnten nicht gebunden werden Unable to store statement results Die Ergebnisse des Befehls konnten nicht gespeichert werden Unable to execute next query Die folgende Abfrage kann nicht ausgeführt werden Unable to store next result Das folgende Ergebnis kann nicht gespeichert werden QMdiArea (Untitled) (Unbenannt) QMdiSubWindow %1 - [%2] %1 - [%2] Close Schließen Minimize Minimieren Restore Down Wiederherstellen &Restore Wieder&herstellen &Move Ver&schieben &Size Größe ä&ndern Mi&nimize M&inimieren Ma&ximize Ma&ximieren Stay on &Top Im &Vordergrund bleiben &Close Schl&ießen Maximize Maximieren Unshade Herabrollen Shade Aufrollen Restore Wiederherstellen Help Hilfe Menu Menü - [%1] - [%1] QMenu Close Schließen Open Öffnen Execute Ausführen QMenuBar Actions Optionen QMessageBox OK OK <h3>About Qt</h3><p>This program uses Qt version %1.</p> <h3>Über Qt</h3><p>Dieses Programm verwendet Qt Version %1.</p> <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.digia.com/product/licensing">qt.digia.com/product/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).</p><p>Qt is a Digia product. See <a href="http://qt.digia.com/">qt.digia.com</a> for more information.</p> About Qt Über Qt Help Hilfe Show Details... Details einblenden... Hide Details... Details ausblenden... QMultiInputContext Select IM Eingabemethode auswählen QMultiInputContextPlugin Multiple input method switcher Umschalter für Eingabemethoden Multiple input method switcher that uses the context menu of the text widgets Mehrfachumschalter für Eingabemethoden, der das Kontextmenü des Text-Widgets verwendet QNativeSocketEngine The remote host closed the connection Der entfernte Rechner hat die Verbindung geschlossen Network operation timed out Das Zeitlimit für die Operation wurde überschritten Out of resources Keine Ressourcen verfügbar Unsupported socket operation Socket-Kommando nicht unterstützt Protocol type not supported Das Protokoll wird nicht unterstützt Invalid socket descriptor Ungültiger Socket-Deskriptor Network unreachable Das Netzwerk ist nicht erreichbar Permission denied Zugriff verweigert Connection timed out Das Zeitlimit für die Verbindung wurde überschritten Connection refused Verbindung verweigert The bound address is already in use Die angegebene Adresse ist bereits in Gebrauch The address is not available Die Adresse ist nicht verfügbar The address is protected Die Adresse ist geschützt Unable to send a message Die Nachricht konnte nicht gesendet werden Unable to receive a message Die Nachricht konnte nicht empfangen werden Unable to write Der Schreibvorgang konnte nicht ausgeführt werden Network error Netzwerkfehler Another socket is already listening on the same port Auf diesem Port hört bereits ein anderer Socket Unable to initialize non-blocking socket Der nichtblockierende Socket konnte nicht initialisiert werden Unable to initialize broadcast socket Der Broadcast-Socket konnte nicht initialisiert werden Attempt to use IPv6 socket on a platform with no IPv6 support Es wurde versucht, einen IPv6-Socket auf einem System ohne IPv6-Unterstützung zu verwenden Host unreachable Der Zielrechner kann nicht erreicht werden Datagram was too large to send Das Datagram konnte nicht gesendet werden, weil es zu groß ist Operation on non-socket Operation kann nur auf einen Socket angewandt werden Unknown error Unbekannter Fehler The proxy type is invalid for this operation Die Operation kann mit dem Proxy-Typ nicht durchgeführt werden QNetworkAccessCacheBackend Error opening %1 %1 konnte nicht geöffnet werden QNetworkAccessDataBackend Operation not supported on %1 Diese Operation wird von %1 nicht unterstützt Invalid URI: %1 Ungültiger URI: %1 QNetworkAccessDebugPipeBackend Write error writing to %1: %2 Fehler beim Schreiben zu %1: %2 Socket error on %1: %2 Socket-Fehler bei %1: %2 Remote host closed the connection prematurely on %1 Der entfernte Rechner hat die Verbindung zu %1 vorzeitig beendet QNetworkAccessFileBackend Request for opening non-local file %1 Anforderung zum Öffnen einer Datei über Netzwerk %1 Error opening %1: %2 %1 konnte nicht geöffnet werden: %2 Write error writing to %1: %2 Fehler beim Schreiben zur Datei %1: %2 Cannot open %1: Path is a directory %1 kann nicht geöffnet werden: Der Pfad spezifiziert ein Verzeichnis Read error reading from %1: %2 Beim Lesen von der Datei %1 trat ein Fehler auf: %2 QNetworkAccessFtpBackend No suitable proxy found Es konnte kein geeigneter Proxy-Server gefunden werden Cannot open %1: is a directory %1 kann nicht geöffnet werden: Es handelt sich um ein Verzeichnis Logging in to %1 failed: authentication required Die Anmeldung bei %1 ist fehlgeschlagen: Es ist eine Authentifizierung erforderlich Error while downloading %1: %2 Beim Herunterladen von %1 trat ein Fehler auf: %2 Error while uploading %1: %2 Beim Hochladen von %1 trat ein Fehler auf: %2 QNetworkAccessHttpBackend No suitable proxy found Es konnte kein geeigneter Proxy-Server gefunden werden QNetworkAccessManager Network access is disabled. Der Zugriff auf das Netzwerk ist nicht gestattet. QNetworkReply Error downloading %1 - server replied: %2 Beim Herunterladen von %1 trat ein Fehler auf - Die Antwort des Servers ist: %2 Protocol "%1" is unknown Das Protokoll "%1" ist unbekannt Network session error. Fehler bei Netzwerkverbindung. Temporary network failure. Das Netzwerk ist zurzeit ausgefallen. QNetworkReplyImpl Operation canceled Operation abgebrochen QNetworkSession Invalid configuration. Ungültige Konfiguration. QNetworkSessionPrivateImpl Unknown session error. Unbekannter Fehler bei Netzwerkverbindung. The session was aborted by the user or system. Die Verbindung wurde vom Benutzer oder vom Betriebssystem unterbrochen. The requested operation is not supported by the system. Die angeforderte Operation wird vom System nicht unterstützt. The specified configuration cannot be used. Die angegebene Konfiguration kann nicht verwendet werden. Roaming was aborted or is not possible. Das Roaming wurde abgebrochen oder ist hier nicht möglich. Roaming error Fehler beim Roaming Session aborted by user or system Die Verbindung wurde vom Benutzer oder vom Betriebssystem unterbrochen Unidentified Error Unbekannter Fehler QOCIDriver Unable to logon Logon-Vorgang fehlgeschlagen Unable to initialize QOCIDriver Initialisierung fehlgeschlagen Unable to begin transaction Es konnte keine Transaktion gestartet werden Unable to commit transaction Die Transaktion konnte nicht durchgeführt werden (Operation 'commit' fehlgeschlagen) Unable to rollback transaction Die Transaktion konnte nicht rückgängig gemacht werden (Operation 'rollback' fehlgeschlagen) QOCIResult Unable to bind column for batch execute Die Spalte konnte nicht für den Stapelverarbeitungs-Befehl gebunden werden Unable to execute batch statement Der Stapelverarbeitungs-Befehl konnte nicht ausgeführt werden Unable to goto next Kann nicht zum nächsten Element gehen Unable to alloc statement Die Allokation des Befehls ist fehlgeschlagen Unable to prepare statement Der Befehl konnte nicht initialisiert werden Unable to get statement type Der Anweisungstyp kann nicht bestimmt werden Unable to bind value Der Wert konnte nicht gebunden werden Unable to execute statement Der Befehl konnte nicht ausgeführt werden QODBCDriver Unable to connect Es kann keine Verbindung aufgebaut werden Unable to disable autocommit 'autocommit' konnte nicht deaktiviert werden Unable to commit transaction Die Transaktion konnte nicht durchgeführt werden (Operation 'commit' fehlgeschlagen) Unable to rollback transaction Die Transaktion konnte nicht rückgängig gemacht werden (Operation 'rollback' fehlgeschlagen) Unable to enable autocommit 'autocommit' konnte nicht aktiviert werden Unable to connect - Driver doesn't support all functionality required Es kann keine Verbindung aufgebaut werden weil der Treiber die benötigte Funktionalität nicht vollständig unterstützt QODBCResult QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult::reset: 'SQL_CURSOR_STATIC' konnte nicht als Attribut des Befehls gesetzt werden. Bitte prüfen Sie die Konfiguration Ihres ODBC-Treibers Unable to execute statement Der Befehl konnte nicht ausgeführt werden Unable to fetch next Der nächste Datensatz konnte nicht abgeholt werden Unable to prepare statement Der Befehl konnte nicht initialisiert werden Unable to bind variable Die Variable konnte nicht gebunden werden Unable to fetch last Der letzte Datensatz konnte nicht abgeholt werden Unable to fetch Es konnten keine Daten abgeholt werden Unable to fetch first Der erste Datensatz konnte nicht abgeholt werden Unable to fetch previous Der vorherige Datensatz konnte nicht abgeholt werden QObject "%1" duplicates a previous role name and will be disabled. "%1" ist bereits als Name einer Rolle vergeben und wird daher deaktiviert. invalid query: "%1" Ungültige Abfrage: "%1" PulseAudio Sound Server PulseAudio-Sound-Server QPPDOptionsModel Name Name Value Wert QPSQLDriver Unable to connect Es kann keine Verbindung aufgebaut werden Could not begin transaction Es konnte keine Transaktion gestartet werden Could not commit transaction Die Transaktion konnte nicht durchgeführt werden (Operation 'commit' fehlgeschlagen) Could not rollback transaction Die Transaktion konnte nicht rückgängig gemacht werden (Operation 'rollback' fehlgeschlagen) Unable to subscribe Die Registrierung ist fehlgeschlagen Unable to unsubscribe Die Registrierung konnte nicht aufgehoben werden QPSQLResult Unable to create query Es konnte keine Abfrage erzeugt werden Unable to prepare statement Der Befehl konnte nicht initialisiert werden QPageSetupWidget Centimeters (cm) Zentimeter (cm) Millimeters (mm) Millimeter (mm) Inches (in) Zoll (in) Points (pt) Punkte (pt) Form Formular Paper Papier Page size: Seitengröße: Width: Breite: Height: Höhe: Paper source: Papierquelle: Orientation Ausrichtung Portrait Hochformat Landscape Querformat Reverse landscape Umgekehrtes Querformat Reverse portrait Umgekehrtes Hochformat Margins Ränder top margin Oberer Rand left margin Linker Rand right margin Rechter Rand bottom margin Unterer Rand QPluginLoader Unknown error Unbekannter Fehler The plugin was not loaded. Das Plugin wurde nicht geladen. QPrintDialog locally connected direkt verbunden Aliases: %1 Alias: %1 unknown unbekannt OK OK Print all Alles drucken Print range Bereich drucken A0 (841 x 1189 mm) A0 (841 x 1189 mm) A1 (594 x 841 mm) A1 (594 x 841 mm) A2 (420 x 594 mm) A2 (420 x 594 mm) A3 (297 x 420 mm) A3 (297 x 420 mm) A5 (148 x 210 mm) A5 (148 x 210 mm) A6 (105 x 148 mm) A6 (105 x 148 mm) A7 (74 x 105 mm) A7 (74 x 105 mm) A8 (52 x 74 mm) A8 (52 x 74 mm) A9 (37 x 52 mm) A9 (37 x 52 mm) B0 (1000 x 1414 mm) B0 (1000 x 1414 mm) B1 (707 x 1000 mm) B1 (707 x 1000 mm) B2 (500 x 707 mm) B2 (500 x 707 mm) B3 (353 x 500 mm) B3 (353 x 500 mm) B4 (250 x 353 mm) B4 (250 x 353 mm) B6 (125 x 176 mm) B6 (125 x 176 mm) B7 (88 x 125 mm) B7 (88 x 125 mm) B8 (62 x 88 mm) B8 (62 x 88 mm) B9 (44 x 62 mm) B9 (44 x 62 mm) B10 (31 x 44 mm) B10 (31 x 44 mm) C5E (163 x 229 mm) C5E (163 x 229 mm) DLE (110 x 220 mm) DLE (110 x 220 mm) Folio (210 x 330 mm) Folio (210 x 330 mm) Ledger (432 x 279 mm) Ledger (432 x 279 mm) Tabloid (279 x 432 mm) Tabloid (279 x 432 mm) US Common #10 Envelope (105 x 241 mm) US Common #10 Envelope (105 x 241 mm) Print current page Diese Seite drucken A4 (210 x 297 mm, 8.26 x 11.7 inches) A4 (210 x 297 mm) B5 (176 x 250 mm, 6.93 x 9.84 inches) B5 (176 x 250 mm) Executive (7.5 x 10 inches, 191 x 254 mm) Executive (7,5 x 10 Zoll, 191 x 254 mm) Legal (8.5 x 14 inches, 216 x 356 mm) Legal (8,5 x 14 Zoll, 216 x 356 mm) Letter (8.5 x 11 inches, 216 x 279 mm) Letter (8,5 x 11 Zoll, 216 x 279 mm) Print selection Auswahl drucken Print Drucken Print To File ... In Datei drucken ... File %1 is not writable. Please choose a different file name. Die Datei %1 ist schreibgeschützt. Bitte wählen Sie einen anderen Dateinamen. %1 already exists. Do you want to overwrite it? Die Datei %1 existiert bereits. Soll sie überschrieben werden? File exists Die Datei existiert bereits <qt>Do you want to overwrite it?</qt> <qt>Soll sie überschrieben werden?</qt> %1 is a directory. Please choose a different file name. %1 ist ein Verzeichnis. Bitte wählen Sie einen anderen Dateinamen. The 'From' value cannot be greater than the 'To' value. Die Angabe für die erste Seite darf nicht größer sein als die für die letzte Seite. A0 A0 A1 A1 A2 A2 A3 A3 A4 A4 A5 A5 A6 A6 A7 A7 A8 A8 A9 A9 B0 B0 B1 B1 B2 B2 B3 B3 B4 B4 B5 B5 B6 B6 B7 B7 B8 B8 B9 B9 B10 B10 C5E C5E DLE DLE Executive Executive Folio Folio Ledger Ledger Legal Legal Letter Letter Tabloid Tabloid US Common #10 Envelope US Common #10 Envelope Custom Benutzerdefiniert &Options >> &Einstellungen >> &Options << &Einstellungen << Print to File (PDF) In PDF-Datei drucken Print to File (Postscript) In Postscript-Datei drucken Local file Lokale Datei Write %1 file Schreiben der Datei %1 &Print &Drucken QPrintPreviewDialog %1% %1% Print Preview Druckvorschau Next page Nächste Seite Previous page Vorige Seite First page Erste Seite Last page Letzte Seite Fit width Breite anpassen Fit page Seite anpassen Zoom in Vergrößern Zoom out Verkleinern Portrait Hochformat Landscape Querformat Show single page Einzelne Seite anzeigen Show facing pages Gegenüberliegende Seiten anzeigen Show overview of all pages Übersicht aller Seiten Print Drucken Page setup Seite einrichten Close Schließen Export to PDF PDF exportieren Export to PostScript PostScript exportieren Page Setup Seite einrichten QPrintPropertiesWidget Form Formular Page Seite Advanced Erweitert QPrintSettingsOutput Form Formular Copies Anzahl Exemplare Print range Bereich drucken Print all Alles drucken Pages from Seiten von to bis Selection Auswahl Output Settings Ausgabeeinstellungen Copies: Anzahl Exemplare: Collate Sortieren Reverse Umgekehrt Options Optionen Color Mode Farbmodus Color Farbe Grayscale Graustufen Duplex Printing Duplexdruck None Kein Long side Lange Seite Short side Kurze Seite Current Page QPrintWidget Form Formular Printer Drucker &Name: &Name: P&roperties &Eigenschaften Location: Standort: Preview Vorschau Type: Typ: Output &file: Ausgabe&datei: ... ... QProcess Could not open input redirection for reading Die Eingabeumleitung konnte nicht zum Lesen geöffnet werden Could not open output redirection for writing Die Ausgabeumleitung konnte nicht zum Lesen geöffnet werden Resource error (fork failure): %1 Ressourcenproblem ("fork failure"): %1 Process operation timed out Zeitüberschreitung Error reading from process Das Lesen vom Prozess ist fehlgeschlagen Error writing to process Das Schreiben zum Prozess ist fehlgeschlagen Process crashed Der Prozess ist abgestürzt No program defined Es wurde kein Programm angegeben Process failed to start: %1 Das Starten des Prozesses ist fehlgeschlagen: %1 QProgressDialog Cancel Abbrechen QPushButton Open Öffnen QRadioButton Check Ankreuzen QRegExp no error occurred kein Fehler disabled feature used deaktivierte Eigenschaft wurde benutzt bad char class syntax falsche Syntax für Zeichenklasse bad lookahead syntax falsche Syntax für Lookahead bad repetition syntax falsche Syntax für Wiederholungen invalid octal value ungültiger Oktal-Wert missing left delim fehlende linke Begrenzung unexpected end unerwartetes Ende met internal limit internes Limit erreicht invalid interval ungültiges Intervall invalid category ungültige Kategorie QSQLite2Driver Error opening database Die Datenbankverbindung konnte nicht geöffnet werden Unable to begin transaction Es konnte keine Transaktion gestartet werden Unable to commit transaction Die Transaktion konnte nicht durchgeführt werden (Operation 'commit' fehlgeschlagen) Unable to rollback transaction Die Transaktion kann nicht rückgängig gemacht werden QSQLite2Result Unable to fetch results Das Ergebnis konnte nicht abgeholt werden Unable to execute statement Der Befehl konnte nicht ausgeführt werden QSQLiteDriver Error opening database Die Datenbankverbindung konnte nicht geöffnet werden Error closing database Die Datenbankverbindung konnte nicht geschlossen werden Unable to begin transaction Es konnte keine Transaktion gestartet werden Unable to commit transaction Die Transaktion konnte nicht durchgeführt werden (Operation 'commit' fehlgeschlagen) Unable to rollback transaction Die Transaktion konnte nicht rückgängig gemacht werden (Operation 'rollback' fehlgeschlagen) QSQLiteResult Unable to fetch row Der Datensatz konnte nicht abgeholt werden Unable to execute statement Der Befehl konnte nicht ausgeführt werden Unable to reset statement Der Befehl konnte nicht zurückgesetzt werden Unable to bind parameters Die Parameter konnte nicht gebunden werden Parameter count mismatch Die Anzahl der Parameter ist falsch No query Kein Abfrage QScriptBreakpointsModel ID ID Location Stelle Condition Bedingung Ignore-count Auslösen nach Single-shot Einmal auslösen Hit-count Ausgelöst QScriptBreakpointsWidget New Neu Delete Löschen QScriptDebugger Go to Line Gehe zu Zeile Line: Zeile: Interrupt Unterbrechen Shift+F5 Shift+F5 Continue Weiter F5 F5 Step Into Einzelschritt herein F11 F11 Step Over Einzelschritt über F10 F10 Step Out Einzelschritt heraus Shift+F11 Shift+F11 Run to Cursor Bis Cursor ausführen Ctrl+F10 Ctrl+F10 Run to New Script Bis zu neuem Skript ausführen Toggle Breakpoint Haltepunkt umschalten F9 F9 Clear Debug Output Debug-Ausgabe löschen Clear Error Log Fehlerausgabe löschen Clear Console Konsole löschen &Find in Script... &Suche im Skript... Ctrl+F Ctrl+F Find &Next &Nächste Fundstelle F3 F3 Find &Previous &Vorhergehende Fundstelle Shift+F3 Shift+F3 Ctrl+G Ctrl+G Debug Debuggen QScriptDebuggerCodeFinderWidget Close Schließen Previous Vorige Next Nächste Case Sensitive Groß/Kleinschreibung beachten Whole words Ganze Worte <img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped <img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Die Suche hat das Ende erreicht QScriptDebuggerLocalsModel Name Name Value Wert QScriptDebuggerStackModel Level Ebene Name Name Location Stelle QScriptEdit Toggle Breakpoint Haltepunkt umschalten Disable Breakpoint Haltepunkt deaktivieren Enable Breakpoint Haltepunkt aktivieren Breakpoint Condition: Bedingung: QScriptEngineDebugger Loaded Scripts Geladene Skripte Breakpoints Haltepunkte Stack Stapel Locals Lokale Variablen Console Konsole Debug Output Debug-Ausgabe Error Log Fehlerausgabe Search Suche View Ansicht Qt Script Debugger Qt Script Debugger QScriptNewBreakpointWidget Close Schließen QScrollBar Scroll here Hierher scrollen Left edge Linker Rand Top Anfang Right edge Rechter Rand Bottom Ende Page left Eine Seite nach links Page up Eine Seite nach oben Page right Eine Seite nach rechts Page down Eine Seite nach unten Scroll left Nach links scrollen Scroll up Nach oben scrollen Scroll right Nach rechts scrollen Scroll down Nach unten scrollen Line up Ausrichten Position Position Line down Eine Zeile nach unten QSharedMemory %1: create size is less then 0 %1: Die Größenangabe für die Erzeugung ist kleiner als Null %1: unable to lock %1: Sperrung fehlgeschlagen %1: unable to unlock %1: Die Sperrung konnte nicht aufgehoben werden %1: permission denied %1: Zugriff verweigert %1: already exists %1: existiert bereits %1: doesn't exists %1: existiert nicht %1: out of resources %1: Keine Ressourcen mehr verfügbar %1: unknown error %2 %1: Unbekannter Fehler %2 %1: key is empty %1: Ungültige Schlüsselangabe (leer) %1: ftok failed %1: ftok-Aufruf ist fehlgeschlagen %1: unable to make key %1: Es kann kein Schlüssel erzeugt werden %1: doesn't exist %1: existiert nicht %1: UNIX key file doesn't exist %1: Die Unix-Schlüsseldatei existiert nicht %1: system-imposed size restrictions %1: Ein systembedingtes Limit der Größe wurde erreicht %1: not attached %1: nicht verbunden %1: invalid size %1: Ungültige Größe %1: key error %1: Fehlerhafter Schlüssel %1: size query failed %1: Die Abfrage der Größe ist fehlgeschlagen %1: unable to set key on lock %1: Es kann kein Schlüssel für die Sperrung gesetzt werden QShortcut Space This and all following "incomprehensible" strings in QShortcut context are key names. Please use the localized names appearing on actual keyboards or whatever is commonly used. Leertaste Esc Esc Tab Tab Backtab Rück-Tab Backspace Rücktaste Return Return Enter Enter Ins Einfg Del Entf Pause Pause Print Druck SysReq SysReq Home Pos1 End Ende Left Links Up Hoch Right Rechts Down Runter PgUp Bild aufwärts PgDown Bild abwärts CapsLock Feststelltaste NumLock Zahlen-Feststelltaste ScrollLock Rollen-Feststelltaste Menu Menü Help Hilfe Back Zurück Forward Vorwärts Stop Abbrechen Refresh Aktualisieren Volume Down Lautstärke - Volume Mute Ton aus Volume Up Lautstärke + Bass Boost Bass-Boost Bass Up Bass + Bass Down Bass - Treble Up Höhen + Treble Down Höhen - Media Play Wiedergabe Media Stop Stopp Media Previous Vorheriger Media Next Nächster Media Record Aufzeichnen Media Pause Media player pause button Pause Toggle Media Play/Pause Media player button to toggle between playing and paused Wiedergabe/Pause Favorites Favoriten Search Suchen Standby Standby Open URL URL öffnen Launch Mail Mail starten Launch Media Medienspieler starten Launch (0) (0) starten Launch (1) (1) starten Launch (2) (2) starten Launch (3) (3) starten Launch (4) (4) starten Launch (5) (5) starten Launch (6) (6) starten Launch (7) (7) starten Launch (8) (8) starten Launch (9) (9) starten Launch (A) (A) starten Launch (B) (B) starten Launch (C) (C) starten Launch (D) (D) starten Launch (E) (E) starten Launch (F) (F) starten Monitor Brightness Up Monitor heller Monitor Brightness Down Monitor dunkler Keyboard Light On/Off Tastaturbeleuchtung Ein/Aus Keyboard Brightness Up Tastaturbeleuchtung heller Keyboard Brightness Down Tastaturbeleuchtung dunkler Power Off Ausschalten Wake Up Aufwecken Eject Auswerfen Screensaver Bildschirmschoner WWW Internet Sleep Schlafmodus LightBulb Beleuchtung Shop Shop History Verlauf Add Favorite Lesezeichen hinzufügen Hot Links Empfohlene Verweise Adjust Brightness Helligkeit einstellen Finance Finanzen Community Community Audio Rewind Audio rückspulen Back Forward Hinterstes nach vorn Application Left Anwendung links Application Right Anwendung rechts Book Buch CD CD Calculator Rechner Clear Löschen Clear Grab Zugriff löschen Close Schließen Copy Kopieren Cut Ausschneiden Display Anzeigen DOS DOS Documents Dokumente Spreadsheet Spreadsheet Browser Browser Game Spiel Go Los iTouch iTouch Logoff Logoff Market Markt Meeting Versammlung Keyboard Menu Tastaturmenü Menu PB Menü PB My Sites Meine Orte News Nachrichten Home Office Home Office Option Option Paste Einfügen Phone Telefon Reply Antworten Reload Neu laden Rotate Windows Fenster rotieren Rotation PB Rotation PB Rotation KB Rotation KB Save Speichern Send Senden Spellchecker Rechtschreibprüfung Split Screen Bildschirm teilen Support Hilfe Task Panel Task-Leiste Terminal Terminal Tools Werkzeuge Travel Reise Video Video Word Processor Textverarbeitung XFer XFer Zoom In Vergrößern Zoom Out Verkleinern Away Abwesend Messenger Messenger WebCam WebCam Mail Forward Weiterleitung Pictures Bilder Music Musik Battery Batterie Bluetooth Bluetooth Wireless Drahtlos Ultra Wide Band Ultra Wide Band Audio Forward Audio vorspulen Audio Repeat Audio wiederholen Audio Random Play Audio zufällige Auswahl spielen Subtitle Untertitel Audio Cycle Track Audiospur wechseln Time Zeit View Ansicht Top Menu Hauptmenü Suspend Pause Hibernate Hibernate Print Screen Bildschirm drucken Page Up Bild aufwärts Page Down Bild abwärts Caps Lock Feststelltaste Num Lock Zahlen-Feststelltaste Number Lock Zahlen-Feststelltaste Scroll Lock Rollen-Feststelltaste Insert Einfügen Delete Löschen Escape Escape System Request System Request Select Auswählen Yes Ja No Nein Context1 Kontext1 Context2 Kontext2 Context3 Kontext3 Context4 Kontext4 Call Button to start a call (note: a separate button is used to end the call) Anruf Hangup Button to end a call (note: a separate button is used to start the call) Auflegen Toggle Call/Hangup Button that will hang up if we're in call, or make a call if we're not. Anrufen/Aufhängen Flip Umdrehen Voice Dial Button to trigger voice dialing Sprachwahl Last Number Redial Button to redial the last number called Wahlwiederholung Camera Shutter Button to trigger the camera shutter (take a picture) Auslöser Camera Focus Button to focus the camera Scharfstellen Kanji Kanji Muhenkan Muhenkan Henkan Henkan Romaji Romaji Hiragana Hiragana Katakana Katakana Hiragana Katakana Hiragana Katakana Zenkaku Zenkaku Hankaku Hankaku Zenkaku Hankaku Zenkaku Hankaku Touroku Touroku Massyo Massyo Kana Lock Kana Lock Kana Shift Kana Shift Eisu Shift Eisu Shift Eisu toggle Eisu toggle Code input Code-Eingabe Multiple Candidate Mehrere Vorschläge Previous Candidate Vorheriger Vorschlag Hangul Hangeul Hangul Start Hangeul Anfang Hangul End Hangeul Ende Hangul Hanja Hangeul-Hanja Hangul Jamo Hangeul-Jamo Hangul Romaja Hangeul-Romaja Hangul Jeonja Hangeul-Jeonja Hangul Banja Hangeul-Banja Hangul PreHanja Hangeul-PreHanja Hangul PostHanja Hangeul-PostHanja Hangul Special Hangeul Special Ctrl Strg Shift Umschalt Alt Alt Meta Meta + + F%1 F%1 Home Page Startseite QSlider Page left Eine Seite nach links Page up Eine Seite nach oben Position Position Page right Eine Seite nach rechts Page down Eine Seite nach unten QSocks5SocketEngine Connection to proxy refused Der Proxy-Server hat den Aufbau einer Verbindung verweigert Connection to proxy closed prematurely Der Proxy-Server hat die Verbindung vorzeitig beendet Proxy host not found Der Proxy-Server konnte nicht gefunden werden Connection to proxy timed out Bei der Verbindung mit dem Proxy-Server wurde ein Zeitlimit überschritten Proxy authentication failed Die Authentifizierung beim Proxy-Server ist fehlgeschlagen Proxy authentication failed: %1 Die Authentifizierung beim Proxy-Server ist fehlgeschlagen: %1 SOCKS version 5 protocol error Protokoll-Fehler (SOCKS Version 5) General SOCKSv5 server failure Allgemeiner Fehler bei der Kommunikation mit dem SOCKSv5-Server Connection not allowed by SOCKSv5 server Der SOCKSv5-Server hat die Verbindung verweigert TTL expired TTL verstrichen SOCKSv5 command not supported Dieses SOCKSv5-Kommando wird nicht unterstützt Address type not supported Dieser Adresstyp wird nicht unterstützt Unknown SOCKSv5 proxy error code 0x%1 Unbekannten Fehlercode vom SOCKSv5-Proxy-Server erhalten: 0x%1 Network operation timed out Das Zeitlimit für die Operation wurde überschritten QSoftKeyManager Ok Ok Select Auswählen Done Fertig Options Optionen Cancel Abbrechen Exit Beenden QSpinBox More Mehr Less Weniger QSql Delete Löschen Delete this record? Diesen Datensatz löschen? Yes Ja No Nein Insert Einfügen Update Aktualisieren Save edits? Änderungen speichern? Cancel Abbrechen Confirm Bestätigen Cancel your edits? Änderungen verwerfen? QSslSocket Unable to write data: %1 Die Daten konnten nicht geschrieben werden: %1 Unable to decrypt data: %1 Die Daten konnten nicht entschlüsselt werden: %1 Error while reading: %1 Beim Lesen ist ein Fehler aufgetreten: %1 Error during SSL handshake: %1 Im Ablauf des SSL-Protokolls ist ein Fehler aufgetreten: %1 Error creating SSL context (%1) Es konnte keine SSL-Kontextstruktur erzeugt werden (%1) Invalid or empty cipher list (%1) Ungültige oder leere Schlüsselliste (%1) Private key does not certify public key, %1 Der private Schlüssel passt nicht zum öffentlichen Schlüssel, %1 Error creating SSL session, %1 Es konnte keine SSL-Sitzung erzeugt werden, %1 Error creating SSL session: %1 Es konnte keine SSL-Sitzung erzeugt werden: %1 The peer certificate is blacklisted Das Zertifikat der Gegenstelle ist in einer Schwarzen Liste enthalten Cannot provide a certificate with no key, %1 Ohne Schlüssel kann kein Zertifikat zur Verfügung gestellt werden, %1 Error loading local certificate, %1 Das lokale Zertifikat konnte nicht geladen werden, %1 Error loading private key, %1 Der private Schlüssel konnte nicht geladen werden, %1 No error Kein Fehler The issuer certificate could not be found Das Zertifikat des Ausstellers konnte nicht gefunden werden The certificate signature could not be decrypted Die Signatur des Zertifikats konnte nicht entschlüsselt werden The public key in the certificate could not be read Der öffentliche Schlüssel konnte nicht gelesen werden The signature of the certificate is invalid Die Signatur des Zertifikats ist ungültig The certificate is not yet valid Das Zertifikat ist noch nicht gültig The certificate has expired Die Gültigkeit des Zertifikats ist abgelaufen The certificate's notBefore field contains an invalid time Das Feld 'notBefore' des Zertifikats enthält eine ungültige Zeit The certificate's notAfter field contains an invalid time Das Feld 'notAfter' des Zertifikats enthält eine ungültige Zeit The certificate is self-signed, and untrusted Das Zertifikat ist selbstsigniert und daher nicht vertrauenswürdig The root certificate of the certificate chain is self-signed, and untrusted Das oberste Zertifikat der Kette ist selbstsigniert und daher nicht vertrauenswürdig The issuer certificate of a locally looked up certificate could not be found Das Zertifikat des Ausstellers eines lokal gefundenen Zertifikats konnte nicht gefunden werden No certificates could be verified Keines der Zertifikate konnte verifiziert werden One of the CA certificates is invalid Eines der Zertifikate der Zertifizierungsstelle ist ungültig The basicConstraints path length parameter has been exceeded Die Länge des basicConstraints-Pfades wurde überschritten The supplied certificate is unsuitable for this purpose Das angegebene Zertifikat kann in diesem Fall nicht verwendet werden The root CA certificate is not trusted for this purpose Das oberste Zertifikat der Zertifizierungsstelle ist für diesen Fall nicht vertrauenswürdig The root CA certificate is marked to reject the specified purpose Das oberste Zertifikat der Zertifizierungsstelle weist diesen Fall auf Grund einer speziellen Kennzeichnung zurück The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate Das Zertifikat des betrachteten Ausstellers wurde zurückgewiesen da sein Subjektname nicht dem Namen des Austellers des aktuellen Zertifikats entspricht The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate Das Zertifikat des betrachteten Ausstellers wurde zurückgewiesen da Ausstellername und Seriennummer vorhanden sind und nicht dem Bezeichner der Zertifizierungsstelle des aktuellen Zertifikats entsprechen The peer did not present any certificate Die Gegenstelle hat kein Zertifikat angegeben The host name did not match any of the valid hosts for this certificate Der Name des Hosts ist keiner aus der Liste der für dieses Zertifikat gültigen Hosts Unknown error Unbekannter Fehler QStateMachine Missing initial state in compound state '%1' Der Anfangszustand des zusammengesetzten Zustands '%1' fehlt Missing default state in history state '%1' Der Anfangszustand im Verlauf bei Zustand '%1' fehlt No common ancestor for targets and source of transition from state '%1' Die Ziele und die Quelle des Übergangs vom Zustand '%1' haben keinen gemeinsamen Ursprung Unknown error Unbekannter Fehler QSystemSemaphore %1: does not exist %1: Nicht existent %1: out of resources %1: Keine Ressourcen mehr verfügbar %1: permission denied %1: Zugriff verweigert %1: already exists %1: Existiert bereits %1: unknown error %2 %1: Unbekannter Fehler %2 QTDSDriver Unable to open connection Die Datenbankverbindung kann nicht geöffnet werden Unable to use database Die Datenbank kann nicht verwendet werden QTabBar Scroll Left Nach links scrollen Scroll Right Nach rechts scrollen QTcpServer Operation on socket is not supported Diese Socket-Operation wird nicht unterstützt QTextControl &Undo &Rückgängig &Redo Wieder&herstellen Cu&t &Ausschneiden &Copy &Kopieren Copy &Link Location &Link-Adresse kopieren &Paste Einf&ügen Delete Löschen Select All Alles auswählen QToolButton Press Drücken Open Öffnen QUdpSocket This platform does not support IPv6 Diese Plattform unterstützt kein IPv6 QUndoGroup Undo Rückgängig Redo Wiederherstellen QUndoModel <empty> <leer> QUndoStack Undo Rückgängig Redo Wiederherstellen QUnicodeControlCharacterMenu LRM Left-to-right mark LRM Left-to-right mark RLM Right-to-left mark RLM Right-to-left mark ZWJ Zero width joiner ZWJ Zero width joiner ZWNJ Zero width non-joiner ZWNJ Zero width non-joiner ZWSP Zero width space ZWSP Zero width space LRE Start of left-to-right embedding LRE Start of left-to-right embedding RLE Start of right-to-left embedding RLE Start of right-to-left embedding LRO Start of left-to-right override LRO Start of left-to-right override RLO Start of right-to-left override RLO Start of right-to-left override PDF Pop directional formatting PDF Pop directional formatting Insert Unicode control character Unicode-Kontrollzeichen einfügen QWebFrame Request cancelled Anfrage wurde abgebrochen Request blocked Anfrage wurde abgewiesen Cannot show URL Der URL kann nicht angezeigt werden Frame load interrupted by policy change Das Laden des Rahmens wurde durch eine Änderung der Richtlinien unterbrochen Cannot show mimetype Dieser Mime-Typ kann nicht angezeigt werden File does not exist Die Datei existiert nicht QWebPage Submit default label for Submit buttons in forms on web pages Senden Submit Submit (input element) alt text for <input> elements with no alt, title, or value Senden Reset default label for Reset buttons in forms on web pages Rücksetzen Choose File title for file button used in HTML forms Durchsuchen No file selected text to display in file button used in HTML forms when no file is selected Es ist keine Datei ausgewählt Open in New Window Open in New Window context menu item In neuem Fenster öffnen Save Link... Download Linked File context menu item Ziel speichern unter... Copy Link Copy Link context menu item Link-Adresse kopieren Open Image Open Image in New Window context menu item Grafik in neuem Fenster öffnen Save Image Download Image context menu item Grafik speichern unter Copy Image Copy Link context menu item Grafik kopieren Open Frame Open Frame in New Window context menu item Frame öffnen Copy Copy context menu item Kopieren Go Back Back context menu item Zurück Go Forward Forward context menu item Vor Stop Stop context menu item Abbrechen Reload Reload context menu item Neu laden Cut Cut context menu item Ausschneiden Paste Paste context menu item Einfügen No Guesses Found No Guesses Found context menu item Keine Vorschläge gefunden Ignore Ignore Spelling context menu item Ignorieren Add To Dictionary Learn Spelling context menu item In Wörterbuch aufnehmen Search The Web Search The Web context menu item Im Web suchen Look Up In Dictionary Look Up in Dictionary context menu item Im Wörterbuch nachschauen Open Link Open Link context menu item Adresse öffnen Ignore Ignore Grammar context menu item Ignorieren Spelling Spelling and Grammar context sub-menu item Rechtschreibung Show Spelling and Grammar menu item title Rechtschreibung und Grammatik anzeigen Hide Spelling and Grammar menu item title Rechtschreibung und Grammatik nicht anzeigen Check Spelling Check spelling context menu item Rechtschreibung prüfen Check Spelling While Typing Check spelling while typing context menu item Rechtschreibung während des Schreibens überprüfen Check Grammar With Spelling Check grammar with spelling context menu item Grammatik mit Rechtschreibung zusammen überprüfen Fonts Font context sub-menu item Fonts Bold Bold context menu item Fett Italic Italic context menu item Kursiv Underline Underline context menu item Unterstrichen Outline Outline context menu item Umriss Direction Writing direction context sub-menu item Schreibrichtung Text Direction Text direction context sub-menu item Schreibrichtung Default Default writing direction context menu item Vorgabe Left to Right Left to Right context menu item Von links nach rechts Right to Left Right to Left context menu item Von rechts nach links Missing Plug-in Label text to be used when a plug-in is missing Fehlendes Plugin Loading... Media controller status message when the media is loading Lädt... Live Broadcast Media controller status message when watching a live broadcast Live-Übertragung Audio Element Media controller element Audio-Element Video Element Media controller element Video-Element Mute Button Media controller element Stummschalttaste Unmute Button Media controller element Abstelltaste für Stummschaltung Play Button Media controller element Abspielknopf Pause Button Media controller element Pause-Knopf Slider Media controller element Schieberegler Slider Thumb Media controller element Schieberegler-Griff Rewind Button Media controller element Rückspultaste Return to Real-time Button Media controller element Kehre zu Echtzeit zurück Elapsed Time Media controller element Spielzeit Remaining Time Media controller element Verbleibende Zeit Status Display Media controller element Statusanzeige Fullscreen Button Media controller element Vollbild-Taste Seek Forward Button Media controller element Vorlauftaste Seek Back Button Media controller element Rücklauftaste Audio element playback controls and status display Media controller element Audio-Steuerung und Statusanzeige Video element playback controls and status display Media controller element Video-Steuerung und Statusanzeige Mute audio tracks Media controller element Schalte Tonspuren stumm Unmute audio tracks Media controller element Stummschaltung der Tonspuren aufheben Begin playback Media controller element Abspielen Pause playback Media controller element Pause Movie time scrubber Media controller element Abspielzeit Movie time scrubber thumb Media controller element Griff zur Einstellung der Abspielzeit Rewind movie Media controller element Film zurückspulen Return streaming movie to real-time Media controller element Setze Film auf Echtzeit zurück Current movie time Media controller element Abspielzeit des Films Remaining movie time Media controller element Verbleibende Zeit des Films Current movie status Media controller element Status des Films Play movie in full-screen mode Media controller element Film im Vollbildmodus abspielen Seek quickly back Media controller element Schnelles Rückwärtssuchen Seek quickly forward Media controller element Schnelles Vorwärtssuchen Indefinite time Media time description Unbegrenzte Zeit %1 days %2 hours %3 minutes %4 seconds Media time description %1 Tage %2 Stunden %3 Minuten %4 Sekunden %1 hours %2 minutes %3 seconds Media time description %1 Stunden %2 Minuten %3 Sekunden %1 minutes %2 seconds Media time description %1 Minuten %2 Sekunden %1 seconds Media time description %1 Sekunden Inspect Inspect Element context menu item Prüfen No recent searches Label for only item in menu that appears when clicking on the search field image, when no searches have been performed Es existieren noch keine Suchanfragen Recent searches label for first item in the menu that appears when clicking on the search field image, used as embedded menu title Bisherige Suchanfragen Clear recent searches menu item in Recent Searches menu that empties menu's contents Gespeicherte Suchanfragen löschen Unknown Unknown filesize FTP directory listing item Unbekannt Web Inspector - %2 Web Inspector - %2 %1 (%2x%3 pixels) Title string for images %1 (%2x%3 Pixel) Redirection limit reached Maximal Anzahl von Weiterleitungen wurde erreicht Bad HTTP request Ungültige HTTP-Anforderung This is a searchable index. Enter search keywords: text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' Dieser Index verfügt über eine Suchfunktion. Geben Sie einen Suchbegriff ein: Scroll here Hierher scrollen Left edge Linker Rand Top Anfang Right edge Rechter Rand Bottom Ende Page left Eine Seite nach links Page up Eine Seite nach oben Page right Eine Seite nach rechts Page down Eine Seite nach unten Scroll left Nach links scrollen Scroll up Nach oben scrollen Scroll right Nach rechts scrollen Scroll down Nach unten scrollen %n file(s) number of chosen file Eine Datei %n Dateien JavaScript Alert - %1 JavaScript-Hinweis - %1 JavaScript Confirm - %1 JavaScript-Bestätigung - %1 JavaScript Prompt - %1 JavaScript-Eingabeaufforderung - %1 JavaScript Problem - %1 JavaScript-Problem - %1 The script on this page appears to have a problem. Do you want to stop the script? Das Skript dieser Webseite ist fehlerhaft. Möchten Sie es anhalten? Move the cursor to the next character Positionsmarke auf nächstes Zeichen setzen Move the cursor to the previous character Positionsmarke auf vorheriges Zeichen setzen Move the cursor to the next word Positionsmarke auf nächstes Wort setzen Move the cursor to the previous word Positionsmarke auf vorherige Wort setzen Move the cursor to the next line Positionsmarke auf nächste Zeile setzen Move the cursor to the previous line Positionsmarke auf vorherige Zeile setzen Move the cursor to the start of the line Positionsmarke auf Zeilenanfang setzen Move the cursor to the end of the line Positionsmarke auf Zeilenende setzen Move the cursor to the start of the block Positionsmarke auf Anfang des Blocks setzen Move the cursor to the end of the block Positionsmarke auf Ende des Blocks setzen Move the cursor to the start of the document Positionsmarke auf Anfang des Dokuments setzen Move the cursor to the end of the document Positionsmarke auf Ende des Dokuments setzen Select all Alles auswählen Select to the next character Bis zum nächsten Zeichen markieren Select to the previous character Bis zum vorherigen Zeichen markieren Select to the next word Bis zum nächsten Wort markieren Select to the previous word Bis zum vorherigen Wort markieren Select to the next line Bis zur nächsten Zeile markieren Select to the previous line Bis zur vorherigen Zeile markieren Select to the start of the line Bis zum Zeilenanfang markieren Select to the end of the line Bis zum Zeilenende markieren Select to the start of the block Bis zum Anfang des Blocks markieren Select to the end of the block Bis zum Ende des Blocks markieren Select to the start of the document Bis zum Anfang des Dokuments markieren Select to the end of the document Bis zum Ende des Dokuments markieren Delete to the start of the word Bis zum Anfang des Wortes löschen Delete to the end of the word Bis zum Ende des Wortes löschen Insert a new paragraph Neuen Abschnitt einfügen Insert a new line Neue Zeile einfügen Paste and Match Style Einfügen und dem Stil anpassen Remove formatting Formatierung entfernen Strikethrough Durchgestrichen Subscript Tiefstellung Superscript Hochstellung Insert Bulleted List Liste mit Punkten einfügen Insert Numbered List Nummerierte Liste einfügen Indent Einrücken Outdent Einrückung aufheben Center Zentrieren Justify Ausrichten Align Left Linksbündig ausrichten Align Right Rechtsbündig ausrichten QWhatsThisAction What's This? Direkthilfe QWidget * * QWizard Cancel Abbrechen Help Hilfe < &Back < &Zurück &Finish Ab&schließen &Help &Hilfe Go Back Zurück Continue Weiter Commit Anwenden Done Fertig &Next &Weiter &Next > &Weiter > QWorkspace &Restore Wieder&herstellen &Move Ver&schieben &Size &Größe ändern Mi&nimize M&inimieren Ma&ximize Ma&ximieren &Close Schl&ießen Stay on &Top Im &Vordergrund bleiben Minimize Minimieren Restore Down Wiederherstellen Close Schließen Sh&ade &Aufrollen %1 - [%2] %1 - [%2] &Unshade &Herabrollen QXml no error occurred kein Fehler error triggered by consumer Konsument löste Fehler aus unexpected end of file unerwartetes Ende der Datei more than one document type definition mehrere Dokumenttypdefinitionen error occurred while parsing element Fehler beim Parsen eines Elements tag mismatch Element-Tags sind nicht richtig geschachtelt error occurred while parsing content Fehler beim Parsen des Inhalts eines Elements unexpected character unerwartetes Zeichen invalid name for processing instruction kein gültiger Name für eine Processing-Instruktion version expected while reading the XML declaration fehlende Version beim Parsen der XML-Deklaration wrong value for standalone declaration falscher Wert für die Standalone-Deklaration error occurred while parsing document type definition Fehler beim Parsen der Dokumenttypdefinition letter is expected ein Buchstabe ist an dieser Stelle erforderlich error occurred while parsing comment Fehler beim Parsen eines Kommentars error occurred while parsing reference Fehler beim Parsen einer Referenz internal general entity reference not allowed in DTD in einer DTD ist keine interne allgemeine Entity-Referenz erlaubt external parsed general entity reference not allowed in attribute value in einem Attribut-Wert sind keine externen Entity-Referenzen erlaubt external parsed general entity reference not allowed in DTD in der DTD sind keine externen Entity-Referenzen erlaubt unparsed entity reference in wrong context nicht-analysierte Entity-Referenz im falschen Kontext verwendet recursive entities rekursive Entity error in the text declaration of an external entity Fehler in der Text-Deklaration einer externen Entity encoding declaration or standalone declaration expected while reading the XML declaration fehlende Kodierung-Deklaration oder Standalone-Deklaration beim Parsen der XML-Deklaration standalone declaration expected while reading the XML declaration fehlende Standalone-Deklaration beim Parsen der XML Deklaration QXmlPatternistCLI Warning in %1, at line %2, column %3: %4 Warnung in %1, bei Zeile %2, Spalte %3: %4 Warning in %1: %2 Warnung in %1: %2 Unknown location Unbekannter Ort Error %1 in %2, at line %3, column %4: %5 Fehler %1 in %2, bei Zeile %3, Spalte %4: %5 Error %1 in %2: %3 Fehler %1 in %2: %3 QXmlStream Extra content at end of document. Überzähliger Inhalt nach Ende des Dokuments. Invalid entity value. Ungültiger Entity-Wert. Invalid XML character. Ungültiges XML-Zeichen. Sequence ']]>' not allowed in content. Im Inhalt ist die Zeichenfolge ']]>' nicht erlaubt. Namespace prefix '%1' not declared Der Namensraum-Präfix '%1' wurde nicht deklariert Attribute redefined. Redefinition eines Attributes. Unexpected character '%1' in public id literal. '%1' ist kein gültiges Zeichen in einer public-id-Angabe. Invalid XML version string. Ungültige XML-Versionsangabe. Unsupported XML version. Diese XML-Version wird nicht unterstützt. %1 is an invalid encoding name. %1 ist kein gültiger Name für die Kodierung. Encoding %1 is unsupported Die Kodierung %1 wird nicht unterstützt Standalone accepts only yes or no. Der Wert für das 'Standalone'-Attribut kann nur 'yes' oder 'no' sein. Invalid attribute in XML declaration. Die XML-Deklaration enthält ein ungültiges Attribut. Premature end of document. Vorzeitiges Ende des Dokuments. Invalid document. Ungültiges Dokument. Expected Es wurde , but got ' erwartet, stattdessen erhalten ' Unexpected ' Ungültig an dieser Stelle ' Expected character data. Es wurden Zeichendaten erwartet. Recursive entity detected. Es wurde eine rekursive Entity festgestellt. Start tag expected. Öffnendes Element erwartet. XML declaration not at start of document. Die XML-Deklaration befindet sich nicht am Anfang des Dokuments. NDATA in parameter entity declaration. Eine Parameter-Entity-Deklaration darf kein NDATA enthalten. %1 is an invalid processing instruction name. %1 ist kein gültiger Name für eine Prozessing-Instruktion. Invalid processing instruction name. Der Name der Prozessing-Instruktion ist ungültig. Illegal namespace declaration. Ungültige Namensraum-Deklaration. Invalid XML name. Ungültiger XML-Name. Opening and ending tag mismatch. Die Anzahl der öffnenden Elemente stimmt nicht mit der Anzahl der schließenden Elemente überein. Reference to unparsed entity '%1'. Es wurde die ungeparste Entity '%1' referenziert. Entity '%1' not declared. Die Entity '%1' ist nicht deklariert. Reference to external entity '%1' in attribute value. Im Attributwert wurde die externe Entity '%1' referenziert. Invalid character reference. Ungültige Zeichenreferenz. Encountered incorrectly encoded content. Es wurde Inhalt mit einer ungültigen Kodierung gefunden. The standalone pseudo attribute must appear after the encoding. Das Standalone-Pseudoattribut muss der Kodierung unmittelbar folgen. %1 is an invalid PUBLIC identifier. %1 ist keine gültige Angabe für eine PUBLIC-Id. QtXmlPatterns At least one component must be present. Es muss mindestens eine Komponente vorhanden sein. %1 is not a valid value of type %2. %1 ist kein gültiger Wert des Typs %2. When casting to %1 from %2, the source value cannot be %3. Bei einer "cast"-Operation von %1 zu %2 darf der Wert nicht %3 sein. Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values. Der effektive boolesche Wert einer Sequenz aus zwei oder mehreren atomaren Werten kann nicht berechnet werden. The data of a processing instruction cannot contain the string %1 Die Daten einer Processing-Anweisung dürfen nicht die Zeichenkette %1 enthalten %1 is an invalid %2 %1 ist kein gültiges %2 %1 is not a valid XML 1.0 character. %1 ist kein gültiges XML-1.0-Zeichen. %1 was called. %1 wurde gerufen. In the replacement string, %1 must be followed by at least one digit when not escaped. In der Ersetzung muss auf %1 eine Ziffer folgen, wenn es nicht durch ein Escape-Zeichen geschützt ist. In the replacement string, %1 can only be used to escape itself or %2, not %3 In der Ersetzung kann %1 nur verwendet werden, um sich selbst oder %2 schützen, nicht jedoch für %3 %1 matches newline characters Der Ausdruck '%1' schließt Zeilenvorschübe ein Matches are case insensitive Groß/Kleinschreibung wird nicht beachtet %1 is an invalid regular expression pattern: %2 %1 ist kein gültiger regulärer Ausdruck: %2 It will not be possible to retrieve %1. %1 kann nicht bestimmt werden. The default collection is undefined Für eine Kollektion ist keine Vorgabe definiert %1 cannot be retrieved %1 kann nicht bestimmt werden The item %1 did not match the required type %2. Das Element %1 entspricht nicht dem erforderlichen Typ %2. %1 is an unknown schema type. %1 ist ein unbekannter Schema-Typ. A template with name %1 has already been declared. Eine Vorlage des Namens %1 existiert bereits. Only one %1 declaration can occur in the query prolog. Der Anfrage-Prolog darf nur eine %1-Deklaration enthalten. The initialization of variable %1 depends on itself Die Initialisierung der Variable %1 hängt von ihrem eigenem Wert ab The variable %1 is unused Die Variable %1 wird nicht verwendet Version %1 is not supported. The supported XQuery version is 1.0. Die Version %1 wird nicht unterstützt. Die unterstützte Version von XQuery ist 1.0. No function with signature %1 is available Es existiert keine Funktion mit der Signatur %1 It is not possible to redeclare prefix %1. Der Präfix %1 kann nicht redeklariert werden. Prefix %1 is already declared in the prolog. Der Präfix %1 wurde bereits im Prolog deklariert. The name of an option must have a prefix. There is no default namespace for options. Der Name einer Option muss einen Präfix haben. Es gibt keine Namensraum-Vorgabe für Optionen. The Schema Import feature is not supported, and therefore %1 declarations cannot occur. Die Deklaration %1 ist unzulässig, da Schema-Import nicht unterstützt wird. The target namespace of a %1 cannot be empty. Der Ziel-Namensraum von %1 darf nicht leer sein. The module import feature is not supported Modul-Import wird nicht unterstützt The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 Der Namensraum einer nutzerdefinierten Funktion aus einem Bibliotheksmodul muss dem Namensraum des Moduls entsprechen (%1 anstatt %2) A function already exists with the signature %1. Es existiert bereits eine Funktion mit der Signatur %1. No external functions are supported. All supported functions can be used directly, without first declaring them as external Externe Funktionen werden nicht unterstützt. Alle unterstützten Funktionen können direkt verwendet werden, ohne sie als extern zu deklarieren The %1-axis is unsupported in XQuery Die %1-Achse wird in XQuery nicht unterstützt The namespace URI cannot be the empty string when binding to a prefix, %1. Der Namensraum-URI darf nicht leer sein, wenn er an den Präfix %1 gebunden ist. %1 is an invalid namespace URI. %1 ist kein gültiger Namensraum-URI. It is not possible to bind to the prefix %1 Der Präfix %1 kann nicht gebunden werden Two namespace declaration attributes have the same name: %1. Es wurden zwei Namensraum-Deklarationsattribute gleichen Namens (%1) gefunden. The namespace URI must be a constant and cannot use enclosed expressions. Ein Namensraum-URI muss eine Konstante sein und darf keine eingebetteten Ausdrücke verwenden. %1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. %1 befindet sich nicht unter den Attributdeklarationen im Bereich. Schema-Import wird nicht unterstützt. empty leer zero or one kein oder ein exactly one genau ein one or more ein oder mehrere zero or more kein oder mehrere The focus is undefined. Es ist kein Fokus definiert. An attribute by name %1 has already been created. Es wurde bereits ein Attribut mit dem Namen %1 erzeugt. Network timeout. Das Zeitlimit der Netzwerkoperation wurde überschritten. Element %1 can't be serialized because it appears outside the document element. Das Element %1 kann nicht serialisiert werden, da es außerhalb des Dokumentenelements erscheint. Year %1 is invalid because it begins with %2. %1 ist keine gültige Jahresangabe, da es mit %2 beginnt. Day %1 is outside the range %2..%3. Die Tagesangabe %1 ist außerhalb des Bereiches %2..%3. Month %1 is outside the range %2..%3. Die Monatsangabe %1 ist außerhalb des Bereiches %2..%3. Overflow: Can't represent date %1. Das Datum %1 kann nicht dargestellt werden (Überlauf). Day %1 is invalid for month %2. Die Tagesangabe %1 ist für den Monat %2 ungültig. Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; Die Zeitangabe 24:%1:%2.%3 ist ungültig. Bei der Stundenangabe 24 müssen Minuten, Sekunden und Millisekunden 0 sein. Time %1:%2:%3.%4 is invalid. Die Zeitangabe %1:%2:%3.%4 ist ungültig. Overflow: Date can't be represented. Das Datum kann nicht dargestellt werden (Überlauf). At least one time component must appear after the %1-delimiter. Bei Vorhandensein eines %1-Begrenzers muss mindestens eine Komponente vorhanden sein. Dividing a value of type %1 by %2 (not-a-number) is not allowed. Die Division eines Werts des Typs %1 durch %2 (kein numerischer Wert) ist nicht zulässig. Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. Die Division eines Werts des Typs %1 durch %2 oder %3 (positiv oder negativ Null) ist nicht zulässig. Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. Die Multiplikation eines Werts des Typs %1 mit %2 oder %3 (positiv oder negativ unendlich) ist nicht zulässig. A value of type %1 cannot have an Effective Boolean Value. Ein Wert des Typs %1 kann keinen effektiven booleschen Wert haben. Value %1 of type %2 exceeds maximum (%3). Der Wert %1 des Typs %2 überschreitet das Maximum (%3). Value %1 of type %2 is below minimum (%3). Der Wert %1 des Typs %2 unterschreitet das Minimum (%3). A value of type %1 must contain an even number of digits. The value %2 does not. Die Stellenzahl eines Wertes des Typs %1 muss geradzahlig sein. Das ist bei %2 nicht der Fall. %1 is not valid as a value of type %2. %1 ist kein gültiger Wert des Typs %2. Operator %1 cannot be used on type %2. Der Operator %1 kann nicht auf den Typ %2 angewandt werden. Operator %1 cannot be used on atomic values of type %2 and %3. Der Operator %1 kann nicht auf atomare Werte der Typen %2 und %3 angewandt werden. The namespace URI in the name for a computed attribute cannot be %1. Der Namensraum-URI im Namen eines berechneten Attributes darf nicht %1 sein. The name for a computed attribute cannot have the namespace URI %1 with the local name %2. Der Name eines berechneten Attributes darf keinen Namensraum-URI %1 mit dem lokalen Namen %2 haben. Type error in cast, expected %1, received %2. Typfehler bei "cast"-Operation; es wurde %1 erwartet, aber %2 empfangen. When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed. Bei einer "cast"-Operation zum Typ %1 oder abgeleitetenTypen muss der Quellwert ein Zeichenketten-Literal oder ein Wert gleichen Typs sein. Der Typ %2 ist ungültig. A comment cannot contain %1 Ein Kommentar darf %1 nicht enthalten A comment cannot end with a %1. Ein Kommentar darf nicht auf %1 enden. An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place. Ein Attributknoten darf nicht als Kind eines Dokumentknotens erscheinen. Es erschien ein Attributknoten mit dem Namen %1. A library module cannot be evaluated directly. It must be imported from a main module. Ein Bibliotheksmodul kann nicht direkt ausgewertet werden, er muss von einem Hauptmodul importiert werden. No template by name %1 exists. Es existiert keine Vorlage mit dem Namen %1. A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type. Werte des Typs %1 dürfen keine Prädikate sein. Für Prädikate sind nur numerische oder effektive boolesche Typen zulässig. A positional predicate must evaluate to a single numeric value. Ein positionales Prädikat muss sich als einfacher, numerischer Wert auswerten lassen. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid. Der Zielname einer Processing-Anweisung kann nicht %1 (unabhängig von Groß/Kleinschreibung) sein. %2 ist daher ungültig. %1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. %1 ist kein gültiger Zielname einer Processing-Anweisung, es muss ein %2 Wert wie zum Beispiel %3 sein. The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. Der letzte Schritt eines Pfades kann entweder nur Knoten oder nur atomare Werte enthalten. Sie dürfen nicht zusammen auftreten. No namespace binding exists for the prefix %1 Es existiert keine Namensraum-Bindung für den Präfix %1 No namespace binding exists for the prefix %1 in %2 Es existiert keine Namensraum-Bindung für den Präfix %1 in %2 The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. Das erste Argument von %1 darf nicht vom Typ %2 sein; es muss numerisch, xs:yearMonthDuration oder xs:dayTimeDuration sein. The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. Das erste Argument von %1 kann nicht vom Typ %2 sein, es muss einer der Typen %3, %4 oder %5 sein. The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. Das zweite Argument von %1 kann nicht vom Typ %2 sein, es muss einer der Typen %3, %4 oder %5 sein. If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. Wenn beide Werte mit Zeitzonen angegeben werden, müssen diese übereinstimmen. %1 und %2 sind daher unzulässig. %1 must be followed by %2 or %3, not at the end of the replacement string. Auf %1 muss %2 oder %3 folgen; es kann nicht am Ende der Ersetzung erscheinen. %1 and %2 match the start and end of a line. Die Ausdrücke %1 und %2 passen jeweils auf den Anfang oder das Ende einer beliebigen Zeile. Whitespace characters are removed, except when they appear in character classes Leerzeichen werden entfernt, sofern sie nicht in Zeichenklassen erscheinen %1 is an invalid flag for regular expressions. Valid flags are: %1 ist kein gültiger Modifikator für reguläre Ausdrücke. Gültige Modifikatoren sind: If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. Es kann kein Präfix angegeben werden, wenn das erste Argument leer oder eine leere Zeichenkette (kein Namensraum) ist. Es wurde der Präfix %1 angegeben. The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). Die Normalisierungsform %1 wird nicht unterstützt. Die unterstützten Normalisierungsformen sind %2, %3, %4 and %5, und "kein" (eine leere Zeichenkette steht für "keine Normalisierung"). A zone offset must be in the range %1..%2 inclusive. %3 is out of range. Eine Zeitzonen-Differenz muss im Bereich %1..%2 (einschließlich) liegen. %3 liegt außerhalb des Bereiches. Required cardinality is %1; got cardinality %2. Die erforderliche Kardinalität ist %1 (gegenwärtig %2). The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. Die Kodierung %1 ist ungültig; sie darf nur aus lateinischen Buchstaben bestehen und muss dem regulären Ausdruck %2 entsprechen. The keyword %1 cannot occur with any other mode name. Das Schlüsselwort %1 kann nicht mit einem anderen Modusnamen zusammen verwendet werden. No variable with name %1 exists Es existiert keine Variable des Namens %1 The value of attribute %1 must be of type %2, which %3 isn't. Der Wert des Attributs %1 muss vom Typ %2 sein, was bei %3 nicht der Fall ist. The prefix %1 cannot be bound. By default, it is already bound to the namespace %2. Der Präfix %1 kann nicht gebunden werden. Er ist bereits per Vorgabe an den Namensraum %2 gebunden. A variable with name %1 has already been declared. Eine Variable des Namens %1 wurde bereits deklariert. No value is available for the external variable with name %1. Es ist kein Wert für die externe Variable des Namens %1 verfügbar. A stylesheet function must have a prefixed name. Der Name einer Stylesheet-Funktion muss einen Präfix haben. The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. Der Namensraum %1 ist reserviert und kann daher von nutzerdefinierten Funktionen nicht verwendet werden (für diesen Zweck gibt es den vordefinierten Präfix %2). An argument with name %1 has already been declared. Every argument name must be unique. Es wurde bereits ein Argument des Namens %1 deklariert. Argumentnamen müssen eindeutig sein. When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal. Bei der Verwendung der Funktion %1 zur Auswertung innerhalb eines Suchmusters muss das Argument eine Variablenreferenz oder ein Zeichenketten-Literal sein. In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching. Bei einem XSL-T-Suchmuster muss das erste Argument zur Funktion %1 bei der Verwendung zur Suche ein Zeichenketten-Literal sein. In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching. Bei einem XSL-T-Suchmuster muss das erste Argument zur Funktion %1 bei der Verwendung zur Suche ein Literal oder eine Variablenreferenz sein. In an XSL-T pattern, function %1 cannot have a third argument. Bei einem XSL-T-Suchmuster darf die Funktion %1 kein drittes Argument haben. In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching. Bei einem XSL-T-Suchmuster dürfen nur die Funktionen %1 und %2, nicht jedoch %3 zur Suche verwendet werden. In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can. Bei einem XSL-T-Suchmuster dürfen nur die Achsen %2 oder %3 verwendet werden, nicht jedoch %1. %1 is an invalid template mode name. %1 ist kein gültiger Name für einen Vorlagenmodus. The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. Der Name der gebundenen Variablen eines for-Ausdrucks muss sich von dem der Positionsvariable unterscheiden. Die zwei Variablen mit dem Namen %1 stehen im Konflikt. The Schema Validation Feature is not supported. Hence, %1-expressions may not be used. %1-Ausdrücke können nicht verwendet werden, da Schemavalidierung nicht unterstützt wird. None of the pragma expressions are supported. Therefore, a fallback expression must be present Es muss ein fallback-Ausdruck vorhanden sein, da keine pragma-Ausdrücke unterstützt werden Each name of a template parameter must be unique; %1 is duplicated. Die Namen von Vorlagenparametern müssen eindeutig sein, %1 existiert bereits. No function with name %1 is available. Es ist keine Funktion des Namens %1 verfügbar. %1 is not a valid numeric literal. %1 ist kein gültiger numerischer Literal. W3C XML Schema identity constraint selector W3C XML Schema identity constraint selector W3C XML Schema identity constraint field W3C XML Schema identity constraint field A construct was encountered which is disallowed in the current language(%1). Es wurde ein Sprachkonstrukt angetroffen, was in der aktuellen Sprache (%1) nicht erlaubt ist. Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared). Der Namensraum %1 kann nur an %2 gebunden werden. Dies ist bereits vordeklariert. Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared). Der Präfix %1 kann nur an %2 gebunden werden. Dies ist bereits vordeklariert. An attribute with name %1 has already appeared on this element. Das Element hat bereits ein Attribut des Namens %1. A direct element constructor is not well-formed. %1 is ended with %2. Es wurde ein fehlerhafter direkter Element-Konstruktor gefunden. %1 endet mit %2. The name %1 does not refer to any schema type. Der Name %1 hat keinen Bezug zu einem Schematyp. %1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. %1 ist ein komplexer Typ. Eine "cast"-Operation zu komplexen Typen ist nicht möglich. Es können allerdings "cast"-Operationen zu atomare Typen wie %2 durchgeführt werden. %1 is not an atomic type. Casting is only possible to atomic types. %1 ist kein atomarer Typ. "cast"-Operation können nur zu atomaren Typen durchgeführt werden. %1 is not a valid name for a processing-instruction. %1 ist kein gültiger Name für eine Processing-Instruktion. The name of an extension expression must be in a namespace. Der Name eines Erweiterungsausdrucks muss sich in einem Namensraum befinden. Required type is %1, but %2 was found. Der erforderliche Typ ist %1, es wurde aber %2 angegeben. Promoting %1 to %2 may cause loss of precision. Die Wandlung von %1 zu %2 kann zu einem Verlust an Genauigkeit führen. It's not possible to add attributes after any other kind of node. Attribute dürfen nicht auf andere Knoten folgen. Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported. Es wird nur Unicode Codepoint Collation unterstützt (%1). %2 wird nicht unterstützt. Integer division (%1) by zero (%2) is undefined. Die Ganzzahldivision (%1) durch Null (%2) ist nicht definiert. Division (%1) by zero (%2) is undefined. Die Division (%1) durch Null (%2) ist nicht definiert. Modulus division (%1) by zero (%2) is undefined. Die Modulo-Division (%1) durch Null (%2) ist nicht definiert. %1 takes at most %n argument(s). %2 is therefore invalid. %1 hat nur %n Argument; die Angabe %2 ist daher ungültig. %1 hat nur %n Argumente; die Angabe %2 ist daher ungültig. %1 requires at least %n argument(s). %2 is therefore invalid. %1 erfordert mindestens ein Argument; die Angabe %3 ist daher ungültig. %1 erfordert mindestens %n Argumente; die Angabe %3 ist daher ungültig. The root node of the second argument to function %1 must be a document node. %2 is not a document node. Der übergeordnete Knoten des zweiten Arguments der Funktion %1 muss ein Dokumentknoten sein, was bei %2 nicht der Fall ist. The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) Der Namensraum einer benutzerdefinierten Funktion darf nicht leer sein (für diesen Zweck gibt es den vordefinierten Präfix %1) A default namespace declaration must occur before function, variable, and option declarations. Die Deklaration des Default-Namensraums muss vor Funktions-, Variablen- oder Optionsdeklaration erfolgen. Namespace declarations must occur before function, variable, and option declarations. Namensraums-Deklarationen müssen vor Funktions- Variablen- oder Optionsdeklarationen stehen. Module imports must occur before function, variable, and option declarations. Modul-Importe müssen vor Funktions-, Variablen- oder Optionsdeklarationen stehen. %1 is not a whole number of minutes. %1 ist keine ganzzahlige Minutenangabe. Attribute %1 can't be serialized because it appears at the top level. Das Attributelement %1 kann nicht serialisiert werden, da es auf der höchsten Ebene erscheint. %1 is an unsupported encoding. Die Kodierung %1 wird nicht unterstützt. %1 contains octets which are disallowed in the requested encoding %2. %1 enthält Oktette, die in der Kodierung %2 nicht zulässig sind. The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character. Der Code-Punkt %1 aus %2 mit der Kodierung %3 ist kein gültiges XML-Zeichen. Ambiguous rule match. Mehrdeutige Regel. In a namespace constructor, the value for a namespace cannot be an empty string. Im Konstruktor eines Namensraums darf der Wert des Namensraumes keine leere Zeichenkette sein. The prefix must be a valid %1, which %2 is not. Der Präfix muss ein gültiger %1 sein. Das ist bei %2 nicht der Fall. The prefix %1 cannot be bound. Der Präfix %1 kann nicht gebunden werden Only the prefix %1 can be bound to %2 and vice versa. An %2 kann nur der Präfix %1 gebunden werden (und umgekehrt). The parameter %1 is required, but no corresponding %2 is supplied. Es wurde kein entsprechendes %2 für den erforderlichen Parameter %1 angegeben. The parameter %1 is passed, but no corresponding %2 exists. Es existiert kein entsprechendes %2 für den übergebenen Parameter %1. The URI cannot have a fragment Der URI darf kein Fragment enthalten. Element %1 is not allowed at this location. Das Element %1 darf nicht an dieser Stelle stehen. Text nodes are not allowed at this location. An dieser Stelle dürfen keine Textknoten stehen. Parse error: %1 Parse-Fehler: %1 The value of the XSL-T version attribute must be a value of type %1, which %2 isn't. Der Wert eines XSL-T-Versionsattributes muss vom Typ %1 sein, was bei %2 nicht der Fall ist. Running an XSL-T 1.0 stylesheet with a 2.0 processor. Es wird ein XSL-T-1.0-Stylesheet mit einem Prozessor der Version 2.0 verarbeitet. Unknown XSL-T attribute %1. Unbekanntes XSL-T-Attribut: %1. Attribute %1 and %2 are mutually exclusive. Die Attribute %1 und %2 schließen sich gegenseitig aus. In a simplified stylesheet module, attribute %1 must be present. In einem vereinfachten Stylesheet-Modul muss das Attribut %1 vorhanden sein. If element %1 has no attribute %2, it cannot have attribute %3 or %4. Das Element %1 darf keines der Attribute %3 oder %4 haben, solange es nicht das Attribut %2 hat. Element %1 must have at least one of the attributes %2 or %3. Das Element %1 muss mindestens eines der Attribute %2 oder %3 haben. At least one mode must be specified in the %1-attribute on element %2. Im %1-Attribut des Elements %2 muss mindestens ein Modus angegeben werden. Element %1 must come last. Das Element %1 muss zuletzt stehen. At least one %1-element must occur before %2. Vor %2 muss mindestens ein %1-Element stehen. Only one %1-element can appear. Es darf nur ein einziges %1-Element stehen. At least one %1-element must occur inside %2. In %2 muss mindestens ein %1-Element stehen. When attribute %1 is present on %2, a sequence constructor cannot be used. Es kann kein Sequenzkonstruktor verwendet werden, wenn %2 ein Attribut %1 hat. Element %1 must have either a %2-attribute or a sequence constructor. Das Element %1 muss entweder ein %2-Attribut haben oder es muss ein Sequenzkonstruktor verwendet werden. When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor. Der Defaultwert eines erforderlichen Parameters kann weder durch ein %1-Attribut noch durch einen Sequenzkonstruktor angegeben werden. Element %1 cannot have children. Das Element %1 kann keine Kindelemente haben. Element %1 cannot have a sequence constructor. Das Element %1 kann keinen Sequenzkonstruktor haben. The attribute %1 cannot appear on %2, when it is a child of %3. %2 darf nicht das Attribut %1 haben, wenn es ein Kindelement von %3 ist. A parameter in a function cannot be declared to be a tunnel. Der Parameter einer Funktion kann nicht als Tunnel deklariert werden. This processor is not Schema-aware and therefore %1 cannot be used. %1 kann nicht verwendet werden, da dieser Prozessor keine Schemas unterstützt. Top level stylesheet elements must be in a non-null namespace, which %1 isn't. Die zuoberst stehenden Elemente eines Stylesheets dürfen sich nicht im Null-Namensraum befinden, was bei %1 der Fall ist. The value for attribute %1 on element %2 must either be %3 or %4, not %5. Der Wert des Attributs %1 des Elements %2 kann nur %3 oder %4 sein, nicht jedoch %5. Attribute %1 cannot have the value %2. Das Attribut %1 darf nicht den Wert %2 haben. The attribute %1 can only appear on the first %2 element. Nur das erste %2-Element darf das Attribut %1 haben. At least one %1 element must appear as child of %2. %2 muss mindestens ein %1-Kindelement haben. %1 has inheritance loop in its base type %2. %1 hat eine zirkuläre Vererbung im Basistyp %2. Circular inheritance of base type %1. Zirkuläre Vererbung im Basistyp %1. Circular inheritance of union %1. Zirkuläre Vererbung bei der Vereinigung %1. %1 is not allowed to derive from %2 by restriction as the latter defines it as final. %1 darf nicht durch Einschränkung von %2 abgeleitet werden, da letzterer sie als final deklariert. %1 is not allowed to derive from %2 by extension as the latter defines it as final. %1 darf nicht durch Erweiterung von %2 abgeleitet werden, da letzterer sie als final deklariert. Base type of simple type %1 cannot be complex type %2. Der komplexe Typ %2 kann nicht Basisklasse des einfachen Typs %1 sein. Simple type %1 cannot have direct base type %2. Der einfache Typ %1 kann nicht den unmittelbaren Basistyp %2 haben. Simple type %1 is not allowed to have base type %2. Der einfache Typ %1 darf nicht den Basistyp %2 haben. Simple type %1 can only have simple atomic type as base type. Der einfache Typ %1 kann nur einen einfachen. atomaren Basistyp haben. Simple type %1 cannot derive from %2 as the latter defines restriction as final. %1 darf nicht von %2 abgeleitet werden, da letzterer die Einschränkung als final deklariert. Variety of item type of %1 must be either atomic or union. Die Varietät der Typen von %1 muss entweder atomar oder eine Vereinigung sein. Variety of member types of %1 must be atomic. Die Varietät der Typen von %1 muss atomar sein. %1 is not allowed to derive from %2 by list as the latter defines it as final. %1 darf nicht durch Listen von %2 abgeleitet werden, da letzterer sie als final deklariert. Simple type %1 is only allowed to have %2 facet. Der einfache Typ %1 darf nur die Facette %2 haben. Base type of simple type %1 must have variety of type list. Der Basistyp des einfachen Typs %1 muss eine Varietät des Typs Liste haben. Base type of simple type %1 has defined derivation by restriction as final. Der Basistyp des einfachen Typs %1 definiert Vererbung durch Einschränkung als final. Item type of base type does not match item type of %1. Der Elementtyp des Basistyps entspricht nicht dem Elementtyp von %1. Simple type %1 contains not allowed facet type %2. Der einfache Typ %1 enthält einen nicht erlaubten Facettentyp %2. %1 is not allowed to derive from %2 by union as the latter defines it as final. %1 darf nicht durch Vereinigung von %2 abgeleitet werden, da sie letzterer sie als final deklariert. %1 is not allowed to have any facets. %1 darf keine Facetten haben. Base type %1 of simple type %2 must have variety of union. Der Basistyp %1 des einfachen Typs %2 muss eine Varietät des Typs Vereinigung haben. Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute. Der Basistyp %1 des einfachen Typs %2 darf keine Einschränkung im %3 Attribut haben. Member type %1 cannot be derived from member type %2 of %3's base type %4. Der Typ %1 des Mitglieds darf nicht vom Typ %2 des Mitglieds vom Basistyp %4 von %3 sein. Derivation method of %1 must be extension because the base type %2 is a simple type. Erweiterung muss als Vererbungsmethode für %1 verwendet werden, da der Basistyp %2 ein einfacher Typ ist. Complex type %1 has duplicated element %2 in its content model. Der komplexe Typ %1 hat ein dupliziertes Element %2 in seinem Inhaltsmodell. Complex type %1 has non-deterministic content. Der komplexe Typ %1 hat nicht-deterministischen Inhalt. Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3. Die Attribute des komplexen Typs %1 sind keine gültige Erweiterung der Attribute des Basistyps %2: %3. Content model of complex type %1 is not a valid extension of content model of %2. Das Inhaltsmodell des komplexen Typs %1 ist keine gültige Erweiterung des Inhaltsmodells von %2. Complex type %1 must have simple content. Der komplexe Typ %1 kann nur einfachen Inhalt haben. Complex type %1 must have the same simple type as its base class %2. Der komplexe Typ %1 kann nur einen einfachen Typ als Basisklasse %2 haben. Complex type %1 cannot be derived from base type %2%3. Der komplexe Typ %1 kann nicht vom Basistyp %2 abgeleitet werden%3. Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3. Die Attribute des komplexen Typs %1 sind keine gültige Einschränkung der Attribute des Basistyps %2: %3. Complex type %1 with simple content cannot be derived from complex base type %2. Der komplexe Typ %1 einfachen Inhalts darf nicht vom komplexen Basistyp %2 abgeleitet werden. Item type of simple type %1 cannot be a complex type. Der Elementtyp des einfachen Typs %1 kann kein komplexer Typ sein. Member type of simple type %1 cannot be a complex type. Der Typ eines Mitglieds des einfachen Typs %1 kann kein komplexer Typ sein. %1 is not allowed to have a member type with the same name as itself. %1 darf keinen Typ eines Mitglieds desselben Namens haben. %1 facet collides with %2 facet. Die Facette %1 steht im Widerspruch zu der Facette %2. %1 facet must have the same value as %2 facet of base type. Die Facette %1 muss denselben Wert wie die Facette %2 des Basistyps haben. %1 facet must be equal or greater than %2 facet of base type. Die Facette %1 muss größer oder gleich der Facette %2 des Basistyps sein. %1 facet must be less than or equal to %2 facet of base type. Die Facette %1 muss kleiner oder gleich der Facette %2 des Basistyps sein. %1 facet contains invalid regular expression Die Facette %1 enthält einen ungültigen regulären Ausdruck Unknown notation %1 used in %2 facet. Die Facette %2 enthält eine ungültige Notation %1. %1 facet contains invalid value %2: %3. Die Facette %1 enthält einen ungültigen Wert %2: %3. %1 facet cannot be %2 or %3 if %4 facet of base type is %5. Die Facette %1 kann nicht %2 oder %3 sein, wenn die Facette %4 des Basistyps %5 ist. %1 facet cannot be %2 if %3 facet of base type is %4. Die Facette %1 kann nicht %2 sein, wenn die Facette %3 des Basistyps %4 ist. %1 facet must be less than or equal to %2 facet. Die Facette %1 muss kleiner oder gleich der Facette %2 sein. %1 facet must be less than %2 facet of base type. Die Facette %1 muss kleiner der Facette %2 des Basistyps sein. %1 facet and %2 facet cannot appear together. Die Facetten %1 und %2 können nicht zusammen erscheinen. %1 facet must be greater than %2 facet of base type. Die Facette %1 muss größer als die Facette %2 des Basistyps sein. %1 facet must be less than %2 facet. Die Facette %1 muss kleiner als die Facette %2 sein. %1 facet must be greater than or equal to %2 facet of base type. Die Facette %1 muss größer oder gleich der Facette %2 des Basistyps sein. Simple type contains not allowed facet %1. Der einfache Typ enthält eine unzulässige Facette %1. %1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list. Die Facetten %1, %2, %3, %4, %5 und %6 sind bei Vererbung durch Listen nicht zulässig. Only %1 and %2 facets are allowed when derived by union. Bei Vererbung durch Vereinigung sind nur die Facetten %1 und %2 zulässig. %1 contains %2 facet with invalid data: %3. %1 enthält eine Facette %2 mit ungültigen Daten: %3. Attribute group %1 contains attribute %2 twice. Die Attributgruppe %1 enthält das Attribut %2 zweimal. Attribute group %1 contains two different attributes that both have types derived from %2. Die Attributgruppe %1 enthält zwei verschiedene Attribute mit Typen, die von %2 abgeleitet sind. Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3. Die Attributgruppe %1 enthält ein Attribut %2 mit einer Einschränkung des Werts, dessen Typ aber von %3 abgeleitet ist. Complex type %1 contains attribute %2 twice. Der komplexe Typ %1 enthält das Attribut %2 doppelt. Complex type %1 contains two different attributes that both have types derived from %2. Die Attributgruppe %1 enthält zwei verschiedene Attribute mit Typen, die beide von %2 abgeleitet sind. Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3. Der komplexe Typ %1 enthält ein Attribut %2 mit einer Einschränkung des Werts, dessen Typ aber von %3 abgeleitet ist. Element %1 is not allowed to have a value constraint if its base type is complex. Das Element %1 darf keine Einschränkung des Werts haben, wenn der Basistyp komplex ist. Element %1 is not allowed to have a value constraint if its type is derived from %2. Das Element %1 darf keine Einschränkung des Werts haben, wenn sein Typ von %2 abgeleitet ist. Value constraint of element %1 is not of elements type: %2. Die Einschränkung des Werts des Elements %1 ist nicht vom Typ des Elements: %2. Element %1 is not allowed to have substitution group affiliation as it is no global element. Das Element %1 kann nicht zu einer Substitutionsgruppe gehören, da es kein globales Element ist. Type of element %1 cannot be derived from type of substitution group affiliation. Der Typ des Elements %1 kann nicht vom Typ der zugehörigen Substitutionsgruppe abgeleitet werden. Value constraint of attribute %1 is not of attributes type: %2. Die Einschränkung des Werts des Attributs %1 ist nicht vom Typ des Attributs: %2. Attribute %1 has value constraint but has type derived from %2. Das Attribut %1 hat eine Einschränkung des Werts, während sein Typ von %2 abgeleitet ist. %1 attribute in derived complex type must be %2 like in base type. Das Attribut %1 in einem abgeleiteten komplexen Typ muss wie im Basistyp '%2' sein. Attribute %1 in derived complex type must have %2 value constraint like in base type. Das Attribut %1 in einem abgeleiteten komplexen Typ muss wie der Basistyp eine Einschränkung des Werts (%2) haben. Attribute %1 in derived complex type must have the same %2 value constraint like in base type. Das Attribut %1 in einem abgeleiteten komplexen Typ muss die gleiche Einschränkung des Werts (%2) wie der Basistyp haben. Attribute %1 in derived complex type must have %2 value constraint. Das Attribut %1 in einem abgeleiteten komplexen Typ muss die Einschränkung des Werts '%2' haben. processContent of base wildcard must be weaker than derived wildcard. Das 'processContent'-Attribut des Basissuchmusters muss schwächer sein als das des abgeleiteten Suchmusters. Element %1 exists twice with different types. Es existieren zwei Vorkommen verschiedenen Typs des Elements %1. Particle contains non-deterministic wildcards. Der Partikel enthält nicht-deterministische Suchmuster. Base attribute %1 is required but derived attribute is not. Das Basisattribut %1 ist erforderlich, nicht jedoch das abgeleitete Attribut. Type of derived attribute %1 cannot be validly derived from type of base attribute. Der Typ des abgeleiteten Attributs %1 kann nicht aus Typ des Basisattributs bestimmt werden. Value constraint of derived attribute %1 does not match value constraint of base attribute. Die Einschränkung des Werts des abgeleiteten Attributs %1 entspricht nicht der Einschränkung des Werts des Basisattributs. Derived attribute %1 does not exist in the base definition. Das abgeleitete Attribut %1 existiert in der Basisdefinition nicht. Derived attribute %1 does not match the wildcard in the base definition. Das abgeleitete Attribut %1 entspricht nicht dem Suchmuster in der Basisdefinition. Base attribute %1 is required but missing in derived definition. Das erforderliche Basisattribut %1 fehlt in der abgeleiteten Definition. Derived definition contains an %1 element that does not exists in the base definition Die abgeleitete Definition enthält ein Element %1, was in der Basisdefinition nicht existiert Derived wildcard is not a subset of the base wildcard. Das abgeleitete Suchmuster ist keine Untermenge des Basissuchmusters. %1 of derived wildcard is not a valid restriction of %2 of base wildcard Das Attribut %1 des abgeleiteten Suchmusters ist keine gültige Einschränkung des Attributs '%2' des Basissuchmusters Attribute %1 from base type is missing in derived type. Das Attribut %1 des Basistyps fehlt im abgeleiteten Typ. Type of derived attribute %1 differs from type of base attribute. Der Typ des abgeleiteten Attributs %1 unterscheidet sich vom Basistyp. Base definition contains an %1 element that is missing in the derived definition Das Element %1 des Basistyps fehlt in der abgeleiteten Definition %1 references unknown %2 or %3 element %4. %1 verweist auf ein unbekanntes Element %4 ('%2' oder '%3'). %1 references identity constraint %2 that is no %3 or %4 element. %1 verweist auf eine Identitätseinschränkung %2, die weder ein '%3' noch ein '%4' Element ist. %1 has a different number of fields from the identity constraint %2 that it references. Bei %1 unterscheidet sich die Anzahl der Felder von der der Identitätseinschränkung %2, auf die es verweist. Base type %1 of %2 element cannot be resolved. Der Basistyp %1 des Elements %2 kann nicht aufgelöst werden. Item type %1 of %2 element cannot be resolved. Der Subtyp %1 des Elements %2 kann nicht aufgelöst werden. Member type %1 of %2 element cannot be resolved. Der Subtyp %1 des Elements %2 kann nicht aufgelöst werden. Type %1 of %2 element cannot be resolved. Der Typ %1 des Elements %2 kann nicht aufgelöst werden. Base type %1 of complex type cannot be resolved. Der Basistyp %1 des komplexen Typs kann nicht aufgelöst werden. %1 cannot have complex base type that has a %2. %1 kann keinen komplexen Basistyp haben, der '%2' spezifiziert. Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type. Das Inhaltsmodell des komplexen Typs %1enthält ein Element '%2'; es kann daher nicht durch Erweiterung von einem Typ abgeleitet werden, der nicht leer ist. Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model. Der komplexe Typ %1 kann nicht durch Erweiterung von %2 abgeleitet werden, da letzterer ein '%3'-Element in seinem Inhaltsmodell hat. Type of %1 element must be a simple type, %2 is not. Der Typ des Elements %1 muss ein einfacher Typ sein, was %2 nicht ist. Substitution group %1 of %2 element cannot be resolved. Die Substitutionsgruppe %1 des Elements %2 kann nicht aufgelöst werden. Substitution group %1 has circular definition. Die Substitutionsgruppe %1 hat eine zirkuläre Definition. Duplicated element names %1 in %2 element. Der Elementname %1 kommt im Element %2 mehrfach vor. Reference %1 of %2 element cannot be resolved. Der Verweis %1 des Elements %2 kann nicht aufgelöst werden. Circular group reference for %1. Zirkulärer Verweis bei %1. %1 element is not allowed in this scope Das Element %1 ist in diesem Bereich nicht zulässig %1 element cannot have %2 attribute with value other than %3. Der Wert des Attributs %2 des Elements %1 kann nur %3 sein. %1 element cannot have %2 attribute with value other than %3 or %4. Der Wert des Attributs %2 des Elements %1 kann nur %3 oder %4 sein. %1 or %2 attribute of reference %3 does not match with the attribute declaration %4. Das Attribut %1 oder %2 des Verweises %3 entspricht nicht der Attributsdeklaration %4. Attribute group %1 has circular reference. Die Attributgruppe %1 hat einen zirkulären Verweis. %1 attribute in %2 must have %3 use like in base type %4. Das Attribut %1 aus %2 muss die Verwendung '%3' spezifizieren, wie im Basistyp %4. Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2. Das Attributssuchmuster %1 ist keine gültige Einschränkung des Attributssuchmuster des Basistyps %2. %1 has attribute wildcard but its base type %2 has not. %1 hat ein Attributssuchmuster, nicht jedoch sein Basistyp %2. Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible. Die Vereinigung der Attributssuchmuster des Typs %1 und seines Basistyps %2 ergibt keinen gültigen Ausdruck. Enumeration facet contains invalid content: {%1} is not a value of type %2. Ungültiger Inhalt einer Aufzählungsfacette: {%1} ist kein Wert des Typs %2. Namespace prefix of qualified name %1 is not defined. Der Namensraum-Präfix des qualifizierten Namens %1 ist nicht definiert. %1 element %2 is not a valid restriction of the %3 element it redefines: %4. Das Element %2 (%1) ist keine gültige Einschränkung des überschriebenen Elements (%3): %4. Empty particle cannot be derived from non-empty particle. Es kann kein leerer Partikel von einem Partikel abgeleitet werden, der nicht leer ist. Derived particle is missing element %1. Das Element %1 fehlt im abgeleiteten Partikel. Derived element %1 is missing value constraint as defined in base particle. Im abgeleiteten Element %1 fehlt Einschränkung des Wertes, wie sie im Basispartikel definiert ist. Derived element %1 has weaker value constraint than base particle. Das abgeleitete Element %1 hat eine schwächere Einschränkung des Wertes als der Basispartikel. Fixed value constraint of element %1 differs from value constraint in base particle. Die feste Einschränkung des Wertes des Elements %1 unterscheidet sich von der Einschränkung des Wertes des Basispartikels. Derived element %1 cannot be nillable as base element is not nillable. Das abgeleitete Element %1 kann kein 'nillable'-Attribut haben, da das Basiselement keines spezifiziert. Block constraints of derived element %1 must not be more weaker than in the base element. Die Blockeinschränkung des abgeleiteten Elements %1 darf nicht schwächer sein als im Basiselement. Simple type of derived element %1 cannot be validly derived from base element. Der einfache Typ des abgeleiteten Elements %1 kann nicht vom Basiselement abgeleitet werden. Complex type of derived element %1 cannot be validly derived from base element. Der komplexe Typ des abgeleiteten Elements %1 kann nicht vom Basiselement abgeleitet werden. Element %1 is missing in derived particle. Das Element %1 fehlt im abgeleiteten Partikel. Element %1 does not match namespace constraint of wildcard in base particle. Das Element %1 entspricht nicht der Namensraumeinschränkung des Basispartikels. Wildcard in derived particle is not a valid subset of wildcard in base particle. Das Suchmuster im abgeleiteten Partikel ist keine gültige Untermenge des Suchmusters des Basispartikels. processContent of wildcard in derived particle is weaker than wildcard in base particle. Das processContent-Attribut des Suchmusters des abgeleiteten Partikels ist schwächer als das Suchmuster des Basispartikels. Derived particle allows content that is not allowed in the base particle. Der abgeleitete Partikel gestattet Inhalt, der für den Basispartikel nicht zulässig ist. Can not process unknown element %1, expected elements are: %2. Das unbekannte Element %1 kann nicht verarbeitet werden; zulässig wären: %2. Element %1 is not allowed in this scope, possible elements are: %2. Das Element %1 ist in diesem Bereich nicht zulässig; möglich wären: %2. Child element is missing in that scope, possible child elements are: %1. Das Unterelement fehlt im Bereich; mögliche Unterelemente wären: %1. Document is not a XML schema. Das Dokument ist kein XML-Schema. %1 attribute of %2 element contains invalid content: {%3} is not a value of type %4. Das Attribut %1 des Elements %2 enthält ungültigen Inhalt: {%3} ist kein Wert des Typs %4. %1 attribute of %2 element contains invalid content: {%3}. Das Attribut %1 des Elements %2 enthält ungültigen Inhalt: {%3}. Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema. Der Zielnamensraum %1 des eingebundenen Schemas unterscheidet sich vom dem von ihm definierten Zielnamensraum %2. Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema. Der Zielnamensraum %1 des importierten Schemas unterscheidet sich vom dem von ihm definierten Zielnamensraum %2. %1 element is not allowed to have the same %2 attribute value as the target namespace %3. Das Element %1 kann nicht den Zielnamensraum %3 als Wert des Attributs '%2' spezifizieren. %1 element without %2 attribute is not allowed inside schema without target namespace. In einem Schema ohne Namensraum muss das Element %1 ein Attribut %2 haben. %1 element is not allowed inside %2 element if %3 attribute is present. Wenn das Attribut %3 vorhanden ist, darf das Element %1 nicht im Element %2 vorkommen. %1 element has neither %2 attribute nor %3 child element. Das Element %1 hat weder das Attribut %2 noch ein Unterelement %3. %1 element with %2 child element must not have a %3 attribute. Das Element %1 darf kein Attribut %3 haben, wenn das Unterelement %2 vorhanden ist. %1 attribute of %2 element must be %3 or %4. Das Attribut %1 des Elements %2 kann nur %3 oder %4 sein. %1 attribute of %2 element must have a value of %3. Das Attribut %1 des Elements %2 muss den Wert %3 haben. %1 attribute of %2 element must have a value of %3 or %4. Das Attribut %1 des Elements %2 kann nur einen der Werte %3 oder %4 haben. %1 element must not have %2 and %3 attribute together. Die Attribute %2 und %3 können nicht zusammen im Element %1 erscheinen. Content of %1 attribute of %2 element must not be from namespace %3. Der Inhalt des Attributs %1 des Elements %2 kann nicht vom Namensraum %3 stammen. %1 attribute of %2 element must not be %3. Das Attribut %1 des Elements %2 kann nicht %3 sein. %1 attribute of %2 element must have the value %3 because the %4 attribute is set. Das Attribut %1 des Elements %2 muss den Wert %3 haben, da das Attribut %4 gesetzt ist. Specifying use='prohibited' inside an attribute group has no effect. Die Angabe von use='prohibited' in einer Attributgruppe hat keinerlei Auswirkungen. %1 element must have either %2 or %3 attribute. Das Element %1 muss eines der Attribute %2 oder %3 spezifizieren. %1 element must have either %2 attribute or %3 or %4 as child element. Das Element %1 muss entweder das Attribut %2 spezifizieren oder über eines der Unterelemente %3 oder %4 verfügen. %1 element requires either %2 or %3 attribute. Das Element %1 erfordert eines der Attribute %2 oder %3. Text or entity references not allowed inside %1 element Text- oder Entitätsreferenzen sind innerhalb eines %1-Elements nicht zulässig. %1 attribute of %2 element must contain %3, %4 or a list of URIs. Das Attribut %1 des Elements %2 muss %3, %4 oder eine Liste der URIs enthalten. %1 element is not allowed in this context. Das Element %1 ist in diesem Kontext nicht zulässig. %1 attribute of %2 element has larger value than %3 attribute. Der Wert des Attributs %1 des Elements %2 ist größer als der des Attributs %3. Prefix of qualified name %1 is not defined. Der Präfix des qualifizierten Namens %1 ist nicht definiert. %1 attribute of %2 element must either contain %3 or the other values. Der Wert des Attributs %1 des Elements %2 muss entweder %3 oder die anderen Werte enthalten. Component with ID %1 has been defined previously. Es wurde bereits eine Komponente mit der ID %1 definiert. Element %1 already defined. Das Element %1 ist bereits definiert. Attribute %1 already defined. Das Attribut %1 ist bereits definiert. Type %1 already defined. Der Typ %1 ist bereits definiert. Attribute group %1 already defined. Die Attributgruppe %1 ist bereits definiert. Element group %1 already defined. Die Elementgruppe %1 ist bereits definiert. Notation %1 already defined. Die Notation %1 ist bereits definiert. Identity constraint %1 already defined. Die Identitätseinschränkung %1 ist bereits definiert. Duplicated facets in simple type %1. Im einfachen Typ %1 kommen Facetten mehrfach vor. %1 is not valid according to %2. %1 ist nach %2 ungültig. String content does not match the length facet. Der Zeichenketteninhalt entspricht nicht der Längenfacette. String content does not match the minLength facet. Der Zeichenketteninhalt entspricht nicht der Längenfacette (Minimumangabe). String content does not match the maxLength facet. Der Zeichenketteninhalt entspricht nicht der Längenfacette (Maximumangabe). String content does not match pattern facet. Der Zeichenketteninhalt entspricht nicht der Suchmusterfacette. String content is not listed in the enumeration facet. Der Zeichenketteninhalt ist nicht in der Aufzählungsfacette enthalten. Signed integer content does not match the maxInclusive facet. Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'maxInclusive'. Signed integer content does not match the maxExclusive facet. Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'maxExclusive'. Signed integer content does not match the minInclusive facet. Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'minInclusive'. Signed integer content does not match the minExclusive facet. Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'minExclusive'. Signed integer content is not listed in the enumeration facet. Der vorzeichenbehaftete Ganzzahlwert ist nicht in der Aufzählungsfacette enthalten. Signed integer content does not match pattern facet. Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Suchmusterfacette. Signed integer content does not match in the totalDigits facet. Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette 'totalDigits'. Unsigned integer content does not match the maxInclusive facet. Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'maxInclusive'. Unsigned integer content does not match the maxExclusive facet. Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'maxExclusive'. Unsigned integer content does not match the minInclusive facet. Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'minInclusive'. Unsigned integer content does not match the minExclusive facet. Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'minExclusive'. Unsigned integer content is not listed in the enumeration facet. Der vorzeichenlose Ganzzahlwert ist nicht in der Aufzählungsfacette enthalten. Unsigned integer content does not match pattern facet. Der vorzeichenlose Ganzzahlwert entspricht nicht der Suchmusterfacette. Unsigned integer content does not match in the totalDigits facet. Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette 'totalDigits'. Double content does not match the maxInclusive facet. Die Gleitkommazahl entspricht nicht der Facette 'maxInclusive'. Double content does not match the maxExclusive facet. Die Gleitkommazahl entspricht nicht der Facette 'maxExclusive'. Double content does not match the minInclusive facet. Die Gleitkommazahl entspricht nicht der Facette 'minInclusive'. Double content does not match the minExclusive facet. Die Gleitkommazahl entspricht nicht der Facette 'minExclusive'. Double content is not listed in the enumeration facet. Die Gleitkommazahl ist nicht in der Aufzählungsfacette enthalten. Double content does not match pattern facet. Die Gleitkommazahl entspricht nicht der Suchmusterfacette. Decimal content does not match in the fractionDigits facet. Die Dezimalzahl entspricht nicht der Facette 'fractionDigit'. Decimal content does not match in the totalDigits facet. Die Dezimalzahl entspricht nicht der Facette 'totalDigits'. Date time content does not match the maxInclusive facet. Die Datumsangabe entspricht nicht der Facette 'maxInclusive'. Date time content does not match the maxExclusive facet. Die Datumsangabe entspricht nicht der Facette 'maxExclusive'. Date time content does not match the minInclusive facet. Die Datumsangabe entspricht nicht der Facette 'minInclusive'. Date time content does not match the minExclusive facet. Die Datumsangabe entspricht nicht der Facette 'minExclusive'. Date time content is not listed in the enumeration facet. Die Datumsangabe ist nicht in der Aufzählungsfacette enthalten. Date time content does not match pattern facet. Die Datumsangabe entspricht nicht der Suchmusterfacette. Duration content does not match the maxInclusive facet. Die Angabe der Zeitdauer entspricht nicht der Facette 'maxInclusive'. Duration content does not match the maxExclusive facet. Die Angabe der Zeitdauer entspricht nicht der Facette 'maxExclusive'. Duration content does not match the minInclusive facet. Die Angabe der Zeitdauer entspricht nicht der Facette 'minInclusive'. Duration content does not match the minExclusive facet. Die Angabe der Zeitdauer entspricht nicht der Facette 'minExclusive'. Duration content is not listed in the enumeration facet. Die Angabe der Zeitdauer ist nicht in der Aufzählungsfacette enthalten. Duration content does not match pattern facet. Die Angabe der Zeitdauer entspricht nicht der Suchmusterfacette. Boolean content does not match pattern facet. Der boolesche Wert entspricht nicht der Suchmusterfacette. Binary content does not match the length facet. Der binäre Inhalt entspricht nicht der Längenfacette. Binary content does not match the minLength facet. Der binäre Inhalt entspricht nicht der Facette 'minLength'. Binary content does not match the maxLength facet. Der binäre Inhalt entspricht nicht der Facette 'maxLength'. Binary content is not listed in the enumeration facet. Der binäre Inhalt ist nicht in der Aufzählungsfacette enthalten. Invalid QName content: %1. Der Inhalt des qualifizierten Namens ist ungültig: %1. QName content is not listed in the enumeration facet. Der Inhalt des qualifizierten Namens ist nicht in der Aufzählungsfacette enthalten. QName content does not match pattern facet. Der Inhalt des qualifizierten Namens entspricht nicht der Suchmusterfacette. Notation content is not listed in the enumeration facet. Der Inhalt der Notation ist nicht in der Aufzählungsfacette enthalten. List content does not match length facet. Der Listeninhalt entspricht nicht der Längenfacette. List content does not match minLength facet. Der Listeninhalt entspricht nicht der Facette 'minLength'. List content does not match maxLength facet. Der Listeninhalt entspricht nicht der Facette 'maxLength'. List content is not listed in the enumeration facet. Der Listeninhalt ist nicht in der Aufzählungsfacette enthalten. List content does not match pattern facet. Der Listeninhalt entspricht nicht der Suchmusterfacette. Union content is not listed in the enumeration facet. Der Inhalt der Vereinigung ist nicht in der Aufzählungsfacette enthalten. Union content does not match pattern facet. Der Inhalt der Vereinigung entspricht nicht der Suchmusterfacette. Data of type %1 are not allowed to be empty. Daten vom Typ %1 können nicht leer sein. Element %1 is missing child element. Beim Element %1 fehlt ein Unterelement. There is one IDREF value with no corresponding ID: %1. Es existiert ein IDREF-Wert, für den keine zugehörige ID vorhanden ist: %1. Loaded schema file is invalid. Das geladene Schema ist ungültig. %1 contains invalid data. %1 enthält ungültige Daten. xsi:schemaLocation namespace %1 has already appeared earlier in the instance document. xsi:schemaLocation namespace %1 wurde im Instanzdokument bereits spezifiziert. xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute. xsi:noNamespaceSchemaLocation kann nicht nach dem ersten Element oder Attribut ohne Namensraum erscheinen. No schema defined for validation. Es ist kein Schema für die Validierung definiert. No definition for element %1 available. Für das Element %1 ist keine Definition verfügbar. Specified type %1 is not known to the schema. Der angegebene Typ %1 ist im Schema nicht spezifiziert. Element %1 is not defined in this scope. Das Element %1 ist in diesem Bereich nicht definiert. Declaration for element %1 does not exist. Für das Element %1 ist keine Deklaration verfügbar. Element %1 contains invalid content. Das Element %1 enthält ungültigen Inhalt. Element %1 is declared as abstract. Das Element %1 ist als abstrakt deklariert. Element %1 is not nillable. Das Element %1 hat das Attribut 'nillable' nicht spezifiziert. Attribute %1 contains invalid data: %2 Das Attribut %1 enthält ungültige Daten: %2 Element contains content although it is nillable. Das Element hat Inhalt, obwohl es 'nillable' spezifiziert. Fixed value constraint not allowed if element is nillable. Eine Beschränkung auf einen festen Wert ist nicht zulässig, wenn das Element 'nillable' spezifiziert. Element %1 cannot contain other elements, as it has a fixed content. Das Element %1 kann keine anderen Element enthalten, da sein Inhalt festgelegt ist. Specified type %1 is not validly substitutable with element type %2. Der angebenene Typ %1 kann nicht durch den Elementtyp %2 substituiert werden. Complex type %1 is not allowed to be abstract. Der komplexe Typ %1 kann nicht abstrakt sein. Element %1 contains not allowed attributes. Das Element %1 enthält unzulässige Attribute. Element %1 contains not allowed child element. Das Element %1 enthält ein unzulässiges Unterelement. Content of element %1 does not match its type definition: %2. Der Inhalt des Elements %1 entspricht nicht seiner Typdefinition: %2. Content of element %1 does not match defined value constraint. Der Inhalt des Elements %1 entspricht nicht der definierten Einschränkung des Werts. Element %1 contains not allowed child content. Das Element %1 enthält unzulässigen Unterinhalt. Element %1 contains not allowed text content. Das Element %1 enthält unzulässigen Textinhalt. Element %1 is missing required attribute %2. Bei dem Element %1 fehlt ein erforderliches Attribut %2. Attribute %1 does not match the attribute wildcard. Das Attribut %1 entspricht nicht dem Attributssuchmuster. Declaration for attribute %1 does not exist. Für das Attribut %1 ist keine Deklaration verfügbar. Element %1 contains two attributes of type %2. Das Element %1 enthält zwei Attribute des Typs %2. Attribute %1 contains invalid content. Das Attribut %1 enthält ungültigen Inhalt. Element %1 contains unknown attribute %2. Das Element %1 enthält ein unbekanntes Attribut %2. Content of attribute %1 does not match its type definition: %2. Der Inhalt des Attributs %1 entspricht nicht seiner Typdefinition: %2. Content of attribute %1 does not match defined value constraint. Der Inhalt des Attributs %1 entspricht nicht der definierten Einschränkung des Werts. Non-unique value found for constraint %1. Für die Einschränkung %1 wurde ein nicht eindeutiger Wert gefunden. Key constraint %1 contains absent fields. Die Einschränkung des Schlüssels %1 enthält nicht vorhandene Felder. Key constraint %1 contains references nillable element %2. Die Einschränkung des Schlüssels %1 verweist auf das Element %2, was 'nillable' spezifiziert. No referenced value found for key reference %1. Der referenzierte Wert der Schlüsselreferenz %1 konnte nicht gefunden werden. More than one value found for field %1. Für das Feld %1 wurden mehrere Werte gefunden. Field %1 has no simple type. Das Feld %1 hat keinen einfachen Typ. ID value '%1' is not unique. Der ID-Wert '%1' ist nicht eindeutig. '%1' attribute contains invalid QName content: %2. Das Attribut '%1' enthält einen ungültigen qualifizierten Namen: %2. qstopmotion-2.3.2-Source/translations/qstopmotion_cs.ts000755 000000 000000 00000231126 13011043104 023473 0ustar00rootroot000000 000000 AboutDialog OK OK and a About O programu &About &O programu Qt runtime version: Běhová verze Qt: Danish Dánština French Francouzština German Němčina This is the qStopMotion application for creating stop motion animations. Toto je program qStopMotion, který je určen k vytváření animovaných filmů dělaných technikou pookénkové nebo také fázové animace. qStopMotion is a fork of stopmotion for linux. qStopMotion vznikl odvozením z programu stopmotion pro Linux. &Thanks To &Poděkování &System Info &Systém Version: Verze: Build time: %1 %2 Čas sestavení: %1 %2 Translation Překlad Swedish Švédština Contributors Přispěvatelé Operating system name and version: Název a verze operačního systému: Main developers Hlavní vývojáři This program is distributed under the terms of the GPL v2. Tento program je šířen za podmínek licence GPL v2. A&uthors &Autoři &Licence Agreement &Povolení Unknown Windows OS Neznámé Windows OS Unknown Mac OS Neznámé Mac OS Czech Čeština AnimationProject Cannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play. Vybraný soubor se záznamem zvuku nelze otevřít pro čtení. Prověřte, že jsou oprávnění nastavena správně. Animace bude, v případě že se rozhodnete pro přehrání, přehrána bez zvuku. The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play. Vybraný soubor se záznamem zvuku není v platném zvukovém formátu. Animace bude, v případě že se rozhodnete pro přehrání, přehrána bez zvuku. Add Sound Přidat zvuk Saving scenes to disk ... Výjevy se ukládají na disk... CameraControllerDialog Hue: Odstín: Pan: Smyk: Gain: Zesílení: Iris: Stínítko: Roll: Točení: Tilt: Naklonění: Zoom: Zvětšení: Color Enable: Povolení barvy: Automatic Hue Automatický barevný odstín Automatic Pan Automatický smyk (pohyb kamery) Camera Control Řízení kamery &Close &Zavřít Automatic Backlight Compensation Automatické vyrovnání osvětlení zezadu Automatic Exposure Automatické nasvícení Automatic Gain Automatické zesílení Automatic Iris Automatické stínítko (clona) Automatic Tilt Automatické naklonění Automatic Roll Automatické točení Automatic Zoom Automatické zvětšení Video Quality Jakost obrazu Focus: Zaostření: Gamma: Gama: Restore Camera Settings... Obnovit nastavení kamery... Backlight Compensation: Vyrovnání osvětlení zezadu: Contrast: Kontrast: Automatic Color Enable Automatické povolení barvy Abort Reset Zrušit nastavení na výchozí hodnoty Automatic White Balance Automatické vyvážení bílé qStopMotion Camera Controller Řízení kamery pro qStopMotion &Reset to Default &Nastavit znovu na výchozí Exposure: Osvětlení: Saturation: Sytost: White Balance: Vyvážení bílé: Sharpness: Ostrost: Automatic Contrast Automatický kontrast Automatic Sharpness Automatická ostrost Reset Camera Settings... Nastavit kameru na výchozí hodnoty... Automatic Brightness Automatický jas Automatic Gamma Automatická gama Automatic Focus Automatická ostrost obrazu Automatic Saturation Automatická sytost Brightness: Jas: DescriptionDialog &OK &OK The character '|' is not allowed in the project description. Znak '|' není v popisu projektu dovolen. &Take Description: Popis &záběru: Project Description Popis projektu Information Informace Take Description Popis záběru &Cancel Z&rušit The character '|' is not allowed in the take description. Znak '|' není v popisu záběru (nahrávky) dovolen. The character '|' is not allowed in the scene description. Znak '|' není v popisu výjevu dovolen. Scene Description Popis výjevu &Project Description: &Popis projektu: &Scene Description: Popis &výjevu: DomainFacade Can't copy image to temp directory! Obrázek nelze kopírovat do adresáře s dočasnými soubory! Can't open history file to write entry! Soubor s historií, aby mohl být přidán nový záznam, nelze otevřít! Critical Važné Can't open history file to recover project! Soubor s historií, aby mohl být projekt obnoven, nelze otevřít! ExportWidget No Ne AVI AVI MP4 MP4 Yes Ano Below you can set which program should be used for encoding the currently active project to a video file. Níže můžete vybrat, který program se má použít na zakódování nyní činného projektu do souboru s obrazovým záznamem. Video Size: Velikost obrazu: Video Format: Obrazový formát: <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Snímků za sekundu</h4> <p>Změnou hodnoty v tomto voliči můžete nastavit rychlost, se kterou se animace odvíjí v <b>zobrazení snímků</b>.</p> <p>Pro spuštění animace stiskněte tlačítko <b>Přehrát</b>.</p> Frame Size Velikost okénka filmu Browse Procházet Below you can set which program should be used for encoding a new project to a video file. Níže můžete vybrat, který program se má použít na zakódování nového projektu do souboru s obrazovým záznamem. Do you want to be asked for an output file everytime you choose to export? Chcete být dotazován na název výstupního souboru pokaždé, když si vyberete vyvedení projektu do souboru? ffmpeg ffmpeg Frames per Second: Snímků za sekundu: Choose output file Vybrat výstupní soubor Encoder settings Nastavení kodéru Encoder Application: Program kodéru: SVGA (800x600) SVGA (800 x 600) Full HD (1900x1080) Full HD (1900 x 1080) HD Ready (1280x720) HD Ready (1280 x 720) Output file settings Nastavení výstupního souboru VGA (640x480) VGA (640 x 480) PAL D (704x576) PAL D (704 x 576) Set default output file: Vyberte výstupní název výstupního souboru: QVGA (320x240) QVGA (320 x 240) libav libav Exposure Can't copy the image to the project directory! Obrázek nelze kopírovat do adresáře s projektem! Can't remove the image in the temporary directory! Obrázek nelze v adresáři s dočasnými soubory smazat! Can't copy the image to the temporary directory! Obrázek nelze kopírovat do adresáře s dočasnými soubory! Critical Važné Can't remove the image from the project directory! Obrázek nelze v adresáři s projektem smazat! Can't save the image in the new file format to the temporary directory! Obrázek nelze v novém formátu uložit do adresáře s dočasnými soubory! ExternalCommandDialog Close Zavřít Result Výsledek Submit Poslat Output from external command Výstup z vnějšího příkazu Failed! Nepodařilo se! Successful! Podařilo se! Input to program: Vstup do programu: GeneralDialog General Settings Obecná nastavení Apply Použít Close Zavřít Video Export Vyvedení obrazu Image Import Zavedení obrázku Image Transformation Proměna obrázku qStopMotion Preferences Nastavení qStopMotion New Project Values Nastavení nového projektu Preferences Nastavení Grabber Zachytávač obrazu GeneralWidget Color Barva Capture Button Functionality Funkce zachytávacího tlačítka Vertical Lines Počet svislých čar Grid Color: Barva čar mřížky: Language Jazyk Append new frame at the end of the take Vložení nového okénka (snímku filmu) na konec záběru Insert new frame after selected frame Vložení nového okénka za vybrané okénko (snímek filmu) Grid Functionality Čáry mřížky Horizontal Lines Počet vodorovných čar Insert new frame bevor selected frame Vložení nového okénka před vybrané okénko (snímek filmu) GrabberWidget Grabber Functionality Funkce digitalizace obrazu Microsoft Media Foundation Source Zdroj Microsoft Media Foundation Video 4 Linux 2 Source Zdroj Video pro Linux 2 Pease restart qStopMotion to activate the changings! Pro zapnutí změn spusťte, prosím, qStopMotion znovu! GStreamer Video 4 Linux 2 Source Zdroj GStreamer Video pro Linux 2 GStreamer DV1394 Source Zdroj GStreamer DV1394 Gphoto2 Source (Experimental) Zdroj Gphoto2 (pokusné) Information Informace GStreamer Video Test Source Zdroj zkoušky obrazu GStreamer Below you can select which image grabber should be used for grabbing images from the camera. If available the controller can be used to control focus, zoom and other functionality. Zde můžete vybrat, který zachytávač (digitalizace obrazu) se má použít, pro zachytávání (nahrávání) obrázků z kamery. Ovládacího spínače lze použít na řízení ostření obrazu, přibližování a oddalování a jiné funkce, když je dostupný. Camera Controller (Experimental) Ovládací spínač kamery (pokusné) GstreamerDv1394Grabber Device %1 Zařízení %1 GstreamerV4L2Grabber Device %1 Zařízení %1 GstreamerVideoTestGrabber Video test device Zařízení na zkoušku obrazu HelpBrowser &Home &Na začátek &Close &Zavřít &Backward &Zpět qStopMotion Help Browser Prohlížeč nápovědy ke qStopMotion &Forward &Vpřed ImageGrabberFacade Check image grabber Přezkoušet zachytávač obrázků Image grabber initialization failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab. Spuštění zachytávače obrázků (digitalizace obrazu) se nezdařila. To se může přihodit, když se chce nahrávat rušeného zařízení. Vyberte, prosím, na kartě pro nahrávání jiné zařízení. No usable video image source found. Please connect on video device on the computer. Nebyl nalezen žádný použitelný zdroj obrázků pro obrazový záznam. Připojte, prosím, zařízení pro práci s obrazem k počítači. Check image sources Přezkoušet zdroj obrázků ImportWidget 0.1 0,1 5.0 5,0 BMP BMP Max Největší Min Nejmenší JPEG JPEG TIFF TIFF Default Grabber Size Výchozí velikost zdroje obrázků Live view settings Nastavení živého pohledu Image Size: Velikost obrázku: Below you can set which image sources should be used for importing images to a new project. Níže můžete vybrat, které zdroje obrázků se mají používat pro zavádění obrázků do nového projektu. Frames per second: Snímků za sekundu: Image Quality: Jakost obrázku: SVGA (800x600) SVGA (800 x 600) Full HD (1900x1080) Full HD (1900 x 1080) Below you can set which image sources should be used for importing images to the currently active project. Níže můžete vybrat, které zdroje obrázků se mají používat pro zavádění obrázků do nynějšího projektu. HD Ready (1280x720) HD Ready (1280 x 720) Image Format: Obrázkový formát: VGA (640x480) VGA (640 x 480) PAL D (704x576) PAL D (704 x 576) Image import settings Nastavení zavedení obrázku QVGA (320x240) QVGA (320 x 240) MainWindowGUI &New &Nový Help Nápověda Redo Znovu Quit Ukončit Undo Zpět <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Nový</h4> <p>Vytvoří <em>nový</em> project.</p> &Edit Úp&ravy &File &Soubor &Help Nápo&věda &Open &Otevřít &Quit &Ukončit &Save &Uložit &Undo &Zpět About O programu Re&do &Znovu Video Obraz MP4 Videos (*.mp4) Filmy MP4 (*.mp4) Unsaved changes Neuložené změny The project directory must not contain more than one project file. V každém adresáři s projektem smí být jen jeden soubor s projektem. What's &This Co je &toto AVI Videos (*.avi) Filmy AVI (*.avi) &Camera Controller Ovládací spínač &kamery &Undo stack Seznam kroků &zpět You have to define an image grabber to use. This can be set in the preferences menu. Musíte vybrat nějaký zachytávač obrázků, který se bude používat. Toto se dá nastavit nabídce pro nastavení. Preferences of qStopMotion Nastavení pro qStopMotion Take ID: ID záběru: <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Zpět</h4> <p>Vrátí jednu nebo více operací zpět.</p> Save project Uložit projekt <h4>TimeLine</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Časová přímka</h4> <p>V této oblasti vidíte snímky (obrázky) a výjevy animace. Těmito posunujete sem a tam, a tím stavíte animaci.</p><p><b>Klávesami šipek</b> nebo <b>x</b> a <b>z</b> se pohybujete mezi snímky (obrázky) vpřed (další) a zpět (předchozí)</p> &About &O programu Remove Scene Smazat výjev Open project Otevřít projekt qStopMotion - New Animation Project qStopMotion - Nový projekt animace <h4>Help</h4> <p>This button will bring up a dialog with the qStopMotion manual</p> <h4>Nápověda</h4> <p>Tímto tlačítkem se vyvolá příručka qStopMotion</p> <h4>Take ID</h4><p>This area displays the id of the currently selected take</p> <h4>ID záběru</h4><p>Toto pole ukazuje ID nyní vybraného záběru</p> Insert Scene Vložit výjev Properties of the animation project Vlastnosti projektu animace <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Obraz</h4> <p>Vyvede nynější projekt jako <em>soubor s obrazem</em>.</p>Při tomto budete vedeni průvodcem. Existing Images Stávající obrázky Scene ID: ID výjevu: Insert Frames Vložit obrázky Exposure ID: ID snímku: Cancel Zrušit No encoder selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an encoder to use! Pro vyvedení obrazového záznamu není vybrán žádný kodér. Toto můžete změnit v dialogu pro nastaveníi projektu. vyvedení obrazu bude možné teprve, až vyberete nějaký kodér. Chcete to udělat nyní? Exporting ... Vyvádí se... Cinelerra Cinelerra Add Frames Přidat obrázky Choose project file Vyberte soubor s projektem No video format selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an video format to use! Pro vyvedení obrazového záznamu není vybrán žádný formát obrazu. Toto můžete změnit v dialogu pro nastaveníi projektu. vyvedení obrazu bude možné teprve, až vyberete nějaký kodér. Chcete to udělat nyní? The character '|' is not allowed in the project file name and will be removed. Znak '|' není v názvu souboru s projektem dovolen a bude odstraněn. Add Scene Přidat výjev Export to file Vyvést do souboru qStopMotion - Undo stack qStopMotion - Seznam kroků zpět <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Znovu</h4> <p>Poslední operace bude obnovena. Můžete to udělat vícekrát.</p> About &Qt O &Qt Properties Vlastnosti <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Zobrazení snímků</h4><p> V této oblasti vidíte vybraný snímek (obrázek). Zde se také přehrávají animace, když stisknete tlačítko <b>Přehrát</b>.</p> Project Projekt <h4>Open</h4> <p><em>Opens</em> a qStopMotion project file.</p> <h4>Otevřít</h4> <p><em>otevře</em> soubor s projektem qStopMotion.</p> New project Nový projekt The Project Projekt You have to define an image grabber to use. This can be set on the recording tool tab. Musíte vybrat nějaký zachytávač obrázků, který se bude používat. Toto se dá nastavit na kartě pro nahrávání. Save &As Uložit &jako <h4>Save</h4> <p><em>Saves</em> the current animation as a qStopMotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Uložit</h4> <p>Uloží nynější animaci jako soubor s projektem qStopMotion. </p> <h4>Exposure ID</h4><p>This area displays the id of the currently selected exposure</p> <h4>ID snímku</h4><p>Toto pole ukazuje ID nyní vybraného snímku</p> Insert Take Vložit záběr Information Informace About Qt O Qt <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Co je to?</h4> <p>Ukazovátko myši se změní a ukáže nápomocné informace o předmětu, na který bylo klepnuto.</p> Save As Uložit jako Connecting camera... Vytváří se spojení s kamerou... Add Take Přidat záběr Recording Nahrávání Take 01 Záběr 01 Select image grabber Vyberte zachytávač obrázků &Export &Vyvést <h4>Preferences of the application</h4> <p>This will opens a window where you can <em>change</em> the preferences of the application.</p> <h4>Nastavení programu</h4> <p>Tímto se otevře okno, v němž můžete <em>změnit</em> nastavení programu.</p> There are unsaved changes. Do you want to save? Jsou neuložené změny. Chcete je uložit? <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Ukončit</h4> <p><em>ukončí</em> program.</p> Project (*.%1) Projekt (*.%1) <h4>About Qt</h4> <p>This will display a small information box where you can read general information about the Qt library.</p> <h4>O Qt</h4> <p>Tímto se ukáže malé informační okno, v němž si můžete přečíst všeobecné informace o knihovně Qt.</p> Remove Frames Odstranit snímky Remove Take Smazat záběr Scene 001 Výjev 001 English Angličtina <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>O programu</h4> <p>Tímto se ukáže malé informační pole, v němž si můžete přečíst všeobecné informace a rovněž jméno vývojáře tohoto vynikajícího kusu programu.</p> <h4>Cinelerra</h4> <p>Exports the current animation as a <em>cinelerra-cv</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4> <p>vyvede nynější animaci jako projekt programu <em>cinelerra-cv</em>.</p>Při tomto budete vedeni průvodcem. Ready to rumble ;-) Teď! <h4>Save As</h4> <p><em>Saves</em> the current animation as a qStopMotion project file.</p> <h4>Uložit jako</h4><em>Uloží</em> nynější animaci jako soubor s projektem qStopMotion.</p> Save project As Uložit projekt jako Preferences Nastavení No default output file name defined. Check your settings in the properties dialo of the project! Nestanoven žádný výchozí název pro výstupní soubor. Prověřte nastavení v dialogu vlastností projektu! Warning Varování The selected encoder is not valid. Check your settings in the properties dialog of the project! Vybraný kodér není platný. Prověřte nastavení v dialogu vlastností projektu! &Windows &Okna What's This Co je toto <h4>Scene ID</h4><p>This area displays the id of the currently selected scene</p> <h4>ID výjevu</h4><p>Toto pole ukazuje ID nyní vybraného výjevu</p> Export to video file Vyvést do souboru s obrazem <h4>Project ID</h4><p>This area displays the id of the currently active project</p> <h4>ID projektu</h4><p>Toto pole ukazuje ID nyní činného projektu</p> Open &Recent Otevřít &nedávný Project ID: ID projektu: There are some images in the open project. Do you want to convert the images to the new file format or quality? V otevřeném projektu jsou nějaké obrázky. Chcete tyto obrázky převést do nového souborového formátu nebo do nové jakosti? <h4>Properties of the project</h4> <p>This will opens a window where you can <em>change</em> properties of the animation project.</p> <h4>Vlastnosti projektu</h4> <p>Tímto se otevře okno, v němž můžete <em>změnit</em> vlastnosti projektu.</p> English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Angličtina The selected encoder is not installed on your computer. Install the encoder or select another one! Vybraný kodér není nainstalován na vašem počítači. Kodér nainstalujte nebo vyberte jiný! PreferencesTool DOM Parser Syntaktický analyzátor DOM Can't copy preferences file to backup file! Soubor s nastavením nelze kopírovat do souboru se zálohou! Critical Važné Can't remove preferences backup file! Záložní soubor souboru s nastavením nelze smazat! Couldn't open XML file: %1 Nepodařilo se otevřít soubor XML: %1 Parse error at line %1, column %2: %3 %4 Chyba při zpracování na řádku %1, sloupec %2: %3 %4 ProjectDialog Apply Použít Close Zavřít Video Export Vyvedení obrazu Image Import Zavedení obrázku Image Transformation Proměna obrázku Properties Vlastnosti Animation Project Properties Vlastnosti projektu animace ProjectSerializer Can't change permissions of the sound directory! Nelze změnit přístupová práva k adresáři se zvuky! Can't remove old backup of project file! Starý záložní soubor souboru s projektem nelze smazat! Can't create sound directory! Nelze vytvořit adresář se zvuky! DOM Parser Syntaktický analyzátor DOM Can't create project directory! Nelze vytvořit adresář s projektem! Can't change permissions of the image directory! Nelze změnit přístupová práva k adresáři s obrázky! Can't copy the project file to backup! Soubor s projektem nelze kopírovat do souboru se zálohou! Critical Važné Can't create image directory! Nelze vytvořit adresář s obrázky! Can't change permissions of the project directory! Nelze změnit přístupová práva k adresáři s projektem! Couldn't open XML file: %1 Nepodařilo se otevřít soubor XML: %1 Parse error at line %1, column %2: %3 %4 Chyba při zpracování na řádku %1, sloupec %2: %3 %4 Can't remove the old project file! Starý soubor s projektem nelze smazat! ProjectTab Edit Upravit Takes Záběry <h4>Append new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>append</em> it at the end of the animation.</p> <h4>Připojení nového výjevu (Ctrl+E)</h4> <p>Klepněte na toto tlačítko pro vytvoření nového <em>výjevu</em> a pro <em>připojení</em> animace na konec.</p> <h4>Remove Take (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>take</em> from the animation.</p> <h4>Smazání záběru (Shift+Delete)</h4> <p>Klepněte na toto tlačítko pro <em>smazání</em> vybraného <em>záběru</em> z animace.</p> The active frame is corrupt Vybraný snímek (obrázek) je poškozen No take selected. Please select a take in the project tree. Nevybrán žádný záběr. Vyberte, prosím, nějaký záběr v projektovém stromu. You do not have Gimp installed on your system GIMP není nainstalován v systému Insert Frames Vložit snímky Frames Snímky Add Frames Přidat snímky Choose frames to add Vyberte snímky k přidání Scenes Výjevy <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>scene</em> from the animation.</p> <h4>Smazání výjevu (Shift+Delete)</h4> <p>Klepněte na toto tlačítko pro <em>smazání</em> vybraného <em>výjevu</em> z animace.</p> Failed to start Gimp! Nepodařilo se spustit GIMP! There is no active frame to open Není vybrán žádný snímek (obrázek) k otevření <h4>Launch Photo Editor</h4> <p>Click this button to open the active frame in the photo editor</p> <p>Note that you can also drag images from the frame bar and drop them on the photo editor</p> <h4>Spuštění programu na úpravy obrázků</h4> <p>Klepněte na toto tlačítko pro otevření programu na upravování obrázků</p> <p>Také je možné, přetáhnout snímky (obrázky) z pruhu se snímky (časová přímka) do otevřeného programu na úpravy obrázků.</p> <h4>Remove Frame (Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>frame</em> from the take.</p> <h4>Smazání snímku (Delete)</h4> <p>Klepněte na toto tlačítko pro <em>smazání</em> vybraného <em>snímku</em> ze záběru.</p> <h4>Append Frames (CTRL+F)</h4> <p>Click on this button to <em>append frames</em> at the end of the take.</p> <h4>Připojení snímků (Ctrl+F)</h4> <p>Klepněte na toto tlačítko pro <em>připojení snímků</em> na konec záběru.</p> Insert Take Vložit záběr <h4>Insert new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>insert</em> it bevor the selected scene.</p> <h4>Vložení nového výjevu (Ctrl+E)</h4> <p>Klepněte na toto tlačítko pro vytvoření nového <em>výjevu</em> a jeho <em>vložení</em> před vybraný výjev.</p> Add Take Přidat záběr <h4>Insert Frames (CTRL+F)</h4> <p>Click on this button to <em>insert frames</em> bevor the selected frame.</p> <h4>Vložení snímků (Ctrl+F)</h4> <p>Klepněte na toto tlačítko pro <em>vložení snímků</em> před vybraný snímek.</p> Take 00 Záběr 00 No scene selected. Please select a scene in the project tree. Nevybrán žádný výjev. Vyberte, prosím, nějaký výjev v projektovém stromu. Scene 000 Výjev 000 <h4>Append new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>append</em> it to the end of the scene.</p> <h4>Připojení nového záběru (Ctrl+E)</h4> <p>Klepněte na toto tlačítko pro vytvoření nového <em>záběru</em> a pro jeho <em>připojení</em> na konec výjevu.</p> Warning Varování <h4>Insert new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>insert</em> it bevor the selected take.</p> <h4>Vložení nového záběru (Ctrl+E)</h4> <p>Klepněte na toto tlačítko pro vytvoření nového <em>záběru</em> a jeho <em>vložení</em> před vybraný záběr.</p> Project Tree Projektový strom ProjectWidget Mix Směs Diff Rozdíly Playback Přehrávání Video 4 Linux (USB WebCam) Video 4 Linux (USB WebCam) Number of images: Počet obrázků: Single frame capture Zachytávání jednotlivých obrázků Test Source Zdroj zkoušky IEEE 1394 (FireWire DigiCam) IEEE 1394 (FireWire DigiCam) gphoto (USB Compact Camera) gphoto (Malá kamera USB) Image grabber settings Nastavení zachytávače (zdroje) obrázků Capture Zachytávání Recording Nahrávání Media Foundation Mediální podklad <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Počet obrázků</h4> <p>Tímto posuvníkem (změnou hodnoty) můžete nastavit, kolik předcházejících obrázků v animaci se má zařadit v obrazu kamery. Nebo, pokud jste v režimu přehrávání: Kolik obrázků bude přehráno. </p> <p>Tím (míšením předchozího obrázku(ů) do kamery) lépe uvidíte, jak je následující obrázek ve vztahu k předcházejícím obrázkům. To umožňuje stejnoměrný (hladší) průběh pohybu!</p> Video 4 Linux 2 (USB WebCam) Video 4 Linux (USB WebCam) QtFrontend &OK &OK &No &Ne &Yes &Ano Create directory Vytvořit adresář qStopMotion - Recovered Project qStopMotion - Obnovený projekt You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. Nemáte potřebná oprávnění pro provozování qStopMotion. tato oprávnění potřebujete k vytvoření adresáře .qstopmotion ve vašem domovském adresáři. Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? Vypadá to, že qStopmotion nebyl při posledním používání správně ukončen. Chcete obnovit poslední sezení? You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. Nemáte potřebná oprávnění pro provozování qStopMotion. Potřebujete oprávnění ke čtení, zápisu a spouštění adresáře .qstopmotion. Recovery Obnovení Check Permissions Prověřit přístupová práva RecordingTab Mix Směs Diff Rozdíly Not Supported Nepodporováno Playback Přehrávání No take selected. Please select a take on the project tab. Nevybrán žádný záběr. Vyberte, prosím, záběr na kartě projektu. Resolution: Rozlišení: Number of images: Počet obrázků: Single frame capture Zachytávání jednotlivých obrázků Camera Kamera Video Source: Zdroj obrazu: Information Informace Capture Zachytávání <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Zapnou/Vypnout kameru (C)</h4> <p>Klepnutím na toto tlačítko zapnete/vypnete kameru</p> Recording Nahrávání No scene and no take selected. Please select a scene and a take on the project tab. Nevybrán žádný výjev a žádný záběr. Vyberte, prosím, výjev a záběr na kartě projektu. <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Počet obrázků</h4> <p>Tímto posuvníkem (změnou hodnoty) můžete nastavit, kolik předcházejících obrázků v animaci se má zařadit v obrazu kamery. Nebo, pokud jste v režimu přehrávání: Kolik obrázků bude přehráno. </p> <p>Tím (míšením předchozího obrázku(ů) do kamery) lépe uvidíte, jak je následující obrázek ve vztahu k předcházejícím obrázkům. To umožňuje stejnoměrný (hladší) průběh pohybu!</p> No active project. Please create a new project or open an existing project. Žádný projekt není činný. Vytvořte, prosím, nový projekt nebo otevřete stávající projekt. Scene Can't remove sound file! Nelze smazat soubor se zvukem! Can't copy sound file! Nelze kopírovat soubor se zvukem! Critical Važné StartDialog &OK &OK <h2>Create a new Project</h2> <h2>Vytvořit nový projekt</h2> <h2>Open project file</h2> <h2>Otevřít soubor s projektem</h2> &Close &Zavřít <h2>Open last Project</h2> <h2>Otevřít poslední projekt</h2> Start a new Project. Začít nový projekt. Open and continue a existing project. Otevřít a pokračovat ve stávajícím projektu. Project path: Cesta k projektu: TimeLine Load images to time line Nahrání obrázků do časové přímky ToolBar Running animation Přehrání animace <h4>First frame of the take (J, Left)</h4> <h4>První snímek záběru (J, šipka vlevo)</h4> <h4>Last frame of the take (L, Right)</h4> <h4>Poslední snímek záběru (L, šipka vpravo)</h4> <h4>Play animation (K, P)</h4> <h4>Přehrát animaci (K, P)</h4> <h4>Next frame (L, Right)</h4> <h4>Další snímek (L, šipka vpravo)</h4> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Zachytit snímek (mezerník)</h4> <p>Klepnutím na toto tlačítko můžete zachytit jednotlivé snímky z kamery a přidat je do animace. To lze provést i stisknutím klávesy <b>mezerníku</b></p> <h4>Previous frame (J, Left)</h4> <h4>Předchozí snímek (J, šipka vlevo)</h4> TransformWidget 0% 0 % 100% 100 % Zoom the image Zvětšení obrázku kamery Clip a part of the image Vystřihnutí části obrázku kamery Zoom value: Hodnota zvětšení: Scale the whole image Změnit velikost celého obrázku Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping. Níže můžete vybrat, která proměna obrázku se má použít při zavádění obrázků do nyní činného projektu. Pokud vyberete vystřihnutí části obrázku, musíte také nastavit nastavení vystřihnutí. Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping. Níže můžete vybrat, která proměna obrázku se má použít při zavádění obrázků do nového projektu. Pokud vyberete vystřihnutí části obrázku, musíte také nastavit nastavení vystřihnutí. Zoom settings Nastavení zvětšení Transformation settings Nastavení proměny obrázku UndoExposureAdd Add exposure (%1,%2,%3) '%4' Přidat snímek (%1,%2,%3) '%4' UndoExposureInsert Insert exposure (%1,%2,%3) '%4' Vložit snímek (%1,%2,%3) '%4' UndoExposureMove Move exposure (%1,%2,%3) Posunout snímek (%1,%2,%3) UndoExposureRemove Remove exposure (%1,%2,%3) Smazat snímek (%1,%2,%3) UndoExposureSelect Select exposure (%1,%2,%3)-->(%4,%5,%6) Vybrat snímek (%1,%2,%3)-->(%4,%5,%6) UndoProjectNew New project '%1' Nový projekt '%1' UndoProjectOpen Open project '%1' Otevřít projekt '%1' UndoSceneAdd Add scene (%1) '%2' Přidat výjev (%1) '%2' UndoSceneInsert Insert scene (%1) '%2' Vložit výjev (%1) '%2' UndoSceneMove Move scene (%1,%2) Posunout výjev (%1,%2) UndoSceneRemove Remove scene (%1) Smazat výjev (%1) UndoSceneSelect Select scene (%1)-->(%2) Vybrat výjev (%1)-->(%2) UndoTakeAdd Add take (%1,%2) '%3' Přidat záběr (%1,%2) '%3' UndoTakeInsert Insert take (%1,%2) '%3' Vložit záběr (%1,%2) '%3' UndoTakeMove Move take (%1,%2) Posunout záběr (%1,%2) UndoTakeRemove Remove take (%1,%2) Smazat záběr (%1,%2) UndoTakeSelect Select take (%1,%2)-->(%3,%4) Vybrat záběr (%1,%2)-->(%3,%4) qstopmotion-2.3.2-Source/translations/qstopmotion_fr.ts000644 000000 000000 00000422277 13011043104 023503 0ustar00rootroot000000 000000 AboutDialog &About A &propos Main developers Développeurs principaux A&uthors A&uteurs Translation Traduction Czech Tchèque Slovenian Slovève French Français Turkish Turc Italian Italien Logo Logo Coordinating Coordination Testing Tester &Thanks To &Remerciements à &Licence Agreement Accord de &licence Unknown Windows OS Windows OS inconnu Unknown Mac OS Mac OS inconnu Build time: %1 %2 Moment de la création: %1 %2 &System Info &Information du système OK OK About A propos This is the qStopMotion application for creating stop motion animations. C'est le programme qStopMotion pour créer des animations en volume. Version: Version: qStopMotion is a fork of stopmotion for linux. qStopMotion est un fork des animations en volume pour linux. and et Danish Danois This program is distributed under the terms of the GPL v2. Ce programme est mis en place sous les conditions de GPL v2. Qt runtime version: Version du temps d'éxecution Qt: Operating system name and version: nom et version du système d'exploitation: German Allemand Portuguese Portugais Spanish Español Swedish Suède Contributors Participants AnimationProject Saving scenes to disk ... Enregistrer les scènes sur le disque dur... Add Sound Ajouter le son Cannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play. Il n'est pas possible d'ouvrir le fichier audio pour le lire. Veuillez vérifier si vous avez mis les bons droits d'accès. L'animation est visualisée sans son si vous choisissez de le lire. The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play. Le fichier audio choisi n'a pas de format audio valide. L'animation est visualisée sans son si vous choisissez de le lire. CameraControllerDialog qStopMotion Camera Controller Commande de la caméra qStopMotion Video Quality Qualité de l'image Automatic Pan Rotation automatique Brightness: Clarté: Automatic Contrast Contraste automatique Contrast: Contraste: Automatic Saturation Saturation automatique Saturation: Saturation: Automatic Hue Nuance automatique Hue: Nuance: Automatic Gamma Gamma automatique Gamma: Gamma: Automatic Sharpness Profondeur de champ automatique Sharpness: Profondeur de champ: Automatic Backlight Compensation compensation automatique du rétroéclairage Backlight Compensation: compensation du rétroéclairage: Automatic Gain Gain automatique Gain: Gain: Automatic Color Enable autorisation automatique de couleurs Color Enable: Autorisation de couleurs: Camera Control Commande de caméra Automatic Exposure Exposition automatique Exposure: Exposition: Restore Camera Settings... Restaurer les paramètres de caméra Reset Camera Settings... Réinitialiser les paramètres de caméra Abort Reset Annuler Réinitialisation Automatic Brightness clarté automatique Automatic White Balance Balance automatique des blancs White Balance: Balance des blancs: Automatic Zoom Zoom automatique Zoom: Zoom: Automatic Focus Netteté automatique de l'image Focus: Netteté de l'image: Pan: Rotation: Automatic Tilt Inclinaison automatique Tilt: Inclinaison: Automatic Iris Iris automatique Iris: Iris: Automatic Roll Rôle automatique Roll: Rôle: &Reset to Default &Reinitialisation par défaut &Close &Fermer DescriptionDialog &Project Description: &Description du projet: &Scene Description: &Description de la scène: &Take Description: &Description de l'enregistrement: &OK &OK &Cancel &Annuler Project Description Description du projet Scene Description Description de la scène Take Description Description de l'enregistrement Information Information The character '|' is not allowed in the project description. Le caractère '|' est interdit dans la description du projet. The character '|' is not allowed in the scene description. Le caractère '|' est interdit dans la description de la scène. The character '|' is not allowed in the take description. Le caractère '|' est interdit dans la description de l'enregistrement. DomainFacade Critical Problématique Can't remove history file! Le fichier histoire ne peut pas être effacé. Can't open history file to write entry! Le fichier histoire ne peut pas être ouvert pour ajouter une nouvelle entrée! Can't open history file to recover project! Le fichier histoire ne peut pas être ouvert pour récupérer le projet! Can't copy image to temp directory! L'image ne peut pas être copié dans le dossier temporaire! ExportWidget Encoder settings Paramètres de l'encodeur Encoder Application: Application de l'encodeur: ffmpeg ffmpeg Video Format: Format vidéo: Video Size: Taille du fichier vidéo: AVI AVI Below you can set which program should be used for encoding a new project to a video file. En dessous vous pouvez choisir quel programme doit être utilisé pour encoder un nouveau projet en un fichier vidéo. libav MP4 MP4 Frame Size Taille des images QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGA (800x600) SVGA (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080) Full HD (1900x1080) {1900x?} Full HD (1900x1080 Full HD (1900x1080 Frames per Second: Images par seconde: Project Frames per Second: Images par seconde dans ce projet: <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>IPS (images par seconde)</h4> <p>En modifiant cette valeur, vous changez la vitesse de l'animation dans le <b>Cadre de prévisualisation</b>.</p> <p>Pour lire l'animation appuyez sur le bouton <b>Lecture de l'animation</b>.</p> Output file settings Paramètres du fichier de sortie Do you want to be asked for an output file everytime you choose to export? Voulez-vous choisir le fichier destination à chaque export ? Yes Oui No Non Set default output file: Définir le fichier destination par défaut : Browse Parcourir Choose output file Choisir le fichier destination Below you can set which program should be used for encoding the currently active project to a video file. Vous pouvez sélectionner ci-dessous quel programme / processus qStopMotion doit utiliser pour encoder le projet en cours en un fichier vidéo. Exposure Critical Problématique Can't move image to temporary directory! Les images ne peuvent pas être déplacée dans le dossier temporaire! Can't copy the image to the temporary directory! L' image ne peut pas être copiée dans le dossier temporaire! Can't remove the image from the project directory! L' image ne peut pas être supprimée du dossier du projet! Can't save the image in the new file format to the temporary directory! L'image ne peut pas être enregistré dans un nouveau fichier dans le dossier temporaire! Can't remove the image in the temporary directory! L' image ne peut pas être supprimée du dossier temporaire! Can't copy image to temporary directory! Les images ne peuvent pas être copiées dans le dossier temporaire! Can't copy the image to the project directory! L' image ne peut pas être copiée dans le dossier du projet! Can't move image to trash directory! Les images ne peuvent pas être déplacées dans la poubelle! Can't move image to project directory! Les images ne peuvent pas être déplacées dans le dossier du projet! ExternalCommandDialog Input to program: Entrée au programme: Submit Envoyer Close Fermer Output from external command Sortie de commandements externes Result Résultat Failed! Échoué! Successful! Réussi! GeneralDialog Preferences Paramètres Apply Appliquer Close Fermer General Settings Paramètres générales New Project Values Valeurs d'un nouveau projet Image Import Importer une image Image Transformation transformation d'une image Video Export Exporter une vidéo Grabber Périphérique General Preferences Fenêtre de préférences qStopMotion Preferences Paramètres de qStopMotion &General Settings &Paramètres généraux &New Project Values &Paramètres par défaut Image &Import Image &Importation Image &Transformation Image &Transformation Video &Export &Exporter une vidéo &Image Import &Importation d'une image GeneralWidget Language Langue Capture Button Functionality Fonction du bouton d'enregistrement Insert new frame bevor selected frame Insertion d'une nouvelle image avant l'image mise en relief Insert new frame after selected frame Insertion d'une nouvelle image après l'image mis en relief Append new frame at the end of the take Insertion d'une nouvelle image à la fin de la prise de vue Grid Functionality Lignes de grille Vertical Lines Lignes verticales Horizontal Lines Lignes horizontales Grid Color: Couleur de grille: Color Couleur GrabberWidget Below you can set which program should be used for encoding a new project to a video file. En dessous vous pouvez choisir quel programme doit être utilisé pour encoder un nouveau projet en un fichier vidéo. Below you can select which image grabber should be used for grabbing images from the camera. If available the controller can be used to control focus, zoom and other functionality. Grabber Functionality Video 4 Linux 2 Source Camera Controller (Experimental) Microsoft Media Foundation Source Gphoto2 Source (Experimental) Information Information Pease restart qStopMotion to activate the changings! GstreamerDeviceGrabber Device %1 Périphérique %1 GstreamerDv1394Grabber Device %1 Périphérique %1 GstreamerGrabber Video test device Périphérique de test vidéo Device %1 Périphérique GstreamerV4L2Grabber Device %1 Périphérique %1 GstreamerVideoTestGrabber Video test device Périphérique de test vidéo HelpBrowser &Close &Fermer &Backward Pa&ge précédente qStopMotion Help Browser Explorateur d'aide qStopMotion &Forward P&age suivante &Home Table des mati&ères ImageGrabber Check image grabber Vérifier le périphérique Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. La capture a échouée. Ceci peut arriver si vous essayez de capturer à partir d'un périphérique non valide. Veuillez vérifier les paramètres de capture dans la fenêtre de préférences. ImageGrabberFacade Check image sources Vérifier le périphérique No usable video image source found. Please connect on video device on the computer. Check image grabber Vérifier le périphérique Image grabber initialization failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab. Grabbing failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab. Saisie de l'image échouée.Cela peut arriver si vous essayé de saisir d'un périphérique non valide. Choisissez s'il vous plaît un autre périphérique dans la tabulation d'enregistrement. ImportWidget Below you can set which image sources should be used for importing images to a new project. En dessous vous pouvez choisir quel périphérique doit être utilisé pour importer des images dans un nouveau projet. Below you can set which image sources should be used for importing images to the currently active project. En dessous vous pouvez choisir quel périphérique doit être utilisé pour importer des images dans le projet activé. Image grabber settings Réglages du périphérique Image Grabber: Périphérique: Test Source Mire de traînage Video 4 Linux (USB WebCam) Video 4 Linux (USB WebCam) IEEE 1394 (FireWire DigiCam) IEEE 1394 (FireWire DigiCam) Direct Show (USB WebCam) Direct Show (USB WebCam) Direct Show (FireWire DigiCam) Direct Show (FireWire DigiCam) gphoto (USB Compact Camera) gphoto (USB Appareil photographique compact) Image import settings Réglages de l'importation d'une image Image Format: Format d'image: JPEG JPEG TIFF TIFF BMP BMP Image Quality: Qualité de l'image: Min Min Max Max Image Size: Grandeur d'image: Default Grabber Size Grandeur du périphérique QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGA (800x600) SVGA (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080) Full HD (1900x1080) {1900x?} Live view settings Paramètres de l'affichage en direct Frames per second: Images par seconde: 0.1 0.1 5.0 5.0 Full HD (1900x1080 Full HD (1900x1080 Transformation settings Réglages d'une conversion d'image Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping. En dessous vous pouvez choisir quel conversion d'image doit être utilisé pour importer une image dans un nouveau projet. Si vous Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping. En dessous vous pouvez choisir quel conversion d'image doit être utilisé pour importer une image dans le projet activé. Si vous MainWindowGUI English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Francais Ready to rumble ;-) Top, c'est parti ;-) &New &Nouveau &Open &Ouvrir <h4>Open</h4> <p><em>Opens</em> a qStopMotion project file.</p> <h4>Ouvrir</h4> <p><em>Ouvre</em> un projet qStopMotion.</p> &Save &Enregistrer Save &As Enregistrer &sous &Quit &Quitter <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Quitter</h4> <p><em>Quitte</em> le programme Stopmotion.</p> &File &Fichier &Undo Annu&ler <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Annuler</h4> <p><em>Annule</em> la dernière action. Vous pouvez presser Annuler plusieurs fois pour annuler plusieurs actions.</p> Re&do Re&faire <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Refaire</h4> <p><em>Refait</em> la dernière action annulée. Vous pouvez presser Refaire plusieurs fois pour refaire plusieurs actions.</p> Cu&t Co&uper <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Couper</h4> <p><em>Coupe</em> les images sélectionnées de l'animation et les ajoute au presse-papier pour que vous puissiez les coller ailleurs.</p> &Copy Cop&ier <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Copier</h4> <p><em>Copie</em> les images sélectionnées dans le presse-papier. Vous pouvez alors les coller où vous le souhaitez.</p> &Paste C&oller <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Coller</h4> <p><em>Colle</em> les images stockées dans le presse-papier à l'emplacement sélectionné.</p> <p>Vous pouvez copier / coller des images depuis d'autres programmes et utiliser cette option pour les coller dans cette animation.</p> &Edit &Édition &Settings &Paramètres What's &This &Qu'est-ce que c'est <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Qu'est-ce que c'est</h4> <p>Ceci affiche un curseur de souris spécial qui peut être utilisé pour afficher des informations utiles comme celle-ci.</p> &About A &propos <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>A propos</h4> <p>Ceci affiche une petite fenêtre d'information où vous pouvez lire des informations générales aussi bien que les noms des développeurs qui ont créé cet excellent logiciel.</p> &Help &Aide &Camera Controller &Commande de caméra <h4>Preferences of the application</h4> <p>This will opens a window where you can <em>change</em> the preferences of the application.</p> <h4>Paramètres de l'application</h4> <p>Cela ouvre une Fenêtre dans la quelle vous pouvez <em>changer</em> les paramètres de l'application.</p> Preferences of qStopMotion Paramètres de qStopMotion Existing Images Images existants There are some images in the open project. Do you want to convert the images to the new file format or quality? Dans le projet ouvert il y a déjà des images. Voulez-vous convertir ces images en le nouveau format ou dans la nouvelle qualité? Project (*.%1) Projet (*.%1) Information Information The character '|' is not allowed in the project file name and will be removed. Le caractère '|' est interdit dans le nom du fichier de projet et est effacé. <h4>About Qt</h4> <p>This will display a small information box where you can read general information about the Qt library.</p> <h4>Concernant Qt</h4> <p>Cela montre une petite boîte d'information dans laquelle vous pouvez lire des informations générales sur la bibliothèque Qt.</p> About Qt Concernant Qt <h4>Project ID</h4><p>This area displays the id of the currently active project</p> <h4>Description du projet</h4><p>Ce cadre montre la description du projet active</p> <h4>Scene ID</h4><p>This area displays the id of the currently selected scene</p> <h4>Description de la scène</h4><p>Ce cadre montre la description de la scène active</p> <h4>Take ID</h4><p>This area displays the id of the currently selected take</p> <h4>Description de la prise de vue</h4><p>Ce cadre montre la description de la prise de vue active</p> <h4>Exposure ID</h4><p>This area displays the id of the currently selected exposure</p> <h4>Description de l'image</h4><p>Ce cadre montre la description de l'image active</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Cadre de prévisualisation</h4><p> Dans cette zone, vous pouvez voir l'image sélectionnée. Vous pouvez aussi voir les animations en pressant le bouton <b>Lecture</b>.</p> You have to define an image grabber to use. This can be set on the recording tool tab. The project directory must not contain more than one project file. No encoder selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an encoder to use! No video format selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an video format to use! No default output file name defined. Check your settings in the properties dialo of the project! Unsaved changes Modifications non enregistrées There are unsaved changes. Do you want to save? Il y a des modifications non enregistrées. Voulez-vous enregistrer ? Video Vidéo &Export &Exporter <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Nouveau</h4> <p>Crée un <em>nouveau</em> projet.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a qStopMotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Enregistrer</h4> <p><em>Enregistre</em> l'animation courante sous forme de fichier projet qStopMotion. <BR>Si ce projet a été enregistré précédemment, il sera enregistré automatiquement dans le même fichier (écrasement).</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a qStopMotion project file.</p> <h4>Enregistrer sous</h4> <p><em>Enregistre</em> l'animation courante sous forme de fichier projet qStopMotion.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Vidéo</h4> <p>Exporte le projet courant vers un fichier <em>vidéo</em>.</p>Vous aurez un assistant pour vous guider. <h4>Cinelerra</h4> <p>Exports the current animation as a <em>cinelerra-cv</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4> <p>Exporte l'animation courante en tant que projet <em>cinelerra-cv</em>.</p>Vous aurez un assistant pour vous guider. Cinelerra Cinelerra Select image grabber Veuillez choisir un périphérique de capture You have to define an image grabber to use. This can be set in the preferences menu. Vous devez définir un périphérique de capture. Ceci peut être fait dans la fenêtre de préférences. Insert Scene Insérer la scène Add Scene Ajouter la scène Remove Scene Effacer la scène Insert Take Insérer la prise de vue Add Take Ajouter la prise de vue Remove Take Effacer la prise de vue Insert Frames Insérer l'image Add Frames Ajouter l'image Remove Frames Effacer l'image &Configure qStopMotion &Configurer qStopMotion &Undo stack &Annuler la liste de commandements About &Qt Concernant &Qt Project ID: Description du projet: Scene ID: Description de la scène: Take ID: Description de la prise de vue: Exposure ID: Description de l'image: &View &Affichage Cancel Annuler Connecting camera... Connceter la caméra... The Project Le projet Scene 001 Scène 001 Take 01 Prise de vue 01 qStopMotion - New Animation Project qStopMotion - Nouveau projet d'animation Project (*.%1);;Archive (*.%2) Projet (*.%1);;Archive (*.%2) Cannot find any registered encoder to be used for video export. This can be set in the preferences menu. Export to video will not be possible until you have set an encoder to use! Il n'est pas possible de trouver un encodeur enregistré pour être utilisé pour l'exportation de la vidéo. Ceci peut être situé dans la fenêtre de préférences. L'exportation comme vidéo n'est pas possible jusqu'à ce que vous ayez installé un encodeur! AVI Videos (*.avi) Vidéos AVI (*.avi) MP4 Videos (*.mp4) Vidéos MP4 (*.mp4) No default output file name defined. Check your settings in the preferences menu! Ne pas definir un nom standard pour le fichier de sortie. Contrôlez les Paramètres dans le menu! The registered encoder is not valid. Check your settings in the preferences menu! L'encodeur enregistré est non valide. Veuillez vérifier les paramètres dans la fenêtre de préférences! Exporting ... Exportation ... qStopMotion - Undo stack qStopMotion - Annuler la liste de commandements Open &Recent &Récemment ouvert(s) Properties Propriétés Preferences Paramètres &Windows &Fenêtre Recording Enregistrement Project Projet New project Nouveau projet Open project Ouvrir un projet Save project Enregistrer le projet Save project As Enregistrer le projet sous <h4>Properties of the project</h4> <p>This will opens a window where you can <em>change</em> properties of the animation project.</p> <h4>Propriétés du projet</h4> <p>Cela ouvre une Fenêtre dans laquelle vous pouvez<em>changer</em> les propriétés du projet.</p> Properties of the animation project Propriétés du projet d'animation Quit Quitter Undo Annuler Redo Refaire Cut Couper Copy Copier Paste Coller <h4>Configure qStopMotion</h4> <p>This will opens a window where you can <em>configure</em> qStopMotion with various input and output devices.</p> <h4>Configurer qStopMotion</h4> <p>Ceci ouvre une fenêtre où vous pouvez <em>configurer</em> qStopMotion ainsi que les périphériques d'entrée et de sortie.</p> Configure qStopMotion Configurer qStopMotion What's This Qu'est-ce que c'est About A propos <h4>TimeLine</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Barre des images</h4> Warning Attention Export to video file Exporter vers un fichier vidéo The selected encoder is not installed on your computer. Install the encoder or select another one! Export to file Exporter vers un fichier <h4>Help</h4> <p>This button will bring up a dialog with the qStopMotion manual</p> <h4>Aide</h4> <p>Ce bouton affiche le manuel utilisateur de qStopMotion</p> Help Aide Choose project file Veuillez choisir le fichier du projet Save As Enregistrer sous PreferencesTool DOM Parser DOM Parser Couldn't open XML file: %1 Le fichier XML ne peut pas être ouvert: %1 Parse error at line %1, column %2: %3 %4 Erreur à la ligne %1, à la colonne %2: %3 %4 Critical Problématique Can't remove preferences backup file! Il n'est pas possible d'effacer la copie de sécurité du fichier! Can't copy preferences file to backup file! Le fichier ne peut pas être enregistré comme copie de sécurité! ProjectDialog Properties Propriétés Apply Appliquer Close Fermer Animation Project Properties Propriétés du projet d'animation Image Import Importer une image Image Transformation Transformation d'une image Video Export Exporter une vidéo Project Preferences Fenêtre de préférences Image &Import Image &Importation Image &Transformation Image &Transformation &General Settings &Paramètres généraux &Project Values &Paramètres par défaut &Image Import &Importation d'une image Video &Export &Exporter une vidéo ProjectSerializer DOM Parser DOM Parser Couldn't open XML file: %1 Le fichier XML ne peut pas être ouvert: %1 Parse error at line %1, column %2: %3 %4 Erreur à la ligne %1, à la colonne %2: %3 %4 Critical Problématique Can't remove old backup of project file! Il n'est pas possible d'effacer la vieille copie de sécurité du fichier du projet! Can't rename project file to backup! Il n'est pas possible de renommer le fichier du projet pour la sauvegarde! Can't copy the project file to backup! Le fichier du projet ne peut pas être copié pour la sauvegarde! Can't remove the old project file! Le vieux fichier du projet ne peut pas être effacé! Can't create project directory! Il n'est pas possible de créer un dossier du projet! Can't change permissions of the project directory! Il n'est pas possible de modifier les droits d'accès du dossier du projet! Can't create image directory! Il n'est pas possible de créer un répertoire des images! Can't change permissions of the image directory! Il n'est pas possible de modifier les droits d'accès du répertoire des images! Can't create sound directory! Il n'est pas possible de créer un répértoire des sons! Can't change permissions of the sound directory! Il n'est pas possible de modifier les droits d'accès du répértoire des sons! ProjectTab Choose frames to add Choisir les images à ajouter Warning Attention Project Tree Arbre de projet Scenes Scènes Takes Prises de vue Frames Images Edit Edition Scene 000 Scène 000 Take 00 Prise de vue 00 You do not have Gimp installed on your system Gimp n'est pas installé sur votre ordinateur There is no active frame to open L'image qui doit être ouverte n'est pas sélectionnée The active frame is corrupt L'image sélectionnée est altérée Failed to start Gimp! Le démarrage de Gimp a échoué! <h4>Insert new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>insert</em> it bevor the selected scene.</p> <h4>Insertion d'une nouvelle scène (CTRL+E)</h4> <p>Veuillez cliquer ce bouton pour créer une nouvelle <em>scène</em> et <em>l'insérer</em> avant la scène sélectionnée.</p> Insert Take Insérer une position No scene selected. Please select a scene in the project tree. Aucune scène est selectionnée. S'il vous plaît choisissez une scène dans l'arbre de projet. Add Take Ajouter une position Insert Frames Insérer des images No take selected. Please select a take in the project tree. Aucune position est selctionnée. S'il vous plaît choisissez une position dans l'arbre de projet. Add Frames Ajouter des images <h4>Append new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>append</em> it at the end of the animation.</p> <h4>Ajouter une nouvelle scène (CTRL+E)</h4> <p>Veuillez cliquer ce bouton pour créer une nouvelle <em>scène</em> et <em>le joindre</em> à la fin de l'animation.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>scene</em> from the animation.</p> <h4>Effacer une scène (SHIFT+Delete)</h4> <p>Veuillez cliquer ce bouton pour <em>effacer</em> la scène <em>sélectionnée</em> de l'animation.</p> <h4>Insert new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>insert</em> it bevor the selected take.</p> <h4>Insertion d'une nouvelle prise de vue (CTRL+E)</h4> <p>Veuillez cliquer ce bouton pour créer une nouvelle <em>prise de vue</em> et <em>l'insérer</em> avant la prise de vue sélectionnée.</p> <h4>Append new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>append</em> it to the end of the scene.</p> <h4>Ajouter une nouvelle prise de vue (CTRL+E)</h4> <p>Veuillez cliquer ce bouton pour créer une nouvelle <em>prise de vue</em> et <em>le joindre</em> à la fin de la scène.</p> <h4>Remove Take (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>take</em> from the animation.</p> <h4>Effacer une prise de vue (SHIFT+Delete)</h4> <p>Veuillez cliquer ce bouton pour <em>effacer</em> la prise de vue <em>sélectionnée</em> de l'animation.</p> <h4>Insert Frames (CTRL+F)</h4> <p>Click on this button to <em>insert frames</em> bevor the selected frame.</p> <h4>Insertion d'une image (CTRL+F)</h4> <p>Veuillez cliquer ce bouton pour <em>insérer des images</em> avant l'image sélectionnée.</p> <h4>Append Frames (CTRL+F)</h4> <p>Click on this button to <em>append frames</em> at the end of the take.</p> <h4>Ajouter des images (CTRL+F)</h4> <p>Veuillez cliquer ce bouton pour <em>joindre des images</em> à la fin de la prise de vue.</p> <h4>Remove Frame (Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>frame</em> from the take.</p> <h4>Effacer une image (Delete)</h4> <p>Veuillez cliquer ce bouton pour <em>effacer</em> l'image <em>sélectionnée</em> de la prise de vue.</p> <h4>Launch Photo Editor</h4> <p>Click this button to open the active frame in the photo editor</p> <p>Note that you can also drag images from the frame bar and drop them on the photo editor</p> <h4>Démarrage du programme de traitement d'image</h4> <p>Veuillez cliquer ce bouton pour ouvrir l'image active dans le programme de traitement d'image</p> <p>Il est également possible de déplacer des images de la barre des images au programme de traitement d'image</p> ProjectWidget Recording Enregistrement Single frame capture Faire des photos Camera Caméra Test Source Mire de traînage USB Source Source USB FireWire Source Source FireWire DirectShow Source Source DirectShow Image grabber settings Réglages du périphérique Video 4 Linux (USB WebCam) Video 4 Linux (USB WebCam) IEEE 1394 (FireWire DigiCam) IEEE 1394 (FireWire DigiCam) Video 4 Linux 2 (USB WebCam) gphoto (USB Compact Camera) gphoto (USB Appareil photographique compact) Media Foundation Capture Prise de vue Mix Mixer Diff Différence Playback Lecture Auto Auto Pr sec Par sec Pr min Par min Pr hr Par heure Number of images: Nombre d'images : <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Nombre d'images</h4> <p>En modifiant cette valeur vous pouvez régler combien d'images précédentes sont insérées dans l'image de la caméra ou dans le mode de la lecture, combien d'images se jouent. </p> <p> Ainsi, vous pouvez mieux voir comment l'image prochain se situe par rapport aux images précédentes. Cela permet des enchaînements réguliers des mouvements.</p> FPS chooser IPS (images par seconde) <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>IPS (images par seconde)</h4> <p>En modifiant cette valeur, vous changez la vitesse de l'animation dans le <b>Cadre de prévisualisation</b>.</p> <p>Pour lire l'animation appuyez sur le bouton <b>Lecture de l'animation</b>.</p> QtFrontend Check Permissions Veuillez vérifier les droits d'accès You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on ~/.qstopmotion Vous n'avez pas les droits d'accès nécessaires pour utiliser qStopMotion. Il vous faut des droits d'accès pour lire, écrire et exécuter dans ~/.qstopmotion qStopMotion qStopMotion Recovery Restauration Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? Probablement qStopMotion n'a pas été correctement terminé lors de le dernière séance. Voulez-vous restaurer la dernière séance? &Yes &Oui Create directory Créez un dossier You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. Vous n'avez pas les permissions nécessaires pour utiliser qStopMotion. Vous avez besoin des permissions pour créer un dossier qstopmotion dans votre dossier local. You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. Vous n'avez pas les droits d'accès nécessaires pour utiliser qStopMotion. Il vous faut des droits d'accès pour lire, écrire et exécuter dans .qstopmotion &No &Non &OK &OK qStopMotion - Recovered Project qStopMotion - Projet restauré RecordingTab FPS chooser IPS (images par seconde) <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>IPS (images par seconde)</h4> <p>En modifiant cette valeur, vous changez la vitesse de l'animation dans le <b>Cadre de prévisualisation</b>.</p> <p>Pour lire l'an animation pressez le bouton <b>Lecture de l'animation</b>.</p> Number of images: Nombre d'images : Camera Caméra Capture Saisie Recording Enregistrement Single frame capture Faire des photos Video Source: Source vidéo Resolution: Résolution Mix Mixer Diff Différence Playback Lecture <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Activer/arrêter la caméra (C)</h4> <p>Cliquez sur ce bouton pour activer la caméra ou l'arrêter</p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Nombre d'images</h4> <p>En modifiant cette valeur vous pouvez régler combien d'images précédentes sont insérées dans l'image de la caméra ou dans le mode de la lecture, combien d'images se jouent. </p> <p> Ainsi, vous pouvez mieux voir comment l'image prochain se situe par rapport aux images précédentes. Cela permet des enchaînements réguliers des mouvements.</p> Not Supported Pas soutenu Information Information No active project. Please create a new project or open an existing project. Aucun projet est activé.S'il vous plaît créez un nouveau projet ou ouvrez un projet existant. No scene and no take selected. Please select a scene and a take on the project tab. Aucune scène ni une position sont selectionnées. S'il vous plaît choisissez une scène et une position sur la tabulation du projet. No take selected. Please select a take on the project tab. Aucune position est selectionnée. S'il vous plaît choisissez une position sur la tabulation du projet. Auto Auto Pr sec Par sec Pr min Par min Pr hr Par heure Scene Critical Problématique Can't remove sound file! Il ne'est pas possible d'effacer le fichier audio! Can't copy sound file! Le fichier son ne peut pas être copié! Can't move sound file! Il n'est pas possible de déplacer le fichier audio! StartDialog <h2>Create a new Project</h2> <h2>Créer un nouveau projet</h2> Start a new Project. Démarrer un nouveau projet. <h2>Open last Project</h2> <h2>Ouvrir le dernier projet</h2> Project path: Chemin vers le projet: <h2>Open project file</h2> <h2>Ouvrir le fichier du projet</h2> Open and continue a existing project. Ouvrir et continuer un projet existant. &OK &OK &Close &Fermer TimeLine Load images to time line Charger les images dans la liste des images ToolBar <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Capturer une Image (Espace)</h4> <p>Cliquez sur ce bouton pour <em>capturer</em> une image depuis la caméra et l'insérer dans l'animation</p> <p> Pour ce faire, vous pouvez aussi utiliser le raccourci clavier : la <b>touche Espace</b></p> <h4>Play animation (K, P)</h4> <h4>Lecture de l'animation (K, P)</h4> Running animation Affichage de l'animation en cours <h4>First frame of the take (J, Left)</h4> <h4>Première image de la prise de vue (J, Gauche)</h4> <h4>Previous frame (J, Left)</h4> <h4>Image pécédente (J, Gauche)</h4> <h4>Next frame (L, Right)</h4> <h4>Image suivante (L, Droite)</h4> <h4>Last frame of the take (L, Right)</h4> <h4>Dernière image de la prise de vue (L, Droite)</h4> TransformWidget Transformation settings Paramètres d'une transformation d'image Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping. En dessous vous pouvez choisir quel transformation d'image doit être utilisé pour importer une image dans un nouveau projet. Si vous sélectionnez couper une partie de l'image vous devez également régler l'orientation. Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping. En dessous vous pouvez choisir quel transformation d'image doit être utilisée pour importer une image dans le projet activé. Si vous sélectionnez couper une partie de l'image vous devez également régler l'orientation. Scale the whole image Redimensionnez toute l'image Clip a part of the image Couper une partie de l'image Zoom the image Zoomer l'image Zoom settings Paramètres de zoom Zoom value: Valeur de zoom 0% 0% 100% 100% UndoExposureAdd Add exposure (%1,%2,%3) '%4' Ajouter exposition (%1,%2,%3) '%4' UndoExposureInsert Insert exposure (%1,%2,%3) '%4' Insérer l'exposition (%1,%2,%3) '%4' UndoExposureMove Move exposure (%1,%2,%3) Bouger l'exposition (%1,%2,%3) UndoExposureRemove Remove exposure (%1,%2,%3) Enlever l'exposition (%1,%2,%3) UndoExposureSelect Select exposure (%1,%2,%3)-->(%4,%5,%6) Sélectionner l'exposition (%1,%2,%3)-->(%4,%5,%6) UndoProjectNew New project '%1' Nouveau projet '%1' UndoProjectOpen Open project '%1' Ouvrir le projet '%1' UndoSceneAdd Add scene (%1) '%2' Ajouter une scène (%1) '%2' UndoSceneInsert Insert scene (%1) '%2' Insérer une scène (%1) '%2' UndoSceneMove Move scene (%1,%2) Déplacer une scène (%1) '%2' UndoSceneRemove Remove scene (%1) Effacer une scène (%1) UndoSceneSelect Select scene (%1)-->(%2) Sélectionner une scène (%1)-->(%2) UndoTakeAdd Add take (%1,%2) '%3' Ajouter une prise de vue (%1,%2) '%3' UndoTakeInsert Insert take (%1,%2) '%3' Insérer une prise de vue (%1,%2) '%3' UndoTakeMove Move take (%1,%2) Déplacer une prise de vue (%1,%2) UndoTakeRemove Remove take (%1,%2) Effacer une prise de vue (%1,%2) UndoTakeSelect Select take (%1,%2)-->(%3,%4) Sélectionner une prise de vue (%1,%2)-->(%3,%4) qstopmotion-2.3.2-Source/translations/qstopmotion_se.qm000644 000000 000000 00000121161 13011043104 023456 0ustar00rootroot000000 000000 ;uz5U D6 ]6,6ޅEC-mT#TDL8pEn*4Fɮ4\\AqY.ktTA  .!@|{#Gu-#G;B~ oM%uM%Vn9qNGAjj@@<FI>VnAZ@cvNƒ>؃jqĘ=qh釥>.d$ x;^Siae[7l 2Ol 2V4(fm-!whSVnHIh*ei'GIY=Z-]]h`^?l VMuLP.zl=FU ֑MiBn(^ Cu2N+~n>~aeBH+[cNPO]kg!Q/ocvz{^}d3cWV/FE9 Q,   O U ; 'Q 5A 5j Pov [‚' h> $ h> h>A' h> la== z; t y tF E @j ? I] . ) q"c * ee> eei hD hu h s( saN ^\6 s`m^ saH !SG k: I RG v n k 1Q  n ;  b` f yNz |>^ I wm O; Ub - <U ͷ)C > A j >" Ч /Ec -duE 0 Gjl GjGY KC N0?t ] ] o# o% +! D o | Y1- D` 1/ vR IE I FcG ߚ 4P) 4VT Ps bq  ?NZ_ Mԇ i$^ w PK Pn v   PY P  N y[ yc<GcK^P6;_SIkv>3ow5?o,t,\tBlpCGO gTuȺADu~y)y))iH&Om&About AboutDialog&Licensavtal&Licence Agreement AboutDialog$&Systeminformation &System Info AboutDialog&Tack till &Thanks To AboutDialogSkapareA&uthors AboutDialogOmAbout AboutDialogByggtid: %1 %2Build time: %1 %2 AboutDialog Contributors AboutDialogFranskaFrench AboutDialogHuvudutvecklareMain developers AboutDialogOKOK AboutDialogFOperativsystemets namn och version:#Operating system name and version:  AboutDialog$Qt runtimeversion:Qt runtime version:  AboutDialogDetta r programmet qStopMotion fr att skapa stopmotion-animation.HThis is the qStopMotion application for creating stop motion animations. AboutDialogVDetta program r distribuerat under GPL v2.:This program is distributed under the terms of the GPL v2. AboutDialogversttning Translation AboutDialogVersion: Version:  AboutDialogochand AboutDialoghqStopMotion r en avgrening av Stopmotion for Linux..qStopMotion is a fork of stopmotion for linux. AboutDialogLgg till ljud Add SoundAnimationProjectCannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play.AnimationProject6Sparar scener till disk ...Saving scenes to disk ...AnimationProjectDen valda ljudfilen r inte i ett fungerande ljudformat. Animationen visas utan ljud om du vljer att spela.The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play.AnimationProject &Stng&CloseCameraControllerDialog&Avbryt&CancelDescriptionDialog&Ok&OKDescriptionDialog(&Projektbeskrivning:&Project Description:DescriptionDialog"&Scenbeskrivning:&Scene Description:DescriptionDialog*&Tagningsbeskrivning:&Take Description:DescriptionDialogInformation InformationDescriptionDialog"PrjektbeskrivningProject DescriptionDescriptionDialogScenbeskrivningScene DescriptionDescriptionDialog&TagningsbeskrivningTake DescriptionDescriptionDialoghTecknet '|' r inte tilltet i projektbeskrivningen.Om Qt</h4> <p>Hr fr du en informationsruta med generell information om Qt-bibliotket.</p>

About Qt

This will display a small information box where you can read general information about the Qt library.

 MainWindowGUI<h4>Om</h4> <p>Hr fr du en informationsruta med generell information om detta fantastiska program och dess utvecklare.</p>

About

This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.

 MainWindowGUI<h4>Cinelerra</h4> <p>Exporterar den aktuella animationen som ett <em>Cinelerra-cv</em> projekt.</p>En guide hjlper dig.

Cinelerra

Exports the current animation as a cinelerra-cv project.

You will be given a wizard to guide you. MainWindowGUI<h4>ExponeringsID</h4><p>Hr fr du reda p aktuella exponeringens ID.</p>W

Exposure ID

This area displays the id of the currently selected exposure

 MainWindowGUI<h4>Bildvisare</h4><p> Hr kan du se vald bildruta. Du kan ocks spela animationer i detta fnster genom att trycka p <b>Spela</b>knappen.</p>

FrameView

In this area you can see the selected frame. You can also play animations in this window by pressing the Play button.

 MainWindowGUIx<h4>Hjlp</h4> <p>Denna knapp ppnar qStopMotionmanualen</p>S

Help

This button will bring up a dialog with the qStopMotion manual

 MainWindowGUIl<h4>Nytt</h4> <p>Skapar ett <em>nytt</em> projekt.</p>3

New

Creates a new project.

 MainWindowGUI<h4>ppna</h4> <p><em>ppnar</em> en qStopMotion projektfil.</p>?

Open

Opens a qStopMotion project file.

 MainWindowGUI<h4>ProjektID</h4><p>Hr fr du reda p aktuella projektets ID.</p>S

Project ID

This area displays the id of the currently active project

 MainWindowGUIj<h4>Avsluta</h4> <p><em>Avslutar</em> programmet.</p>0

Quit

Quits the program.

 MainWindowGUI<h4>Gr om</h4> <p><em>Gr om</em> senaste hndelsen. Du kan trycka flera gnger fr att gra om fler steg.</p>v

Redo

Redoes your last operation. You can press redo several times to redo several operations.

 MainWindowGUI<h4>Spara som</h4> <p><em>Sparar</em>den aktuella animationen som en qStopMotion projektfil.</p>[

Save As

Saves the current animation as a qStopMotion project file.

 MainWindowGUI^<h4>Spara</h4> <p><em>Sparar</em>den aktuella animationen som en qStopMotion projektfil. <BR>Om projektet sparats tidigare s sparas det automatiskt till samma projektfil.</p>

Save

Saves the current animation as a qStopMotion project file.
If this project has been saved before it will automatically be saved to the previously selected file.

 MainWindowGUIz<h4>ScenID</h4><p>Hr fr du reda p aktuella scenens ID.</p>Q

Scene ID

This area displays the id of the currently selected scene

 MainWindowGUI<h4>TagningsID</h4><p>Hr fr du reda p aktuella tagningens ID.</p>O

Take ID

This area displays the id of the currently selected take

 MainWindowGUI<h4>Tidsaxel</h4> <p>Hr kan du se animationens bildrutor och scener. Du kan arrangera om sekvenser genom att flytta bilder.</p><p>Du kan vxla mellan nsta och tidigare bildrutor med<b>piltangenterna</b> eller <b>x</b> och <b>z</b></p>

TimeLine

In this area you can see the frames and scenes in the animations and build the animation by moving the them around.

You can switch to the next and the previous frame using the arrow buttons or x and z

 MainWindowGUI<h4>ngra</h4> <p><em>ngrar</em> senaste hndelsen. Du kan trycka flera gnger fr att ngra fler steg.</p>u

Undo

Undoes your last operation. You can press undo several time to undo earlier operations.

 MainWindowGUI<h4>Video</h4> <p>Exporterar den aktuella animationen som <em>video</em>.</p>En guide hjlper dig.l

Video

Exports the current project as video.

You will be given a wizard to guide you. MainWindowGUI<h4>Frklaring</h4> <p>Klicka p olika element som knappar fr att f upp information liknande denna.</p>

What's This

This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.

 MainWindowGUI"AVIvideor (*.avi)AVI Videos (*.avi) MainWindowGUIOmAbout MainWindowGUI Om &Qt About &Qt MainWindowGUI Om QtAbout Qt MainWindowGUI&Lgg till bildrutor Add Frames MainWindowGUILgg till scen Add Scene MainWindowGUI"Lgg till tagningAdd Take MainWindowGUI AvbrytCancel MainWindowGUIVlj projektfilChoose project file MainWindowGUICinelerra Cinelerra MainWindowGUI$Ansluter kamera...Connecting camera... MainWindowGUISvenskaEnglish MainWindowGUI$Exportera till filExport to file MainWindowGUI.Exportera till videofilExport to video file MainWindowGUIExporterar... Exporting ... MainWindowGUIExponeringsID: Exposure ID:  MainWindowGUI HjlpHelp MainWindowGUIInformation Information MainWindowGUI Infoga bildrutor Insert Frames MainWindowGUIInfoga scen Insert Scene MainWindowGUIInfoga tagning Insert Take MainWindowGUI"MP4videor (*.mp4)MP4 Videos (*.mp4) MainWindowGUINytt projekt New project MainWindowGUI&ppna tidigare Open &Recent MainWindowGUIppna projekt Open project MainWindowGUIProjektProject MainWindowGUIProjekt (*.%1)Project (*.%1) MainWindowGUIProjektID: Project ID:  MainWindowGUIAvslutaQuit MainWindowGUI Gr omRe&do MainWindowGUINu ker vi ;-)Ready to rumble ;-) MainWindowGUIInspelning Recording MainWindowGUI Gr omRedo MainWindowGUI"Ta bort bildrutor Remove Frames MainWindowGUITa bort scen Remove Scene MainWindowGUITa bort tagning Remove Take MainWindowGUISp&ara somSave &As MainWindowGUISpara somSave As MainWindowGUISpara projekt Save project MainWindowGUI"Spara projekt somSave project As MainWindowGUIScen 001 Scene 001 MainWindowGUIScenID: Scene ID:  MainWindowGUISelect image grabber MainWindowGUITagning 01Take 01 MainWindowGUITagningsID: Take ID:  MainWindowGUIProjektet The Project MainWindowGUITecknet '|' r inte tilltet i filnamnet och kommer att tas bort.NThe character '|' is not allowed in the project file name and will be removed. MainWindowGUIXDet finns osparade ndringar. Vill du spara?/There are unsaved changes. Do you want to save? MainWindowGUI ngraUndo MainWindowGUI&Osparande ndringarUnsaved changes MainWindowGUI VideoVideo MainWindowGUIVarningWarning MainWindowGUIFrklaring What's &This MainWindowGUIFrklaring What's This MainWindowGUIDu mste ange en bildfngstenhet att anvnda. Detta kan anges i instllningsmenyn.TYou have to define an image grabber to use. This can be set in the preferences menu. MainWindowGUIHqStopMotion - Nytt animationsprojekt#qStopMotion - New Animation Project MainWindowGUI6qStopMotion - ngringslistaqStopMotion - Undo stack MainWindowGUI`Kan inte kopiera instllningar till backupfilen!+Can't copy preferences file to backup file!PreferencesTool^Kan inte ta bort backupfilen fr instllningar!%Can't remove preferences backup file!PreferencesTool6Kunde inte ppna XMLfil: %1Couldn't open XML file: %1PreferencesToolKritisktCriticalPreferencesToolDOM tolk DOM ParserPreferencesToolPTolkningsfel p rad %1, kolumn %2: %3 %4(Parse error at line %1, column %2: %3 %4PreferencesToolVerkstllApply ProjectDialog StngClose ProjectDialogZKan inte ndra rttigheter fr bildkatalogen!0Can't change permissions of the image directory!ProjectSerializer`Kan inte ndra rttigheter fr projektkatalogen!2Can't change permissions of the project directory!ProjectSerializerZKan inte ndra rttigheter fr ljudkatalogen!0Can't change permissions of the sound directory!ProjectSerializer6Kan inte skapa bildkatalog!Can't create image directory!ProjectSerializer<Kan inte skapa projektkatalog!Can't create project directory!ProjectSerializer6Kan inte skapa ljudkatalog!Can't create sound directory!ProjectSerializerZKan inte ta bort gammal backup av projektfil!(Can't remove old backup of project file!ProjectSerializer6Kunde inte ppna XMLfil: %1Couldn't open XML file: %1ProjectSerializerKritisktCriticalProjectSerializerDOMtolk DOM ParserProjectSerializerPTolkningsfel p rad %1, kolumn %2: %3 %4(Parse error at line %1, column %2: %3 %4ProjectSerializer<h4>Lgg till bildrutor (CTRL+E)</h4> <p>Klicka p denna knapp fr att lgga till <em>bildrutor</em> dem i slutet av tagningen.</p>m

Append Frames (CTRL+F)

Click on this button to append frames at the end of the take.

 ProjectTab.<h4>Lgg till ny scen (CTRL+E)</h4> <p>Klicka p denna knapp fr att skapa en ny <em>scen</em> och <em>lgga till</em> den i slutet av animationen.</p>

Append new Scene (CTRL+E)

Click this button to create a new scene and append it at the end of the animation.

 ProjectTab0<h4>Lgg till ny tagning (CTRL+E)</h4> <p>Klicka p denna knapp fr att skapa en ny <em>tagning</em> och <em>lgga till</em> den i slutet av scenen.</p>

Append new Take (CTRL+E)

Click this button to create a new take and append it to the end of the scene.

 ProjectTab"<h4>Infoga bildrutor (CTRL+E)</h4> <p>Klicka p denna knapp fr att lgga till <em>bildrutor</em> och <em>infoga</em> dem fre vald bildruta.</p>o

Insert Frames (CTRL+F)

Click on this button to insert frames bevor the selected frame.

 ProjectTab<h4>Infoga ny scen (CTRL+E)</h4> <p>Klicka p denna knapp fr att skapa en ny <em>scen</em> och <em>infoga</em> den fre vald scen.</p>

Insert new Scene (CTRL+E)

Click this button to create a new scene and insert it bevor the selected scene.

 ProjectTab <h4>Infoga ny tagning (CTRL+E)</h4> <p>Klicka p denna knapp fr att skapa en ny <em>tagning</em> och <em>infoga</em> den fre vald tagning.</p>

Insert new Take (CTRL+E)

Click this button to create a new take and insert it bevor the selected take.

 ProjectTab<h4>Starta fotoredigerare</h4> <p>Klicka p denna knapp fr att ppna vald bild i fotoredigeringsprogrammet.</p> <p>Du kan ocks dra bilder frn tidsaxeln och slppa dem ver fotoredigeraren.</p>

Launch Photo Editor

Click this button to open the active frame in the photo editor

Note that you can also drag images from the frame bar and drop them on the photo editor

 ProjectTab <h4>Ta bort bildruta (Delete)</h4> <p>Klicka p denna knapp fr att <em>ta bort</em> den valda <em>bildrutan</em> frn tagningen.</p>u

Remove Frame (Delete)

Click this button to remove the selected frame from the take.

 ProjectTab <h4>Ta bort scen (SHIFT+Delete)</h4> <p>Klicka p denna knapp fr att <em>ta bort</em> den valda <em>scenen</em> frn animationen.</p>

Remove Scene (SHIFT+Delete)

Click this button to remove the selected scene from the animation.

 ProjectTab<h4>Ta bort tagning (SHIFT+Delete)</h4> <p>Klicka p denna knapp fr att <em>ta bort</em> den valda <em>tagningen</em> frn animationen.</p>~

Remove Take (SHIFT+Delete)

Click this button to remove the selected take from the animation.

 ProjectTab&Lgg till bildrutor Add Frames ProjectTab"Lgg till tagningAdd Take ProjectTab4Vlj bilder att lgga tillChoose frames to add ProjectTabRedigeraEdit ProjectTabBMisslyckades med att starta Gimp!Failed to start Gimp! ProjectTabBildrutorFrames ProjectTab Infoga bildrutor Insert Frames ProjectTabInfoga tagning Insert Take ProjectTab\Ingen scen vald. Vlj en scen i projekttrdet.=No scene selected. Please select a scene in the project tree. ProjectTabhIngen tagning vald. Vlj en tagning i projekttrdet.;No take selected. Please select a take in the project tree. ProjectTabProjekttrd Project Tree ProjectTabScen 000 Scene 000 ProjectTab ScenerScenes ProjectTabTake 00Take 00 ProjectTabTagningarTakes ProjectTab<Den aktiva bildrutan r trasigThe active frame is corrupt ProjectTabPDet finns ingen aktiv bildruta att ppna There is no active frame to open ProjectTabVarningWarning ProjectTabNGimp r inte installerat p ditt system-You do not have Gimp installed on your system ProjectTab><h4>Antal bilder</h4> <p>Genom att ndra vrdet p skjutreglaget bestmmer du hur mnga tidigare bilder i animationen som skall mixas ver kamerabilder eller, om du befinner dig i uppspelningslge, hur mnga bilder som skall spelas upp.</p> <p>Genom att mixa tidigare bild(er) ver kamerabilder s ser du lttare hur nsta bild ser ut i relation till de tidigare och drigenom f en mjukare stopmotionanimation!</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 ProjectWidget FngstCapture ProjectWidgetSkillnadDiff ProjectWidgetMixaMix ProjectWidgetAntal bilder:Number of images: ProjectWidgetUppspelningPlayback ProjectWidgetInspelning Recording ProjectWidgetEnbildstagningSingle frame capture ProjectWidget&Nej&No QtFrontend&Ok&OK QtFrontend&Ja&Yes QtFrontend.Kontrollera rttigheterCheck Permissions QtFrontendSkapa katalogCreate directory QtFrontendterskapandeRecovery QtFrontendNgot orsakade att qStopMotion ovntat avslutades vid senaste anvndningen. Vill du terskapa?]Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? QtFrontendDu har inte tillrckliga rttigheter fr att kra qStopMotion. Du behver rttighet att skapa en .qstopmotion-katalog i din hemkatalog.You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. QtFrontend2Du har inte tillrckliga rttigheter fr att kra qStopMotion. Du behver rttighet att lsa, skriva och kra filer som program i .qstopmotion-katalogen.You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. QtFrontend@qStopMotion - terskapat projektqStopMotion - Recovered Project QtFrontend><h4>Antal bilder</h4> <p>Genom att ndra vrdet p skjutreglaget bestmmer du hur mnga tidigare bilder i animationen som skall mixas ver kamerabilder eller, om du befinner dig i uppspelningslge, hur mnga bilder som skall spelas upp.</p> <p>Genom att mixa tidigare bild(er) ver kamerabilder s ser du lttare hur nsta bild ser ut i relation till de tidigare och drigenom f en mjukare stopmotionanimation!</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 RecordingTab<h4>Vxla mellan kamera p/av (C)</h4> <p>Klicka p denna knapp fr att vxla mellan kamera p eller av</p> [

Toggle camera on/off (C)

Click this button to toggle the camera on and off

 RecordingTab KameraCamera RecordingTab FngstCapture RecordingTabSkillnadDiff RecordingTabInformation Information RecordingTabMixaMix RecordingTabInget aktivt projekt. Skapa ett nytt projekt eller ppna ett existerande projekt.KNo active project. Please create a new project or open an existing project. RecordingTabIngen scen eller tagning vald. Vlj en scen och en tagning under projektfliken.SNo scene and no take selected. Please select a scene and a take on the project tab. RecordingTabpIngen tagning vald. Vlj en tagning under projektfliken.:No take selected. Please select a take on the project tab. RecordingTabAntal bilder:Number of images: RecordingTabUppspelningPlayback RecordingTabInspelning Recording RecordingTabEnbildstagningSingle frame capture RecordingTab2Kan inte ta bort ljudfil!Can't remove sound file!SceneKritisktCriticalScene &Stng&Close StartDialog&Ok&OK StartDialog><h2>Skapa ett nytt projekt</h2>

Create a new Project

 StartDialog@<h2>ppna senaste projektet</h2>

Open last Project

 StartDialog2<h2>ppna projektfil</h2>

Open project file

 StartDialogPppna och fortstt ett tidigare projekt.%Open and continue a existing project. StartDialog*Skvg till projekt: Project path:  StartDialog0Starta ett nytt projekt.Start a new Project. StartDialog6Ladda bilder till tidsaxelnLoad images to time lineTimeLine<h4>Fnga bildruta (Mellanslag)</h4> <p>Klicka p denna knapp fr att <em>fnga</em> en bildruta frn kameran och lgga till i animationen.</p> <p> Detta kan ocks gras genom att trycka<b>Mellanslagstangenten</b></p>.

Capture Frame (Space)

Click on this button to capture a frame from the camera an put it in the animation

This can also be done by pressing the Space key

ToolBarZ<h4>Tagningens frsta bildruta (J, Left)</h4>*

First frame of the take (J, Left)

ToolBarZ<h4>Tagningens sista bildruta (L, Right)</h4>*

Last frame of the take (L, Right)

ToolBarD<h4>Nsta bildruta (L, Right)</h4>

Next frame (L, Right)

ToolBar><h4>Spela animation (K, P)</h4>

Play animation (K, P)

ToolBarL<h4>Fregende bildruta (J, Left)</h4>!

Previous frame (J, Left)

ToolBar Spelar animationRunning animationToolBarHLgg till exponering (%1,%2,%3) '%4'Add exposure (%1,%2,%3) '%4'UndoExposureAddBInfoga exponering (%1,%2,%3) '%4'Insert exposure (%1,%2,%3) '%4'UndoExposureInsert8Flytta exponering (%1,%2,%3)Move exposure (%1,%2,%3)UndoExposureMove:Ta bort exponering (%1,%2,%3)Remove exposure (%1,%2,%3)UndoExposureRemoveNVlj exponering (%1,%2,%3)-->(%4,%5,%6)'Select exposure (%1,%2,%3)-->(%4,%5,%6)UndoExposureSelect"Nytt projekt '%1'New project '%1'UndoProjectNew$ppna projekt '%1'Open project '%1'UndoProjectOpen0Lgg till scen (%1) '%2'Add scene (%1) '%2' UndoSceneAdd*Infoga scen (%1) '%2'Insert scene (%1) '%2'UndoSceneInsert&Flytta scen (%1,%2)Move scene (%1,%2) UndoSceneMove"Ta bort scen (%1)Remove scene (%1)UndoSceneRemove*Vlj scen (%1)-->(%2)Select scene (%1)-->(%2)UndoSceneSelect<Lgg till tagning (%1,%2) '%3'Add take (%1,%2) '%3' UndoTakeAdd6Infoga tagning (%1,%2) '%3'Insert take (%1,%2) '%3'UndoTakeInsert,Flytta tagning (%1,%2)Move take (%1,%2) UndoTakeMove.Ta bort tagning (%1,%2)Remove take (%1,%2)UndoTakeRemove<Vlj tagning (%1,%2)-->(%3,%4)Select take (%1,%2)-->(%3,%4)UndoTakeSelectqstopmotion-2.3.2-Source/translations/translation.txt000644 000000 000000 00000002536 12536560630 023162 0ustar00rootroot000000 000000 Preparation of the development systems 1. install the latest version of the Qt SDK from http://qt.nokia.com/ 2. download the actual sources of qStopMotion from http://qstopmotion.sourceforge.net/ or check out the latest revision of the sources from the repository Update the translations of qStopMotion: 1. update the source files in qStopMotion.pro 2. start a command line and move to the project directory 3. call lupdate qstopmotion.pro 4. add, change or remove the translations in the ../translations/*.ts files using the Qt Liguist tool 5. Uncomment the lines for the qt_*.ts files 6. call lrelease qstopmotion.pro 7. Comment out the lines for the qt_*.ts files Add a new laguage: 1. add the qstopmotion_*.ts file for the new laguage in the qStopMotion.pro file 2. copy the qt_*.ts file for the new language from the Qt-SDK translation directory to the translation directory of the project 3. add the qt_*.ts file for the new language in the qStopMotion.pro file 4. start a command line and move to the project directory 5. call lupdate qstopmotion.pro 6. add, change or remove the translations in the ../translations/*.ts files using the Qt Liguist tool 7. call lrelease qstopmotion.pro 8. add the *.ts file for the new laguage in the cmakelists.txt file 9. create new installer Check in the new translation in the repository 1. 2. qstopmotion-2.3.2-Source/translations/qt_se.ts000644 000000 000000 00000163044 12536560630 021550 0ustar00rootroot000000 000000 QAccel Space Space Esc Esc Tab Tab Backtab Backtab Backspace Backspace Return Return Enter Enter Ins Ins Del Del Pause Pause Print Print SysReq SsyReq Home Home End End Left Left Up Up Right Right Down Down PgUp PgUp PgDown PgDown CapsLock CapsLock NumLock NumLock ScrollLock ScrollLock Ctrl Ctrl Alt Alt Shift Shift + + F%1 F%1 Menu Menu Help Help Back Back Forward Forward' Stop Stop Refresh Refresh Volume Down Volume Down Volume Mute Volume Mute Volume Up Volume Up Bass Boost Bass Boost Bass Up Bass Up Bass Down Bass Down Treble Up Treble Up Treble Down Treble Down Media Play Media Play Media Stop Media Stop Media Previous Media Previous Media Next Media Next Media Record Media Record Favorites Favorites Search Search Standby Standby Open URL Open URL Launch Mail Launch Mail Launch Media Launch Media Launch (0) Launch (0) Launch (1) Launch (1) Launch (2) Launch (2) Launch (3) Launch (3) Launch (4) Launch (4) Launch (5) Launch (5) Launch (6) Launch (6) Launch (7) Launch (7) Launch (8) Launch (8) Launch (9) Launch (9) Launch (A) Launch (A) Launch (B) Launch (B) Launch (C) Launch (C) Launch (D) Launch (D) Launch (E) Launch (E) Launch (F) Launch (F) Meta Host %1 kan ej hittas QApplication QT_LAYOUT_DIRECTION Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. LTR Executable '%1' requires Qt %2, found Qt %3. Exekverbar '%1' kräver Qt %2, hittade Qt %3. Incompatible Qt Library Error Inkompatibelt Qt Library-fel QAquaStyle OK OK Cancel Avbryt QColorDialog Hu&e: To&n: &Sat: &Mättnad: &Val: &Värde: &Red: &Röd: &Green: &Grön: Bl&ue: Bl&å: A&lpha channel: A&lfakanal: &Basic colors &Basfärger &Custom colors &Specialfärger &Define Custom Colors >> &Definiera specialfärger >> OK OK Cancel Avbryt &Add to Custom Colors &Lägg till specialfärger Select color Välj färg QDataTable True Sant False Falskt Insert Infoga Update Uppdatera Delete Ta bort QDialog What's This? Vad är detta? QErrorMessage &Show this message again &Visa detta meddelande igen &OK &OK Debug Message: Debugmeddelande: Warning: Varning: Fatal Error: Fatalt fel: QFileDialog Copy or Move a File Kopiera eller flytta en fil Read: %1 Läs: %1 Write: %1 Skriv: %1 Cancel Avbryt All Files (*) Alla filer (*) Name Namn Size Storlek Type Typ Date Datum Attributes Attribut OK OK Look &in: Leta &i: File &name: Fil&namn: File &type: Fil&typ: Back Bakåt One directory up En mappnivå upp Create New Folder Skapa ny mapp List View Listvy Detail View Detaljerad vy Preview File Info Förhandsgranska filinformation Preview File Contents Förhandsgranska filinnehåll Read-write Läs- och skrivrättighet Read-only Enbart läsrättighet Write-only Enbart skrivrättighet Inaccessible Oåtkomlig Symlink to File Symlink till fil Symlink to Directory Symlink till mapp Symlink to Special Symlink till special File Fil Dir Mapp Special Special' Open Öppna Save As Spara som &Open &Öppna &Save &Spara &Rename &Döp om &Delete &Ta bort R&eload L&äs in på nytt Sort by &Name Sortera efter &namn Sort by &Size Sortera efter &storlek Sort by &Date Sortera efter &datum &Unsorted &Osorterat Sort Sortera Show &hidden files Visa &dolda filer the file filen the directory mappen the symlink symlink-länken Delete %1 Ta bort %1 <qt>Are you sure you wish to delete %1 "%2"?</qt> <qt>Är du säker på att du vill ta bort %1 "%2"?</qt> &Yes &Ja &No &Nej New Folder 1 Ny mapp 1 New Folder Ny mapp New Folder %1 Ny mapp %1 Find Directory Sök efter mapp Directories Mappar Save Spara Error Fel %1 File not found. Check path and filename. %1 Filen kan ej hittas. Kontrollera sökväg och filnamn. All Files (*.*) Alla filer (*.*) Open Öppna Select a Directory Välj en mapp Directory: Mapp: QFont Latin Latin Greek Grekiska Cyrillic Kyrilliska Armenian Armeniska Georgian Georgiska Runic Runskrift Ogham Ogham Hebrew Hebreiska Arabic Arabiska Syriac Syrianska Thaana Thaana Devanagari Devangari Bengali Bengaliska Gurmukhi Gurmukhi Gujarati Gujarati Oriya Oriya Tamil Tamilska Telugu Telugu Kannada Kannada Malayalam Malayalam Sinhala Sinhala Thai Thailändska Lao Laotiska Tibetan Tibetanska Myanmar Burmesiska Khmer Khmer Han Han Hiragana Hiragana' Katakana Katakana Hangul Hangul Bopomofo Bopomofo Yi Yi Ethiopic Etiopiska Cherokee Cherokee Canadian Aboriginal Canadian Aboriginal Mongolian Mongoliska Currency Symbols Valutasymboler Letterlike Symbols Bokstavsliknande symboler Number Forms Nummerformer Mathematical Operators Matematiska operatorer Technical Symbols Tekniska symboler Geometric Symbols Geometriska symboler Miscellaneous Symbols Övriga symboler Enclosed and Square Inramade och fyrkantiga Braille Blindskrift Unicode Unicode QFontDialog &Font &Font Font st&yle Font&variant &Size &Storlek Effects Effekter Stri&keout Över&struken &Underline &Understruken &Color &Färg Sample Prov Scr&ipt Skriv&stil OK OK Apply Applicera Cancel Avbryt Close Stäng Select Font Välj font QFtp Host %1 found Host %1 hittades Host found Host hittades Connected to host %1 Uppkopplad till host %1 Connected to host Uppkopplad till host Connection to %1 closed Uppkoppling till %1 stängd Connection closed Uppkoppling stängd Host %1 not found Host %1 hittades inte Connection refused to host %1 Uppkoppling avböjd av host %1 Unknown error Okänt fel Connecting to host failed: %1 Uppkoppling till host misslyckades: %1 Login failed: %1 Inloggning misslyckades: %1 Listing directory failed: %1 Listning av mapp misslyckades: %1 Changing directory failed: %1 Byte av mapp misslyckades: %1 Downloading file failed: %1 Nedladdning av fil misslyckades: %1 Uploading file failed: %1 Uppladdning av fil misslyckades: %1 Removing file failed: %1 Borttagande av fil misslyckades: %1 Creating directory failed: %1 Skapande av mapp misslyckades: %1 Removing directory failed: %1 Borttagande av mapp misslyckades: %1 Not connected Inte uppkopplad Connection refused for data connection Uppkoppling avböjd för datauppkoppling QHeader %1 %1 QHttp Connection refused Uppkoppling avböjd Host %1 not found Host %1 hittades inte Wrong content length Felaktig längd på innehåll HTTP request failed HTTP-begäran misslyckades Host %1 found Host %1 hittades Host found Host hittades Connected to host %1 Uppkopplad till host %1 Connected to host Uppkopplad till host Connection to %1 closed Uppkoppling till %1 stängd Connection closed Uppkoppling stängd Unknown error Okänt fel Request aborted Begäran avbruten No server set to connect to Ingen server angiven att koppla upp mot Server closed connection unexpectedly Servern stängde oväntat uppkopplingen Invalid HTTP response header Ogiltigt HTTP-responshuvud Invalid HTTP chunked body Ogiltig HTTP chunked body QInputDialog OK OK Cancel Avbryt QLineEdit &Undo &Ångra &Redo &Upprepa Cu&t Kl&ipp ut &Copy &Kopiera &Paste &Klistra in Clear Rensa Select All Markera alla QLocalFs Could not rename %1 to %2 Kunde inte döpa om %1 till %2 Could not open %1 Kunde inte öppna %1 Could not write %1 Kunde inte skriva till %1 Could not read directory %1 Kunde inte läsa mapp %1 Could not create directory %1 Kunde inte skapa mapp %1 Could not remove file or directory %1 Kunde inte flytta fil eller mapp %1 QMainWindow Line up Linjera Customize... Anpassa... QMenuBar About Om Config Konfiguration Preference Inställningar Options Tillägg Setting Inställning Setup Uppsättning Quit Avsluta Exit Gå ur QMessageBox OK OK Cancel Avbryt &Yes &Ja &No &Nej &Abort &Avbryt &Retry &Försök igen &Ignore &Ignorera <h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for multiplatform GUI &amp; application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants.<br>Qt is also available for embedded devices.</p><p>Qt is a Trolltech product. See <tt>http://www.trolltech.com/qt/</tt> for more information.</p> <h3>Om Qt</h3><p>Detta program använder Qt version %1.</p><p>Qt är en C++-verktygslåda för GUI- och programvaruutveckling på flera plattformar.</p><p>Qt ger portabilitet från en källa till MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux och alla större kommersiella Unix-varianter.<br>Qt är också tillgängligt för inbäddade enheter.</p><p>Qt är en produkt från Trolltech. Se <tt>http://www.trolltech.com/qt/</tt> för mer information.</p> QNetworkProtocol Operation stopped by the user Åtgärden stoppad av användaren QPrintDialog locally connected lokalt uppkopplad Aliases: %1 Aliasnamn: %1 unknown okänd Unknown Location Okänd plats OK OK Cancel Avbryt Printer settings Skrivarinställningar Print in color if available Skriv ut i färg om det är möjligt Print in grayscale Skriv ut i gråskala Print destination Skrivardestination Print to printer: Skriv ut till skrivare: Printer Skrivare Host Host Comment Kommentar Print to file: Skriv till fil: Browse... Sök... Options Tillägg Print all Skriv ut allt Print range Utskriftsomfång From page: Från sida: To page: Till sida: Print first page first Skriv ut första sidan först Print last page first Skriv ut sista sidan först Number of copies: Antal kopior: Paper format Pappersformat Portrait Stående Landscape Liggande A0 (841 x 1189 mm) A0 (841 x 1189 mm) A1 (594 x 841 mm) A1 (594 x 841 mm) A2 (420 x 594 mm) A2 (420 x 594 mm) A3 (297 x 420 mm) A3 (297 x 420 mm) A4 (210x297 mm, 8.26x11.7 inches) A4 (210x297 mm, 8.26x11.7 tum) A5 (148 x 210 mm) A5 (148 x 210 mm) A6 (105 x 148 mm) A6 (105 x 148 mm) A7 (74 x 105 mm) A7 (74 x 105 mm) A8 (52 x 74 mm) A8 (52 x 74 mm) A9 (37 x 52 mm) A9 (37 x 52 mm) B0 (1000 x 1414 mm) B0 (1000 x 1414 mm) B1 (707 x 1000 mm) B1 (707 x 1000 mm) B2 (500 x 707 mm) B2 (500 x 707 mm) B3 (353 x 500 mm) B3 (353 x 500 mm) B4 (250 x 353 mm) B4 (250 x 353 mm) B5 (176 x 250 mm, 6.93x9.84 inches) B5 (176 x 250 mm, 6.93x9.84 tum) B6 (125 x 176 mm) B6 (125 x 176 mm) B7 (88 x 125 mm) B7 (88 x 125 mm) B8 (62 x 88 mm) B8 (62 x 88 mm) B9 (44 x 62 mm) B9 (44 x 62 mm) B10 (31 x 44 mm) B10 (31 x 44 mm) C5E (163 x 229 mm) C5E (163 x 229 mm) DLE (110 x 220 mm) DLE (110 x 220 mm) Executive (7.5x10 inches, 191x254 mm) Executive (7.5x10 tum, 191x254 mm) Folio (210 x 330 mm) Folio (210 x 330 mm) Ledger (432 x 279 mm) Ledger (432 x 279 mm) Legal (8.5x14 inches, 216x356 mm) Legal (8.5x14 tum, 216x356 mm) Letter (8.5x11 inches, 216x279 mm) Letter (8.5x11 inches, 216x279 mm) Tabloid (279 x 432 mm) Tabloid (279 x 432 mm) US Common #10 Envelope (105 x 241 mm) US Common #10 Kuvert (105 x 241 mm) Setup Printer Inställning av skrivare PostScript Files (*.ps);;All Files (*) Postscript-filer (*.ps);;Alla filer (*) QProgressDialog Cancel Avbryt QRegExp no error occurred inget fel uppstod disabled feature used avaktiverad använd funktion bad char class syntax dålig char class-syntax bad lookahead syntax dålig look ahead-syntax bad repetition syntax dålig repetition-syntax invalid octal value ogiltigt oktalvärde missing left delim vänster delimiterare saknas unexpected end oväntat slut met internal limit har nått intern gräns QSql Delete Ta bort Delete this record? Ta bort denna post? Yes Ja No Nej Insert Infoga Update Uppdatera Save edits? Spara redigeringar? Cancel Avbryt Confirm Bekräfta Cancel your edits? Avbryta dina redigeringar? QTabDialog OK OK Apply Applicera Help Help Defaults Standardinställningar Cancel Avbryt QTextEdit &Undo &Ångra &Redo &Upprepa Cu&t Kl&ipp ut &Copy &Kopiera &Paste &Klistra in Clear Rensa Select All Markera alla QTitleBar System Menu Systemmeny Shade Skugga Unshade Ta bort skugga Normalize Normalisera Minimize Minimera Maximize Maximera Close Stäng QToolBar More... Mer... QUrlOperator The protocol `%1' is not supported Protokollet '%1' stöds ej The protocol `%1' does not support listing directories Protokollet '%1' stödjer ej listning av mappar The protocol `%1' does not support creating new directories Protokollet '%1' stödjer ej att skapa nya mappar The protocol `%1' does not support removing files or directories Protokollet '%1' stödjer ej att ta bort filer eller mappar The protocol `%1' does not support renaming files or directories Protokollet '%1' stödjer ej att döpa om filer eller mappar The protocol `%1' does not support getting files Protokollet '%1' stödjer hämtning av filer The protocol `%1' does not support putting files Protokollet '%1' stödjer placering av filer The protocol `%1' does not support copying or moving files or directories Protokollet '%1' stödjer ej att kopiera eller flytta filer eller mappar (unknown) (okänd) QWSDecoration &Restore &Återskapa &Move &Flytta &Size &Storlek Mi&nimize Mi&nimera Ma&ximize Ma&ximera Close Stäng Windows Windows KDE KDE KDE2 KDE2 BeOS BeOS Hydro Hydro Default Standard QWhatsThisButton What's this? Vad är detta? QWizard &Cancel &Avbryt < &Back < &Bakåt &Next > &Nästa > &Finish &Gör klart &Help &Hjälp QWorkspace &Restore &Återskapa &Move &Flytta &Size &Storlek Mi&nimize Mi&nimera Ma&ximize Ma&ximera &Close &Stäng Stay on &Top Lägg &ovanpå Sh&ade Sk&ugga %1 - [%2] %1 - [%2] Minimize Minimera Restore Down Återskapa nedåt Close Stäng &Unshade &Ta bort skugga QXml no error occurred inget fel uppstod error triggered by consumer fel skapades av användaren unexpected end of file oväntat slut på filen more than one document type definition fler än en dokumenttypsdefinition error occurred while parsing element fel uppstod under parsning av element tag mismatch felmatchning av tagg error occurred while parsing content fel uppstod under parsning av innehåll unexpected character oväntat tecken invalid name for processing instruction ogiltigt namn för processinstruktion version expected while reading the XML declaration version förväntades när XML-deklarationen lästes wrong value for standalone declaration fel värde för standalone-deklaration encoding declaration or standalone declaration expected while reading the XML declaration kodningsdeklaration eller standalone-deklaration förväntades när XML-deklarationen lästes standalone declaration expected while reading the XML declaration standalone-deklaration förväntades när XML-deklarationen lästes error occurred while parsing document type definition fel uppstod under parsning av dokumenttypsdefinition letter is expected bokstav förväntades error occurred while parsing comment fel uppstod under parsning av kommentar error occurred while parsing reference fel uppstod under parsning av referens internal general entity reference not allowed in DTD intern generell entitetsreferens inte tillåten i DTD external parsed general entity reference not allowed in attribute value extern parsad generell entitetsreferens inte tillåten i attributvärde external parsed general entity reference not allowed in DTD extern parsad generell entitetsreferens inte tillåten i DTD unparsed entity reference in wrong context oparsad entitetsreferens i fel kontext recursive entities rekursiva entiteter error in the text declaration of an external entity fel i textdeklarationen för en extern entitet QtMultiLineEdit Undo Ångra Redo Upprepa Cut Klipp ut Copy Kopiera Paste Klistra in Paste special... Klistra in special... Clear Rensa Select All Markera alla qstopmotion-2.3.2-Source/translations/qstopmotion_da.ts000644 000000 000000 00000414752 13011043104 023457 0ustar00rootroot000000 000000 AboutDialog This is the qStopMotion application for creating stop motion animations. Dette er qStopMotion programmet, til at lave stopmotion animationer. Version: Version: qStopMotion is a fork of stopmotion for linux. qStopMotion er en fork af stopmotion for linux. and og &About &Om Main developers Primære udviklere Contributors Bidragydere A&uthors F&orfattere Translation Oversættelse French Fransk Danish Dansk Swedish Svensk German Tysk Czech Tjekkisk &Thanks To &Tak til This program is distributed under the terms of the GPL v2. Dette program er distribueret under reglerne for GPL v2. &Licence Agreement &Licensaftale Qt runtime version: Qt runtime version: Operating system name and version: Operativsystem og version: Unknown Windows OS Ukendt Windows OS Unknown Mac OS Ukendt Mac OS Build time: %1 %2 Build tid: %1 %2 &System Info &System Info OK OK About Om AnimationProject Saving scenes to disk ... Gemmer scener til disk ... Add Sound Tilføj lyd Cannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play. Kan ikke åbne den valgte lydfil til læsning. Check at du har sat de rigtige rettigheder. Animationen vil blive spillet uden lyd, hvis du vælger afspil. The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play. Den valgte audio fil er ugyldig indenfor det valgte lyd format. Animationen vil blivet spillet uden lyd hvis du vælger afspil. CameraControllerDialog qStopMotion Camera Controller qStopMotion Kamera Controller Video Quality Video Kvalitet Automatic Pan Automatisk Pan Brightness: Lysstyrke: Automatic Contrast Automatisk Kontrast Contrast: Kontrast: Automatic Saturation Automatisk Mætning Saturation: Mætning: Automatic Hue Automatisk Farvetone Hue: Farvetone: Automatic Gamma Automatisk Gamma Gamma: Gamma: Automatic Sharpness Automatisk Skarphed Sharpness: Skarphed: Automatic Backlight Compensation Automatisk Backlight Kompensation Backlight Compensation: Backlight Kompensation: Automatic Gain AutomatiskForstærkning Gain: Forstærkning: Automatic Color Enable Automatisk Farve Aktivering Color Enable: Farve Aktivering: Camera Control Kamera Kontrol Automatic Exposure Automatisk Eksponering Exposure: Eksponering: Restore Camera Settings... Gendan Kamera Indstillinger... Reset Camera Settings... Nulstil Kamera Indstillinger... Abort Reset Fortryd Nukstil Automatic Brightness Automatisk Lysstyrke Automatic White Balance Automatisk Hvidbalance White Balance: Hvidbalance: Automatic Zoom Automatisk Zoom Zoom: Zoom: Automatic Focus Automatic Fokus Focus: Fokus: Pan: Pan: Automatic Tilt Automatisk Tilt Tilt: Tilt: Automatic Iris Automatisk Blænde Iris: Blænde: Automatic Roll Don't know word 'Roll' Automatic Roll Roll: Roll: &Reset to Default &Nulstil til standard &Close &Luk CompositingTab First Group Box Første Group Box Second Group Box Anden Group Box Third Group Box Tredje Group Box <h4>First Button</h4> <h4>Første Knap</h4> <h4>Second Button</h4> <h4>Anden Knap</h4> <h4>Third Button</h4> <h4>Tredje Knap</h4> DefaultTab Recording Optagelse Single frame capture Enkelt billede optagelse Camera Kamera Test Source Test kilde USB Source USB kilde FireWire Source FireWire kilde DirectShow Source DirectShow kilde Capture Optag Mix Miks Diff Difference Playback Afspil Number of images: Antal billeder: <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Antal billeder</h4> <p>Ved at ændre på værdien her, kan du vælge hvor mange billeder bagud i animationen de skal vises, eller, hvis du er i Afspil mode: hvor mange billeder der skal afspilles. </p> <p>Ved at mikse de forudgående billeder med det kameraet ser nu, kan du lettere se hvordan det næste billede bliver i relation til det forudgående, og derme lave noget bedre stop motion animation!</p> FPS chooser BPS vælger <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>BPS vælger</h4> <p>Ved at ændre værdien i dette felt, vælger du hastigheden som animationen i <b>Fremviseren</b> vil køre med.</p> <p>Start animationen ved at presse <b>Kør Animation</b> knappen.</p> DescriptionDialog &Project Description: &Projekt Beskrivelse: &Scene Description: &Scene Beskrivelse: &Take Description: &Take Beskrivelse: &OK &OK &Cancel &Annuler Project Description Projekt Beskrivelse Scene Description Scene Beskrivelse Take Description Take Beskrivelse Information Information The character '|' is not allowed in the project description. Karakteren '|' er ikke tilladt i projekt beskrivelsen. The character '|' is not allowed in the scene description. Karakteren '|' er ikke tilladt i scene beskrivelsen. The character '|' is not allowed in the take description. Karakteren '|' er ikke tilladt i take beskrivelsen. DomainFacade Critical Kritisk Can't open history file to write entry! Kan ikke åbne historie filen og skrive post! Can't open history file to recover project! Kan ikke åbne historie filen og genskabe projekt! Can't copy image to temp directory! Kan ikke kopiere billede til midlertidig mappe! ExportTab Below you can set which program/process qStopMotion should use for encoding the currently active project to a video file. Herunder kan du vælge hvilket program/hvilken proces qStopMotion skal bruge for at lave dit aktive projekt om til en video fil. Encoder settings Encoder instillinger Encoder Application: Encoder Applikation: ffmpeg ffmpeg Video Format: Video Format: AVI AVI MP4 MP4 Video Size: Video Størrelse: Frame Size Billed størrelse QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGQ (800x600) SVGQ (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080 Fuld HD (1900x1080 Project Frames per Second: Projekt Billeder pr Sekund: <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>BPS vælger</h4> <p>Ved at ændre værdien i dette felt, vælger du hastigheden som animationen i <b>Fremviseren</b> vil køre med.</p> <p>Start animationen ved at presse <b>Kør Animation</b> knappen.</p> Output file settings Output fil indstillinger Do you want to be asked for an output file everytime you choose to export? Vil du spørges om output fil hver gang du vælger at eksportere en fil? Yes Ja No Nej Set default output file: Indstil standard output fil: Browse Gennemse Choose output file Vælg output fil ExportWidget Below you can set which program should be used for encoding a new project to a video file. Herunder kan du vælge hvilket program der skal bruges for at lave dit nye projekt til en video fil. Below you can set which program should be used for encoding the currently active project to a video file. Herunder kan du vælge hvilket program der skal bruges for at lave dit aktive projekt om til en video fil. Encoder settings Encoder instillinger Encoder Application: Encoder Applikation: ffmpeg ffmpeg libav Video Format: Video Format: AVI AVI MP4 MP4 Video Size: Video Størrelse: Frame Size Billed størrelse QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGA (800x600) SVGA (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080) Fuld HD (1900x1080) Frames per Second: Billeder per sekund: <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>BPS vælger</h4> <p>Ved at ændre værdien i dette felt, vælger du hastigheden som animationen i <b>Fremviseren</b> vil køre med.</p> <p>Start animationen ved at presse <b>Kør Animation</b> knappen.</p> Output file settings Output fil indstillinger Do you want to be asked for an output file everytime you choose to export? Vil du spørges om output fil hver gang du vælger at eksportere en fil? Yes Ja No Nej Set default output file: Indstil standard output fil: Browse Gennemse Choose output file Vælg output fil Exposure Critical Kritisk Can't move image to temporary directory! Kan ikke flytte billede til midlertidig mappe! Can't copy the image to the temporary directory! Kan ikke kopiere billedet til midlertidig mappe! Can't remove the image from the project directory! Kan ikke fjerne billedet fra projekt mappe! Can't save the image in the new file format to the temporary directory! Kan ikke gemme billedet i det nye fil format til midlertidig mappe! Can't remove the image in the temporary directory! Kan ikke fjerne billedet i den midlertidige mappe! Can't copy image to temporary directory! Kan ikke kopiere billede til midlertidig mappe! Can't copy the image to the project directory! Kan ikke kopiere billedet til projekt mappen! Can't move image to project directory! Kan ikke flytte billede til projekt mappe! ExternalCommandDialog Input to program: Input til program: Submit Indsend Close Luk Output from external command Output fra ekstern kommando Result Resultat Failed! Mislykkedes! Successful! Succes! GeneralDialog Preferences Foretrukne Apply Anvend Close Luk qStopMotion Preferences qStopMotion Foretrukne General Settings Generelle indstillinger New Project Values Nyt projekt Værdier Image Import Billed import Image Transformation Billed Transformering Video Export Video Eksport Grabber Grabber &General Settings &Generelle indstillinger Video &Export Video &Eksport GeneralTab Language Sprog Capture Button Functionality Optageknap Funktionalitet Insert new frame bevor selected frame Indsæt nyt billede før valgte billede Insert new frame after selected frame Indsæt nyt billede efter valgte billede Append new frame at the end of the take Tilføj nyt billede i slutningen af optagelsen GeneralWidget Language Sprog Capture Button Functionality Optageknap Funktionalitet Insert new frame bevor selected frame Indsæt nyt billede før valgte billede Insert new frame after selected frame Indsæt nyt billede efter valgte billede Append new frame at the end of the take Tilføj nyt billede i slutningen af optagelsen Grid Functionality Gitter funktionalitet Vertical Lines Lodrette linjer Horizontal Lines Vandrette Linjer Grid Color: Gitter farve: Color Farve GrabberWidget Below you can select which image grabber should be used for grabbing images from the camera. If available the controller can be used to control focus, zoom and other functionality. Nedenfor kan du vælge hvilken billedgrabber kameraet skal bruge. Hvis der er en controller tilgængelig, kan den bruges til at regulere fokus, zoom og anden funktionalitet. Grabber Functionality Grabber Funktionalitet GStreamer Video Test Source GStreamer Video Test Kilde GStreamer Video 4 Linux 2 Source GStreamer Video 4 Linux 2 Kilde Video 4 Linux 2 Source Video 4 Linux 2 Kilde Camera Controller (Experimental) Kamera Controller (Eksperimentel) GStreamer DV1394 Source GStreamer DV1394 Kilde Microsoft Media Foundation Source Microsoft Media Foundation Kilde Gphoto2 Source (Experimental) Gphoto2 Kilde (Eksperimentel) Information Information Pease restart qStopMotion to activate the changings! Genstart venligst qStopMotion for at aktive ændringerne! GstreamerDeviceGrabber Device %1 Enhed %1 GstreamerDv1394Grabber Device %1 Enhed %1 GstreamerGrabber Video test device Video test enhed Device %1 Enhed %1 GstreamerV4L2Grabber Device %1 Enhed %1 GstreamerVideoTestGrabber Video test device Video test enhed HelpBrowser qStopMotion Help Browser qStopMotion Hjælpe Browser &Backward &Bagud &Home &Hjem &Forward &Fremad &Close &Luk ImageGrabber Check image grabber Tjek billede grabber Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Grabbing mislykkedes. Dette kan ske hvis du prøver at grabbe fra en ugyldig enhed. Kontroller dine grabber indstillinger i foretrukne menuen. ImageGrabberFacade Check image sources Tjek billed kilder No usable video image source found. Please connect on video device on the computer. Ingen brugbar videokilde fundet. Tilslut venligst til computerens videoenhed. Check image grabber Tjek billede grabber Image grabber initialization failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab. Billedgrabber initiering mislykkedes. Det sker hvis du prøver at grabbe fra en ugyldig enhed. Vælg venligst en anden enhed. Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Grabbing mislykkedes. Dette kan ske hvis du prøver at grabbe fra en ugyldig enhed. Kontroller dine grabber indstillinger i foretrukne menuen. ImportWidget Below you can set which image sources should be used for importing images to a new project. Herunder kan du vælge hvilke billed kilder der skal bruges for at importere billeder til et nyt projekt. Below you can set which image sources should be used for importing images to the currently active project. Herunder kan du vælge hvilke billed kilder der skal bruges for at importere billeder til det aktive projekt. Test Source Test kilde Image import settings Billed import indstillinger Image Format: Billed Format: JPEG JPEG TIFF TIFF BMP BMP Image Quality: Billed Kvalitet: Min Min Max Max Image Size: Billed Størrelse: Default Grabber Size Standard Grabber Størrelse QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGA (800x600) SVGA (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080) Fuld HD (1900x1080) Live view settings Live afspilnings indstillinger Frames per second: Billeder per sekund: 0.1 0.1 5.0 5.0 MainWindowGUI Select image grabber Vælg billed grabber You have to define an image grabber to use. This can be set in the preferences menu. Du skal vælge en billede grabber at bruge. Dette vælges i foretrukne menuen. qStopMotion - No Animation Project qStopMotion - Intet Animations Projekt Ready to rumble ;-) Klar til kamp ;-) &New &Ny &Open Å&bn &Save &Gem Save &As Ge&m som Video Video Cinelerra Cinelerra Properties Egenskaber &Quit &Afslut &Undo Fortr&yd Re&do G&endan Insert Scene Indsæt Scene Add Scene Tilføj Scene Remove Scene Fjern Scene Insert Take Indsæt Take Add Take Tilføj Take Remove Take Fjern Take Insert Frames Indsæt Billeder Add Frames Tilføj billeder Remove Frames Fjern Billeder &Configure qStopMotion &Konfigurer qStopMotion What's &This &Hvad er Dette &Undo stack &Undo stack &Camera Controller Kamera &Controller &Help &Hjælp About &Qt Om &Qt &About &Om Project ID: Projekt ID: Scene ID: Scene ID: Take ID: Take ID: Exposure ID: Eksponering ID: &File &Fil &Export &Eksport &Edit &Rediger &Settings &Indstillinger &View &Se Recording Optagelse Project Projekt <h4>Properties of the project</h4> <p>This will opens a window where you can <em>change</em> properties of the animation project.</p> <h4>Projekt Egenskaber</h4> <p>Vil åbne et vindue hvor du kan <em>ændre</em> egenskaberne i dit animations projekt.</p> Properties of the animation project Egenskaber i animations projekt <h4>Preferences of the application</h4> <p>This will opens a window where you can <em>change</em> the preferences of the application.</p> <h4>Program Egenskaber</h4> <p>Vil åbne et vindue hvor du kan <em>ændre</em> egenskaberne i programmet.</p> Preferences of qStopMotion qStopMotion Egenskaber Cancel Annuler Connecting camera... Forbinder kamera... You have to define an image grabber to use. This can be set on the recording tool tab. Du må definere hvilken billed grabber der skal bruges. Dette kan ske i optage-fanen. Existing Images Eksisterende billeder There are some images in the open project. Do you want to convert the images to the new file format or quality? Der findes billeder i det åbne projekt. Ønsker du at konvertere dem til det nye filformat eller kvalitet? The Project Projektet Scene 001 Scene_001 Take 01 Take_01 qStopMotion - New Animation Project qStopMotion - Nyt Animations Projekt Choose project file Vælg projekt fil Project (*.%1) Projekt (*.%1) Save As Gem som Information Information The character '|' is not allowed in the project file name and will be removed. Karakteren '|' er ikke tilladt i projekt navnet og bliver fjernet. Warning Advarsel The project directory must not contain more than one project file. Projektmappen må ikke indeholde mere end en projekt fil. The selected encoder is not installed on your computer. Install the encoder or select another one! Cannot find any registered encoder to be used for video export. This can be set in the preferences menu. Export to video will not be possible until you have set an encoder to use! Kan ikke finde en registreret encoder for video export. Det kan sættes i foretrukne menuen. Eksport til video er ikke mulig før du har valgt en encoder at bruge! AVI Videos (*.avi) AVI Videoer (*.avi) MP4 Videos (*.mp4) MP4 Videoer (*.mp4) Export to video file Eksporter til video fil No default output file name defined. Check your settings in the preferences menu! Ingen standard output fil navn defineret. Tjek dine indstillinger i foretrukne menuen! The registered encoder is not valid. Check your settings in the preferences menu! Den registrerede encoder er ikke gyldig. Tjek dine indstillinger i foretrukne menuen! Exporting ... Eksporterer ... Export to file Eksporter til fil qStopMotion - Undo stack qStopMotion - Undo stack English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Dansk Open &Recent Åbn &Seneste Preferences Foretrukne &Windows &Windows <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Ny</h4> <p>Opretter et <em>nyt</em> projekt.</p> New project Nyt projekt <h4>Open</h4> <p><em>Opens</em> a qStopMotion project file.</p> <h4>Åbn</h4> <p><em>Åbner</em> en qStopMotion projekt fil.</p> Open project Åbn projekt <h4>Save</h4> <p><em>Saves</em> the current animation as a qStopMotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Gem</h4> <p><em>Gemmer</em> den aktive animation som en qStopMotion projekt fil. <BR>Er projektet tidligere gemt, vil det automatisk blive gemt som den tidligere gemte fil.</p> Save project Gem projekt <h4>Save As</h4> <p><em>Saves</em> the current animation as a qStopMotion project file.</p> <h4>Gem som</h4> <p><em>Gemmer</em> den nuværende animation som en qStopMotion projekt fil.</p> Save project As Gem projekt Som <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4> <p>Eksporterer det nuværende projekt som <em>video</em>.</p>Du hjælpes af en guide. <h4>Cinelerra</h4> <p>Exports the current animation as a <em>cinelerra-cv</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4> <p>Eksporterer den nuværende animation som <em>cinelerra</em> projekt.</p>Du hjælpes af en guide. <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Afslut</h4> <p><em>Afslutter</em> programmet.</p> Quit Afslut <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Fortryd</h4> <p><em>Fortryder</em> din sidste handling. Du kan presse fortryd flere gange for at fortryde tidligere handlinger.</p> Undo Fortryd <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Gendan</h4> <p><em>Gendanner</em> din sidste handling. Du kan presse gendan flere gange for at gendanne tidligere handlinger.</p> Redo Gendan <h4>Configure qStopMotion</h4> <p>This will opens a window where you can <em>configure</em> qStopMotion with various input and output devices.</p> <h4>Konfigurer qStopMotion</h4> <p>Dette vil åbne et vindue, hvor du kan <em>konfigurere</em> qStopMotion med forskellige input og output enheder.</p> Configure qStopMotion Konfigurer qStopMotion <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Hvad er dette</h4> <p>Dette vil give dig en HvadErDette-musecursor, som kan bruges til at vise brugbar information som denne.</p> What's This Hvad er Dette <h4>Help</h4> <p>This button will bring up a dialog with the qStopMotion manual</p> <h4>Hjælp</h4> <p>Denne knap frembringer qStopMotion manualen</p> Help Hjælp <h4>About Qt</h4> <p>This will display a small information box where you can read general information about the Qt library.</p> <h4>Om Qt</h4> <p>Dette vil give dig en lille informations boks, hvor du kan læse om Qt biblioteket.</p> About Qt Om Qt <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Om</h4> <p>Dette vil give di en informations boks, hvor du kan læse generel information og finde oplysninger om udviklerne bag denne gode software.</p> About Om <h4>Project ID</h4><p>This area displays the id of the currently active project</p> <h4>Projekt ID</h4><p>Dette område giver et ID fra dit nuværende aktive projekt</p> <h4>Scene ID</h4><p>This area displays the id of the currently selected scene</p> <h4>Scene ID</h4><p>Dette område viser din nuværende valgte scenes ID</p> <h4>Take ID</h4><p>This area displays the id of the currently selected take</p> <h4>Take ID</h4><p>Dette område viser dit nuværende takes ID</p> <h4>Exposure ID</h4><p>This area displays the id of the currently selected exposure</p> <h4>Eksponerings ID</h4><p>Dette område viser din nuværende eksponerings ID</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Fremviser</h4><p> I dette område kan du se det valgte billede. Du kan også afspille animationer i dette vindue, ved at trykke på <b>Afspil</b> knappen.</p> <h4>TimeLine</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Tidslinje</h4> <p>I dette område kan du se billeder og scener i animationen og bygge animationen ved at flytte dem rundt.</p><p>Du kan skifte mellem foregående og kommende billede ved at bruge <b>pile-tasterne</b> eller <b>x</b> og <b>z</b></p> No encoder selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an encoder to use! Ingen encoder er valgt til video eksport. Denne kan vælges i projektets indstillingsdialog. Eksport til video er ikke mulig før du har valgt en encoder! No video format selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an video format to use! Video format er ikke valgt til video eksport. Denne kan vælges i projektets indstillingsdialog. Eksport til video er ikke mulig før du har valgt et video format! No default output file name defined. Check your settings in the properties dialo of the project! Standard output filnavn er ikke defineret Kontroller dine indstillinger for projektet! The selected encoder is not valid. Check your settings in the properties dialog of the project! Den valgte encoder er ikke gyldig. Kontroller dine indstillinger for projektet! Unsaved changes Ugemte ændringer There are unsaved changes. Do you want to save? Der er ugemte ændringer. Ønsker du at gemme? PreferencesDialog Apply Anvend Close Luk Preferences Menu Foretrukne Menu &General Settings &Generelle indstillinger Video &Export Video &Eksport &Default Values &Standard værdier PreferencesTool DOM Parser DOM Parser Couldn't open XML file: %1 Kunne ikke åbne XML fil: %1 Parse error at line %1, column %2: %3 %4 Fortolkerfejl ved linje %1, kolonne %2: %3 %4 Critical Kritisk Can't remove preferences backup file! Kan ikke flytte foretrukne backup fil! Can't copy preferences file to backup file! Kan ikke kopiere foretrukne fil til backup fil! ProjectDialog Properties Egenskaber Apply Anvend Close Luk Animation Project Properties Animation Projekt Egenskaber Image Import Billed import Image Transformation Billed Transformering Video Export Video Eksport Video &Export Video &Eksport ProjectSerializer DOM Parser DOM Parser Couldn't open XML file: %1 Kunne ikke åbne XML fil: %1 Parse error at line %1, column %2: %3 %4 Fortolkerfejl ved linje %1, kolonne %2: %3 %4 Critical Kritisk Can't remove old backup of project file! Kan ikke fjerne gammel backup af projekt fil! Can't rename project file to backup! Kan ikke omdøbe projekt fil til backup! Can't copy the project file to backup! Kan ikke kopiere projekt fil til backup! Can't remove the old project file! Kan ikke fjerne den gamle projekt fil! Can't create project directory! Kan ikke projekt mappe! Can't change permissions of the project directory! Kan ikke ændre rettigheder på projekt mappen! Can't create image directory! Kan ikke oprette billed mappe! Can't change permissions of the image directory! Kan ikke ændre rettigheder på billed mappen! Can't create sound directory! Kan ikke oprette lyd mappe! Can't change permissions of the sound directory! Kan ikke ændre rettigheder på lyd mappen! ProjectTab Project Tree Projekt Træ Scenes Scener Takes Takes Frames Billeder Edit Rediger Scene 000 Scene_000 Take 00 Take_00 Insert Take Indsæt Take No scene selected. Please select a scene in the project tree. Ingen scene valgt. Vælgt venligst en scene i projekt træet. Add Take Tilføj Take Insert Frames Indsæt Billeder No take selected. Please select a take in the project tree. Ingen take valgt. Vælgt venligst et take i projekt træet. Add Frames Tilføj billeder Warning Advarsel There is no active frame to open Der er intet aktivt billede at åbne The active frame is corrupt Det aktive billede er beskadiget <h4>Insert new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>insert</em> it bevor the selected scene.</p> <h4>Indsæt ny Scene (CTRL+E)</h4> <p>Klik her for at oprette en ny <em>scene</em> og <em>indsætte</em> den før den valgte scene.</p> <h4>Append new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>append</em> it at the end of the animation.</p> <h4>Vedhæft ny Scene (CTRL+E)</h4> <p>Klik her for at oprette en ny <em>scene</em> og <em>vedhæfte</em> den i slutningen af animationen.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>scene</em> from the animation.</p> <h4>Fjern Scene (SHIFT+Delete)</h4> <p>Klik her for at <em>fjerne</em> den valgte <em>scene</em> fra animationen.</p> <h4>Insert new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>insert</em> it bevor the selected take.</p> <h4>Indsæt ny Take (CTRL+E)</h4> <p>Klik her for at oprette et nyt <em>take</em> og <em>indsætte</em> det foran det valgte take.</p> <h4>Append new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>append</em> it to the end of the scene.</p> <h4>Vedhæft nyt Take (CTRL+E)</h4> <p>Klik her for at oprette et nyt <em>take</em> og <em>vedhæfte</em> det i slutningen af scenen.</p> <h4>Remove Take (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>take</em> from the animation.</p> <h4>Fjern Take (SHIFT+Delete)</h4> <p>Klik her for at <em>fjerne</em> det valgte <em>take</em> fra animationen.</p> <h4>Insert Frames (CTRL+F)</h4> <p>Click on this button to <em>insert frames</em> bevor the selected frame.</p> <h4>Indsæt billeder (CTRL+F)</h4> <p>Klik her for at <em>indsætte billeder</em> foran det valgte billede.</p> <h4>Append Frames (CTRL+F)</h4> <p>Click on this button to <em>append frames</em> at the end of the take.</p> <h4>Vedhæft Billeder (CTRL+F)</h4> <p>Klik her for at <em>vedhæfte billeder</em> i slutningen ag dit take.</p> <h4>Remove Frame (Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>frame</em> from the take.</p> <h4>Fjern billede (Delete)</h4> <p>Klik her for at <em>fjerne</em> det valgte <em>billede</em> fra dit take.</p> <h4>Launch Photo Editor</h4> <p>Click this button to open the active frame in the photo editor</p> <p>Note that you can also drag images from the frame bar and drop them on the photo editor</p> <h4>Start Foto redigering</h4> <p>Klik her for at åbne det aktive billede i Foto redigeringen</p> <p>Bemærk at du også kan trække billeder fra billedrækken og lægge dem over i foto redigeringen</p> Choose frames to add Vælg billeder at tilføje You do not have Gimp installed on your system Du har ikke GIMP installeret i dit system Failed to start Gimp! Kunne ikke starte GIMP! ProjectWidget Recording Optagelse Single frame capture Enkelt billede optagelse Camera Kamera Test Source Test kilde USB Source USB kilde FireWire Source FireWire kilde DirectShow Source DirectShow kilde Image grabber settings Billed grabber indstillinger Video 4 Linux (USB WebCam) Video 4 Linux (USB WebCam) IEEE 1394 (FireWire DigiCam) IEEE 1394 (FireWire DigiCam) Video 4 Linux 2 (USB WebCam) gphoto (USB Compact Camera) gphoto (USB Compact Kamera) Media Foundation Media Foundation Capture Optag Mix Miks Diff Difference Playback Afspil Number of images: Antal billeder: <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Antal billeder</h4> <p>Ved at ændre på værdien her, kan du vælge hvor mange billeder bagud i animationen de skal vises, eller, hvis du er i Afspil mode: hvor mange billeder der skal afspilles. </p> <p>Ved at mikse de forudgående billeder med det kameraet ser nu, kan du lettere se hvordan det næste billede bliver i relation til det forudgående, og derme lave noget bedre stop motion animation!</p> QtFrontend Create directory Opret mappe You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. Du har ikke de fornødne rettigheder for at køre qStopMotion. Du behøver ret til at oprette .qstopmotion mappen i dit hjemmebibliotek. Check Permissions Tjek rettigheder You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. Du har ikke de fornødne rettigheder for at køre qStopMotion. Du behøver ret til at læse, skrive og eksekvere i .qstopmotion mappen. &Yes &Ja &No &Nej &OK &OK Recovery Genopretning Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? Noget fik qStopmotion til at stoppe uregelmæssigt sidst. Ønsker du at genoprette? qStopMotion - Recovered Project qStopMotion - Genopret Projekt RecordingTab Auto Auto Camera Kamera Capture Optag Recording Optagelse Single frame capture Enkelt billede optagelse Video Source: Video kilde: Resolution: Opløsning: Mix Miks Diff Difference Playback Afspil <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Tænd/Sluk Kamera (C)</h4> <p>Klik her for at tænde og slukke kameraet</p> Number of images: Antal billeder: <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Antal billeder</h4> <p>Ved at ændre på værdien her, kan du vælge hvor mange billeder bagud i animationen de skal vises, eller, hvis du er i Afspil mode: hvor mange billeder der skal afspilles. </p> <p>Ved at mikse de forudgående billeder med det kameraet ser nu, kan du lettere se hvordan det næste billede bliver i relation til det forudgående, og derme lave noget bedre stop motion animation!</p> Not Supported Ikke Understøttet Information Information No active project. Please create a new project or open an existing project. Intet aktivt projekt. Opret venligst et projekt eller åbn et eksisterende projekt. No scene and no take selected. Please select a scene and a take on the project tab. Ingen scene og ingen take valgt. Vælg venligst en scene og et take i projekt-fanen. No take selected. Please select a take on the project tab. Ingen take valgt. Vælgt venligst et take i projekt-fanen. Scene Critical Kritisk Can't remove sound file! Kan ikke fjerne lyd fil! Can't copy sound file! Kan ikke kopiere lydfil! Can't move sound file! Kan ikke flytte lyd fil! StartDialog <h2>Create a new Project</h2> <h2>Opret nyt Projekt</h2> Start a new Project. Start et nyt Projekt. <h2>Open last Project</h2> <h2>Åbn seneste Projekt</h2> Project path: Projekt sti: <h2>Open project file</h2> <h2>Åbn projekt fil</h2> Open and continue a existing project. Åbn og fortsæt et eksisterende projekt. &OK &OK &Close &Luk TimeLine Load images to time line Indlæs billeder til tidslinjen ToolBar Running animation Kører animation <h4>Play animation (K, P)</h4> <h4>Afspil animation (K, P)</h4> <h4>First frame of the take (J, Left)</h4> <h4>Første billede af dit take (J, Left)</h4> <h4>Previous frame (J, Left)</h4> <h4>Forudgående billede (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Næste billede (L, Right)</h4> <h4>Last frame of the take (L, Right)</h4> <h4>Sidste billede i dit take (L, Right)</h4> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Optag billede (Space)</h4> <p>Klik her for at <em>optage</em> et billede fra kameraet og indsætte det i animationen</p> <p> Det kan også gøres ved at trykke <b>Mellemrums tast</b></p> TransformWidget Transformation settings Transformering Indstillinger Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping. Herunder kan du vælge hvilken billed transformering der skal bruges til import af billeder i et nyt projekt. Hvis du vælger at klippe en del af billedet, skal justering for klipning også sættes. Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping. Herunder kan du vælge hvilken billed transformering der skal bruges til import af billeder i det aktive projekt. Hvis du vælger at klippe en del af billedet, skal justering for klipning også sættes. Scale the whole image Skaler hele billedet Clip a part of the image Klip en del af billedet Zoom the image Zoom på billedet Zoom settings Zoom indstillinger Zoom value: Zoom værdi: 0% 0% 100% 100% UndoExposureAdd Add exposure (%1,%2,%3) '%4' Tilføj billede (%1,%2,%3) '%4' UndoExposureInsert Insert exposure (%1,%2,%3) '%4' Indsæt billede (%1,%2,%3) '%4' UndoExposureMove Move exposure (%1,%2,%3) Flyt billede (%1,%2,%3) UndoExposureRemove Remove exposure (%1,%2,%3) Fjern billede (%1,%2,%3) UndoExposureSelect Select exposure (%1,%2,%3)-->(%4,%5,%6) Vælg billede (%1,%2,%3)-->(%4,%5,%6) UndoProjectNew New project '%1' Nyt projekt '%1' UndoProjectOpen Open project '%1' Åbn projekt '%1' UndoSceneAdd Add scene (%1) '%2' Tilføj scene (%1) '%2' UndoSceneInsert Insert scene (%1) '%2' Indsæt scene (%1) '%2' UndoSceneMove Move scene (%1,%2) Flyt scene (%1,%2) UndoSceneRemove Remove scene (%1) Fjern scene (%1) UndoSceneSelect Select scene (%1)-->(%2) Vælg scene (%1)-->(%2) UndoTakeAdd Add take (%1,%2) '%3' Tilføj take (%1,%2) '%3' UndoTakeInsert Insert take (%1,%2) '%3' Indsæt take (%1,%2) '%3' UndoTakeMove Move take (%1,%2) Flyt take (%1,%2) UndoTakeRemove Remove take (%1,%2) Fjern take (%1,%2) UndoTakeSelect Select take (%1,%2)-->(%3,%4) Vælg take (%1,%2)-->(%3,%4) ViewTab First Group Box Første Group Box Second Group Box Anden Group Box Third Group Box Tredje Group Box <h4>First Button</h4> <h4>Første Knap</h4> <h4>Second Button</h4> <h4>Anden Knap</h4> <h4>Third Button</h4> <h4>Tredje Knap</h4> qstopmotion-2.3.2-Source/translations/qstopmotion_de.ts000644 000000 000000 00000434300 13011043104 023452 0ustar00rootroot000000 000000 AboutDialog &About Ü&ber Main developers Hauptentwickler A&uthors A&utoren Translation Übersetzung Czech Tschechisch Slovenian Slowenisch French Französisch Turkish Türkisch Italian Italienisch Logo Logo Coordinating Koordination Testing Testen &Thanks To &Dank an &Licence Agreement &Lizenzabkommen Unknown Windows OS Unbekanntes Windows OS Unknown Mac OS Unbekanntes Mac OS Build time: %1 %2 Erstellungszeitpunkt: %1 %2 &System Info &Systeminformation OK OK About Info This is the qStopMotion application for creating stop motion animations. Dies ist das qStopMotion Programm um Stopmotion-Animationsfilme zu erstellen. Version: Version: qStopMotion is a fork of stopmotion for linux. qStopMotion ist ein Fork von stopmotion für Linux. and und Danish Dänisch This program is distributed under the terms of the GPL v2. Dieses Programm wird unter den Bedingungen der GPL v2 bereitgestellt. Qt runtime version: Version der Qt Laufzeitumgebung: Operating system name and version: Name und Version des Betriebssystems: German Deutsch Portuguese Portugisisch Spanish Spanisch Swedish Schwedisch Contributors Mitwirkende AnimationProject Saving scenes to disk ... Abspeichern der Szenen auf die Festplatte ... Add Sound Ton hinzufügen Cannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play. Die ausgewählte Ton-Datei kann nicht zum lesen geöffnet werden. Überprüfen Sie, dass die Rechte richtig gesetzt sind. Die Animation wird ohne Ton abgespielt wenn Sie abspielen wählen. The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play. Die ausgewählte Ton-Datei hat kein gültiges Ton-Format. Die Animation wird ohne Ton abgespielt, wenn Sie abspielen wählen. CameraControllerDialog qStopMotion Camera Controller qStopMotion Kamerasteuerung Video Quality Bildqualität Automatic Pan Automatischer Schwenk Brightness: Helligkeit: Camera Resolution Kameraauflösung Resolution: Auflösung: Automatic Contrast Automatischer Kontrast Contrast: Kontrast: Automatic Saturation Automatische Sättigung Saturation: Sättigung: Automatic Hue Automatischer Farbton Hue: Farbton: Automatic Gamma Automatisches Gamma Gamma: Gamma: Automatic Sharpness Automatische Schärfe Sharpness: Schärfe: Automatic Backlight Compensation Automatische Hintergrundbeleuchtungskompensation Backlight Compensation: Hintergrundbeleuchtungskompensation: Automatic Gain Automatische Verstärkung Gain: Verstärkung: Automatic Color Enable Automatisch Farbe zulassen Color Enable: Farbe zulassen: Camera Control Kamerasteuerung Automatic Exposure Automatische Belichtung Exposure: Belichtung: Restore Camera Settings... Wiederherstellen der Kameraeinstellungen... Reset Camera Settings... Zurücksetzen der Kameraeinstellungen... Abort Reset Zurücksetzen abbrechen Automatic Brightness Automatische Helligkeit Automatic White Balance Automatischer Weißabgleich White Balance: Weißabgleich: Automatic Zoom Automatischer Zoom Zoom: Zoom: Automatic Focus Automatische Bildschärfe Focus: Bildschärfe: Pan: Schwenk: Automatic Tilt Automatische Neigung Tilt: Neigung: Automatic Iris Automatische Blende Iris: Blende: Automatic Roll Automatische Rolle Roll: Rolle: &Reset to Default &Zurücksetzen auf Standard &Close &Schließen DescriptionDialog &Project Description: &Projektbeschreibung: &Scene Description: &Szenebeschreibung: &Take Description: A&ufnahmebeschreibung: &OK &OK &Cancel &Abbrechen Project Description Projektbeschreibung Scene Description Szenebeschreibung Take Description Aufnahmebeschreibung Information Information The character '|' is not allowed in the project description. Das Zeichen '|' ist in der Projektbeschreibung nicht gestattet. The character '|' is not allowed in the scene description. Das Zeichen '|' ist in der Szenebeschreibung nicht gestattet. The character '|' is not allowed in the take description. Das Zeichen '|' ist in der Aufnahmebeschreibung nicht gestattet. DomainFacade <empty> <leer> Critical Kritisch Can't remove history file! Historie Datei kann nicht gelöscht werden! Can't open history file to write entry! Historie Datei kann nicht geöffnet werden um neuen Eintrag hinzuzufügen. Can't open history file to recover project! Historie Datei kann nicht geöffnet werden um Projekt wiederherzustellen. Can't copy image to temp directory! Bild kann nicht in das temporäre Verzeichnis kopiert werden! ExportWidget Encoder settings Encoder Einstellungen Encoder Application: Encoder Applikation: ffmpeg ffmpeg libav libav Video Format: Video Format: AVI AVI MP4 MP4 Video Size: Video Größe: Frame Size Größe der Bilder QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGA (800x600) SVGA (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080) Full HD (1900x1080) Frames per Second: Bilder pro Sekunde: Project Frames per Second: Bilder pro Sekunde in diesem Projekt: <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Bilder pro Sekunde</h4> <p>Hiermit können sie die Geschwindigkeit einstellen, mi der die Animation im <b>Bildbetrachter</b> abläuft.</p> <p>Um die Animation zu starten, drücken sie den <b>Start</b> Knopf.</p> Output file settings Einstellungen Ausgabedatei Do you want to be asked for an output file everytime you choose to export? Möchten sie jedesmal nach einem Dateinamen gefragt werden, wenn sie Export wählen ? Yes Ja No Nein Set default output file: Wählen sie die Standard Ausgabe-Dateinamen: Browse Durchsuchen Choose output file Wählen sie die Ausgabe-Datei Below you can set which program should be used for encoding a new project to a video file. Unten können sie auswählen, welches Programm benutzt werden soll, um ein neues Projekt zu einer Videodatei zu encodieren. Below you can set which program should be used for encoding the currently active project to a video file. Unten können sie auswählen, welches Programm benutzt werden soll, um das aktuelle Projekt zu einer Videodatei zu encodieren. Exposure Critical Kritisch Can't copy image to temp directory! Bilder können nicht in das temporäre Verzeichnis kopiert werden! Can't rename image file! Bilder können nicht umbenannt werden! Can't move image to temporary directory! Bilder können nicht in das temporäre Verzeichnis verschoben werden! Can't copy the image to the temporary directory! Das Bild kann nicht in das temporäre Verzeichnis kopiert werden! Can't remove the image from the project directory! Das Bild kann im Projektverzeichnis nicht gelöscht werden! Can't save the image in the new file format to the temporary directory! Das Bild kann nicht im neuen Format in das temporäre Verzeichnis gespeichert werden! Can't remove the image in the temporary directory! Das Bild kann im temporäre Verzeichnis nicht gelöscht werden! Can't copy image to temporary directory! Bilder können nicht in das temporäre Verzeichnis kopiert werden! Can't save image in the new file format to temporary directory! Bilder können nicht im neuen Format in das temporäre Verzeichnis gespeichert werden! Can't copy the image to the project directory! Das Bild kann nicht in das Projektverzeichnis kopiert werden! Can't remove the image in the project directory! Bilder können im temporäre Verzeichnis nicht gelöscht werden! Can't move image to trash directory! Bilder können nicht in das Abfallverzeichnis verschoben werden! Can't move image to project directory! Bilder können nicht in das Projektverzeichnis verschoben werden! ExternalCommandDialog Input to program: Eingabe zum Programm: Submit Abschicken Close Schließen Output from external command Ausgabe von exterenem Kommando Result Ergebnis Failed! Fehlgeschlagen! Successful! Erfolgreich! GeneralDialog Preferences Einstellungen Apply Anwenden Close Schließen General Settings Allgemeine Einstellungen New Project Values Einstellungen neues Projekt Image Import Bildimport Image Transformation Bildumwandlung Video Export Grabber Bilddigitalisierer General Preferences Allgemeine Einstellungen qStopMotion Preferences qStopMotion Einstellungen &General Settings &Allgemeine Einstellungen &New Project Values &Einstellungen neues Projekt Image &Import Bild&import Image &Transformation Bild&umwandlung Video &Export &Video Export G&rabber &Bilddigitalisierer &Image Import &Bildimport GeneralWidget Language Sprache Capture Button Functionality Funktion des Aufnahmeknopfes Insert new frame bevor selected frame Einfügen des neuen Bildes vor dem hervorgehobenen Bild Insert new frame after selected frame Einfügen des neuen Bildes hinter dem hervorgehobenen Bild Append new frame at the end of the take Einfügen des neuen Bildes am Ende der Aufnahme Grid Functionality Gitterlinien Vertical Lines Anzahl vertikale Linien Horizontal Lines Anzahl horizontale Linien Grid Color: Gitterlinienfarbe Color Farbe GphotoGrabber Gphoto2 device Gphoto2 Gerät GrabberWidget Below you can set which program should be used for encoding a new project to a video file. Unten können sie auswählen, welches Programm benutzt werden soll, um ein neues Projekt zu einer Videodatei zu encodieren. Below you can select which image grabber should be used for grabbing images from the camera. If available the controller can be used to control focus, zoom and other functionality. Hier können sie auswählen, welche Bilddigitalisierer verwendet werden sollen, um Bilder von der Kamera aufzunehmen. Der Kontroller kann zur Steuerung von Focus, Zoom und anderen Funktionen verwendet werden, wenn er zur Verfügung steht. Grabber Functionality Bilddigitalisiererfunktionen GStreamer Video Test Source GStreamer Video Testquelle GStreamer Video 4 Linux 2 Source GStreamer Video 4 Linux 2 Quelle Video 4 Linux 2 Source Video 4 Linux 2 Quelle Camera Controller (Experimental) Kamera Kontroller (Experimentell) GStreamer DV1394 Source GStreamer DV1394 Quelle GStreamer Direct Show USB Source GStreamer Direct Show USB Quelle Microsoft Media Foundation Source Microsoft Media Foundation Quelle Gphoto2 Source (Experimental) Gphoto2 Quelle (Experimentell) Information Information Pease restart qStopMotion to activate the changings! Zum aktivieren der Änderungen bitte qStopMotion neu starten! GstreamerDeviceGrabber Device %1 Gerät %1 GstreamerDv1394Grabber Device %1 Gerät %1 GstreamerGrabber Video test device Video-Test-Gerät Device %1 Gerät %1 GstreamerV4L2Grabber Device %1 Gerät %1 GstreamerVideoTestGrabber Video test device Video-Test-Gerät HelpBrowser qStopMotion Help Browser qStopMotion Hilfe Browser &Backward &Zurück &Home S&tartseite &Forward &Vorwärts &Close &Schließen ImageGrabber Check image grabber Überprüfe den Image Grabber Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Grabbing fehlgeschlagen. Bitte überprüfen sie ihre Grabber-Einstellungen im Einstellungen-Menü. ImageGrabberFacade Check image sources Überprüfe die Foto Quelle No usable video image source found. Please connect on video device on the computer. Es wurde keine nutzbare Foto Quelle gefunden. Bitte ein Video Gerät an den Computer anschließen. Check image grabber Überprüfe den Foto Grabber Image grabber initialization failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab. Initialisierung des Foto Grabbers fehlgeschlagen. Dies kann passieren, wen man von einem gestörtem Gerät aufnehmen möchte. Bitte wähle ein anderes Gerät im Aufnahme-Tab. Grabbing failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab. Bild aufnehmen fehlgeschlagen. Dies kann passieren, wen man von einem gestörtem Gerät aufnehmen möchte. Bitte wähle ein anderes Gerät im Aufnahme-Tab. Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Grabbing fehlgeschlagen. Bitte überprüfen sie ihre Grabber-Einstellungen im Einstellungen-Menü. ImportWidget Below you can set which image sources should be used for importing images to a new project. Unten können sie auswählen, welche Bilderquelle verwendet werden soll, um Bilder in ein neues Projekt zu importieren. Below you can set which image sources should be used for importing images to the currently active project. Unten können sie auswählen, welche Bildquelle benutzt werden soll, um Bilder in das aktuelle Projekt zu importieren. Image grabber settings Einstellungen Bildquelle Image Grabber: Bildquelle: Test Source Test Quelle Video 4 Linux (USB WebCam) Video 4 Linux (USB WebCam) IEEE 1394 (FireWire DigiCam) IEEE 1394 (FireWire DigiCam) Direct Show (USB WebCam) Direct Show (USB WebCam) Direct Show (FireWire DigiCam) Direct Show (FireWire DigiCam) gphoto (USB Compact Camera) gphoto (USB Kompaktkamera) Image import settings Einstellungen Bildimport Image Format: Bildformat: JPEG JPEG TIFF TIFF BMP BMP Image Quality: Bildqualität: Min Min Max Max Image Size: Bildgröße: Default Grabber Size Größe der Bildquelle QVGA (320x240) QVGA (320x240) VGA (640x480) VGA (640x480) SVGA (800x600) SVGA (800x600) PAL D (704x576) PAL D (704x576) HD Ready (1280x720) HD Ready (1280x720) Full HD (1900x1080) Full HD (1900x1080) Transformation settings Einstellungen Bildumwandlung Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping. Unten können sie auswählen, welche Bilderumwandlung verwendet werden soll, um Bilder eines neues Projektes umzuwandeln. Wenn sie ausschneiden auswählen müssen sie auch die Ausrichtung einstellen. Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping. Unten können sie auswählen, welche Bilderumwandlung verwendet werden soll, um Bilder des aktuellen Projektes umzuwandeln. Wenn sie ausschneiden auswählen müssen sie auch die Ausrichtung einstellen. Scale the whole image Gesamtes Bild skalieren Clip a part of the image Ausschneiden eines Teiles des Kamerabildes Live view settings Einstellungen Live-Ansicht Frames per second: Bilder pro Sekunde: 0.1 0,1 5.0 5,0 MainWindowGUI English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Deutsch Ready to rumble ;-) Los geht's ! &New &Neu &Open &Öffnen <h4>Open</h4> <p><em>Opens</em> a qStopMotion project file.</p> <h4>Öffnen</h4> <p><em>öffnet</em> eine qStopMotion Projektdatei.</p> &Save &Speichern Save &As Speichern &unter &Quit &Beenden <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Beenden</h4> <p><em>Beendet</em> das Program.</p> &File &Datei &Undo &Rückgängig <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Rückgängig</h4> <p>Macht eine oder mehrerer Aktionen rückgängig</p> Re&do &Wiederherstellen <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Wiederherstellen</h4> <p>Die letzte Operation wird wiederhergestellt. Sie können dies mehrmals tun.</p> Cu&t &Ausschneiden <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Ausschneiden</h4> <p>Schneidet die gewählten Bilder aus und verschibt sie in die Zwischenablage. Anschliessend kann man sie an anderer Stelle wieder einfügen.</p> &Copy &Kopieren <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Kopieren</h4> <p><em>Kopiert</em> die gewählten Bilder in die Zwischenablage . Danach können sie diese Bilder an einer anderen Stelle einfügen.</p> &Paste &Einfügen <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Einfügen</h4> <p>Fügt Bilder aus der Zwischenablage an der gewählten Position ein</p> <p>Sie können auch Bilder aus anderen Programmen kopieren/ausschneiden und sie hiermit hier einfügen</p> &Edit &Bearbeiten &Settings &Einstellungen What's &This &Was ist das? <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>was ist das ?</h4> <p>Der Mauszeiger ..ndert sich und zeigt hilfreiche Informationen uber das angeklickte Objekt.</p> &About &Info <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Über</h4> <p>Dies zeigt eine kleine Informationsbox, in der Sie sowohl allgemeine Informationen als auch die Namen der Entwickler dieses exzelenten Stückes Software lesen können.</p> &Help &Hilfe <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Bildanzeige</h4><p> In diesem Bereich sehen sie das gewählte Bild. Hier laufen auch die Animationen ab, wenn sie <b>Start</b> drücken.</p> The selected encoder is not installed on your computer. Install the encoder or select another one! Der ausgewählte Encoder ist auf diesem Computer nicht installiert. Installiere diesen Encoder oder wähle einen anderen aus! Unsaved changes Nicht gespeicherte Änderungen There are unsaved changes. Do you want to save? Es gibt ungespeicherte Änderungen. Möchten sie speichern? Video Video &Configure Application &Applikation konfigurieren &Configure Project &Projekt konfigurieren &Camera Controller &Kamerasteuerung &Export E&xportieren <h4>Preferences of the application</h4> <p>This will opens a window where you can <em>change</em> the preferences of the application.</p> <h4>Einstellungen der Anwendung</h4> <p>Dies öffnet ein Fenster in dem sie die Einstellungen der Anwendung <em>ändern</em> können.</p> Preferences of qStopMotion Einstellungen für qStopMotion Existing Images Existierende Bilder There are some images in the open project. Do you want to convert the images to the new file format or quality? Im offenen Projekt existieren schon Bilder. Möchten Sie diese Bilder in das neue Format oder die neue Qualität konvertieren? Project (*.%1) Projekt (*.%1) Information Information The character '|' is not allowed in the project file name and will be removed. Das Zeichen '|' ist im Namen der Projektdatei nicht gestattet und wird entfernt. No default output file name defined. Check your settings in the preferences menu! Kein Standardnamen für die Ausgabedatei vorgegeben. Überprüfen sie die Einstellungen im Einstellungsmenü! <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Neu</h4> <p>Erzeugt ein <em>neues</em> Project.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a qStopMotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Speichern</h4> <p>Speichert die aktuelle Animation als qStopMotion Projektdatei. </p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a qStopMotion project file.</p> <h4>Speichern als</h4> <p>Speichert die aktuelle Animation als qStopMotion Projekt.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4> <p>Exportiert das aktuelle Projekt als <em>Videodatei</em>.</p>Ein Assistent wird sie dabei unterstützen. <h4>Cinelerra</h4> <p>Exports the current animation as a <em>cinelerra-cv</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4> <p>Exportiert die aktuelle Animation als ein <em>cinelerra-cv</em> Projekt.</p>Ein Assistent wird sie führen. Cinelerra Cinelerra Select image grabber Wähle Image Grabber aus You have to define an image grabber to use. This can be set in the preferences menu. Sie müsen im Einstellungs-Menü einen Videograbber auswählen. qStopMotion - No Animation Project qStopMotion - Kein Animationsprojekt Insert Scene Szene einfügen Add Scene Szene hinzufügen Remove Scene Szene löschen Insert Take Aufnahme einfügen Add Take Aufnahme hinzufügen Remove Take Aufnahme löschen Insert Frames Bilder einfügen Add Frames Bilder hinzufügen Remove Frames Bilder löschen &Configure qStopMotion qStopMotion &konfigurieren &Undo stack &Rückgängig Liste About &Qt Über &Qt Project ID: Projekt ID: Scene ID: Szene ID: Take ID: Aufnahme ID: Exposure ID: Bild ID: &View &Ansicht Cancel Abbrechen Connecting camera... Stelle Verbindung zur Kamera her... The Project Das Projekt Scene 001 Szene 001 Take 01 Aufnahme 01 qStopMotion - New Animation Project qStopMotion - Neues Animationsprojekt Project (*.%1);;Archive (*.%2) Projekt (*.%1);;Archiv (*.%2) Saving scenes to disk ... Abspeichern der Szenen auf die Festplatte ... Cannot find any registered encoder to be used for video export. This can be set in the preferences menu. Export to video will not be possible until you have set an encoder to use! Für den Video-Export konnte kein Encoder gefunden werden. Sie können dies im Einstellungs-Menü ändern. Video-Export wird erst möglich, wenn sie einen Encoder eingestellt haben. Wollen sie dies nun tun ? AVI Videos (*.avi) AVI Filme (*.avi) MP4 Videos (*.mp4) MP4 Filme (*.mp4) The registered encoder is not valid. Check your settings in the preferences menu! Der gewählte Encoder ist nicht gültig. Überprüfen sie die Einstellungen im Einstellungsmenü! Exporting ... Exportieren ... qStopMotion - Undo stack qStopMotion - Rückgängig Liste Open &Recent &Zuletzt geöffnete Dateien Properties Eigenschaften Preferences Einstellungen &Windows &Fenster Recording Aufnahme Project Projekt New project Neues Projekt Open project Projekt öffnen Save project Projekt speichern Save project As Projekt speichern als <h4>Properties of the project</h4> <p>This will opens a window where you can <em>change</em> properties of the animation project.</p> <h4>Eigenschaften des Projektes</h4> <p>Dies öffnet ein Fenster in dem sie die Eigenschaften des Projektes <em>ändern</em> können.</p> Properties of the animation project Eigenschaften des Animationsprojektes Quit Beenden Undo Rückgängig Redo Wiederherstellen Cut Ausschneiden Copy Kopieren Paste Einfügen <h4>Configure qStopMotion</h4> <p>This will opens a window where you can <em>configure</em> qStopMotion with various input and output devices.</p> <h4>qStopMotion konfigurieren</h4> <p>Dies öffnet ein Fenster in dem sie qStopMotion und verscheidene Ein und Ausgabegeräte <em>konfigurieren</em> können</p> Configure qStopMotion qStopMotion konfigurieren <h4>Configure Project</h4> <p>This will opens a window where you can <em>configure</em> the project with various settings.</p> <h4>Projekt konfigurieren</h4> <p>Dies öffnet ein Fenster in dem sie das Projekt mit verschiedenen Werten <em>konfigurieren</em> können</p> What's This Was ist das? <h4>About Qt</h4> <p>This will display a small information box where you can read general information about the Qt library.</p> <h4>Über Qt</h4> <p>Dies zeigt eine kleine Informationsbox, in der Sie allgemeine Informationen zur Qt Bibliothek lesen können.</p> About Qt Über Qt About Info <h4>Project ID</h4><p>This area displays the id of the currently active project</p> <h4>Projekt ID</h4><p>Dieses Feld zeigt die ID des aktiven Projektes an</p> <h4>Scene ID</h4><p>This area displays the id of the currently selected scene</p> <h4>Szene ID</h4><p>Dieses Feld zeigt die ID der aktiven Szene an</p> <h4>Take ID</h4><p>This area displays the id of the currently selected take</p> <h4>Aufnahme ID</h4><p>Dieses Feld zeigt die ID der aktiven Aufnahme an</p> <h4>Exposure ID</h4><p>This area displays the id of the currently selected exposure</p> <h4>Bild ID</h4><p>Diese Feld zeigt die ID des aktiven Bildes an</p> <h4>TimeLine</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Bildleiste</h4> <p>In diesem Bereich sehen sie Bilder und Szenen der Animation. Sie diese hin und herschieben.</p><p>Mit den <b>Pfeiltasten</b> oder <b>x</b> und <b>z</b> navigieren sie ein Bild vor oder zurück</p> You have to define an image grabber to use. This can be set on the recording tool tab. Sie müsen einen Image Grabber auswählen. Dies kann auf dem Aufnahme Tab erfolgen. Warning Warnung The project directory must not contain more than one project file. In jedem Projekt-Verzeichnis darf nur ein Projekt-Datei existieren. No encoder selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an encoder to use! Für den Video-Export ist kein Encoder ausgewählt. Sie können dies im Eigenschaften-Dialog des Projekts ändern. Video-Export wird erst möglich, wenn sie einen Encoder ausgewählt haben. No video format selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an video format to use! Für den Video-Export ist kein Videoformat ausgewählt. Sie können dies im Eigenschaften-Dialog des Projekts ändern. Video-Export wird erst möglich, wenn sie ein Videoformat ausgewählt haben. Export to video file In Videodatei exportieren No default output file name defined. Check your settings in the properties dialo of the project! Kein Standardnamen für die Ausgabedatei vorgegeben. Überprüfen sie die Einstellungen im Eigenschaften-Dialog des Projektes! The selected encoder is not valid. Check your settings in the properties dialog of the project! Der gewählte Encoder ist nicht gültig. Überprüfen sie die Einstellungen im Eigenschaften-Dialog des Projektes! Export to file In Datei exportieren <h4>Configure Application</h4> <p>This will opens a window where you can <em>configure</em> the application with various settings.</p> <h4>Applikation konfigurieren</h4> <p>Dies öffnet ein Fenster in dem sie die Applikation mit verschiedenen Werten <em>konfigurieren</em> können</p> <h4>Help</h4> <p>This button will bring up a dialog with the qStopMotion manual</p> <h4>Hilfe</h4> <p>Dieser Knopf führt sie zum qStopMotion Handbuch</p> Help Hilfe Choose project file Wählen sie eine Projekt-Datei Save As Speichern als PreferencesTool DOM Parser DOM Parser Couldn't open XML file: %1 XML Datei kann nicht geöffnet werden: %1 Parse error at line %1, column %2: %3 %4 Fehler beim verarbeiten in Zeile %1, Spalte %2: %3 %4 Critical Kritisch Can't remove preferences backup file! Sicherheitskopie der Einstellungsdatei kann nicht gelöscht werden! Can't copy preferences file to backup file! Einstellungsdatei kann nicht in Sicherungskopie kopiert werden! ProjectDialog Properties Eigenschaften Apply Anwenden Close Schließen Animation Project Properties Eigenschaften des Animationsprojektes Image Import Bildimport Image Transformation Bildumwandlung Video Export Video Export Project Preferences Projektspezifische Einstellungen Image &Import Bild&import Image &Transformation Bild&umwandlung &General Settings &Allgemeine Einstellungen &Project Values &Projekteinstellungen &Image Import &Bildimport Video &Export Video &Export ProjectSerializer DOM Parser DOM Parser Couldn't open XML file: %1 XML Datei kann nicht geöffnet werden: %1 Parse error at line %1, column %2: %3 %4 Fehler beim verarbeiten in Zeile %1, Spalte %2: %3 %4 Critical Kritisch Can't remove old backup of project file! Die alte Sicherheitskopie der Projektdatei kann nicht gelöscht werden! Can't rename project file to backup! Projektdatei kann nicht zur Sicherung umbenannt werden! Can't copy the project file to backup! Projektdatei kann nicht zur Sicherung kopiert werden! Can't remove the old project file! Alte Projektdatei kann nicht gelöscht werden! Can't create project directory! Projektverzeichnis kann nicht erzeugt werden! Can't change permissions of the project directory! Die Zugriffsrechte des Projektverzeichnisses können nicht geändert werden! Can't create image directory! Bilderverzeichnis kann nicht erzeugt werden! Can't change permissions of the image directory! Die Zugriffsrechte des Bildverzeichnisses können nicht geändert werden! Can't create sound directory! Tonverzeichnis kann nicht erzeugt werden! Can't change permissions of the sound directory! Die Zugriffsrechte des Tonverzeichnisses können nicht geändert werden! ProjectTab Choose frames to add Wählen sie Bilder zum hinzufügen Warning Warnung Project Tree Projektbaum Scenes Szenen Takes Aufnahmen Frames Bilder Edit Bearbeiten Scene 000 Szene 000 Take 00 Aufnahme 00 You do not have Gimp installed on your system Gimp ist auf Ihrem Computer nicht installiert There is no active frame to open Es ist kein Bild zum öffnen ausgewählt The active frame is corrupt Das ausgewählte Bild ist beschädigt Failed to start Gimp! Der Start von Gimp ist fehlgeschlagen! <h4>Insert new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>insert</em> it bevor the selected scene.</p> <h4>Einfügen einer neuen Szene (CTRL+E)</h4> <p>Betätige diesen Knopf um eine neue <em>Szene</em> zu erzeugen und vor der ausgewählten Szene <em>einzufügen</em>.</p> Insert Take Aufnahme einfügen No scene selected. Please select a scene in the project tree. Keine Szene ausgewählt. Bitte eine Szene im Projektbaum auswählen. Add Take Aufnahme hinzufügen Insert Frames Bilder einfügen No take selected. Please select a take in the project tree. Keine Aufnahme ausgewählt. Bitte eine Aufnahme im Projektbaum auswählen. Add Frames Bilder hinzufügen <h4>Append new Scene (CTRL+E)</h4> <p>Click this button to create a new <em>scene</em> and <em>append</em> it at the end of the animation.</p> <h4>Einfügen einer neuen Szene (CTRL+E)</h4> <p>Betätige diesen Knopf um eine neue <em>Szene</em> zu erzeugen und am Ende der Animation <em>anzuhängen</em>.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>scene</em> from the animation.</p> <h4>Lösche Scene (SHIFT+Delete)</h4> <p>Betätige diesen Knopf um die ausgewählte <em>Szene</em> zu <em>löschen</em>.</p> <h4>Insert new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>insert</em> it bevor the selected take.</p> <h4>Einfügen einer neuen Aufnahme (CTRL+E)</h4> <p>Betätige diesen Knopf um eine neue <em>Aufnahme</em> zu erzeugen und vor der ausgewählten Aufnahme <em>einzufügen</em>.</p> <h4>Append new Take (CTRL+E)</h4> <p>Click this button to create a new <em>take</em> and <em>append</em> it to the end of the scene.</p> <h4>Einfügen einer neuen Aufnahme (CTRL+E)</h4> <p>Betätige diesen Knopf um eine neue <em>Aufnahme</em> zu erzeugen und an das Ende der Szene <em>anzuhängen</em>.</p> <h4>Remove Take (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>take</em> from the animation.</p> <h4>Lösche Aufnahme (SHIFT+Delete)</h4> <p>Betätige diesen Knopf um die ausgewählte <em>Aufnahme</em> zu <em>löschen</em>.</p> <h4>Insert Frames (CTRL+F)</h4> <p>Click on this button to <em>insert frames</em> bevor the selected frame.</p> <h4>Einfügen von Bildern (CTRL+F)</h4> <p>Betätige diesen Knopf um neue <em>Bilder</em> vor dem ausgewählten Bild <em>einzufügen</em>.</p> <h4>Append Frames (CTRL+F)</h4> <p>Click on this button to <em>append frames</em> at the end of the take.</p> <h4>Einfügen von Bildern (CTRL+F)</h4> <p>Betätige diesen Knopf um neue <em>Bilder</em> am Ende der Aufnahme <em>anzuhängen</em>.</p> <h4>Remove Frame (Delete)</h4> <p>Click this button to <em>remove</em> the selected <em>frame</em> from the take.</p> <h4>Lösche Bild (SHIFT+Delete)</h4> <p>Betätige diesen Knopf um das ausgewählte <em>Bild</em> zu <em>löschen</em>.</p> <h4>Launch Photo Editor</h4> <p>Click this button to open the active frame in the photo editor</p> <p>Note that you can also drag images from the frame bar and drop them on the photo editor</p> <h4>Öffne Bildbearbeitungsprogramm</h4> <p>Betätige diesen Knopf um das Bildbearbeitungsprogramm zu öffnen</p> <p>Es ist auch möglich, Bilder von der Zeitleiste in das Bildbearbeitungsprogramm zu verschieben.</p> ProjectWidget Recording Aufnahme Single frame capture Aufnehme einzelner Bilder Camera Kamera Test Source Test Quelle USB Source USB Quelle FireWire Source FireWire Quelle DirectShow Source DirectShow Quelle Image grabber settings Einstellungen Bildquelle Video 4 Linux (USB WebCam) Video 4 Linux (USB WebCam) IEEE 1394 (FireWire DigiCam) IEEE 1394 (FireWire DigiCam) Video 4 Linux 2 (USB WebCam) Video 4 Linux 2 (USB WebCam) gphoto (USB Compact Camera) gphoto (USB Kompaktkamera) Media Foundation Media Foundation Capture Aufnahme Mix Mischen Diff Unterschied Playback Playback Auto Auto Pr sec pro Sekunde Pr min pro Minute Pr hr pro Stunde Number of images: Anzahl der Bilder: <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Anzahl der Bilder</h4> <p>Mit diesem Regler können sie einstellen, wieviele Vorgänger-Bilder der Animation im Kamerabild eingeblendet werden sollten. Im playback-Modus: wie viele Bilder abgespielt werden. </p> <p>Dadurch können sie besser sehen wie das nächste Bild im Verhältnis zu den vorhergehenden Bildern sein wird. Dies ermöglicht gleichmässige Bewegungsabläufe!</p> FPS chooser Bilder pro Sekunde Einstellung <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Bilder pro Sekunde</h4> <p>Hiermit können sie die Geschwindigkeit einstellen, mi der die Animation im <b>Bildbetrachter</b> abläuft.</p> <p>Um die Animation zu starten, drücken sie den <b>Start</b> Knopf.</p> QtFrontend Check Permissions Zugriffsreche überprüfen You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on ~/.qstopmotion Sie haben nicht die notwendigen Rechte, um qStopMotion zu verwenden. Sie benötigen Rechte zum lesen, schreiben und ausführen im Verzeichnis ~/.qstopmotion qStopMotion qStopMotion Recovery Wiederherstellung Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? Es sieht so aus, als wurde qStopmotion bei der letzten Nutzung nicht ordentlich beendet. Möchten Sie die letzte Sitzung wiederherstellen? Recover project Wiederherstellungsprojekt Recover scene Wiederherstellungsszene Recover take Wiederherstellungsaufnahme Create directory Verzeichnis erstellen You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. Sie haben nicht die notwendigen Rechte, um qStopMotion zu verwenden. Sie benötigen Rechte zum erzeugen des Verzeichnisses .qstopmotion in Ihrem Home-Verzeichnis. You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. Sie haben nicht die notwendigen Rechte, um qStopMotion zu verwenden. Sie benötigen Rechte zum lesen, schreiben und ausführen im Verzeichnis .qstopmotion &Yes &Ja &No &Nein &OK &OK qStopMotion - Recovered Project qStopMotion - Wiederhergestelltes Projekt RecordingTab Camera Kamera Test Source Test Quelle USB Source USB Quelle FireWire Source FireWire Quelle DirectShow Source DirectShow Quelle Capture Aufnahme Recording Aufnahme Single frame capture Aufnahme einzelner Bilder Video Source: Video Quelle: Resolution: Auflösung: Mix Mischen Diff Unterschied Playback Playback <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Kamera ein/aus (K)</h4> <p>Hiermit können sie die Kamera ein- und ausschalten</p> Number of images: Anzahl der Bilder: <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Anzahl der Bilder</h4> <p>Mit diesem Regler können sie einstellen, wieviele Vorgänger-Bilder der Animation im Kamerabild eingeblendet werden sollten. Im playback-Modus: wie viele Bilder abgespielt werden. </p> <p>Dadurch können sie besser sehen wie das nächste Bild im Verhältnis zu den vorhergehenden Bildern sein wird. Dies ermöglicht gleichmässige Bewegungsabläufe.</p> Not Supported Wird nicht unterstützt Information Information No active project. Please create a new project or open an existing project. Es ist kein Projekt aktiv. Bitte ein neues Projekt erzeugen oder ein existierendes Projekt öffnen. No scene and no take selected. Please select a scene and a take on the project tab. Es ist keine Szene und keine Aufnahme ausgewählt. Bitte auf der Projektseite eine Szene und eine Aufnahme auswählen. No take selected. Please select a take on the project tab. Es ist keine Aufnahme ausgewählt. Bitte auf der Projektseite eine Aufnahme auswählen. Auto Auto Pr sec pro Sekunde Pr min pro Minute Pr hr pro Stunde Scene You do not have permission to read that file Sie haben nicht das Recht diese Datei zu lesen Add Exposure Bild hinzufügen Importing exposures from disk ... Importieren der Bilder von der Festplatte ... You do not have permission to read Sie haben nicht das Recht zu lesen file(s) Datei(en) Critical Kritisch Can't remove sound file! Tondatei kann nicht gelöscht werden! Can't copy sound file! Tondatei kann nicht kopiert werden! Can't move sound file! Tondatei kann nicht verschoben werden! StartDialog <h2>Create a new Project</h2> <h2>Neues Projekt beginnen</h2> Start a new Project. Ein neues Projekt beginnen. <h2>Open last Project</h2> <h2>Das letzte Projekt öffnen</h2> Project path: Pfad zum Projekt: <h2>Open project file</h2> <h2>Projektdatei öffnen</h2> Open and continue a existing project. Öffnen und fortsetzen eines existierenden Projektes. &OK &OK &Close &Schließen Take You do not have permission to read that file Sie haben nicht das Recht diese Datei zu lesen Add Exposure Bild hinzufügen Importing exposures from disk ... Importieren der Bilder von der Festplatte ... You do not have permission to read Sie haben nicht das Recht zu lesen file(s) Datei(en) TimeLine Load images to time line Laden der Bilder in die Zeitleiste ToolBar Running animation Animation abspielen <h4>Play animation (K, P)</h4> <h4>Animation abspielen</h4> <h4>First frame of the take (J, Left)</h4> <h4>Erstes Bild der Aufnahme (J, Links)</h4> <h4>Previous frame (J, Left)</h4> <h4>ein Bild zurück</h4> <h4>Next frame (L, Right)</h4> <h4>ein Bild vor</h4> <h4>Last frame of the take (L, Right)</h4> <h4>Letztes Bild der Aufnahme (L, Rechts)</h4> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Bild aufnehmen (Leertaste)</h4> <p>Mit diesem Knopf können sie einzelne Bilder aufnehmen und der Animation hizufügen. Das geht auch in dem sie die <b>Leertaste</b> drücken</p> TransformWidget Transformation settings Einstellungen Bildumwandlung Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping. Unten können sie auswählen, welche Bilderumwandlung verwendet werden soll, um Bilder eines neues Projektes umzuwandeln. Wenn sie ausschneiden auswählen müssen sie auch die Ausrichtung einstellen. Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping. Unten können sie auswählen, welche Bilderumwandlung verwendet werden soll, um Bilder des aktuellen Projektes umzuwandeln. Wenn sie ausschneiden auswählen müssen sie auch die Ausrichtung einstellen. Scale the whole image Gesamtes Bild skalieren Clip a part of the image Ausschneiden eines Teiles des Kamerabildes Zoom the image Vergrößern des Kamerabildes Zoom settings Vergrößerungseinstellungen Zoom value: Vergrößerungswert: 0% 0% 100% 100% UndoExposureAdd Add exposure (%1,%2,%3) '%4' Bild hinzufügen (%1,%2,%3) '%4' UndoExposureInsert Insert exposure (%1,%2,%3) '%4' Bild einfügen (%1,%2,%3) '%4' UndoExposureMove Move exposure (%1,%2,%3) Bild verschieben (%1,%2,%3) UndoExposureRemove Remove exposure (%1,%2,%3) Bild löschen (%1,%2,%3) UndoExposureSelect Select exposure (%1,%2,%3)-->(%4,%5,%6) Bild auswählen (%1,%2,%3)-->(%4,%5,%6) UndoProjectNew New project '%1' Neues Projekt '%1' UndoProjectOpen Open project '%1' Projekt öffnen '%1' UndoSceneAdd Add scene (%1) '%2' Szene hinzufügen (%1) '%2' UndoSceneInsert Insert scene (%1) '%2' Szene einfügen (%1) '%2' UndoSceneMove Move scene (%1,%2) Szene verschieben (%1,%2) UndoSceneRemove Remove scene (%1) Szene löschen (%1) UndoSceneSelect Select scene (%1)-->(%2) Szene auswählen (%1)-->(%2) UndoTakeAdd Add take (%1,%2) '%3' Aufnahme hinzufügen (%1,%2) '%3' UndoTakeInsert Insert take (%1,%2) '%3' Aufnahme einfügen (%1,%2) '%3' UndoTakeMove Move take (%1,%2) Aufnahme verschieben (%1,%2) UndoTakeRemove Remove take (%1,%2) Aufnahme löschen (%1,%2) UndoTakeSelect Select take (%1,%2)-->(%3,%4) Aufnahme auswählen (%1,%2)-->(%3,%4) qstopmotion-2.3.2-Source/translations/qstopmotion_cs.qm000644 000000 000000 00000173766 13011043104 023476 0ustar00rootroot000000 000000 $v.0=>I>,u>5y@#AujZQ6 56C6ޅ$s=~`Em}#TD'^#8En]FɮicUNu.\we@ELpAqY+.Pzt 5#*5 J} K4I|qz7. C7 C!@7#G#G'B~ M%M%.NVnniuhqNwzG@v90BA2<˼IsCn) P9cZvyvNƒsլjZCJ؃Ęorvܓ~釥sw::B.l$ *a15^&H;^Se[7l 2l 2vO{.*m45f{.!t6oVno5I*VnT_T ')GIPYrZ-]hB`^ullV6HѣLնPdwlr֣ ֣hF07܄!1E t GZN ֑Bn[3jz >2N^C^z~GSJ ~x4#M#+X {JNw+[6nN=WPO\!]]g!oc)FzD{^ګ}d#օ5d_Q,AO*AW/ӏ9! Q" #^ 4N S +3 Z4 .89 5x 5 Ehs Po [‚E h> h>A h>w; h>` larD qT^ zo | t C9; m @j* Ƚ.K ȽQ t II . # q"i *ʊ 52 [5 ees ee hh h hв s( saq xj ^ s`_ sa !  IR RP v vR n ۰3 1 ̉t  S ! &i2 ;  b`V f pP~_ yNÍ |> ~s E  =   c <9 ͷ)u > 8J  >T ЧV / -duj 0 Gj Gj KC ]= ],0 ]Mk gޛ k}KL oVk oX +!4 +  ű Yf D; 1e v I, IM Fcz 8  ߚ 4: 4 Ps-= bq6X  _ ,y;G ?N Mԇ W%x `jN' i$D, w9 PS P  P/' PQ N P y- yPtST7OfGc LN~Hs^&mY@.d06;%S|Vȑ3`kv>hjw5v oaG7]t<\t~pGPOT.`h#;c͟k nuȺ5Du<~ vÓEy)-y)P)4bFEiq&O programu&About AboutDialog&Povolen&Licence Agreement AboutDialog&Systm &System Info AboutDialog&Podkovn &Thanks To AboutDialog&AutoYiA&uthors AboutDialogO programuAbout AboutDialog( as sestaven: %1 %2Build time: %1 %2 AboutDialogPYispvatel Contributors AboutDialog eatinaCzech AboutDialogDnatinaDanish AboutDialogFrancouzatinaFrench AboutDialogNm inaGerman AboutDialogHlavn vvojYiMain developers AboutDialogOKOK AboutDialogDNzev a verze opera nho systmu: #Operating system name and version:  AboutDialog"Bhov verze Qt: Qt runtime version:  AboutDialog`vdatinaSwedish AboutDialogToto je program qStopMotion, kter je ur en k vytvYen animovanch filmo dlanch technikou pooknkov nebo tak fzov animace.HThis is the qStopMotion application for creating stop motion animations. AboutDialogdTento program je aYen za podmnek licence GPL v2.:This program is distributed under the terms of the GPL v2. AboutDialogPYeklad Translation AboutDialogNeznm Mac OSUnknown Mac OS AboutDialog$Neznm Windows OSUnknown Windows OS AboutDialogVerze:  Version:  AboutDialogaand AboutDialogzqStopMotion vznikl odvozenm z programu stopmotion pro Linux..qStopMotion is a fork of stopmotion for linux. AboutDialogPYidat zvuk Add SoundAnimationProjectfVybran soubor se zznamem zvuku nelze otevYt pro  ten. ProvYte, ~e jsou oprvnn nastavena sprvn. Animace bude, v pYpad ~e se rozhodnete pro pYehrn, pYehrna bez zvuku.Cannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play.AnimationProject:Vjevy se ukldaj na disk...Saving scenes to disk ...AnimationProjectVybran soubor se zznamem zvuku nen v platnm zvukovm formtu. Animace bude, v pYpad ~e se rozhodnete pro pYehrn, pYehrna bez zvuku.The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play.AnimationProject&ZavYt&CloseCameraControllerDialog4&Nastavit znovu na vchoz&Reset to DefaultCameraControllerDialogFZruait nastaven na vchoz hodnoty Abort ResetCameraControllerDialogLAutomatick vyrovnn osvtlen zezadu Automatic Backlight CompensationCameraControllerDialogAutomatick jasAutomatic BrightnessCameraControllerDialog4Automatick povolen barvyAutomatic Color EnableCameraControllerDialog(Automatick kontrastAutomatic ContrastCameraControllerDialog*Automatick nasvcenAutomatic ExposureCameraControllerDialog4Automatick ostrost obrazuAutomatic FocusCameraControllerDialog(Automatick zeslenAutomatic GainCameraControllerDialog Automatick gamaAutomatic GammaCameraControllerDialog4Automatick barevn odstn Automatic HueCameraControllerDialog8Automatick stntko (clona)Automatic IrisCameraControllerDialog>Automatick smyk (pohyb kamery) Automatic PanCameraControllerDialog$Automatick to enAutomatic RollCameraControllerDialog$Automatick sytostAutomatic SaturationCameraControllerDialog&Automatick ostrostAutomatic SharpnessCameraControllerDialog*Automatick naklonnAutomatic TiltCameraControllerDialog2Automatick vyv~en blAutomatic White BalanceCameraControllerDialog(Automatick zvtaenAutomatic ZoomCameraControllerDialog6Vyrovnn osvtlen zezadu:Backlight Compensation:CameraControllerDialogJas: Brightness:CameraControllerDialogXzen kameryCamera ControlCameraControllerDialogPovolen barvy: Color Enable:CameraControllerDialogKontrast: Contrast:CameraControllerDialogOsvtlen: Exposure:CameraControllerDialogZaostYen:Focus:CameraControllerDialogZeslen:Gain:CameraControllerDialog Gama:Gamma:CameraControllerDialogOdstn:Hue:CameraControllerDialogStntko:Iris:CameraControllerDialog Smyk:Pan:CameraControllerDialogJNastavit kameru na vchoz hodnoty...Reset Camera Settings...CameraControllerDialog6Obnovit nastaven kamery...Restore Camera Settings...CameraControllerDialogTo en:Roll:CameraControllerDialogSytost: Saturation:CameraControllerDialogOstrost: Sharpness:CameraControllerDialogNaklonn:Tilt:CameraControllerDialogJakost obrazu Video QualityCameraControllerDialogVyv~en bl:White Balance:CameraControllerDialogZvtaen:Zoom:CameraControllerDialog:Xzen kamery pro qStopMotionqStopMotion Camera ControllerCameraControllerDialogZ&ruait&CancelDescriptionDialog&OK&OKDescriptionDialog &Popis projektu:&Project Description:DescriptionDialogPopis &vjevu:&Scene Description:DescriptionDialogPopis &zbru:&Take Description:DescriptionDialogInformace InformationDescriptionDialogPopis projektuProject DescriptionDescriptionDialogPopis vjevuScene DescriptionDescriptionDialogPopis zbruTake DescriptionDescriptionDialogPZnak '|' nen v popisu projektu dovolen.Snmko za sekundu</h4> <p>Zmnou hodnoty v tomto voli i mo~ete nastavit rychlost, se kterou se animace odvj v <b>zobrazen snmko</b>.</p> <p>Pro spuatn animace stisknte tla tko <b>PYehrt</b>.</p>

FPS chooser

By changing the value in this chooser you set which speed the animation in the FrameView should run at.

To start an animation press the Run Animation button.

 ExportWidgetAVIAVI ExportWidgetN~e mo~ete vybrat, kter program se m pou~t na zakdovn novho projektu do souboru s obrazovm zznamem.ZBelow you can set which program should be used for encoding a new project to a video file. ExportWidgetN~e mo~ete vybrat, kter program se m pou~t na zakdovn nyn  innho projektu do souboru s obrazovm zznamem.iBelow you can set which program should be used for encoding the currently active project to a video file. ExportWidgetProchzetBrowse ExportWidget,Vybrat vstupn souborChoose output file ExportWidgetChcete bt dotazovn na nzev vstupnho souboru poka~d, kdy~ si vyberete vyveden projektu do souboru?JDo you want to be asked for an output file everytime you choose to export? ExportWidgetProgram kodru:Encoder Application: ExportWidget Nastaven kodruEncoder settings ExportWidget*Velikost oknka filmu Frame Size ExportWidget$Snmko za sekundu:Frames per Second: ExportWidget*Full HD (1900 x 1080)Full HD (1900x1080) ExportWidget*HD Ready (1280 x 720)HD Ready (1280x720) ExportWidgetMP4MP4 ExportWidgetNeNo ExportWidget8Nastaven vstupnho souboruOutput file settings ExportWidget"PAL D (704 x 576)PAL D (704x576) ExportWidget QVGA (320 x 240)QVGA (320x240) ExportWidget SVGA (800 x 600)SVGA (800x600) ExportWidgetTVyberte vstupn nzev vstupnho souboru:Set default output file: ExportWidgetVGA (640 x 480) VGA (640x480) ExportWidget Obrazov formt: Video Format: ExportWidget Velikost obrazu: Video Size: ExportWidgetAnoYes ExportWidget ffmpegffmpeg ExportWidget libavlibav ExportWidget`Obrzek nelze koprovat do adresYe s projektem!.Can't copy the image to the project directory!ExposurepObrzek nelze koprovat do adresYe s do asnmi soubory!0Can't copy the image to the temporary directory!ExposureXObrzek nelze v adresYi s projektem smazat!2Can't remove the image from the project directory!ExposurehObrzek nelze v adresYi s do asnmi soubory smazat!2Can't remove the image in the temporary directory!ExposureObrzek nelze v novm formtu ulo~it do adresYe s do asnmi soubory!GCan't save the image in the new file format to the temporary directory!Exposure Va~nCriticalExposure ZavYtCloseExternalCommandDialogNepodaYilo se!Failed!ExternalCommandDialog$Vstup do programu:Input to program:ExternalCommandDialog2Vstup z vnjaho pYkazuOutput from external commandExternalCommandDialogVsledekResultExternalCommandDialog PoslatSubmitExternalCommandDialogPodaYilo se! Successful!ExternalCommandDialog Pou~tApply GeneralDialog ZavYtClose GeneralDialog Obecn nastavenGeneral Settings GeneralDialog"Zachytva obrazuGrabber GeneralDialog Zaveden obrzku Image Import GeneralDialogPromna obrzkuImage Transformation GeneralDialog2Nastaven novho projektuNew Project Values GeneralDialogNastaven Preferences GeneralDialogVyveden obrazu Video Export GeneralDialog*Nastaven qStopMotionqStopMotion Preferences GeneralDialoghVlo~en novho oknka (snmku filmu) na konec zbru'Append new frame at the end of the take GeneralWidget:Funkce zachytvacho tla tkaCapture Button Functionality GeneralWidget BarvaColor GeneralWidget"Barva  ar mY~ky: Grid Color: GeneralWidget ry mY~kyGrid Functionality GeneralWidget*Po et vodorovnch  arHorizontal Lines GeneralWidgetlVlo~en novho oknka za vybran oknko (snmek filmu)%Insert new frame after selected frame GeneralWidgetpVlo~en novho oknka pYed vybran oknko (snmek filmu)%Insert new frame bevor selected frame GeneralWidget JazykLanguage GeneralWidget$Po et svislch  arVertical Lines GeneralWidgetZde mo~ete vybrat, kter zachytva (digitalizace obrazu) se m pou~t, pro zachytvn (nahrvn) obrzko z kamery. Ovldacho spna e lze pou~t na Yzen ostYen obrazu, pYibli~ovn a oddalovn a jin funkce, kdy~ je dostupn.Below you can select which image grabber should be used for grabbing images from the camera. If available the controller can be used to control focus, zoom and other functionality. GrabberWidget@Ovldac spna kamery (pokusn) Camera Controller (Experimental) GrabberWidget.Zdroj Gphoto2 (pokusn)Gphoto2 Source (Experimental) GrabberWidget4Funkce digitalizace obrazuGrabber Functionality GrabberWidgetInformace Information GrabberWidget@Zdroj Microsoft Media Foundation!Microsoft Media Foundation Source GrabberWidgethPro zapnut zmn spusete, prosm, qStopMotion znovu!4Pease restart qStopMotion to activate the changings! GrabberWidget.Zdroj Video pro Linux 2Video 4 Linux 2 Source GrabberWidget &Zpt &Backward HelpBrowser&ZavYt&Close HelpBrowser &VpYed&Forward HelpBrowser&Na za tek&Home HelpBrowserBProhl~e npovdy ke qStopMotionqStopMotion Help Browser HelpBrowser:PYezkouaet zachytva obrzkoCheck image grabberImageGrabberFacade0PYezkouaet zdroj obrzkoCheck image sourcesImageGrabberFacadejSpuatn zachytva e obrzko (digitalizace obrazu) se nezdaYila. To se mo~e pYihodit, kdy~ se chce nahrvat ruaenho zaYzen. Vyberte, prosm, na kart pro nahrvn jin zaYzen.Image grabber initialization failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab.ImageGrabberFacadeNebyl nalezen ~dn pou~iteln zdroj obrzko pro obrazov zznam. PYipojte, prosm, zaYzen pro prci s obrazem k po ta i.SNo usable video image source found. Please connect on video device on the computer.ImageGrabberFacade0,10.1 ImportWidget5,05.0 ImportWidgetBMPBMP ImportWidgetN~e mo~ete vybrat, kter zdroje obrzko se maj pou~vat pro zavdn obrzko do novho projektu.[Below you can set which image sources should be used for importing images to a new project. ImportWidgetN~e mo~ete vybrat, kter zdroje obrzko se maj pou~vat pro zavdn obrzko do nynjaho projektu.jBelow you can set which image sources should be used for importing images to the currently active project. ImportWidget>Vchoz velikost zdroje obrzkoDefault Grabber Size ImportWidget$Snmko za sekundu:Frames per second: ImportWidget*Full HD (1900 x 1080)Full HD (1900x1080) ImportWidget*HD Ready (1280 x 720)HD Ready (1280x720) ImportWidget"Obrzkov formt: Image Format: ImportWidgetJakost obrzku:Image Quality: ImportWidget"Velikost obrzku: Image Size: ImportWidget4Nastaven zaveden obrzkuImage import settings ImportWidgetJPEGJPEG ImportWidget0Nastaven ~ivho pohleduLive view settings ImportWidgetNejvtaMax ImportWidgetNejmenaMin ImportWidget"PAL D (704 x 576)PAL D (704x576) ImportWidget QVGA (320 x 240)QVGA (320x240) ImportWidget SVGA (800 x 600)SVGA (800x600) ImportWidgetTIFFTIFF ImportWidgetVGA (640 x 480) VGA (640x480) ImportWidget&O programu&About MainWindowGUI.Ovldac spna &kamery&Camera Controller MainWindowGUIp&ravy&Edit MainWindowGUI&Vyvst&Export MainWindowGUI&Soubor&File MainWindowGUINpo&vda&Help MainWindowGUI &Nov&New MainWindowGUI&OtevYt&Open MainWindowGUI&Ukon it&Quit MainWindowGUI&Ulo~it&Save MainWindowGUI &Zpt&Undo MainWindowGUI$Seznam kroko &zpt &Undo stack MainWindowGUI &Okna&Windows MainWindowGUI<h4>O Qt</h4> <p>Tmto se uk~e mal informa n okno, v nm~ si mo~ete pYe st vaeobecn informace o knihovn Qt.</p>

About Qt

This will display a small information box where you can read general information about the Qt library.

 MainWindowGUIN<h4>O programu</h4> <p>Tmto se uk~e mal informa n pole, v nm~ si mo~ete pYe st vaeobecn informace a rovn~ jmno vvojYe tohoto vynikajcho kusu programu.</p>

About

This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.

 MainWindowGUI<h4>Cinelerra</h4> <p>vyvede nynja animaci jako projekt programu <em>cinelerra-cv</em>.</p>PYi tomto budete vedeni provodcem.

Cinelerra

Exports the current animation as a cinelerra-cv project.

You will be given a wizard to guide you. MainWindowGUI<h4>ID snmku</h4><p>Toto pole ukazuje ID nyn vybranho snmku</p>W

Exposure ID

This area displays the id of the currently selected exposure

 MainWindowGUI0<h4>Zobrazen snmko</h4><p> V tto oblasti vidte vybran snmek (obrzek). Zde se tak pYehrvaj animace, kdy~ stisknete tla tko <b>PYehrt</b>.</p>

FrameView

In this area you can see the selected frame. You can also play animations in this window by pressing the Play button.

 MainWindowGUI<h4>Npovda</h4> <p>Tmto tla tkem se vyvol pYru ka qStopMotion</p>S

Help

This button will bring up a dialog with the qStopMotion manual

 MainWindowGUIf<h4>Nov</h4> <p>VytvoY <em>nov</em> project.</p>3

New

Creates a new project.

 MainWindowGUI<h4>OtevYt</h4> <p><em>otevYe</em> soubor s projektem qStopMotion.</p>?

Open

Opens a qStopMotion project file.

 MainWindowGUI<h4>Nastaven programu</h4> <p>Tmto se otevYe okno, v nm~ mo~ete <em>zmnit</em> nastaven programu.</p>

Preferences of the application

This will opens a window where you can change the preferences of the application.

 MainWindowGUI<h4>ID projektu</h4><p>Toto pole ukazuje ID nyn  innho projektu</p>S

Project ID

This area displays the id of the currently active project

 MainWindowGUI<h4>Vlastnosti projektu</h4> <p>Tmto se otevYe okno, v nm~ mo~ete <em>zmnit</em> vlastnosti projektu.</p>

Properties of the project

This will opens a window where you can change properties of the animation project.

 MainWindowGUI`<h4>Ukon it</h4> <p><em>ukon </em> program.</p>0

Quit

Quits the program.

 MainWindowGUI<h4>Znovu</h4> <p>Posledn operace bude obnovena. Mo~ete to udlat vcekrt.</p>v

Redo

Redoes your last operation. You can press redo several times to redo several operations.

 MainWindowGUI<h4>Ulo~it jako</h4><em>Ulo~</em> nynja animaci jako soubor s projektem qStopMotion.</p>[

Save As

Saves the current animation as a qStopMotion project file.

 MainWindowGUI<h4>Ulo~it</h4> <p>Ulo~ nynja animaci jako soubor s projektem qStopMotion. </p>

Save

Saves the current animation as a qStopMotion project file.
If this project has been saved before it will automatically be saved to the previously selected file.

 MainWindowGUI<h4>ID vjevu</h4><p>Toto pole ukazuje ID nyn vybranho vjevu</p>Q

Scene ID

This area displays the id of the currently selected scene

 MainWindowGUI<h4>ID zbru</h4><p>Toto pole ukazuje ID nyn vybranho zbru</p>O

Take ID

This area displays the id of the currently selected take

 MainWindowGUI <h4> asov pYmka</h4> <p>V tto oblasti vidte snmky (obrzky) a vjevy animace. Tmito posunujete sem a tam, a tm stavte animaci.</p><p><b>Klvesami aipek</b> nebo <b>x</b> a <b>z</b> se pohybujete mezi snmky (obrzky) vpYed (dala) a zpt (pYedchoz)</p>

TimeLine

In this area you can see the frames and scenes in the animations and build the animation by moving the them around.

You can switch to the next and the previous frame using the arrow buttons or x and z

 MainWindowGUIp<h4>Zpt</h4> <p>Vrt jednu nebo vce operac zpt.</p>u

Undo

Undoes your last operation. You can press undo several time to undo earlier operations.

 MainWindowGUI<h4>Obraz</h4> <p>Vyvede nynja projekt jako <em>soubor s obrazem</em>.</p>PYi tomto budete vedeni provodcem.l

Video

Exports the current project as video.

You will be given a wizard to guide you. MainWindowGUI<h4>Co je to?</h4> <p>Ukazovtko myai se zmn a uk~e npomocn informace o pYedmtu, na kter bylo klepnuto.</p>

What's This

This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.

 MainWindowGUI"Filmy AVI (*.avi)AVI Videos (*.avi) MainWindowGUIO programuAbout MainWindowGUI O &Qt About &Qt MainWindowGUIO QtAbout Qt MainWindowGUIPYidat obrzky Add Frames MainWindowGUIPYidat vjev Add Scene MainWindowGUIPYidat zbrAdd Take MainWindowGUI ZruaitCancel MainWindowGUI4Vyberte soubor s projektemChoose project file MainWindowGUICinelerra Cinelerra MainWindowGUI>VytvY se spojen s kamerou...Connecting camera... MainWindowGUIAngli tinaThis should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German)English MainWindowGUI"Stvajc obrzkyExisting Images MainWindowGUI"Vyvst do souboruExport to file MainWindowGUI6Vyvst do souboru s obrazemExport to video file MainWindowGUIVyvd se... Exporting ... MainWindowGUIID snmku:  Exposure ID:  MainWindowGUINpovdaHelp MainWindowGUIInformace Information MainWindowGUIVlo~it obrzky Insert Frames MainWindowGUIVlo~it vjev Insert Scene MainWindowGUIVlo~it zbr Insert Take MainWindowGUI"Filmy MP4 (*.mp4)MP4 Videos (*.mp4) MainWindowGUINov projekt New project MainWindowGUINestanoven ~dn vchoz nzev pro vstupn soubor. ProvYte nastaven v dialogu vlastnost projektu!`No default output file name defined. Check your settings in the properties dialo of the project! MainWindowGUIPro vyveden obrazovho zznamu nen vybrn ~dn kodr. Toto mo~ete zmnit v dialogu pro nastaveni projektu. vyveden obrazu bude mo~n teprve, a~ vyberete njak kodr. Chcete to udlat nyn?No encoder selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an encoder to use! MainWindowGUIPro vyveden obrazovho zznamu nen vybrn ~dn formt obrazu. Toto mo~ete zmnit v dialogu pro nastaveni projektu. vyveden obrazu bude mo~n teprve, a~ vyberete njak kodr. Chcete to udlat nyn?No video format selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an video format to use! MainWindowGUI OtevYt &nedvn Open &Recent MainWindowGUIOtevYt projekt Open project MainWindowGUINastaven Preferences MainWindowGUI2Nastaven pro qStopMotionPreferences of qStopMotion MainWindowGUIProjektProject MainWindowGUIProjekt (*.%1)Project (*.%1) MainWindowGUIID projektu:  Project ID:  MainWindowGUIVlastnosti Properties MainWindowGUI6Vlastnosti projektu animace#Properties of the animation project MainWindowGUIUkon itQuit MainWindowGUI &ZnovuRe&do MainWindowGUITe!Ready to rumble ;-) MainWindowGUINahrvn Recording MainWindowGUI ZnovuRedo MainWindowGUI Odstranit snmky Remove Frames MainWindowGUISmazat vjev Remove Scene MainWindowGUISmazat zbr Remove Take MainWindowGUIUlo~it &jakoSave &As MainWindowGUIUlo~it jakoSave As MainWindowGUIUlo~it projekt Save project MainWindowGUI&Ulo~it projekt jakoSave project As MainWindowGUIVjev 001 Scene 001 MainWindowGUIID vjevu:  Scene ID:  MainWindowGUI4Vyberte zachytva obrzkoSelect image grabber MainWindowGUIZbr 01Take 01 MainWindowGUIID zbru:  Take ID:  MainWindowGUIProjekt The Project MainWindowGUIZnak '|' nen v nzvu souboru s projektem dovolen a bude odstrann.NThe character '|' is not allowed in the project file name and will be removed. MainWindowGUIV ka~dm adresYi s projektem sm bt jen jeden soubor s projektem.BThe project directory must not contain more than one project file. MainWindowGUIVybran kodr nen nainstalovn na vaaem po ta i. Kodr nainstalujte nebo vyberte jin!bThe selected encoder is not installed on your computer. Install the encoder or select another one! MainWindowGUIV otevYenm projektu jsou njak obrzky. Chcete tyto obrzky pYevst do novho souborovho formtu nebo do nov jakosti?oThere are some images in the open project. Do you want to convert the images to the new file format or quality? MainWindowGUINJsou neulo~en zmny. Chcete je ulo~it?/There are unsaved changes. Do you want to save? MainWindowGUIZptUndo MainWindowGUINeulo~en zmnyUnsaved changes MainWindowGUI ObrazVideo MainWindowGUIVarovnWarning MainWindowGUICo je &toto What's &This MainWindowGUICo je toto What's This MainWindowGUIMuste vybrat njak zachytva obrzko, kter se bude pou~vat. Toto se d nastavit nabdce pro nastaven.TYou have to define an image grabber to use. This can be set in the preferences menu. MainWindowGUIMuste vybrat njak zachytva obrzko, kter se bude pou~vat. Toto se d nastavit na kart pro nahrvn.VYou have to define an image grabber to use. This can be set on the recording tool tab. MainWindowGUIDqStopMotion - Nov projekt animace#qStopMotion - New Animation Project MainWindowGUI>qStopMotion - Seznam kroko zptqStopMotion - Undo stack MainWindowGUItSoubor s nastavenm nelze koprovat do souboru se zlohou!+Can't copy preferences file to backup file!PreferencesToolbZlo~n soubor souboru s nastavenm nelze smazat!%Can't remove preferences backup file!PreferencesToolHNepodaYilo se otevYt soubor XML: %1Couldn't open XML file: %1PreferencesTool Va~nCriticalPreferencesTool4Syntaktick analyztor DOM DOM ParserPreferencesToolfChyba pYi zpracovn na Ydku %1, sloupec %2: %3 %4(Parse error at line %1, column %2: %3 %4PreferencesTool6Vlastnosti projektu animaceAnimation Project Properties ProjectDialog Pou~tApply ProjectDialog ZavYtClose ProjectDialog Zaveden obrzku Image Import ProjectDialogPromna obrzkuImage Transformation ProjectDialogVlastnosti Properties ProjectDialogVyveden obrazu Video Export ProjectDialogfNelze zmnit pYstupov prva k adresYi s obrzky!0Can't change permissions of the image directory!ProjectSerializerjNelze zmnit pYstupov prva k adresYi s projektem!2Can't change permissions of the project directory!ProjectSerializerdNelze zmnit pYstupov prva k adresYi se zvuky!0Can't change permissions of the sound directory!ProjectSerializerrSoubor s projektem nelze koprovat do souboru se zlohou!&Can't copy the project file to backup!ProjectSerializerBNelze vytvoYit adresY s obrzky!Can't create image directory!ProjectSerializerFNelze vytvoYit adresY s projektem!Can't create project directory!ProjectSerializer@Nelze vytvoYit adresY se zvuky!Can't create sound directory!ProjectSerializerlStar zlo~n soubor souboru s projektem nelze smazat!(Can't remove old backup of project file!ProjectSerializerLStar soubor s projektem nelze smazat!"Can't remove the old project file!ProjectSerializerHNepodaYilo se otevYt soubor XML: %1Couldn't open XML file: %1ProjectSerializer Va~nCriticalProjectSerializer4Syntaktick analyztor DOM DOM ParserProjectSerializerfChyba pYi zpracovn na Ydku %1, sloupec %2: %3 %4(Parse error at line %1, column %2: %3 %4ProjectSerializer<h4>PYipojen snmko (Ctrl+F)</h4> <p>Klepnte na toto tla tko pro <em>pYipojen snmko</em> na konec zbru.</p>m

Append Frames (CTRL+F)

Click on this button to append frames at the end of the take.

 ProjectTab4<h4>PYipojen novho vjevu (Ctrl+E)</h4> <p>Klepnte na toto tla tko pro vytvoYen novho <em>vjevu</em> a pro <em>pYipojen</em> animace na konec.</p>

Append new Scene (CTRL+E)

Click this button to create a new scene and append it at the end of the animation.

 ProjectTab<<h4>PYipojen novho zbru (Ctrl+E)</h4> <p>Klepnte na toto tla tko pro vytvoYen novho <em>zbru</em> a pro jeho <em>pYipojen</em> na konec vjevu.</p>

Append new Take (CTRL+E)

Click this button to create a new take and append it to the end of the scene.

 ProjectTab<h4>Vlo~en snmko (Ctrl+F)</h4> <p>Klepnte na toto tla tko pro <em>vlo~en snmko</em> pYed vybran snmek.</p>o

Insert Frames (CTRL+F)

Click on this button to insert frames bevor the selected frame.

 ProjectTab2<h4>Vlo~en novho vjevu (Ctrl+E)</h4> <p>Klepnte na toto tla tko pro vytvoYen novho <em>vjevu</em> a jeho <em>vlo~en</em> pYed vybran vjev.</p>

Insert new Scene (CTRL+E)

Click this button to create a new scene and insert it bevor the selected scene.

 ProjectTab2<h4>Vlo~en novho zbru (Ctrl+E)</h4> <p>Klepnte na toto tla tko pro vytvoYen novho <em>zbru</em> a jeho <em>vlo~en</em> pYed vybran zbr.</p>

Insert new Take (CTRL+E)

Click this button to create a new take and insert it bevor the selected take.

 ProjectTab<h4>Spuatn programu na pravy obrzko</h4> <p>Klepnte na toto tla tko pro otevYen programu na upravovn obrzko</p> <p>Tak je mo~n, pYethnout snmky (obrzky) z pruhu se snmky ( asov pYmka) do otevYenho programu na pravy obrzko.</p>

Launch Photo Editor

Click this button to open the active frame in the photo editor

Note that you can also drag images from the frame bar and drop them on the photo editor

 ProjectTab<h4>Smazn snmku (Delete)</h4> <p>Klepnte na toto tla tko pro <em>smazn</em> vybranho <em>snmku</em> ze zbru.</p>u

Remove Frame (Delete)

Click this button to remove the selected frame from the take.

 ProjectTab<h4>Smazn vjevu (Shift+Delete)</h4> <p>Klepnte na toto tla tko pro <em>smazn</em> vybranho <em>vjevu</em> z animace.</p>

Remove Scene (SHIFT+Delete)

Click this button to remove the selected scene from the animation.

 ProjectTab<h4>Smazn zbru (Shift+Delete)</h4> <p>Klepnte na toto tla tko pro <em>smazn</em> vybranho <em>zbru</em> z animace.</p>~

Remove Take (SHIFT+Delete)

Click this button to remove the selected take from the animation.

 ProjectTabPYidat snmky Add Frames ProjectTabPYidat zbrAdd Take ProjectTab0Vyberte snmky k pYidnChoose frames to add ProjectTabUpravitEdit ProjectTab6NepodaYilo se spustit GIMP!Failed to start Gimp! ProjectTab SnmkyFrames ProjectTabVlo~it snmky Insert Frames ProjectTabVlo~it zbr Insert Take ProjectTabNevybrn ~dn vjev. Vyberte, prosm, njak vjev v projektovm stromu.=No scene selected. Please select a scene in the project tree. ProjectTabNevybrn ~dn zbr. Vyberte, prosm, njak zbr v projektovm stromu.;No take selected. Please select a take in the project tree. ProjectTab Projektov strom Project Tree ProjectTabVjev 000 Scene 000 ProjectTab VjevyScenes ProjectTabZbr 00Take 00 ProjectTab ZbryTakes ProjectTabHVybran snmek (obrzek) je poakozenThe active frame is corrupt ProjectTabZNen vybrn ~dn snmek (obrzek) k otevYen There is no active frame to open ProjectTabVarovnWarning ProjectTab@GIMP nen nainstalovn v systmu-You do not have Gimp installed on your system ProjectTab<h4>Po et obrzko</h4> <p>Tmto posuvnkem (zmnou hodnoty) mo~ete nastavit, kolik pYedchzejcch obrzko v animaci se m zaYadit v obrazu kamery. Nebo, pokud jste v re~imu pYehrvn: Kolik obrzko bude pYehrno. </p> <p>Tm (maenm pYedchozho obrzku(o) do kamery) lpe uvidte, jak je nsledujc obrzek ve vztahu k pYedchzejcm obrzkom. To umo~Huje stejnomrn (hlada) probh pohybu!</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 ProjectWidgetZachytvnCapture ProjectWidgetRozdlyDiff ProjectWidgetLNastaven zachytva e (zdroje) obrzkoImage grabber settings ProjectWidget Mediln podkladMedia Foundation ProjectWidgetSmsMix ProjectWidgetPo et obrzko:Number of images: ProjectWidgetPYehrvnPlayback ProjectWidgetNahrvn Recording ProjectWidget@Zachytvn jednotlivch obrzkoSingle frame capture ProjectWidget4Video 4 Linux (USB WebCam)Video 4 Linux 2 (USB WebCam) ProjectWidget0gphoto (Mal kamera USB)gphoto (USB Compact Camera) ProjectWidget&Ne&No QtFrontend&OK&OK QtFrontend&Ano&Yes QtFrontend2ProvYit pYstupov prvaCheck Permissions QtFrontend VytvoYit adresYCreate directory QtFrontendObnovenRecovery QtFrontendVypad to, ~e qStopmotion nebyl pYi poslednm pou~vn sprvn ukon en. Chcete obnovit posledn sezen?]Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? QtFrontend Nemte potYebn oprvnn pro provozovn qStopMotion. tato oprvnn potYebujete k vytvoYen adresYe .qstopmotion ve vaaem domovskm adresYi.You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. QtFrontendNemte potYebn oprvnn pro provozovn qStopMotion. PotYebujete oprvnn ke  ten, zpisu a spouatn adresYe .qstopmotion.You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. QtFrontend<qStopMotion - Obnoven projektqStopMotion - Recovered Project QtFrontend<h4>Po et obrzko</h4> <p>Tmto posuvnkem (zmnou hodnoty) mo~ete nastavit, kolik pYedchzejcch obrzko v animaci se m zaYadit v obrazu kamery. Nebo, pokud jste v re~imu pYehrvn: Kolik obrzko bude pYehrno. </p> <p>Tm (maenm pYedchozho obrzku(o) do kamery) lpe uvidte, jak je nsledujc obrzek ve vztahu k pYedchzejcm obrzkom. To umo~Huje stejnomrn (hlada) probh pohybu!</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 RecordingTab<h4>Zapnou/Vypnout kameru (C)</h4> <p>Klepnutm na toto tla tko zapnete/vypnete kameru</p>[

Toggle camera on/off (C)

Click this button to toggle the camera on and off

 RecordingTab KameraCamera RecordingTabZachytvnCapture RecordingTabRozdlyDiff RecordingTabInformace Information RecordingTabSmsMix RecordingTab}dn projekt nen  inn. VytvoYte, prosm, nov projekt nebo otevYete stvajc projekt.KNo active project. Please create a new project or open an existing project. RecordingTabNevybrn ~dn vjev a ~dn zbr. Vyberte, prosm, vjev a zbr na kart projektu.SNo scene and no take selected. Please select a scene and a take on the project tab. RecordingTab~Nevybrn ~dn zbr. Vyberte, prosm, zbr na kart projektu.:No take selected. Please select a take on the project tab. RecordingTabNepodporovno Not Supported RecordingTabPo et obrzko:Number of images: RecordingTabPYehrvnPlayback RecordingTabNahrvn Recording RecordingTabRozliaen: Resolution: RecordingTab@Zachytvn jednotlivch obrzkoSingle frame capture RecordingTabZdroj obrazu: Video Source: RecordingTabBNelze koprovat soubor se zvukem!Can't copy sound file!Scene<Nelze smazat soubor se zvukem!Can't remove sound file!Scene Va~nCriticalScene&ZavYt&Close StartDialog&OK&OK StartDialog<<h2>VytvoYit nov projekt</h2>

Create a new Project

 StartDialogB<h2>OtevYt posledn projekt</h2>

Open last Project

 StartDialogF<h2>OtevYt soubor s projektem</h2>

Open project file

 StartDialogXOtevYt a pokra ovat ve stvajcm projektu.%Open and continue a existing project. StartDialog"Cesta k projektu:Project path:  StartDialog&Za t nov projekt.Start a new Project. StartDialog@Nahrn obrzko do  asov pYmkyLoad images to time lineTimeLinez<h4>Zachytit snmek (mezernk)</h4> <p>Klepnutm na toto tla tko mo~ete zachytit jednotliv snmky z kamery a pYidat je do animace. To lze provst i stisknutm klvesy <b>mezernku</b></p>

Capture Frame (Space)

Click on this button to capture a frame from the camera an put it in the animation

This can also be done by pressing the Space key

ToolBarZ<h4>Prvn snmek zbru (J, aipka vlevo)</h4>*

First frame of the take (J, Left)

ToolBarb<h4>Posledn snmek zbru (L, aipka vpravo)</h4>*

Last frame of the take (L, Right)

ToolBarN<h4>Dala snmek (L, aipka vpravo)</h4>

Next frame (L, Right)

ToolBar><h4>PYehrt animaci (K, P)</h4>

Play animation (K, P)

ToolBarT<h4>PYedchoz snmek (J, aipka vlevo)</h4>!

Previous frame (J, Left)

ToolBar PYehrn animaceRunning animationToolBar0 %0%TransformWidget 100 %100%TransformWidgetjN~e mo~ete vybrat, kter promna obrzku se m pou~t pYi zavdn obrzko do novho projektu. Pokud vyberete vystYihnut  sti obrzku, muste tak nastavit nastaven vystYihnut.Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping.TransformWidgetvN~e mo~ete vybrat, kter promna obrzku se m pou~t pYi zavdn obrzko do nyn  innho projektu. Pokud vyberete vystYihnut  sti obrzku, muste tak nastavit nastaven vystYihnut.Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping.TransformWidget@VystYihnut  sti obrzku kameryClip a part of the imageTransformWidget<Zmnit velikost celho obrzkuScale the whole imageTransformWidget2Nastaven promny obrzkuTransformation settingsTransformWidget$Nastaven zvtaen Zoom settingsTransformWidget.Zvtaen obrzku kameryZoom the imageTransformWidget"Hodnota zvtaen: Zoom value:TransformWidget:PYidat snmek (%1,%2,%3) '%4'Add exposure (%1,%2,%3) '%4'UndoExposureAdd:Vlo~it snmek (%1,%2,%3) '%4'Insert exposure (%1,%2,%3) '%4'UndoExposureInsert4Posunout snmek (%1,%2,%3)Move exposure (%1,%2,%3)UndoExposureMove0Smazat snmek (%1,%2,%3)Remove exposure (%1,%2,%3)UndoExposureRemoveJVybrat snmek (%1,%2,%3)-->(%4,%5,%6)'Select exposure (%1,%2,%3)-->(%4,%5,%6)UndoExposureSelect"Nov projekt '%1'New project '%1'UndoProjectNew(OtevYt projekt '%1'Open project '%1'UndoProjectOpen,PYidat vjev (%1) '%2'Add scene (%1) '%2' UndoSceneAdd,Vlo~it vjev (%1) '%2'Insert scene (%1) '%2'UndoSceneInsert,Posunout vjev (%1,%2)Move scene (%1,%2) UndoSceneMove"Smazat vjev (%1)Remove scene (%1)UndoSceneRemove0Vybrat vjev (%1)-->(%2)Select scene (%1)-->(%2)UndoSceneSelect2PYidat zbr (%1,%2) '%3'Add take (%1,%2) '%3' UndoTakeAdd2Vlo~it zbr (%1,%2) '%3'Insert take (%1,%2) '%3'UndoTakeInsert,Posunout zbr (%1,%2)Move take (%1,%2) UndoTakeMove(Smazat zbr (%1,%2)Remove take (%1,%2)UndoTakeRemove<Vybrat zbr (%1,%2)-->(%3,%4)Select take (%1,%2)-->(%3,%4)UndoTakeSelectqstopmotion-2.3.2-Source/translations/qt_fr.ts000644 000000 000000 00001533633 12536560630 021556 0ustar00rootroot000000 000000 AudioOutput <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Le périphérique audio <b>%1</b> ne fonctionne pas.<br/>Utilisation de <b>%2</b>.</html> <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> <html>Utilisation de <b>%1</b><br/>qui vient de devenir disponible et a une plus grande priorité.</html> Revert back to device '%1' Utilisation de '%1' BackendSelection A list of Phonon Backends found on your system. The order here determines the order Phonon will use them in. Une list de backends pour Phonon trouvés sur le système. L'ordre determine l'ordre dans lequel Phonon va les utiliser. Prefer Préférer Defer Différer BackendTester MainWindow Fenêtre Principale local audio file: Fichier audio local : local video file: Fichier vidéo local : remote media URL: URL distante : run tests Lancer les tests testing: %p% test de : %P% CloseButton Close Tab Fermer l'onglet Debugger::JSAgentWatchData [Array of length %1] [Tableau de longueur %1] <undefined> <indéfini> FakeReply Fake error ! Fausse erreur ! Fake error! Fausse erreur ! Invalid URL URL invalide MAC_APPLICATION_MENU Services Services Hide %1 Masquer %1 Hide Others Masquer les autres Show All Tout afficher Preferences... Préférences... Quit %1 Quitter %1 About %1 À propos de %1 MainWindow Print Impr écran Location: Emplacement : OutputDeviceChoice Various categories of outputs. For each category you may choose what device you wish to output to. Differentes catégories de sortie. Pour chaque catégorie vous pouvez choisir quel périphérique vous souhaitez utiliser. Show Advanced Devices Montrer les périphériques avancés Apply Device List to ... Appliquer la liste de périphériques à... Audio Outputs found on your system. Choose the device that you wish sound to come out of. Périphériques audio trouvés sur votre système. Choisissez le périphérique que vous voulez utiliser. The order determines the preference of the output devices. If for some reason the first device cannot be used Phonon will try to use the second, and so on. L'ordre détermine la préférence du périphérique audio. Si pour quelque raison le premier ne peut pas être utilisé, Phonon essaiera d'utiliser le deuxième... Remove Supprimer prefer the selected device préférer le périphérique sélectionné Prefer Préférer no preference for the selected device pas de préférence pour le périphérique sélectionné Defer Différer PPDOptionsModel Name Nom Value Valeur Phonon:: Notifications Notifications Music Musique Video Vidéo Communication Communication Games Jeux Accessibility Accessibilité Phonon::AudioOutput <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Le périphérique audio <b>%1</b> ne fonctionne pas.<br/>Repli sur <b>%2</b>.</html> <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> <html>Basculement vers le périphérique audio <b>%1</b><br/>qui vient juste d'être disponible et dont le niveau de préférence est plus élevé.</html> Revert back to device '%1' Revenir au périphérique '%1' <html>Switching to the audio playback device <b>%1</b><br/>which has higher preference or is specifically configured for this stream.</html> <html>Basculement vers le périphérique audio <b>%1</b><br/>dont le niveau de préférence est plus élevé ou qui est spécifiquement configuré pour ce flux.</html> Phonon::Gstreamer::Backend Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled. Attention : Vous n'avez apparemment pas installé le paquet gstreamer0.10-plugins-good. Des fonctionnalités vidéo ont été desactivées. Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabled Attention : Vous n'avez apparemment pas installées les plugins de base de GStreamer. Le support audio et vidéo est désactivé Phonon::Gstreamer::MediaObject Cannot start playback. Check your Gstreamer installation and make sure you have libgstreamer-plugins-base installed. Impossible de démarrer la lecture. Verifiez votre installation de Gstreamer et assurez-vous d'avoir installé libgstreamer-plugins-base. Unknown media format: %1 Format inconnu : %1 Unable to flush media pipeline Impossible de vider le pipeline multimédia Could not decode URL. Impossible de décoder l'URL. Could not open file. Impossible d'ouvrir le fichier. Source type invalid Type de source invalide Could not open stream. Impossible d'ouvrir le flux. Source type not supported Type de source non supporté Could not load source Impossible de charger la source Missing codec helper script assistant. ??? Assistant de script d'aide au codec manquant. Plugin codec installation failed for codec: %0 Échec de l'installation du plugin pour le codec : %0 A required codec is missing. You need to install the following codec(s) to play this content: %0 Un codec requis est manquant. Vous devez installer le codec suivant pour jouer le contenu : %0 Could not open media source. Impossible d'ouvrir le média source. Invalid source type. Type de source invalide. Could not locate media source. Impossible de localiser le média source. Could not open audio device. The device is already in use. Impossible d'ouvrir le périphérique audio. Celui-ci est déjà en cours d'utilisation. Could not decode media source. Impossible de décoder le média source. Cannot start playback. Check your GStreamer installation and make sure you have libgstreamer-plugins-base installed. Impossible de démarrer la lecture. Vérifiez votre installation de GStreamer et assurez-vous d'avoir installé libgstreamer-plugins-base. Phonon::MMF Audio Output Sortie audio The audio output device Périphérique audio de sortie No error Aucune erreur Not found Introuvable Out of memory Mémoire insuffisante Not supported Non supporté Overflow Dépassement Underflow Soupassement Already exists Existe déjà Path not found Chemin introuvable In use Utilisé Not ready Pas prêt Access denied Autorisation refusée Could not connect Connexion impossible Disconnected Déconnecté Permission denied Autorisation refusée Insufficient bandwidth Bande passante insuffisante Network unavailable Réseau non disponible Network communication error Erreur de communication réseau Streaming not supported Streaming non supporté Server alert Alerte serveur Invalid protocol Protocole invalide Invalid URL URL invalide Multicast error Erreur multicast Proxy server error Erreur du serveur proxy Proxy server not supported Serveur proxy non supporté Audio output error Erreur de sortie audio Video output error Erreur de sortie vidéo Decoder error Erreur du décodeur Audio or video components could not be played Les composants audio ou vidéo n'ont pas pu être lus DRM error Erreur GDN Unknown error (%1) Erreur inconnue (%1) Phonon::MMF::AbstractMediaPlayer Not ready to play Pas prêt pour lecture Error opening file Erreur lors de l'ouverture du fichier Error opening URL Erreur lors de l'ouverture de l'URL Error opening resource erreur lors de l'ouverture de la ressource Error opening source: resource not opened erreur lors de l'ouverture de la source : ressource non ouverte Setting volume failed Le réglage du volume a échoué Loading clip failed Échec de l'ouverture du clip Playback complete Lecture terminée Download error Erreur de téléchargement Phonon::MMF::AbstractVideoPlayer Pause failed La mise en pause a échoué Seek failed La recherche a échoué Getting position failed L'obtention de la position a échoué Opening clip failed L'ouverture du clip a échoué Phonon::MMF::AudioEqualizer %1 Hz %1 Hz Phonon::MMF::AudioPlayer Getting position failed L'obtention de la position a échoué Opening clip failed L'ouverture du clip a échoué Phonon::MMF::DsaVideoPlayer Video display error Erreur de l'affichage vidéo Phonon::MMF::EffectFactory Enabled Activé Phonon::MMF::EnvironmentalReverb Decay HF ratio (%) DecayHFRatio: Ratio of high-frequency decay time to the value specified by DecayTime. Ratio HF du déclin (%) Decay time (ms) DecayTime: Time over which reverberation is diminished. Temps de déclin (ms) Density (%) Density Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Diffusion value. Densité (%) Diffusion (%) Diffusion: Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Density value. Diffusion (%) Reflections delay (ms) ReflectionsDelay: Amount of delay between the arrival the direct path from the source and the arrival of the first reflection. Délai réflexions (ms) Reflections level (mB) ReflectionsLevel: Amplitude of reflections. This value is corrected by the RoomLevel to give the final reflection amplitude. Niveau réflexions (mB) Reverb delay (ms) ReverbDelay: Amount of time between arrival of the first reflection and start of the late reverberation. Délai de réverbération (ms) Reverb level (mB) ReverbLevel Amplitude of reverberations. This value is corrected by the RoomLevel to give the final reverberation amplitude. Niveau de réverbération (mB) Room HF level RoomHFLevel: Amplitude of low-pass filter used to attenuate the high frequency component of reflected sound. Niveau HF pièce Room level (mB) RoomLevel: Master volume control for all reflected sound. Niveau pièce (mB) Phonon::MMF::MediaObject Error opening source: type not supported Erreur lors de l'ouverture de la source : type non supporté Error opening source: resource is compressed Erreur lors de l'ouverture de la source : ressource compressée Error opening source: resource not valid Erreur lors de l'ouverture de la source : ressource invalide Error opening source: media type could not be determined Erreur lors de l'ouverture de la source : type de média non déterminé Failed to set requested IAP Echec lors de l'établissement du point d'accès à Internet requis Phonon::MMF::StereoWidening Level (%) Niveau (%) Phonon::MMF::SurfaceVideoPlayer Video display error Erreur de l'affichage vidéo Phonon::MMF::VideoPlayer Pause failed La mise en pause a échoué Seek failed La recherche a échoué Getting position failed L'obtention de la position a échoué Opening clip failed L'ouverture du clip a échoué Buffering clip failed La mise en mémoire tampon du clip a échoué Video display error Erreur de l'affichage vidéo Phonon::VolumeSlider Volume: %1% Volume : %1% Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1% Utilisez le slider pour ajuster le volume. La position la plus à gauche est 0%, la plus à droite est %1% Muted Son coupé Q3Accel %1, %2 not defined La séquence %1, %2 n'est pas définie Ambiguous %1 not handled Séquence ambiguë %1 non traitée Q3DataTable True Vrai False Faux Insert Insérer Update Actualiser Delete Supprimer Q3FileDialog Copy or Move a File Copie ou déplace un fichier Read: %1 Lecture : %1 Write: %1 Écriture : %1 Cancel Annuler All Files (*) Tous les fichiers (*) Name Nom Size Taille Type Type Date Date Attributes Attributs &OK &OK Look &in: Chercher &dans : File &name: &Nom de fichier : File &type: &Type de fichier : Back Précédent (historique) One directory up Aller au dossier parent Create New Folder Créer un nouveau dossier List View Affichage liste Detail View Affichage détaillé Preview File Info Informations du fichier prévisualisé Preview File Contents Contenu du fichier prévisualisé Read-write Lecture-écriture Read-only Lecture seule Write-only Écriture seule Inaccessible Inaccessible Symlink to File Lien symbolique vers un fichier Symlink to Directory Lien symbolique vers un dossier Symlink to Special Lien symbolique vers un fichier spécial File Fichier Dir Dossier Special Fichier spécial Open Ouvrir Save As Enregistrer sous &Open &Ouvrir &Save &Enregistrer &Rename &Renommer &Delete Suppri&mer R&eload R&echarger Sort by &Name Trier par &nom Sort by &Size Trier par ta&ille Sort by &Date Trier par &date &Unsorted &Non trié Sort Tri Show &hidden files Afficher les fic&hiers cachés the file le fichier the directory le dossier the symlink le lien symbolique Delete %1 Supprimer %1 <qt>Are you sure you wish to delete %1 "%2"?</qt> <qt>Voulez-vous vraiment supprimer %1 "%2" ?</qt> &Yes &Oui &No &Non New Folder 1 Nouveau dossier 1 New Folder Nouveau dossier New Folder %1 Nouveau dossier %1 Find Directory Chercher dans le dossier Directories Dossiers Directory: Dossier : Error Erreur %1 File not found. Check path and filename. %1 Impossible de trouver le fichier. Vérifiez le chemin et le nom du fichier. All Files (*.*) Tous les fichiers (*.*) Open Ouvrir Select a Directory Sélectionner un dossier Q3LocalFs Could not read directory %1 Impossible de lire le dossier %1 Could not create directory %1 Impossible de créer le dossier %1 Could not remove file or directory %1 Impossible de supprimer le fichier ou dossier %1 Could not rename %1 to %2 Impossible de renommer %1 en %2 Could not open %1 Impossible d'ouvrir %1 Could not write %1 Impossible d'écrire %1 Q3MainWindow Line up Aligner Customize... Personnaliser... Q3NetworkProtocol Operation stopped by the user Opération interrompue par l'utilisateur Q3ProgressDialog Cancel Annuler Q3TabDialog OK OK Apply Appliquer Help Aide Defaults Par défaut Cancel Annuler Q3TextEdit &Undo &Annuler &Redo &Rétablir Cu&t Co&uper &Copy Cop&ier &Paste Co&ller Clear Effacer Select All Tout sélectionner Q3TitleBar System Système Restore up Restaurer en haut Minimize Réduire Restore down Restaurer en bas Maximize Maximiser Close Fermer Contains commands to manipulate the window Contient des commandes pour manipuler la fenêtre Puts a minimized back to normal Rend à une fenêtre minimisée son aspect normal Moves the window out of the way Déplace la fenêtre à l'écart Puts a maximized window back to normal Rend à une fenêtre minimisée son aspect normal Makes the window full screen Affiche la fenêtre en plein écran Closes the window Ferme la fenêtre Displays the name of the window and contains controls to manipulate it Affiche le nom de la fenêtre et contient des contrôles pour la manipuler Puts a minimized window back to normal Rend à une fenêtre minimisée son aspect normal Q3ToolBar More... Plus... Q3UrlOperator The protocol `%1' is not supported Le protocole '%1' n'est pas géré The protocol `%1' does not support listing directories Le protocole `%1' ne permet pas de lister les fichiers d'un dossier The protocol `%1' does not support creating new directories Le protocole `%1' ne permet pas de créer de nouveaux dossiers The protocol `%1' does not support removing files or directories Le protocole `%1' ne permet pas de supprimer des fichiers ou des dossiers The protocol `%1' does not support renaming files or directories Le protocole `%1' ne permet pas de renommer des fichiers ou des dossiers The protocol `%1' does not support getting files Le protocole `%1' ne permet pas de recevoir des fichiers The protocol `%1' does not support putting files Le protocole `%1' ne permet pas d'envoyer des fichiers The protocol `%1' does not support copying or moving files or directories Le protocole `%1' ne permet pas de copier ou de déplacer des fichiers (unknown) (inconnu) Q3Wizard &Cancel &Annuler < &Back < &Précédent &Next > &Suivant > &Finish &Terminer &Help &Aide QAbstractSocket Host not found Hôte introuvable Connection refused Connexion refusée Connection timed out Connexion expirée Operation on socket is not supported Opération sur socket non supportée Socket operation timed out Opération socket expirée Socket is not connected Le socket n'est pas connecté Network unreachable Réseau impossible à rejoindre QAbstractSpinBox &Step up &Augmenter Step &down &Diminuer &Select All Tout &sélectionner QAccessibleButton Uncheck Décocher Check Cocher Press Appuyer QApplication QT_LAYOUT_DIRECTION Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. LTR Executable '%1' requires Qt %2, found Qt %3. L'exécutable '%1' requiert Qt %2 (Qt %3 présent). Incompatible Qt Library Error Erreur : bibliothèque Qt incompatible Activate Activer Activates the program's main window Active la fenêtre principale du programme QT_LAYOUT_DIRECTION LTR QAxSelect Select ActiveX Control Sélectionner un contrôle ActiveX OK OK &Cancel &Annuler COM &Object: &Objet COM : QCheckBox Uncheck Décocher Check Cocher Toggle Changer QColorDialog Hu&e: &Teinte : &Sat: &Saturation : &Val: &Valeur : &Red: &Rouge : &Green: &Vert : Bl&ue: Ble&u : A&lpha channel: Canal a&lpha : Select Color Sélectionner une couleur &Basic colors Couleurs de &base &Custom colors &Couleurs personnalisées &Define Custom Colors >> Définir des &couleurs personnalisées >> OK OK Cancel Annuler &Add to Custom Colors &Ajouter aux couleurs personnalisées Select color Sélection d'une couleur QComboBox Open Ouvrir False Faux True Vrai Close Fermer QCoreApplication %1: permission denied QSystemSemaphore %1 : permission refusée %1: already exists QSystemSemaphore %1 : existe déjà %1: doesn't exists QSystemSemaphore %1 : n'existe pas %1: does not exist QSystemSemaphore %1 : n'existe pas %1: out of resources QSystemSemaphore %1 : plus de ressources disponibles %1: unknown error %2 QSystemSemaphore %1 : erreur inconnue %2 %1: key is empty QSystemSemaphore %1 : clé vide %1: unable to make key QSystemSemaphore %1 : impossible de créer la clé %1: ftok failed QSystemSemaphore %1 : ftok a échoué %1: key is empty %1 : clé vide %1: unable to make key %1 : impossible de créer la clé %1: ftok failed %1 : ftok a échoué %1: already exists %1 : existe déjà %1: does not exist %1 : n'existe pas %1: out of resources %1 : plus de ressources disponibles %1: unknown error %2 %1 : erreur inconnue %2 QDB2Driver Unable to connect Incapable d'établir une connexion Unable to commit transaction Incapable de soumettre la transaction Unable to rollback transaction Incapable d'annuler la transaction Unable to set autocommit Impossible d'activer l'auto-soumission QDB2Result Unable to execute statement Impossible d'exécuter la requête Unable to prepare statement Impossible de préparer la requête Unable to bind variable Impossible d'attacher la variable Unable to fetch record %1 Impossible de récupérer l'enregistrement %1 Unable to fetch next Impossible de récupérer le suivant Unable to fetch first Impossible de récupérer le premier QDateTimeEdit AM AM am am PM PM pm pm QDeclarativeAbstractAnimation Cannot animate non-existent property "%1" Impossible d'animer la propriété inexistante "%1" Cannot animate read-only property "%1" Impossible d'animer la propriété en lecture seule "%1" Animation is an abstract class L'animation est une classe abstraite QDeclarativeAnchorAnimation Cannot set a duration of < 0 Impossible de sélectionner une durée négative QDeclarativeAnchors Possible anchor loop detected on fill. Boucle potentielle dans les ancres détectée pour le remplissage. Possible anchor loop detected on centerIn. Boucle potentielle dans les ancres détectée pour le centrage. Cannot anchor to an item that isn't a parent or sibling. Impossible d'ancrer à un élément qui n'est pas un parent ou partage le même parent. Possible anchor loop detected on vertical anchor. Boucle potentielle dans les ancres détectée pour l'ancre verticale. Possible anchor loop detected on horizontal anchor. Boucle potentielle dans les ancres détectée pour l'ancre horizontale. Cannot specify left, right, and hcenter anchors. Impossible de spécifier à la fois une ancre gauche, droite et hcenter. Cannot anchor to a null item. Impossible d'ancrer à un élément nul. Cannot anchor a horizontal edge to a vertical edge. Impossible d'ancrer un bord horizontal à un bord vertical. Cannot anchor item to self. Impossible d'ancrer l'élément à lui même. Cannot specify top, bottom, and vcenter anchors. Impossible de spécifier à la fois une ancre haut, bas et vcenter. Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors. L'ancre baseline ne peut pas etre combinée à l'usage des ancres haut, bas ou vcenter. Cannot anchor a vertical edge to a horizontal edge. Impossible d'ancrer un bord vertical à un bord horizontal. QDeclarativeAnimatedImage Qt was built without support for QMovie Qt a été compilé sans support de QMovie QDeclarativeApplication Application is an abstract class Application est une classe abstraite QDeclarativeBehavior Cannot change the animation assigned to a Behavior. Impossible de changer l'animation affectée à un comportement. QDeclarativeBinding Binding loop detected for property "%1" Boucle détectée dans l'affectation pour la propriété "%1" QDeclarativeBindings Binding loop detected for property "%1" Boucle détectée dans l'affectation pour la propriété "%1" QDeclarativeCompiledBindings Binding loop detected for property "%1" Boucle détectée dans l'affectation pour la propriété "%1" QDeclarativeCompiler Invalid property assignment: "%1" is a read-only property Affectation de propriété invalide : "%1"est une propriété en lecture seule Invalid property assignment: unknown enumeration Affectation de propriété invalide : énumération inconnue Invalid property assignment: string expected Affectation de propriété invalide : chaîne attendue Invalid property assignment: url expected Affectation de propriété invalide : url attendue Invalid property assignment: unsigned int expected Affectation de propriété invalide : unsigned int attendu Invalid property assignment: int expected Affectation de propriété invalide : int attendu Invalid property assignment: float expected Affectation de propriété invalide : float attendu Invalid property assignment: double expected Affectation de propriété invalide : double attendu Invalid property assignment: number expected Affectation de propriété invalide : nombre attendu Invalid property assignment: color expected Affectation de propriété invalide : couleur attendue Invalid property assignment: date expected Affectation de propriété invalide : date attendue Invalid property assignment: time expected Affectation de propriété invalide : heure attendue Invalid property assignment: datetime expected Affectation de propriété invalide : date et heure attendues Invalid property assignment: point expected Affectation de propriété invalide : point attendu Invalid property assignment: size expected Affectation de propriété invalide : taille attendue Invalid property assignment: rect expected Affectation de propriété invalide : rectangle attendu Invalid property assignment: boolean expected Affectation de propriété invalide : booléen attendu Invalid property assignment: 3D vector expected Affectation de propriété invalide : vecteur 3D attendu Invalid property assignment: unsupported type "%1" Affectation de propriété invalide : type "%1" non supporté Element is not creatable. Impossible de créer l'élément. Component elements may not contain properties other than id Les éléments du composant ne peuvent pas contenir des propriétés autres que id Invalid component id specification L'id de composant spécifiée n'est pas valide id is not unique l'id n'est pas unique Invalid component body specification Le corps de la spécification du composant n'est pas valide Component objects cannot declare new properties. Les objets composants ne peuvent pas déclarer de nouvelles propriétés. Component objects cannot declare new signals. Les objets composants ne peuvent pas déclarer de nouveaux signaux. Component objects cannot declare new functions. Les objets composants ne peuvent pas déclarer de nouvelles fonctions. Cannot create empty component specification Impossible de créer une spécification du composant vide "%1.%2" is not available in %3 %4.%5. "%1.%2" n'est pas disponible dans %3 %4.%5. "%1.%2" is not available due to component versioning. "%1.%2" n'est pas disponible dans cette version du composant. Incorrectly specified signal assignment L'affectation du signal est incorrectement spécifiée Cannot assign a value to a signal (expecting a script to be run) Impossible d'assigner une valeur à un signal (un script à exécuter est attendu) Empty signal assignment Affectation de signal vide Empty property assignment Affectation de propriété vide Attached properties cannot be used here La configuration spécifiée ne peut être utilisée ici. Non-existent attached object Objet attaché inexistant Invalid attached object assignment L'affectation de l'objet attaché est invalide Cannot assign to non-existent default property Impossible d'attacher à une propriété par défaut inexistante Cannot assign to non-existent property "%1" Impossible d'attacher à une propriété inexistante "%1" Invalid use of namespace Utilisation invalide d'espace de noms Not an attached property name Ce n'est pas un nom de propriété attachée Invalid use of id property Utilisation invalide de la propriété id Property has already been assigned a value Une valeur a déjà été attribuée à la propriété Invalid grouped property access Accès invalide à une propriété groupée Cannot assign a value directly to a grouped property Impossible d'assigner directement une valeur à une propriété groupée Invalid property use La propriété utilisée est invalide Property assignment expected Affectation de propriété attendue Single property assignment expected Une seule affectation de propriété est attendue Unexpected object assignment Affectation d'objet inattendue Cannot assign object to list Impossible d'assigner un objet à une liste Can only assign one binding to lists Un seul lien peut être assigné à des listes Cannot assign primitives to lists Impossible d'assigner des primitives à des listes Cannot assign multiple values to a script property Impossible d'assigner plusieurs valeurs à une propriété de script Invalid property assignment: script expected Affectation de propriété invalide : script attendu Cannot assign multiple values to a singular property Impossible d'assigner plusieurs valeurs à une propriété singulière Cannot assign object to property Impossible d'assigner un objet à une propriété "%1" cannot operate on "%2" "%1" ne peut pas opérer sur "%2" Duplicate default property Propriété par défaut en double Duplicate property name Nom de propriété en double Property names cannot begin with an upper case letter Les noms des propriétés ne peuvent pas commencer par une majuscule Illegal property name Nom de propriété invalide Duplicate signal name Nom de signal en double Signal names cannot begin with an upper case letter Les noms de signaux ne peuvent pas commencer par une majuscule Illegal signal name Nom de signal invalide Duplicate method name Nom de méthode en double Method names cannot begin with an upper case letter Les noms des méthodes ne peuvent pas commencer par une majuscule Illegal method name Nom de méthode invalide Property value set multiple times Valeur de propriété attribuée plusieurs fois Invalid property nesting Imbrication de propriété invalide Cannot override FINAL property Impossible de remplacer la propriété FINAL Invalid property type Type de propriété invalide Invalid empty ID id vide invalide IDs cannot start with an uppercase letter Les ids ne peuvent pas commencer par une majuscule IDs must start with a letter or underscore Les ids doivent commencer par une lettre ou un tiret bas IDs must contain only letters, numbers, and underscores Les ids ne peuvent contenir que des lettres, des nombres ou des tirets bas ID illegally masks global JavaScript property id masque illégalement la propriété JavaScript globale No property alias location Invalid alias location Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property> Alias property exceeds alias bounds L'alias de propriété n'a pas d'emplacement Invalid alias reference. An alias reference must be specified as <id> or <id>.<property> Référence d'alias invalide. Les références d'alias doivent être spécifiées comme <id> ou <id>.<property> Invalid alias reference. Unable to find id "%1" Référence d'alias invalide. Impossible de trouver l'id "%1" QDeclarativeComponent Invalid empty URL URL vide invalide createObject: value is not an object createObject : la valeur fournie n'est pas un objet QDeclarativeCompositeTypeManager Resource %1 unavailable La ressource %1 n'est pas disponible Namespace %1 cannot be used as a type L'espace de noms %1 ne peut pas être utilisé comme un type %1 %2 %1 %2 Type %1 unavailable Le type %1 n'est pas disponible QDeclarativeConnections Cannot assign to non-existent property "%1" Imposible d'assigner à la propriété inexistante "%1" Connections: nested objects not allowed Connexions : les éléments imbriqués ne sont pas autorisés Connections: syntax error Connexions : erreur de syntaxe Connections: script expected Connexions : script attendu QDeclarativeEngine executeSql called outside transaction() executeSql a été appelé en dehors de transaction() Read-only Transaction Transaction en lecture seule Version mismatch: expected %1, found %2 Version incompatible : %1 attendue, %2 trouvée SQL transaction failed la transaction SQL a échouée transaction: missing callback transaction : la fonction de rappel est absente SQL: database version mismatch SQL : la version de la base de données est incompatible QDeclarativeFlipable front is a write-once property front est une propriété à écriture unique back is a write-once property back est une propriété à écriture unique QDeclarativeImportDatabase cannot load module "%1": File name case mismatch for "%2" module "%1" definition "%2" not readable la définition "%2" du module "%1% n'est pas lisible plugin cannot be loaded for module "%1": %2 impossible de charger le plugin pour le module "%1" : %2 module "%1" plugin "%2" not found le plugin "%2" du module "%1" n'a pas été trouvé module "%1" version %2.%3 is not installed la version %2.%3 du module "%1" n'est pas installée module "%1" is not installed le module "%1" n'est pas installé "%1": no such directory "%1" : le répertoire n'existe pas import "%1" has no qmldir and no namespace l'importation "%1" n'a pas de qmldir ni d'espace de noms - %1 is not a namespace - %1 n'est pas un espace de noms - nested namespaces not allowed - les espaces de noms imbriqués ne sont pas autorisés local directory répertoire local is ambiguous. Found in %1 and in %2 est ambigu. Trouvé dans %1 et dans %2 is ambiguous. Found in %1 in version %2.%3 and %4.%5 est ambigu. Trouvé dans %1 dans les versions %2.%3 et %4.%5 is instantiated recursively est instancié récursivement is not a type n'est pas un type File name case mismatch for "%2" QDeclarativeKeyNavigationAttached KeyNavigation is only available via attached properties KeyNavigation est disponible uniquement via les propriétés attachées QDeclarativeKeysAttached Keys is only available via attached properties Keys, a verifier Keys est disponible uniquement via les propriétés attachées QDeclarativeLayoutMirroringAttached LayoutDirection attached property only works with Items LayoutMirroring is only available via attached properties QDeclarativeListModel remove: index %1 out of range remove : l'index %1 est hors de la plage de valeurs admissibles insert: value is not an object insert : une valeur n'est pas un objet insert: index %1 out of range insert : l'index %1 est hors de la plage de valeurs admissibles move: out of range move : hors de la plage de valeurs admissibles append: value is not an object append : une valeur n'est pas un objet set: value is not an object set : une valeur n'est pas un objet set: index %1 out of range set : l'index %1 est hors de la plage de valeurs admissible ListElement: cannot contain nested elements ListElement : ne peut pas contenir des éléments imbriqués ListElement: cannot use reserved "id" property ListElement : ne peut pas utiliser la propriété réservée "id" ListElement: cannot use script for property value ListElement : ne peut pas utiliser script comme valeur pour une propriété ListModel: undefined property '%1' ListModel : propriété indéfinie '%1' QDeclarativeLoader Loader does not support loading non-visual elements. Le chargeur n'est pas compatible avec le chargement d'éléments non-visuels. QDeclarativeParentAnimation Unable to preserve appearance under complex transform Impossible de conserver l'aspect lors d'une transformation complexe Unable to preserve appearance under non-uniform scale Impossible de conserver l'aspect lors d'une mise à l'échelle non uniforme Unable to preserve appearance under scale of 0 Impossible de conserver l'aspect lors d'une mise à l'échelle égale à 0 QDeclarativeParentChange Unable to preserve appearance under complex transform Impossible de conserver l'aspect lors d'une transformation complexe Unable to preserve appearance under non-uniform scale Impossible de conserver l'aspect lors d'une mise à l'échelle non uniforme Unable to preserve appearance under scale of 0 Impossible de conserver l'aspect lors d'une mise à l'échelle égale à 0 QDeclarativeParser Illegal unicode escape sequence Séquence d'échappement Unicode illégale Illegal character Caractère illégal Unclosed string at end of line Chaîne de caractères non fermée en fin de ligne Illegal escape sequence Séquence d'échappement illégale Unclosed comment at end of file Commentaire non fermé en fin de ligne Illegal syntax for exponential number Syntaxe illégale pour un nombre exponentiel Identifier cannot start with numeric literal Impossible de commencer un identifiant par un chiffre Unterminated regular expression literal Élément non terminé pour l'expression régulière Invalid regular expression flag '%0' Drapeau '%0' invalid pour l'expression régulière Unterminated regular expression backslash sequence Séquence antislash non terminée pour l'expression régulière Unterminated regular expression class Classe non terminée pour l'expression régulière Syntax error Erreur de syntaxe Unexpected token `%1' jeton inattendu '%1' Expected token `%1' jeton attendu '%1' Property value set multiple times valeur de propriété attribuée à plusieurs reprises Expected type name Nom de type attendu Invalid import qualifier ID qualificatif id d'importation invalide Reserved name "Qt" cannot be used as an qualifier "Qt" est un nom réservé et ne peut pas être utilisé comme qualificatif Script import qualifiers must be unique. ?? Les qualificatifs d'importation de script doivent être uniques. Script import requires a qualifier L'importation de script exige un qualificatif Library import requires a version L'importation de bibliothèque exige une version Expected parameter type Type de paramètre attendu Invalid property type modifier Modificateur invalide pour le type de propriété Unexpected property type modifier Modificateur inattendu pour le type de propriété Expected property type Type de propriété attendu Readonly not yet supported La lecture seule n'est pas encore implémentée JavaScript declaration outside Script element Déclaration JavaScript en dehors de l'élément Script QDeclarativePauseAnimation Cannot set a duration of < 0 Impossible d'attribuer une durée < 0 QDeclarativePixmap Error decoding: %1: %2 Erreur de décodage : %1 : %2 Failed to get image from provider: %1 Impossible d'obtenir l'image du fournisseur : %1 Cannot open: %1 Impossible d'ouvrir : %1 QDeclarativePixmapCache Error decoding: %1: %2 Erreur de décodage : %1 : %2 Failed to get image from provider: %1 Impossible d'obtenir l'image du fournisseur : %1 Cannot open: %1 Impossible d'ouvrir : %1 Unknown Error loading %1 Erreur de chargement inconnue : %1 QDeclarativePropertyAnimation Cannot set a duration of < 0 Impossible d'attribuer une durée < 0 QDeclarativePropertyChanges PropertyChanges does not support creating state-specific objects. PropertyChanges n'est pas compatible avec la création d'objets spécifiques à un état. Cannot assign to non-existent property "%1" Ne peut pas assigner à la propriété inexistante "%1" Cannot assign to read-only property "%1" Ne peut pas assigner à la propriété en lecture seule "%1" QDeclarativeTextInput Could not load cursor delegate Impossible de charger le délégué de curseur Could not instantiate cursor delegate Impossible d'instancier le délégué de curseur QDeclarativeTypeLoader Script %1 unavailable Type %1 unavailable Le type %1 n'est pas disponible Namespace %1 cannot be used as a type L'espace de noms %1 ne peut pas être utilisé comme un type %1 %2 %1: user typename %2: error string %1 %2 QDeclarativeVME Unable to create object of type %1 Impossible de créer un objet de type %1 Cannot assign value %1 to property %2 Impossible d'assigner la valeur %1 à la propriété %2 Cannot assign object type %1 with no default method Impossible d'assigner un objet de type %1 sans méthode par défaut Cannot connect mismatched signal/slot %1 %vs. %2 le vs a confirmer Impossible de connecter le signal/slot %1 %vs. %2 pour cause d'incompatibilité Cannot assign an object to signal property %1 Impossible d'assigner un objet à la propriété %1 d'un signal Cannot assign object to list Impossible d'assigner un objet à une liste Cannot assign object to interface property Impossible d'assigner un objet à la propriété d'une interface Unable to create attached object Impossible de créer un objet attaché Cannot set properties on %1 as it is null Impossible d'attribuer les propriétés à %1 car ce dernier est nul QDeclarativeVisualDataModel Delegate component must be Item type. Un composant délégué doit être de type Item. QDeclarativeXmlListModel Qt was built without support for xmlpatterns Qt a été compilé sans support pour xmlpatterns QDeclarativeXmlListModelRole An XmlRole query must not start with '/' Une requête XmlRole ne doit pas commencer par '/' QDeclarativeXmlRoleList An XmlListModel query must start with '/' or "//" Une requête XmlListModel doit commencer par '/' ou "//" QDial QDial QDial SpeedoMeter Tachymètre SliderHandle Poignée du slider QDialog What's This? Qu'est-ce que c'est ? Done Terminer QDialogButtonBox OK OK Save Enregistrer &Save Enregi&strer Open Ouvrir Cancel Annuler &Cancel &Annuler Close Fermer &Close &Fermer Apply Appliquer Reset Réinitialiser Help Aide Don't Save Ne pas enregistrer Discard Ne pas enregistrer &Yes &Oui Yes to &All Oui à &tout &No &Non N&o to All Non à to&ut Save All Tout Enregistrer Abort Abandonner Retry Réessayer Ignore Ignorer Restore Defaults Restaurer les valeurs par défaut Close without Saving Fermer sans enregistrer &OK &OK QDirModel Name Nom Size Taille Kind Match OS X Finder Type Type All other platforms Type Date Modified Dernière Modification Kind Type Type Type QDockWidget Close Fermer Dock Attacher Float Détacher QDoubleSpinBox More Plus Less Moins QErrorMessage &Show this message again &Afficher ce message de nouveau &OK &OK Debug Message: Message de débogage : Warning: Avertissement : Fatal Error: Erreur fatale : QFile Destination file exists Le fichier destination existe Cannot remove source file Impossible de supprimer le fichier source Cannot open %1 for input Impossible d'ouvrir %1 pour lecture Cannot open for output Impossible d'ouvrir pour écriture Failure to write block Impossible d'écrire un bloc Cannot create %1 for output Impossible de créer %1 pour écriture No file engine available or engine does not support UnMapExtension Aucun moteur de fichier disponible ou celui-ci ne supporte pas UnMapExtension Will not rename sequential file using block copy Ne renommera pas le fichier séquentiel avec la copie par blocs QFileDialog Back Précédent (historique) List View Affichage liste Detail View Affichage détaillé Open Ouvrir &Open &Ouvrir &Save &Enregistrer &Rename &Renommer &Delete Suppri&mer Show &hidden files Afficher les fic&hiers cachés Directories Dossiers Recent Places Emplacements récents All Files (*) Tous les fichiers (*) %1 already exists. Do you want to replace it? Le fichier %1 existe déjà. Voulez-vous l'écraser ? %1 File not found. Please verify the correct file name was given. %1 Fichier introuvable. Veuillez vérifier que le nom du fichier est correct. My Computer Poste de travail Parent Directory Dossier parent Files of type: Fichiers de type : Directory: Dossier : File not found. Please verify the correct file name was given Fichier introuvable. Veuillez vérifier que le nom du fichier est correct %1 Directory not found. Please verify the correct directory name was given. %1 Dossier introuvable. Veuillez vérifier que le nom du dossier est correct. '%1' is write protected. Do you want to delete it anyway? '%1' est protégé en écriture. Voulez-vous quand même le supprimer ? Are sure you want to delete '%1'? Êtes-vous sûr de vouloir supprimer '%1' ? Could not delete directory. Impossible de supprimer le dossier. All Files (*.*) Tous les fichiers (*.*) Save As Enregistrer sous Drive Unité File Fichier File Folder Match Windows Explorer Fichier Dossier Folder All other platforms Dossier Alias Mac OS X Finder Alias Shortcut All other platforms Raccourci Unknown Inconnu Find Directory Chercher dans le dossier Show Afficher Forward Successeur New Folder Nouveau dossier &New Folder &Nouveau dossier &Choose &Choisir Remove Supprimer File &name: &Nom de fichier : Look in: Voir dans : Create New Folder Créer un nouveau dossier File Folder Fichier Dossier Folder Dossier Alias Alias Shortcut Raccourci Go back Précédent Go forward Suivant Go to the parent directory Dossier parent Create a New Folder Créer un nouveau dossier Change to list view mode Affichage liste Change to detail view mode Affichage détaillé QFileSystemModel %1 TB %1 To %1 GB %1 Go %1 MB %1 Mo %1 KB %1 Ko %1 bytes %1 octets Invalid filename Nom de fichier invalide <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. <b>Le nom "%1" ne peut pas être utilisé.</b><p>Essayez un autre nom avec moins de caractères ou sans ponctuation. Name Nom Size Taille Kind Match OS X Finder Type Type All other platforms Type Date Modified Dernière modification My Computer Poste de travail Computer Ordinateur Kind Type Type Type %1 byte(s) %1 octet(s) QFontDatabase Normal Normal Bold Gras Demi Bold Demi-gras Black Extra-gras Demi Demi Light Maigre Italic Italique Oblique Oblique Any Tous Latin Latin Greek Grec Cyrillic Cyrillique Armenian Arménien Hebrew Hébreu Arabic Arabe Syriac Syriaque Thaana Thâna Devanagari Dévanagari Bengali Bengali Gurmukhi Gurmukhi Gujarati Gujarati Oriya Oriya Tamil Tamoul Telugu Telugu Kannada Kannada Malayalam Malayalam Sinhala Sinhala Thai Thaï Lao Lao/Laotien sont corrects Lao Tibetan Tibétain Myanmar Myanmar/Birman sont corrects mais Myanmar semble plus adapté pour la langue écrite Myanmar Georgian Géorgien Khmer Khmer Simplified Chinese Chinois Simplifié Traditional Chinese Chinois Traditionnel Japanese Japonais Korean Coréen Vietnamese Vietnamien Symbol Symbole Ogham Ogham Runic Runique N'Ko N'Ko QFontDialog &Font &Police Font st&yle St&yle de police &Size &Taille Effects Effets Stri&keout &Barré &Underline &Souligné Sample Exemple Select Font Choisir une police Wr&iting System &Système d'écriture QFtp Host %1 found Hôte %1 trouvé Host found Hôte trouvé Connected to host %1 Connecté à l'hôte %1 Connected to host Connecté à l'hôte Connection to %1 closed Connexion à %1 fermée Connection closed Connexion fermée Host %1 not found Hôte %1 introuvable Connection refused to host %1 Connexion à l'hôte %1 refusée Connection timed out to host %1 Connexion expirée vers l'hôte %1 Unknown error Erreur inconnue Connecting to host failed: %1 Échec de la connexion à l'hôte %1 Login failed: %1 Échec du login : %1 Listing directory failed: %1 Échec du listage du dossier : %1 Changing directory failed: %1 Échec du changement de dossier : %1 Downloading file failed: %1 Échec du téléchargement du fichier : %1 Uploading file failed: %1 Échec du télédéchargement : %1 Removing file failed: %1 Échec de la suppression d'un fichier : %1 Creating directory failed: %1 Échec de la création d'un dossier : %1 Removing directory failed: %1 Échec de la suppression d'un dossier : %1 Not connected Non connecté Connection refused for data connection Connexion donnée refusée QGstreamerPlayerSession Unable to play %1 Impossible de lire %1 QHostInfo Unknown error Erreur inconnue No host name given Aucun nom d'hôte n'a été donné QHostInfoAgent Host not found Hôte introuvable Unknown address type Adresse de type inconnu Unknown error Erreur inconnue No host name given Aucun nom d'hôte n'a été donné Invalid hostname Nom d'hôte invalide QHttp Connection refused Connexion refusée Host %1 not found Hôte %1 introuvable Wrong content length Longueur du contenu invalide HTTP request failed Échec de la requête HTTP Host %1 found Hôte %1 trouvé Host found Hôte trouvé Connected to host %1 Connecté à l'hôte %1 Connected to host Connecté à l'hôte Connection to %1 closed Connexion à %1 fermée Connection closed Connexion fermée Unknown error Erreur inconnue Request aborted Requête interrompue No server set to connect to Aucun serveur spécifié Server closed connection unexpectedly Connexion interrompue par le serveur Invalid HTTP response header Entête de réponse HTTP invalide Unknown authentication method Méthode d'authentification inconnue Invalid HTTP chunked body Fragment HTTP invalide Error writing response to device Erreur lors de l'écriture de la réponse Proxy authentication required Le proxy requiert une authentification Authentication required Authentification requise Proxy requires authentication Le proxy requiert une authentification Host requires authentication L'hôte requiert une authentification Data corrupted Données corrompues Unknown protocol specified Protocole spécifié inconnu SSL handshake failed La poignée de main SSL a échoué Connection refused (or timed out) Connexion refusée (ou délai expiré) HTTPS connection requested but SSL support not compiled in Connexion HTTPS requise mais le support SSL n'est pas compilé QHttpSocketEngine Did not receive HTTP response from proxy Pas de réponse HTTP de la part du proxy Error parsing authentication request from proxy Erreur dans le reqête d'authentification reçue du proxy Authentication required Authentification requise Proxy denied connection Le proxy a rejeté la connexion Error communicating with HTTP proxy Erreur de communication avec le proxy HTTP Proxy server not found Serveur proxy introuvable Proxy connection refused Connexion au proxy refusée Proxy server connection timed out La connexion au serveur proxy a expiré Proxy connection closed prematurely La connexion au serveur proxy a été fermée prématurément QIBaseDriver Error opening database Erreur d'ouverture de la base de données Could not start transaction La transaction n'a pas pu être démarrée Unable to commit transaction Incapable de soumettre la transaction Unable to rollback transaction Incapable d'annuler la transaction QIBaseResult Unable to create BLOB Impossible de créer un BLOB Unable to write BLOB Impossible d'écrire le BLOB Unable to open BLOB Impossible d'ouvrir le BLOB Unable to read BLOB Impossible de lire le BLOB Could not find array Impossible de trouver le tableau Could not get array data Impossible de trouver le tableau de données Could not get query info Impossible d'avoir les informations sur la requête Could not start transaction Impossible de démarrer la transaction Unable to commit transaction Incapable de soumettre la transaction Could not allocate statement Impossible d'allouer la requête Could not prepare statement Impossible de préparer la requête Could not describe input statement Impossible de décrire la requête Could not describe statement Impossible de décrire la requête Unable to close statement Impossible de fermer la requête Unable to execute query Impossible d'exécuter la requête Could not fetch next item Impossible de récuperer l'élément suivant Could not get statement info Impossible d'avoir les informations sur la requête QIODevice Permission denied Autorisation refusée Too many open files Trop de fichiers ouverts simultanément No such file or directory Aucun fichier ou dossier de ce nom No space left on device Aucun espace disponible sur le périphérique Unknown error Erreur inconnue QInputContext XIM XIM XIM input method Méthode d'entrée XIM Windows input method Méthode d'entrée Windows Mac OS X input method Méthode d'entrée Mac OS X FEP Processeur frontal S60 FEP input method Méthode de saisie processeur frontal S60 QInputDialog Enter a value: Entrer une valeur : QLibrary QLibrary::load_sys: Cannot load %1 (%2) QLibrary::load_sys : Impossible de charger %1 (%2) QLibrary::unload_sys: Cannot unload %1 (%2) QLibrary::unload_sys : Impossible de décharger %1 (%2) QLibrary::resolve_sys: Symbol "%1" undefined in %2 (%3) QLibrary::resolve_sys : Symbole "%1" non défini dans %2 (%3) Could not mmap '%1': %2 Impossible d'établir la projection en mémoire de '%1' : %2 Plugin verification data mismatch in '%1' Données de vérification du plugin différente dans '%1' Could not unmap '%1': %2 Impossible de supprimer la projection en mémoire de '%1' : %2 The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] Le plugin '%1' utilise une bibliothèque Qt incompatible. (%2.%3.%4) [%5] The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3" Le plugin '%1' utilise une bibliothèque Qt incompatible. Clé attendue "%2", reçue "%3" Unknown error Erreur inconnue The shared library was not found. La bibliothèque partagée est introuvable. The file '%1' is not a valid Qt plugin. Le fichier '%1' n'est pas un plugin Qt valide. The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) Le plugin '%1' utilise une bibliothèque Qt incompatible. (Il est impossible de mélanger des bibliothèques 'debug' et 'release'.) Cannot load library %1: %2 Impossible de charger la bibliothèque %1 : %2 Cannot unload library %1: %2 Impossible de décharger la bibliothèque %1 : %2 Cannot resolve symbol "%1" in %2: %3 Impossible de résoudre le symbole "%1" dans %2 : %3 '%1' is not an ELF object (%2) '%1' n'est pas un objet ELF (%2) '%1' is not an ELF object '%1' n'est pas un objet ELF '%1' is an invalid ELF object (%2) '%1' n'est pas un objet ELF valide (%2) QLineEdit Select All Tout sélectionner &Undo &Annuler &Redo &Rétablir Cu&t Co&uper &Copy Cop&ier &Paste Co&ller Delete Supprimer QLocalServer %1: Name error %1 : Erreur de nom %1: Permission denied %1 : Permission refusée %1: Address in use %1 : Address déjà utilisée %1: Unknown error %2 %1 : Erreur inconnue %2 QLocalSocket %1: Connection refused %1 : Connexion refusée %1: Remote closed %1 : Connexion fermée %1: Invalid name %1 : Nom invalide %1: Socket access error %1 : Erreur d'accès au socket %1: Socket resource error %1 : Erreur de ressource du socket %1: Socket operation timed out %1 : L'opération socket a expiré %1: Datagram too large %1 : Datagramme trop grand %1: Connection error %1 : Erreur de connexion %1: The socket operation is not supported %1 : L'opération n'est pas supportée %1: Unknown error %1 : erreur inconnue %1: Unknown error %2 %1 : Erreur inconnue %2 %1: Access denied %1 : Autorisation refusée QMYSQLDriver Unable to open database ' Impossible d'ouvrir la base de données ' Unable to connect Impossible d'établir une connexion Unable to begin transaction Impossible de démarrer la transaction Unable to commit transaction Impossible de soumettre la transaction Unable to rollback transaction Impossible d'annuler la transaction QMYSQLResult Unable to fetch data Impossible de récuperer des données Unable to execute query Impossible d'exécuter la requête Unable to store result Impossible de stocker le résultat Unable to prepare statement Impossible de préparer l'instruction Unable to reset statement Impossible de réinitialiser l'instruction Unable to bind value Impossible d'attacher la valeur Unable to execute statement Impossible d'exécuter la requête Unable to bind outvalues Impossible d'attacher les valeurs de sortie Unable to store statement results Impossible de stocker les résultats de la requête Unable to execute next query Impossible d'exécuterla prochaine requête Unable to store next result Impossible de stocker le prochain résultat QMdiArea (Untitled) (Sans titre) QMdiSubWindow %1 - [%2] %1 - [%2] Close Fermer Minimize Réduire Restore Down Restaurer en bas &Restore &Restaurer &Move &Déplacer &Size &Taille Mi&nimize Réd&uire Ma&ximize Ma&ximiser Stay on &Top &Rester au premier plan &Close &Fermer - [%1] - [%1] Maximize Maximiser Unshade Restaurer Shade Ombrer Restore Restaurer Help Aide Menu Menu QMediaPlayer The QMediaPlayer object does not have a valid service Pas de service valide pour l'objet QMediaPlayer QMediaPlaylist Could not add items to read only playlist. Impossible d'ajouter des éléments à une liste de lecture en lecture seule. Playlist format is not supported Le format de liste de lecture n'est pas supporté The file could not be accessed. Impossible d'accéder au fichier. QMenu Close Fermer Open Ouvrir Execute Exécuter QMenuBar About À propos Config Configuration Preference Préférence Options Options Setting Paramètre Setup Réglage Quit Quitter Exit Quitter About %1 À propos de %1 About Qt À propos de Qt Preferences Préférences Quit %1 Quitter %1 Actions Actions QMessageBox OK OK About Qt À propos de Qt Help Aide <p>This program uses Qt version %1.</p> <p>Ce programme utilise la version %1 de Qt.</p> <h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qtopia Core.</p><p>Qt is a Trolltech product. See <a href="http://qt.digia.com/">qt.digia.com/</a> for more information.</p> <h3>À propos de Qt</h3>%1<p>Qt est un toolkit C++ pour le développement d'applications multi-platformes.</p><p>Qt fournit la portabilité du code source pour MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux et toutes les variantes commerciales majeures d'Unix. Qt est aussi disponible pour les systèmes embarqués sous le nom Qtopia Core.</p><p>Qt est un produit de Trolltech. <a href="http : //qt.digia.com/">qt.digia.com</a> for more information.</p> Show Details... Montrer les détails... Hide Details... Cacher les détails... <h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Digia product. See <a href="http://qt.digia.com/">qt.digia.com</a> for more information.</p> <h3>À propos de Qt</h3>%1<p>Qt est un framework de développement d'applications multi-plateforme.</p><p>Qt fournit la portabilité du code source surMS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, et toutes les variantes majeures d'Unix. Qt est aussi disponible pour l'embarqué avec Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt est un produit de Digia. Allez à <a href="http : //qt.digia.com/">qt.digia.com</a> pour plus d'informations.</p> <p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://qt.digia.com/company/model/">qt.digia.com/company/model/</a> for an overview of Qt licensing.</p> <p>Ce programme utilise Qt Open Source Edition version %1.</p><p>Qt Open Source Edition est prévu pour le développement d'applications Open Source. Vous devez avoir un license commerciale de Qt pour développer des applications propiétaires (Closed Source).</p><p>Vous pouvez aller sur <a href="http : //qt.digia.com/company/model/">qt.digia.com/company/model/</a> pour plus d'informations sur les licenses Qt.</p> <h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt Embedded.</p><p>Qt is a Trolltech product. See <a href="http://qt.digia.com/">qt.digia.com</a> for more information.</p> <h3>À propos de Qt</h3>%1<p>Qt est un toolkit C++ pour le développement d'application multi-plateforme.</p><p>Qt fournit la portabilité de votre source pour MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, toutes les variantes majeures d'Unix. Qt est aussi disponible pour les périphériques embarqués avec Qt Embedded.</p><p>Qt est un produit de Trolltech. Voir <a href="http : //qt.digia.com/">qt.digia.com</a> pour plus d'informations.</p> <h3>About Qt</h3><p>This program uses Qt version %1.</p> <h3>À propos de Qt</h3><p>Ce programme utilise Qt version %1.</p> <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.digia.com/product/licensing">qt.digia.com/product/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).</p><p>Qt is a Digia product. See <a href="http://qt.digia.com/">qt.digia.com</a> for more information.</p> <p>Qt est une bibliothèque logicielle C++ pour le développement d’applications multiplateformes.</p><p>Qt fournit une portabilité source unique pour MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux et les principales variantes commerciales d’Unix. Qt est également disponible pour appareils intégrés comme Qt pour Embedded Linux et Qt pour Windows CE.</p><p>Il existe trois options de licence différentes conçues pour s’adapter aux besoins d’utilisateurs variés.</p><p>Qt concédée sous notre contrat de licence commerciale est destinée au développement de logiciels propriétaires/commerciaux dont vous ne souhaitez pas partager le code source avec des tiers ou qui ne peuvent se conformer aux termes de la LGPL GNU version 2.1 ou GPL GNU version 3.0.</p><p>Qt concédée sous la LGPL GNU version 2.1 est destinée au développement d’applications Qt (propriétaires ou libres) à condition que vous vous conformiez aux conditions générales de la LGPL GNU version 2.1.</p><p>Qt concédée sous la licence publique générale GNU version 3.0 est destinée au développement d’applications Qt lorsque vous souhaitez utiliser ces applications avec d’autres logiciels soumis aux termes de la GPL GNU version 3.0 ou lorsque vous acceptez les termes de la GPL GNU version 3.0.</p><p>Veuillez consulter<a href="http : //qt.digia.com/product/licensing">qt.digia.com/product/licensing</a> pour un aperçu des concessions de licences Qt.</p><p>Copyright (C) 2012 Digia Plc et/ou ses filiales.</p><p>Qt est un produit Digia. Voir <a href="http : //qt.digia.com/">qt.digia.com</a> pour de plus amples informations.</p> QMultiInputContext Select IM Sélectionner IM QMultiInputContextPlugin Multiple input method switcher Sélectionneur de méthode de saisie Multiple input method switcher that uses the context menu of the text widgets Sélectionneur de méthode de saisie qui utilise le menu contextuel des widgets de texte QNativeSocketEngine The remote host closed the connection L'hôte distant a fermé la connexion Network operation timed out L'opération réseau a expiré Out of resources Manque de ressources Unsupported socket operation Opération socket non supportée Protocol type not supported Protocol non géré Invalid socket descriptor Descripteur de socket invalide Network unreachable Réseau impossible à rejoindre Permission denied Autorisation refusée Connection timed out Connexion expirée Connection refused Connexion refusée The bound address is already in use L'adresse liée est déjà en usage The address is not available L'adresse n'est pas disponible The address is protected L'adresse est protégée Unable to send a message Impossible d'envoyer un message Unable to receive a message Impossible de recevoir un message Unable to write Impossible d'écrire Network error Erreur réseau Another socket is already listening on the same port Un autre socket écoute déjà sur le même port Unable to initialize non-blocking socket Impossible d'initialiser le socket asynchrone Unable to initialize broadcast socket Impossible d'initialiser le socket broadcast Attempt to use IPv6 socket on a platform with no IPv6 support Tentative d'utiliser un socket IPv6 sur une plateforme qui ne supporte pas IPv6 Host unreachable Hôte inaccessible Datagram was too large to send Le datagramme était trop grand pour être envoyé Operation on non-socket Operation sur non-socket Unknown error Erreur inconnue The proxy type is invalid for this operation Le type de proxy est invalide pour cette opération QNetworkAccessCacheBackend Error opening %1 Erreur lors de l'ouverture de %1 QNetworkAccessDataBackend Operation not supported on %1 Opération non supportée sur %1 Invalid URI: %1 URI invalide : %1 QNetworkAccessDebugPipeBackend Write error writing to %1: %2 Erreur lors de l'écriture dans %1 : %2 Socket error on %1: %2 Erreur de socket sur %1 : %2 Remote host closed the connection prematurely on %1 L'hôte distant a fermé sa connexion de façon prématurée sur %1 QNetworkAccessFileBackend Request for opening non-local file %1 Requête d'ouverture de fichier distant %1 Error opening %1: %2 Erreur lors de l'ouverture de %1 : %2 Write error writing to %1: %2 Erreur d'écriture de %1 : %2 Cannot open %1: Path is a directory Impossible d'ouvrir %1 : le chemin est un dossier Read error reading from %1: %2 Erreur de lecture de %1 : %2 QNetworkAccessFtpBackend No suitable proxy found Aucun proxy trouvé Cannot open %1: is a directory Impossible d'ouvrir %1 : le chemin est un dossier Logging in to %1 failed: authentication required Connexion à %1 a échoué : authentification requise Error while downloading %1: %2 Erreur lors du téléchargement de %1 : %2 Error while uploading %1: %2 Erreur lors de l'envoi de %1 : %2 QNetworkAccessHttpBackend No suitable proxy found Aucun proxy trouvé QNetworkAccessManager Network access is disabled. L'accès au réseau est désactivé. QNetworkReply Error downloading %1 - server replied: %2 Erreur lors du téléchargement de %1 - le serveur a répondu : %2 Protocol "%1" is unknown Le protocole "%1" est inconnu Network session error. Erreur de session réseau. backend start error. Temporary network failure. Erreur réseau temporaire. QNetworkReplyImpl Operation canceled Opération annulée QNetworkSession Invalid configuration. Configuration invalide. QNetworkSessionPrivateImpl Roaming error Erreur de roaming Session aborted by user or system Session annulée par l'utilisateur ou le système Unidentified Error Erreur inconnue Unknown session error. Erreur de session inconnue. The session was aborted by the user or system. la session a été annulée par l'utilisateur ou le système. The requested operation is not supported by the system. L'opération requise n'est pas suportée par le système. The specified configuration cannot be used. La configuration spécifiée ne peut être utilisée. Roaming was aborted or is not possible. Le roaming a été annulé ou est impossible. QOCIDriver Unable to logon Impossible d'ouvrir une session Unable to initialize QOCIDriver L'initialisation a échoué Unable to begin transaction Impossible de démarrer la transaction Unable to commit transaction Impossible d'enregistrer la transaction Unable to rollback transaction Impossible d'annuler la transaction Unable to initialize L'initialisation a échoué QOCIResult Unable to bind column for batch execute Impossible d'attacher la colonne pour une execution batch Unable to execute batch statement Impossible d'exécuter l'instruction batch Unable to goto next Impossible de passer au suivant Unable to alloc statement Impossible d'allouer la requête Unable to prepare statement Impossible de préparer la requête Unable to bind value Impossible d'attacher la valeur Unable to execute select statement Impossible d'exéctuer la requête select Unable to execute statement Impossible d'exéctuer la requête Unable to get statement type Impossible d'obtenir le type de la requête QODBCDriver Unable to connect Incapable d'établir une connexion Unable to connect - Driver doesn't support all needed functionality Impossible de se connecter - Le pilote ne supporte pas toutes les fonctionnalités nécessaires Unable to disable autocommit Impossible de désactiver l'autocommit Unable to commit transaction Incapable de soumettre la transaction Unable to rollback transaction Incapable d'annuler la transaction Unable to enable autocommit Impossible d'activer l'autocommit Unable to connect - Driver doesn't support all functionality required Impossible de se connecter - Le pilote ne supporte pas toutes les fonctionnalités nécessaires QODBCResult QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult::reset : Impossible d'utiliser 'SQL_CURSOR_STATIC' comme attribut de requête. Veuillez vérifier la configuration de votre pilote ODBC Unable to execute statement Impossible d'exéctuer la requête Unable to fetch next Impossible de récupérer le suivant Unable to prepare statement Impossible de préparer la requête Unable to bind variable Impossible d'attacher la variable Unable to fetch last Impossible de récupérer le dernier Unable to fetch Impossible de récupérer Unable to fetch first Impossible de récupérer le premier Unable to fetch previous Impossible de récupérer le précedent QObject Home Début Operation not supported on %1 Opération non supportée sur %1 Invalid URI: %1 URI invalide : %1 Write error writing to %1: %2 Erreur d'écriture sur %1 : %2 Read error reading from %1: %2 Erreur de lecture sur %1 : %2 Socket error on %1: %2 Erreur de socket sur %1 : %2 Remote host closed the connection prematurely on %1 L'hôte distant a fermé sa connexion de façon prématurée sur %1 Protocol error: packet of size 0 received Erreur de protocole : paquet de taille 0 reçu No host name given Nom d'hôte manquant Invalid hostname Nom d'hôte invalide PulseAudio Sound Server Serveur de son PulseAudio "%1" duplicates a previous role name and will be disabled. "%1" est un doublon d'un nom de role existant et sera désactivé. invalid query: "%1" Requête invalide : "%1" Host not found Hôte introuvable QPPDOptionsModel Name Nom Value Valeur QPSQLDriver Unable to connect Impossible d'établir une connexion Could not begin transaction Impossible de démarrer la transaction Could not commit transaction Impossible de soumettre la transaction Could not rollback transaction Impossible d'annuler la transaction Unable to subscribe Impossible de s'inscrire Unable to unsubscribe Impossible de se désinscrire QPSQLResult Unable to create query Impossible de créer la requête Unable to prepare statement Impossible de préparer la requête QPageSetupWidget Centimeters (cm) Centimètres (cm) Millimeters (mm) Millimètres (mm) Inches (in) Pouces (in) Points (pt) Points (pts) Form Formulaire Paper Papier Page size: Dimensions : Width: Largeur : Height: Hauteur : Paper source: Source du papier : Orientation Orientation Portrait Portrait Landscape Paysage Reverse landscape Paysage inversé Reverse portrait Portrait inversé Margins Marges top margin marge haute left margin marge gauche right margin marge droite bottom margin marge basse QPluginLoader Unknown error Erreur inconnue The plugin was not loaded. Le plugin n'a pas été chargé. QPrintDialog locally connected connecté en local unknown inconnu OK OK Cancel Annuler Print in color if available Imprimer en couleur si possible Print all Imprimer tout Print range Imprimer la sélection Print last page first Imprimer d'abord la dernière page Number of copies: Nombre de copies : Paper format Format du papier Portrait Portrait Landscape Paysage A0 (841 x 1189 mm) A0 (841 x 1189 mm) A1 (594 x 841 mm) A1 (594 x 841 mm) A2 (420 x 594 mm) A2 (420 x 594 mm) A3 (297 x 420 mm) A3 (297 x 420 mm) A5 (148 x 210 mm) A5 (148 x 210 mm) A6 (105 x 148 mm) A6 (105 x 148 mm) A7 (74 x 105 mm) A7 (74 x 105 mm) A8 (52 x 74 mm) A8 (52 x 74 mm) A9 (37 x 52 mm) A9 (37 x 52 mm) B0 (1000 x 1414 mm) B0 (1000 x 1414 mm) B1 (707 x 1000 mm) B1 (707 x 1000 mm) B2 (500 x 707 mm) B2 (500 x 707 mm) B3 (353 x 500 mm) B3 (353 x 500 mm) B4 (250 x 353 mm) B4 (250 x 353 mm) B6 (125 x 176 mm) B6 (125 x 176 mm) B7 (88 x 125 mm) B7 (88 x 125 mm) B8 (62 x 88 mm) B8 (62 x 88 mm) B9 (44 x 62 mm) B9 (44 x 62 mm) B10 (31 x 44 mm) B10 (31 x 44 mm) C5E (163 x 229 mm) C5E (163 x 229 mm) DLE (110 x 220 mm) DLE (110 x 220 mm) Folio (210 x 330 mm) Folio (210 x 330 mm) Ledger (432 x 279 mm) Ledger (432 x 279 mm) Tabloid (279 x 432 mm) Tabloïde (279 x 432 mm) US Common #10 Envelope (105 x 241 mm) US Common #10 Envelope (105 x 241 mm) Print current page Imprimer la page courante Aliases: %1 Alias : %1 A4 (210 x 297 mm, 8.26 x 11.7 inches) A4 (210 x 297 mm) B5 (176 x 250 mm, 6.93 x 9.84 inches) B5 (176 x 250 mm) Executive (7.5 x 10 inches, 191 x 254 mm) Executive (7,5 x 10 pouces, 191 x 254 mm) Legal (8.5 x 14 inches, 216 x 356 mm) Legal (8.5 x 14 pouces, 216 x 356 mm) Letter (8.5 x 11 inches, 216 x 279 mm) Letter (8,5 x 11 pouces, 216 x 279 mm) Print selection Imprimer la sélection Page size: Dimensions : Orientation: Orientation : Paper source: Source du papier : Print Imprimer File Fichier Printer Imprimante Print To File ... Imprimer dans un fichier... Print dialog Fenêtre d'impression Size: Taille : Properties Propriétés Printer info: Informations sur l'imprimante : Browse Parcourir Print to file Imprimer dans un fichier Pages from Pages to à Selection Sélection Copies Copies Collate Assembler Other Autre Double side printing Impression recto verso File %1 is not writable. Please choose a different file name. Impossible d'écrire dans le fichier %1. Veuillez choisir un nom de fichier différent. %1 already exists. Do you want to overwrite it? %1 existe. Voulez-vous l'écraser ? File exists Le fichier existe <qt>Do you want to overwrite it?</qt> <qt>voulez-vous l'écraser ?</qt> %1 is a directory. Please choose a different file name. %1 est un dossier. Veuillez choisir un nom de fichier différent. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 C5E DLE Executive Folio Ledger Legal Letter Tabloid US Common #10 Envelope Custom Personnalisé &Options >> &Print Im&primer &Options << Print to File (PDF) Imprimer dans un fichier (PDF) Print to File (Postscript) Imprimer dans un fichier (PostScript) Local file Fichier local Write %1 file Ecriture du fichier %1 The 'From' value cannot be greater than the 'To' value. La valeur 'de' ne peut pas être plus grande que la valeur 'à'. QPrintPreviewDialog %1% %1% Print Preview Aperçu avant impression Next page Page suivante Previous page Page précédente First page Première page Last page Dernière page Fit width Ajuster la largeur Fit page Ajuster la page Zoom in Zoom avant Zoom out Zoom arrière Portrait Portrait Landscape Paysage Show single page Afficher une seule page Show facing pages Afficher deux pages Show overview of all pages Afficher un aperçu de toutes les pages Print Imprimer Page setup Mise en page Close Fermer Export to PDF Exporter vers PDF Export to PostScript Exporter vers PostScript Page Setup Mise en page QPrintPropertiesDialog PPD Properties Propriétés PPD Save Enregistrer OK OK QPrintPropertiesWidget Form Formulaire Page Advanced Avancé QPrintSettingsOutput Form Formulaire Copies Copies Print range Imprimer la sélection Print all Imprimer tout Pages from Pages to à Selection Sélection Output Settings Paramètres de sortie Copies: Copies : Collate Assembler Reverse Inverse Options Options Color Mode Mode de couleur Color Couleur Grayscale Dégradé de gris Duplex Printing Impression en duplex None Aucun Long side Côté long Short side Côté court Current Page Page courante QPrintWidget Form Formulaire Printer Imprimante &Name: &Nom : P&roperties P&ropriétés Location: Emplacement : Preview Prévisualisation Type: Type : Output &file: &Fichier de sortie : ... QProcess Could not open input redirection for reading Impossible d'ouvrir la redirection d'entrée en lecture Could not open output redirection for writing Impossible d'ouvrir la redirection de sortie pour écriture Resource error (fork failure): %1 Erreur de ressouce (fork) : %1 Process operation timed out Operation de processus a expiré Error reading from process Erreur de lecture du processus Error writing to process Erreur d"écriture vers le processus Process crashed Le processus à planté No program defined Aucun programme défini Process failed to start Le processus n'a pas démarré Process failed to start: %1 Le démarrage du processus a échoué : %1 QProgressDialog Cancel Annuler QPushButton Open Ouvrir QRadioButton Check Cocher QRegExp no error occurred aucune erreur ne s'est produite disabled feature used option désactivée bad char class syntax syntaxe invalide pour classe de caractère bad lookahead syntax syntaxe invalide pour lookahead bad repetition syntax syntaxe invalide pour répétition invalid octal value valeur octale invalide missing left delim délémiteur gauche manquant unexpected end fin impromptue met internal limit rencontré limite interne invalid interval intervalle invalide invalid category catégorie invalide QSQLite2Driver Error to open database Erreur à l'ouverture de la base de données Unable to begin transaction Impossible de démarrer la transaction Unable to commit transaction Impossible de soumettre la transaction Unable to rollback Transaction Impossible d'annuler la transaction Error opening database Erreur lors de l'ouverture de la base de données Unable to rollback transaction Impossible de répéter la transaction QSQLite2Result Unable to fetch results Impossible de récupérer les résultats Unable to execute statement Impossible d'exécuter la requête QSQLiteDriver Error opening database Erreur lors de l'ouverture de la base de données Error closing database Erreur lors de la fermeture de la base de données Unable to begin transaction Impossible de démarrer la transaction Unable to commit transaction Incapable de soumettre la transaction Unable to roll back transaction Impossible d'annuler la transaction Unable to rollback transaction Impossible d'annuler la transaction QSQLiteResult Unable to fetch row Impossible de récupérer la rangée Unable to execute statement Impossible d'exécuter la requête Unable to reset statement Impossible de réinitialiser la requête Unable to bind parameters Impossible d'attacher les paramètres Parameter count mismatch Nombre de paramètres incorrect No query Pas de requête QScriptBreakpointsModel ID Identifiant Location Lieu Condition Condition Ignore-count Nombre d'ignorés Single-shot Un seul coup Hit-count Nombre de coups QScriptBreakpointsWidget New Créer Delete Supprimer QScriptDebugger Go to Line Aller à la ligne Line: Ligne : Interrupt Interrompre Shift+F5 Shift+F5 Continue Continuer F5 F5 Step Into Pas à pas détaillé F11 F11 Step Over Pas à pas principal F10 F10 Step Out Pas à pas sortant Shift+F11 Shift+F11 Run to Cursor Exécuter au curseur Ctrl+F10 Ctrl+F10 Run to New Script Exécuter au nouveau script Toggle Breakpoint Basculer le point d'arrêt F9 F9 Clear Debug Output Effacer les résultats du débogage Clear Error Log Effacer le journal d'erreurs Clear Console Effacer la console &Find in Script... &Chercher dans le script... Ctrl+F Ctrl+F Find &Next Résultat &suivant F3 F3 Find &Previous Chercher &précédent Shift+F3 Shift+F3 Ctrl+G Ctrl+G Debug Déboguer QScriptDebuggerCodeFinderWidget Close Fermer Previous Précédent Next Suivant Case Sensitive Sensible à la casse Whole words Mots complets <img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped <img src=" : /qt/scripttools/debugging/images/wrap.png">&nbsp;La recherche est revenue au début QScriptDebuggerLocalsModel Name Nom Value Valeur QScriptDebuggerStackModel Level Niveau Name Nom Location Emplacement QScriptEdit Toggle Breakpoint Basculer le point d'arrêt Disable Breakpoint Désactiver le point d'arrêt Enable Breakpoint Activer le point d'arrêt Breakpoint Condition: Condition du point d'arrêt : QScriptEngineDebugger Loaded Scripts Scripts chargés Breakpoints Points d'arrêt Stack Pile Locals Locaux Console Console Debug Output Résultats du débogage Error Log Journal d'erreurs Search Chercher View Affichage Qt Script Debugger Débogueur de script Qt QScriptNewBreakpointWidget Close Fermer QScrollBar Scroll here Défiler jusqu'ici Left edge Bord gauche Top En haut Right edge Bord droit Bottom En bas Page left Page précédente Page up Page précédente Page right Page suivante Page down Page suivante Scroll left Défiler vers la gauche Scroll up Défiler vers le haut Scroll right Défiler vers la droite Scroll down Défiler vers le bas Line up Aligner Position Position Line down Aligner en-bas QSharedMemory %1: unable to set key on lock %1 : impossible d'affecter la clé au verrou %1: create size is less then 0 %1 : taille de création est inférieur à 0 %1: unable to lock %1 : impossible de vérrouiller %1: unable to unlock %1 : impossible de déverrouiller %1: permission denied %1 : permission refusée %1: already exists %1 : existe déjà %1: doesn't exists %1 : n'existe pas %1: out of resources %1 : plus de ressources disponibles %1: unknown error %2 %1 : erreur inconnue %2 %1: key is empty %1 : clé vide %1: unix key file doesn't exists %1 : le fichier de clé unix n'existe pas %1: ftok failed %1 : ftok a échoué %1: unable to make key %1 : impossible de créer la clé %1: system-imposed size restrictions %1 : le système impose des restrictions sur la taille %1: bad name %1: not attached %1 : non attaché %1: invalid size %1 : taille invalide %1: key error %1 : erreur de clé %1: size query failed %1 : la requête de taille a échoué %1: doesn't exist %1 : n'existe pas %1: UNIX key file doesn't exist %1 : le fichier de clés UNIX n'existe pas QShortcut Space This and all following "incomprehensible" strings in QShortcut context are key names. Please use the localized names appearing on actual keyboards or whatever is commonly used. Espace Esc Échap Tab Tab Backtab Tab arr Backspace Effacement Return Retour Enter Entrée Ins Inser Del Suppr Pause Pause Print Imprimer SysReq Syst Home Début End Fin Left Gauche Up Haut Right Droite Down Bas PgUp Page préc PgDown Page suiv CapsLock Verr maj NumLock Verr num ScrollLock Arrêt défil Menu Menu Help Aide Back Précédent (historique) Forward Successeur (historique) Stop Arrêter Refresh Rafraîchir Volume Down Volume bas Volume Mute Volume muet Volume Up Volume haut Bass Boost Graves fort Bass Up Graves haut Bass Down Graves bas Treble Up Aigus haut Treble Down Aigus bas Media Play Média démarrer Media Stop Média arrêt Media Previous Média précédent Media Next Média suivant Media Record Média enregistrer Favorites Préférés Search Recherche Standby Attente Open URL Ouvrir URL Launch Mail Lancer courrier Launch Media Lancer média Launch (0) Lancer (0) Launch (1) Lancer (1) Launch (2) Lancer (2) Launch (3) Lancer (3) Launch (4) Lancer (4) Launch (5) Lancer (5) Launch (6) Lancer (6) Launch (7) Lancer (7) Launch (8) Lancer (8) Launch (9) Lancer (9) Launch (A) Lancer (A) Launch (B) Lancer (B) Launch (C) Lancer (C) Launch (D) Lancer (D) Launch (E) Lancer (E) Launch (F) Lancer (F) Print Screen Capture d'écran Page Up Page haut Page Down Page bas Caps Lock Verr Maj Num Lock Verr num Number Lock Verrouillage numérique Scroll Lock Arrêt défilement Insert Insérer Delete Supprimer Escape Échapement System Request Système Select Sélectionner Yes Oui No Non Context1 Contexte1 Context2 Contexte2 Context3 Contexte3 Context4 Contexte4 Call Button to start a call (note: a separate button is used to end the call) Appeler Hangup Button to end a call (note: a separate button is used to start the call) Raccrocher Toggle Call/Hangup Button that will hang up if we're in call, or make a call if we're not. Décrocher/Raccrocher Flip Retourner Voice Dial Button to trigger voice dialing Commande vocale Last Number Redial Button to redial the last number called Bis Camera Shutter Button to trigger the camera shutter (take a picture) Déclencheur appareil photo Camera Focus Button to focus the camera Focus appareil photo Kanji Muhenkan Henkan Romaji Hiragana Katakana Hiragana Katakana Zenkaku Hankaku Zenkaku Hankaku Touroku Massyo Kana Lock Kana Shift Eisu Shift Eisu toggle Code input Multiple Candidate Candidat multiple Previous Candidate Candidat précédent Hangul Hangul Start Hangul début Hangul End Hangul Fin Hangul Hanja Hangul Jamo Hangul Romaja Hangul Jeonja Hangul Banja Hangul PreHanja Hangul PostHanja Hangul Special Ctrl Ctrl Shift Maj Alt Alt Meta Méta + + F%1 F%1 Home Page Page d'accueil Media Pause Media player pause button Média pause Toggle Media Play/Pause Media player button to toggle between playing and paused Média Lecture/Pause Monitor Brightness Up Augmenter la luminosité du moniteur Monitor Brightness Down Baisser la luminosité du moniteur Keyboard Light On/Off Avec/sans lumière clavier Keyboard Brightness Up Augmenter la luminosité du clavier Keyboard Brightness Down Baisser la luminosité du clavier Power Off Couper l'alimentation Wake Up Réveiller Eject Éjecter Screensaver Économiseur d'écran WWW WWW Sleep Dormir LightBulb Ampoule Shop Magasin History Historique Add Favorite Ajouter favori Hot Links Liens chauds Adjust Brightness Régler la luminosité Finance Finances Community Communauté Audio Rewind Audio arrière Back Forward Retour avant Application Left Application gauche Application Right Application droite Book Livre CD CD Calculator Calculatrice Clear Effacer Clear Grab Effacer la prise Close Fermer Copy Copier Cut Couper Display Affichage DOS DOS Documents Documents Spreadsheet Feuille de calcul Browser Navigateur Game Jeu Go Aller iTouch iTouch Logoff Fermer une session Market Marché Meeting Réunion Keyboard Menu Menu du clavier Menu PB Menu PB My Sites Mes sites News Actualités Home Office Bureau à domicile Option Option Paste Coller Phone Téléphone Reply Répondre Reload Recharger Rotate Windows Faire tourner la fenêtre Rotation PB Rotation PB Rotation KB Rotation KB Save Enregistrer Send Envoyer Spellchecker Correcteur orthographique Split Screen Partager l'écran Support Supporter Task Panel Panneau de tâches Terminal Terminal Tools Outils Travel Voyager Video Vidéo Word Processor Traitement de texte XFer XFer Zoom In Agrandir Zoom Out Rétrécir Away Absent Messenger Messagerie instantanée WebCam Webcaméra Mail Forward Faire suivre l'e-mail Pictures Images Music Musique Battery Batterie Bluetooth Bluetooth Wireless Sans fil Ultra Wide Band Bande ultralarge Audio Forward Audio avant Audio Repeat Audio répéter Audio Random Play Audio lecture aléatoire Subtitle Sous-titre Audio Cycle Track Audio répéter la piste Time Heure View Affichage Top Menu Haut du menu Suspend Suspendre Hibernate Hiberner QSlider Page left Page précédente Page up Page précédente Position Position Page right Page suivante Page down Page suivante QSocks5SocketEngine Connection to proxy refused Connexion au proxy refusée Connection to proxy closed prematurely connexion au proxy fermée prématurément Proxy host not found Hôte proxy introuvable Connection to proxy timed out Connexion au proxy expirée Proxy authentication failed L'authentification proxy a échoué Proxy authentication failed: %1 L'authentification proxy a échoué : %1 SOCKS version 5 protocol error Erreur de protocole SOCKS version 5 General SOCKSv5 server failure Erreur générale du serveur SOCKSv5 Connection not allowed by SOCKSv5 server Connexion refusée par le serveur SOCKSv5 TTL expired TTL expiré SOCKSv5 command not supported Commande SOCKSv5 non supportée Address type not supported Type d'adresse non supporté Unknown SOCKSv5 proxy error code 0x%1 Erreur proxy SOCKSv5 inconnue : 0x%1 Socks5 timeout error connecting to socks server Erreur d'expiration socks5 lors de l'établissement d'une connexion au serveur socks Network operation timed out L'opération réseau a expiré QSoftKeyManager Ok OK Select Sélectionner Done Terminer Options Options Cancel Annuler Exit Quitter QSpinBox More Plus Less Moins QSql Delete Supprimer Delete this record? Supprimer cet enregistrement ? Yes Oui No Non Insert Insérer Update Actualiser Save edits? Enregistrer les modifications ? Cancel Annuler Confirm Confirmer Cancel your edits? Annuler vos modifications ? QSslSocket Unable to write data: %1 Impossible d'écrire les données : %1 Error while reading: %1 Erreur lors de la lecture : %1 Error during SSL handshake: %1 Erreur lors de la poignée de main SSL : %1 Error creating SSL context (%1) Erreur lors de la création du contexte SSL (%1) Invalid or empty cipher list (%1) La list de chiffrements est invalide ou vide (%1) Error creating SSL session, %1 Erreur lors de la création de la session SSL, %1 Error creating SSL session: %1 Erreur lors de la création de la session SSL : %1 Cannot provide a certificate with no key, %1 Impossible de fournir un certificat sans clé, %1 Error loading local certificate, %1 Erreur lors du chargement du certificat local, %1 Error loading private key, %1 Erreur lors du chargement de la clé privée, %1 Private key do not certificate public key, %1 La clé privée ne certifie pas la clé publique, %1 Private key does not certificate public key, %1 La clé privée ne certifie pas la clé publique, %1 Unable to decrypt data: %1 Impossible de décrypter les données : %1 Private key does not certify public key, %1 La clé privée ne certifie pas la clé publique, %1 No error Aucune erreur The issuer certificate could not be found Le certificat de l'émetteur est introuvable The certificate signature could not be decrypted La signature du certificat n'a pas pu être vérifiée The public key in the certificate could not be read La clé publique du certificat n'a pas pu être lue The signature of the certificate is invalid La signature du certificat n'est pas valide The certificate is not yet valid Le certificat n'est pas encore valide The certificate has expired Le certificat a expiré The certificate's notBefore field contains an invalid time Le champ pasAvant du certificat inclut une heure invalide The certificate's notAfter field contains an invalid time Le champ pasAprès du certificat inclut une heure invalide The certificate is self-signed, and untrusted Le certificat n'est pas sécurisé car auto-signé The root certificate of the certificate chain is self-signed, and untrusted Le certificat racine de la chaîne de certificats n'est pas sécurisé car signé automatiquement The issuer certificate of a locally looked up certificate could not be found Le certificat de l'émetteur d'un certificat converti localement est introuvable No certificates could be verified Aucun certificat n'a pu être vérifié One of the CA certificates is invalid L'un des certificats CA n'est pas valide The basicConstraints path length parameter has been exceeded Le paramètre de longueur du chemin basicConstraints a été dépassé The supplied certificate is unsuitable for this purpose Le certificat fourni ne convient pas pour cet objectif The root CA certificate is not trusted for this purpose Le certificat CA racine n'est pas sécurisé pour cet objectif The root CA certificate is marked to reject the specified purpose Le certificat CA racine est marqué pour rejeter l'objectif spécifié The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate Le certificat de l'émetteur candidat actuel a été rejeté car le nom de son sujet ne correspondait pas au nom de l'émetteur du certificat actuel The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate Le certificat de l'émetteur candidat actuel a été rejeté car le nom de son sujet et son numéro de série étaient présents et ne correspondaient pas à l'identifiant de la clé d'autorité du certificat actuel The peer did not present any certificate Le poste ne contient aucun certificat The host name did not match any of the valid hosts for this certificate Le nom d'hôte ne correspondait à aucun des hôtes valides pour ce certificat The peer certificate is blacklisted Unknown error Erreur inconnue QStateMachine Missing initial state in compound state '%1' État initial manquant dans l'état composé '%1' Missing default state in history state '%1' État par défaut manquant dans l'état de l'historique '%1' No common ancestor for targets and source of transition from state '%1' Aucun ancêtre commun pour les cibles et la source de transition de l'état '%1' Unknown error Erreur inconnue QSymbianSocketEngine Unable to initialize non-blocking socket Impossible d'initialiser le socket asynchrone Unable to initialize broadcast socket Impossible d'initialiser le socket broadcast Attempt to use IPv6 socket on a platform with no IPv6 support Tentative d'utiliser un socket IPv6 sur une plateforme qui ne supporte pas IPv6 The remote host closed the connection L'hôte distant a fermé la connexion Network operation timed out L'opération réseau a expiré Out of resources Manque de ressources Unsupported socket operation Opération socket non supportée Protocol type not supported Protocol non géré Invalid socket descriptor Descripteur de socket invalide Host unreachable Hôte inaccessible Network unreachable Réseau impossible à rejoindre Permission denied Autorisation refusée Connection timed out Connexion expirée Connection refused Connexion refusée The bound address is already in use L'adresse liée est déjà en usage The address is not available L'adresse n'est pas disponible The address is protected L'adresse est protégée Datagram was too large to send Le datagramme était trop grand pour être envoyé Unable to send a message Impossible d'envoyer un message Unable to receive a message Impossible de recevoir un message Unable to write Impossible d'écrire Network error Erreur réseau Another socket is already listening on the same port Un autre socket écoute déjà sur le même port Operation on non-socket Operation sur non-socket The proxy type is invalid for this operation Le type de proxy est invalide pour cette opération The address is invalid for this operation The specified network session is not opened Unknown error Erreur inconnue QSystemSemaphore %1: out of resources %1 : plus de ressources disponibles %1: permission denied %1 : permission refusée %1: already exists %1 : existe déjà %1: does not exist %1 : n'existe pas %1: name error %1: unknown error %2 %1 : erreur inconnue %2 QTDSDriver Unable to open connection Impossible d'ouvrir la connexion Unable to use database Impossible d'utiliser la base de données QTabBar Scroll Left Défiler vers la gauche Scroll Right Défiler vers la droite QTcpServer Socket operation unsupported Operation socket non supportée Operation on socket is not supported Opération sur le socket non supportée QTextControl &Undo &Annuler &Redo &Rétablir Cu&t Co&uper &Copy Cop&ier Copy &Link Location Copier l'adresse du &lien &Paste Co&ller Delete Supprimer Select All Tout sélectionner QToolButton Press Appuyer Open Ouvrir QUdpSocket This platform does not support IPv6 Cette plateforme ne supporte pas IPv6 QUndoGroup Undo Annuler Redo Rétablir Undo %1 Undo Default text for undo action Annuler Redo %1 Redo Default text for redo action Rétablir QUndoModel <empty> <vide> QUndoStack Undo Annuler Redo Rétablir Undo %1 Undo Default text for undo action Annuler Redo %1 Redo Default text for redo action Rétablir QUnicodeControlCharacterMenu LRM Left-to-right mark LRM Left-to-right mark RLM Right-to-left mark RLM Right-to-left mark ZWJ Zero width joiner ZWJ Zero width joiner ZWNJ Zero width non-joiner ZWNJ Zero width non-joiner ZWSP Zero width space ZWSP Zero width space LRE Start of left-to-right embedding LRE Start of left-to-right embedding RLE Start of right-to-left embedding RLE Start of right-to-left embedding LRO Start of left-to-right override LRO Start of left-to-right override RLO Start of right-to-left override RLO Start of right-to-left override PDF Pop directional formatting PDF Pop directional formatting Insert Unicode control character Insérer caractère de contrôle Unicode QWebFrame Request cancelled Requête annulée Request blocked Requête bloquée Cannot show URL Impossible d'afficher l'URL Loading is handled by the media engine Frame load interruped by policy change Chargement de la frame interrompu par un changement de configuration Cannot show mimetype Impossible d'afficher le mimetype File does not exist Le fichier n'existe pas Frame load interrupted by policy change Chargement du cadre interrompue par le changement de stratégie QWebPage Submit default label for Submit buttons in forms on web pages Soumettre Submit Submit (input element) alt text for <input> elements with no alt, title, or value Soumettre Reset default label for Reset buttons in forms on web pages Réinitialiser Searchable Index text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' Index recherchable Choose File title for file button used in HTML forms Choisir le fichier No file selected text to display in file button used in HTML forms when no file is selected Pas de fichier sélectionné Details text to display in <details> tag when it has no <summary> child Open in New Window Open in New Window context menu item Ouvrir dans une Nouvelle Fenêtre Save Link... Download Linked File context menu item Enregistrer le lien... Copy Link Copy Link context menu item Copier le lien Open Image Open Image in New Window context menu item Ouvrir l'image Save Image Download Image context menu item Enregistrer l'image Copy Image Copy Link context menu item Copier l'image Copy Image Address Copy Image Address menu item Open Video Open Video in New Window Open Audio Open Audio in New Window Copy Video Copy Video Link Location Copy Audio Copy Audio Link Location Toggle Controls Toggle Media Controls Toggle Loop Toggle Media Loop Playback Enter Fullscreen Switch Video to Fullscreen Play Play Pause Pause Pause Mute Mute Open Frame Open Frame in New Window context menu item Ouvrir le cadre Copy Copy context menu item Copier Go Back Back context menu item Précédent Go Forward Forward context menu item Suivant Stop Stop context menu item Arrêter Reload Reload context menu item Recharger Cut Cut context menu item Couper Paste Paste context menu item Coller Select All Select All context menu item Tout sélectionner No Guesses Found No Guesses Found context menu item Pas de candidat trouvés Ignore Ignore Spelling context menu item Ignorer Add To Dictionary Learn Spelling context menu item Ajouter au dictionnaire Search The Web Search The Web context menu item Chercher sur le Web Look Up In Dictionary Look Up in Dictionary context menu item Chercher dans le dictionnaire Open Link Open Link context menu item Ouvrir le lien Ignore Ignore Grammar context menu item Ignorer Spelling Spelling and Grammar context sub-menu item Orthographe Show Spelling and Grammar menu item title Afficher Orthographe et Grammaire Hide Spelling and Grammar menu item title Cacher Orthographe et Grammaire Check Spelling Check spelling context menu item Vérifier l'orthographe Check Spelling While Typing Check spelling while typing context menu item Vérifier l'orthographe pendant la saisie Check Grammar With Spelling Check grammar with spelling context menu item Vérifier la grammaire en même temps que l'orthographe Fonts Font context sub-menu item Polices Bold Bold context menu item Gras Italic Italic context menu item Italique Underline Underline context menu item Souligné Outline Outline context menu item Contour Direction Writing direction context sub-menu item Text Direction Text direction context sub-menu item Orientation du texte Default Default writing direction context menu item Par défaut Left to Right Left to Right context menu item Gauche à droite Right to Left Right to Left context menu item Droite à gauche Loading... Media controller status message when the media is loading Chargement... Live Broadcast Media controller status message when watching a live broadcast Diffusion en direct Audio Element Media controller element Élément audio Video Element Media controller element Élément vidéo Mute Button Media controller element Bouton de désactivation du son Unmute Button Media controller element Bouton de réactivation du son Play Button Media controller element Bouton de lecture Pause Button Media controller element Bouton de pause Slider Media controller element Slider Slider Thumb Media controller element Curseur de la barre de défilement Rewind Button Media controller element Bouton de retour en arrière Return to Real-time Button Media controller element Bouton de retour au temps réel Elapsed Time Media controller element Temps écoulé Remaining Time Media controller element Durée restante Status Display Media controller element Affichage de l'état Fullscreen Button Media controller element Bouton de plein écran Seek Forward Button Media controller element Bouton de recherche avant Seek Back Button Media controller element Bouton de recherche arrière Audio element playback controls and status display Media controller element Commandes de lecture et affichage de l'état de l'élément audio Video element playback controls and status display Media controller element Commandes de lecture et affichage de l'état de l'élément vidéo Mute audio tracks Media controller element Couper le son des pistes audio Unmute audio tracks Media controller element Réactiver le son des pistes audio Begin playback Media controller element Commencer la lecture Pause playback Media controller element Pause lecture Movie time scrubber Media controller element Balayeur de durée du film Movie time scrubber thumb Media controller element Case de défilement du balayeur de la durée du film Rewind movie Media controller element Rembobiner le film Return streaming movie to real-time Media controller element Ramener le film en streaming en temps réel Current movie time Media controller element Durée du film en cours Remaining movie time Media controller element Durée de film restante Current movie status Media controller element État du film actuel Play movie in full-screen mode Media controller element Regarder le film en mode plein écran Seek quickly back Media controller element Recherche rapide arrière Seek quickly forward Media controller element Recherche rapide avant Indefinite time Media time description Durée indéfinie %1 days %2 hours %3 minutes %4 seconds Media time description %1 jours %2 heures %3 minutes %4 secondes %1 hours %2 minutes %3 seconds Media time description %1 heures %2 minutes %3 secondes %1 minutes %2 seconds Media time description %1 minutes %2 secondes %1 seconds Media time description %1 secondes LTR Left to Right context menu item De la gauche vers la droite RTL Right to Left context menu item De la droite vers la gauche Inspect Inspect Element context menu item Inspecter No recent searches Label for only item in menu that appears when clicking on the search field image, when no searches have been performed Pas de recherche récente Recent searches label for first item in the menu that appears when clicking on the search field image, used as embedded menu title Recherches récentes Clear recent searches menu item in Recent Searches menu that empties menu's contents Effacer les recherches récentes Missing Plug-in Label text to be used when a plug-in is missing Plug-in manquant Unknown Unknown filesize FTP directory listing item Inconnu %1 (%2x%3 pixels) Title string for images %1 (%2x%3 pixels) Web Inspector - %2 Inspecteur Web - %2 Redirection limit reached Limite de redirection atteinte Bad HTTP request Requête HTTP erronée This is a searchable index. Enter search keywords: text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' Ceci est un index. Veuillez saisir les mots-clé : Scroll here Défiler jusqu'ici Left edge À gauche Top Haut Right edge À droite Bottom En bas Page left Page gauche Page up Page haut Page right Page droite Page down Page bas Scroll left Défiler vers la gauche Scroll up Défiler vers le haut Scroll right Défiler vers la droite Scroll down Défiler vers le bas %n file(s) number of chosen file %n fichier %n fichiers JavaScript Alert - %1 Alerte JavaScript - %1 JavaScript Confirm - %1 Confirmation JavaScript - %1 JavaScript Prompt - %1 Invite JavaScript - %1 Move the cursor to the next character Déplacer le curseur au caractère suivant Move the cursor to the previous character Déplacer le curseur au caractère précédent Move the cursor to the next word Déplacer le curseur au mot suivant Move the cursor to the previous word Déplacer le curseur au mot précédent Move the cursor to the next line Déplacer le curseur à la ligne suivante Move the cursor to the previous line Déplacer le curseur à la ligne précédente Move the cursor to the start of the line Déplacer le curseur en début de ligne Move the cursor to the end of the line Déplacer le curseur en fin de ligne Move the cursor to the start of the block Déplacer le curseur au début du paragraphe Move the cursor to the end of the block Déplacer le curseur à la fin du paragraphe Move the cursor to the start of the document Déplacer le curseur en début de document Move the cursor to the end of the document Déplacer le curseur en fin de document Select all Tout sélectionner Select to the next character Sélectionner jusqu'au caractère suivant Select to the previous character Sélectionner jusqu'au caractère précédent Select to the next word Sélectionner jusqu'au mot suivant Select to the previous word Sélectionner jusqu'au mot précédent Select to the next line Sélectionner jusqu'à la ligne suivante Select to the previous line Sélectionner jusqu'à la ligne précédente Select to the start of the line Sélectionner jusqu'en début de ligne Select to the end of the line Sélectionner jusqu'en fin de ligne Select to the start of the block Sélectionner jusqu'au début du paragraphe Select to the end of the block Sélectionner jusqu'à la fin du paragraphe Select to the start of the document Sélectionner jusqu'au début du document Select to the end of the document Sélectionner jusqu'à la fin du document Delete to the start of the word Supprimer jusqu'au début du mot Delete to the end of the word Supprimer jusqu'à la fin du mot Insert a new paragraph Insérer un nouveau paragraphe Insert a new line Insérer une nouvelle ligne Submit Soumettre Reset Réinitialiser Choose File Choisir le fichier No file selected Pas de fichier sélectionné Open in New Window Ouvrir dans une Nouvelle Fenêtre Save Link... Enregistrer la cible du lien... Copy Link Copier le lien Open Image Ouvrir l'image Save Image Enregistrer l'image Copy Image Copier l'image Open Frame Ouvrir le cadre Copy Copier Go Back Précédent Go Forward Suivant Stop Stop Reload Recharger Cut Couper Paste Coller No Guesses Found Pas de candidat trouvés Ignore Ignorer Add To Dictionary Ajouter au dictionnaire Search The Web Chercher sur le Web Look Up In Dictionary Chercher dans le dictionnaire Open Link Ouvrir le lien Spelling Orthographe Show Spelling and Grammar Afficher Orthographe et Grammaire Hide Spelling and Grammar Cacher Orthographe et Grammaire Check Spelling Vérifier l'orthographe Check Spelling While Typing Vérifier l'orthographe pendant la saisie Check Grammar With Spelling Vérifier la grammaire en même temps que l'orthographe Fonts Polices Bold Gras Italic Italique Underline Souligné Outline Contour Direction Direction Text Direction Orientation du texte Default Défaut Left to Right Gauche à droite Right to Left Droite à gauche Loading... Chargement... Live Broadcast Diffusion en direct Audio Element Élément audio Video Element Élément vidéo Mute Button Bouton de désactivation du son Unmute Button Bouton de réactivation du son Play Button Bouton de lecture Pause Button Bouton de pause Slider Barre de défilement Slider Thumb Curseur de la barre de défilement Rewind Button Bouton de retour en arrière Return to Real-time Button Bouton de retour au temps réel Elapsed Time Temps écoulé Remaining Time Durée restante Status Display Affichage de l'état Fullscreen Button Bouton de plein écran Seek Forward Button Bouton de recherche avant Seek Back Button Bouton de recherche arrière Audio element playback controls and status display Commandes de lecture et affichage de l'état de l'élément audio Video element playback controls and status display Commandes de lecture et affichage de l'état de l'élément vidéo Mute audio tracks Couper le son des pistes audio Unmute audio tracks Réactiver le son des pistes audio Begin playback Commencer la lecture Pause playback Pause lecture Movie time scrubber Épurateur de la durée du film Movie time scrubber thumb Case de défilement de l'épurateur de la durée du film Rewind movie Rembobiner le film Return streaming movie to real-time Ramener le film en streaming en temps réel Current movie time Durée du film actuel Remaining movie time Durée de film restante Current movie status État du film actuel Play movie in full-screen mode Regarder le film en mode plein écran Seek quickly back Recherche rapide arrière Seek quickly forward Recherche rapide avant Indefinite time Durée indéfinie %1 days %2 hours %3 minutes %4 seconds %1 jours %2 heures %3 minutes %4 secondes %1 hours %2 minutes %3 seconds %1 heures %2 minutes %3 secondes %1 minutes %2 seconds %1 minutes %2 secondes %1 seconds %1 secondes Inspect Inspecter No recent searches Pas de recherche récente Recent searches Recherches récentes Clear recent searches Effacer les recherches récentes Unknown Inconnu %1 (%2x%3 pixels) %1 (%2x%3 pixels) This is a searchable index. Enter search keywords: Ceci est un index. Veuillez saisir les mots-clé : JavaScript Problem - %1 Problème de JavaScript - %1 The script on this page appears to have a problem. Do you want to stop the script? Le script de cette page semble avoir un problème. Souhaitez-vous arrêter le script ? Paste and Match Style Coller et suivre le style Remove formatting Retirer la mise en forme Strikethrough Barré Subscript Indice Superscript Exposant Insert Bulleted List Insérer une liste à puces Insert Numbered List Insérer une liste numérotée Indent Retrait Outdent Retrait négatif Center Centré Justify Justifié Align Left Aligner à gauche Align Right Aligner à droite QWhatsThisAction What's This? Qu'est-ce que c'est ? QWidget * QWizard Go Back Précédent Continue Continuer Commit si il s'agit de commit au même sens que git... (en même temps se marier en cliquant... ?!!?!) Soumettre Done Terminer Quit Quitter Help Aide < &Back < &Précédent &Finish &Terminer Cancel Annuler &Help &Aide &Next &Suivant > &Next > &Suivant > QWorkspace &Restore &Restaurer &Move &Déplacer &Size &Taille Mi&nimize Réd&uire Ma&ximize Ma&ximiser &Close &Fermer Stay on &Top Rester au &premier plan Minimize Réduire Restore Down Restaurer en bas Close Fermer Sh&ade Enrou&ler %1 - [%2] %1 - [%2] &Unshade Dér&ouler QXml no error occurred aucune erreur ne s'est produite error triggered by consumer Erreur déclenchée par le consommateur unexpected end of file Fin de fichier inattendue more than one document type definition plus d'une définition de type de document error occurred while parsing element une erreur s'est produite pendant l'analyse syntaxique de l'élement tag mismatch tag incongru error occurred while parsing content une erreur s'est produite pendant l'analyse syntaxique du contenu unexpected character caractère inattendu invalid name for processing instruction nom d'instruction invalide version expected while reading the XML declaration une version est attendue dans la déclaration XML wrong value for standalone declaration valeur incorrecte pour une déclaration "standalone" error occurred while parsing document type definition une erreur s'est produite pendant l'analyse syntaxique de la définition du type de document letter is expected une lettre est attendue error occurred while parsing comment une erreur s'est produite pendant l'analyse syntaxique du commentaire error occurred while parsing reference une erreur s'est produite pendant l'analyse syntaxique d'une référence internal general entity reference not allowed in DTD référence à une entité générale interne non autorisée dans la DTD external parsed general entity reference not allowed in attribute value référence à une entité générale externe non autorisée dans la valeur d'attribut external parsed general entity reference not allowed in DTD référence à une entité générale externe non autorisée dans le DTD unparsed entity reference in wrong context référence à une entité non analysée dans le mauvais contexte recursive entities entités récursives error in the text declaration of an external entity erreur dans la déclaration texte d'une entité externe encoding declaration or standalone declaration expected while reading the XML declaration déclaration d'encodage ou déclaration "standalone" attendue lors de la lecture de la déclaration XML standalone declaration expected while reading the XML declaration déclaration "standalone" attendue lors de la lecture de la déclaration XML QXmlPatternistCLI Warning in %1, at line %2, column %3: %4 Avertissement dans %1, à la ligne %2, colonne %3 : %4 Warning in %1: %2 Avertissement dans %1 : %2 Unknown location Lieu inconnu Error %1 in %2, at line %3, column %4: %5 Erreur %1 dans %2, à la ligne %3, colonne %4 : %5 Error %1 in %2: %3 Erreur %1 dans %2 : %3 QXmlStream Extra content at end of document. Contenu superflu à la fin du document. Invalid entity value. Valeur de l'entité invalide. Invalid XML character. Caractère XML invalide. Sequence ']]>' not allowed in content. séquence ']]>' non autorisée dans le contenu. Namespace prefix '%1' not declared Le préfixe d'espace de noms %1 n'a pas été déclaré Attribute redefined. Redéfinition d'attribut. Unexpected character '%1' in public id literal. Caractère '%1' inattendu pour une valeur d'identifiant public. Invalid XML version string. Chaîne de version XML invalide. Unsupported XML version. Version XML non supportée. %1 is an invalid encoding name. %1 n'est pas un nom d'encodage valide. Encoding %1 is unsupported %1 n'est pas un encodage supporté Invalid XML encoding name. Encodage XML invalide. Standalone accepts only yes or no. Le seules valeurs possibles pour "standalone" sont "yes" ou "no". Invalid attribute in XML declaration. Attribut invalide dans une déclaration XML. Premature end of document. Fin de document inattendue. Invalid document. Document invalide. Expected Attendu(e) , but got ' , mais trouvé ' Unexpected ' Inattendu(e) Expected character data. données texte attendues. Recursive entity detected. Entité récursive détectée. Start tag expected. Tag de départ attendu. XML declaration not at start of document. La déclaration XML doit être en début de document. NDATA in parameter entity declaration. NDATA dans une déclaration de paramètre d'entité. %1 is an invalid processing instruction name. %1 n'est pas un nom d'instruction valide. Invalid processing instruction name. nom d'instruction invalide. Illegal namespace declaration. Déclaration d'espace de noms non autorisée. Invalid XML name. Nom XML invalide. Opening and ending tag mismatch. Tags ouvrant et fermants ne correspondent pas. Reference to unparsed entity '%1'. Référence à l'entité '%1' non analysée. Entity '%1' not declared. Entité '%1' non déclarée. Reference to external entity '%1' in attribute value. Référence à l'entité externe '%1' en valeur d'attribut. Invalid character reference. Référence à un caractère invalide. Encountered incorrectly encoded content. Du contenu avec un encodage incorrect a été rencontré. The standalone pseudo attribute must appear after the encoding. Le pseudo-attribut "standalone" doit apparaître après l'encodage. %1 is an invalid PUBLIC identifier. %1 n'est pas un identifiant "PUBLIC" valide. QmlJSDebugger::LiveSelectionTool Items QmlJSDebugger::QmlToolBar Inspector Mode Play/Pause Animations Select Sélectionner Select (Marquee) Zoom Color Picker Apply Changes to QML Viewer Apply Changes to Document Tools Outils 1x 1x 0.5x 0.5x 0.25x 0.25x 0.125x 0.125x 0.1x 0.1x QmlJSDebugger::ToolBarColorBox Copy Color QmlJSDebugger::ZoomTool Zoom to &100% Zoom In Agrandir Zoom Out Rétrécir QtXmlPatterns An %1-attribute with value %2 has already been declared. Un attribute %1 avec la valeur %2 est déjà déclaré. An %1-attribute must have a valid %2 as value, which %3 isn't. Un attribute %1 doit avoir un %2 valide, %3 ne l'a pas. Network timeout. Le réseau ne répond pas. Element %1 can't be serialized because it appears outside the document element. L'élément %1 ne peut pas être sérialisé parce qu'il est hors de l'élément document. Attribute element %1 can't be serialized because it appears at the top level. L'élément attribute %1 ne peut pas être sérialisé parce qu'il apparaît comme racine. Year %1 is invalid because it begins with %2. L'année %1 est invalide parce qu'elle commence par %2. Day %1 is outside the range %2..%3. Le jour %1 est hors de l'intervalle %2..%3. Month %1 is outside the range %2..%3. Le mois %1 est hors de l'intervalle %2..%3. Overflow: Can't represent date %1. Overflow : impossible de représenter la date %1. Day %1 is invalid for month %2. Jour %1 est invalide pour le mois %2. Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; Heure 24 : %1 : %2.%3 est invalide. L'heure est 24 mais les minutes, secondes et millisecondes ne sont pas à 0; Time %1:%2:%3.%4 is invalid. L'heure %1 : %2 : %3.%4 est invalide. Overflow: Date can't be represented. Overflow : la date ne peut pas être représentée. At least one component must be present. Au moins un composant doit être présent. At least one time component must appear after the %1-delimiter. Au moins un composant doit apparaître après le délimiteur %1. No operand in an integer division, %1, can be %2. Pas d'opérande dans une division entière, %1, peut être %2. The first operand in an integer division, %1, cannot be infinity (%2). Le premier opérande dans une division entière, %1, ne peut être infini (%2). The second operand in a division, %1, cannot be zero (%2). Le second opérande dans une division, %1, ne peut être nul (%2). %1 is not a valid value of type %2. %1 n'est pas une valeur valide du type %2. When casting to %1 from %2, the source value cannot be %3. En castant de %2 vers %1, la valeur source ne peut pas être %3. Integer division (%1) by zero (%2) is undefined. Division entière (%1) par zéro (%2) indéfinie. Division (%1) by zero (%2) is undefined. Division (%1) par zéro (%2) indéfinie. Modulus division (%1) by zero (%2) is undefined. Module division (%1) par zéro (%2) indéfinie. Dividing a value of type %1 by %2 (not-a-number) is not allowed. Diviser une valeur du type %1 par %2 (not-a-number) est interdit. Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. Diviser une valeur de type %1 par %2 ou %3 (plus ou moins zéro) est interdit. Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. La multiplication d'une valeur du type %1 par %2 ou %3 (plus ou moins infini) est interdite. A value of type %1 cannot have an Effective Boolean Value. Une valeur de type %1 ne peut pas avoir une valeur booléene effective. Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values. Effective Boolean Value ne peut être calculée pour une séquence contenant deux ou plus valeurs atomiques. Value %1 of type %2 exceeds maximum (%3). La valeur %1 de type %2 excède le maximum (%3). Value %1 of type %2 is below minimum (%3). La valeur %1 de type %2 est inférieur au minimum (%3). A value of type %1 must contain an even number of digits. The value %2 does not. Une valeur de type %1 doit contenir un nombre pair de chiffre. La valeur %2 n'est pas conforme. %1 is not valid as a value of type %2. %1 n'est pas une valeur valide de type %2. Operator %1 cannot be used on type %2. L'opérateur %1 ne peut pas être utilisé pour le type %2. Operator %1 cannot be used on atomic values of type %2 and %3. L'opérateur %1 ne peut pas être utilisé pour des valeurs atomiques de type %2 ou %3. The namespace URI in the name for a computed attribute cannot be %1. L'URI de namespace dans le nom d'un attribut calculé ne peut pas être %1. The name for a computed attribute cannot have the namespace URI %1 with the local name %2. Le nom d'un attribut calculé ne peut pas avoir l'URI de namespace %1 avec le nom local %2. Type error in cast, expected %1, received %2. Erreur de type lors du cast, attendu %1 mais reçu %2. When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed. En castant vers %1 ou des types dérivés, la valeur source doit être du même type ou une chaîne. Le type %2 n'est pas autorisé. No casting is possible with %1 as the target type. Aucun cast n'est possible avec %1 comme type de destination. It is not possible to cast from %1 to %2. Il est impossible de caster de %1 en %2. Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated. Caster vers %1 est impossible parce que c'est un type abstrait qui ne peut donc être instancié. It's not possible to cast the value %1 of type %2 to %3 I lest impossible de caster la valeur %1 de type %2 en %3 Failure when casting from %1 to %2: %3 Echec en castant de %1 ver %2 : %3 A comment cannot contain %1 Un commentaire ne peut pas contenir %1 A comment cannot end with a %1. Un commentaire ne peut pas finir par %1. No comparisons can be done involving the type %1. Aucune comparaison ne peut être faite avec le type %1. Operator %1 is not available between atomic values of type %2 and %3. L'opérateur %1 n'est pas disponible entre valeurs atomiques de type %2 et %3. An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place. Un noeuds attribut ne peut être un fils d'un noeuds document. C'est pourquoi l'attribut %1 est mal placé. A library module cannot be evaluated directly. It must be imported from a main module. Un module de bibliothèque ne peut pas être évalué directement. Il doit être importé d'un module principal. No template by name %1 exists. Aucun template nommé %1 n'existe. A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type. Une valeur de type %1 ne peut être un prédicat. Un prédicat doit être de type numérique ou un Effective Boolean Value. A positional predicate must evaluate to a single numeric value. Un prédicat de position doit être évalué en une unique valeur numérique. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid. Le nom de destination dans une instruction de traitement ne peut être %1. %2 est invalide. %1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. %1 n'est pas un nom de destination valide dans une instruction de traitement. Ce doit être une valeur %2, par ex. %3. The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. La dernière étape dans un chemin doit contenir soit des noeuds soit des valeurs atomiques. Cela ne peut pas être un mélange des deux. The data of a processing instruction cannot contain the string %1 Les données d'une instruction de traitement ne peut contenir la chaîne %1 No namespace binding exists for the prefix %1 Aucun lien de namespace n'existe pour le préfixe %1 No namespace binding exists for the prefix %1 in %2 Aucun lien de namespace n'existe pour le préfixe %1 dans %2 %1 is an invalid %2 %1 est un ivalide %2 %1 takes at most %n argument(s). %2 is therefore invalid. %1 prend au maximum %n argument. %2 est donc invalide. %1 prend au maximum %n arguments. %2 est donc invalide. %1 requires at least %n argument(s). %2 is therefore invalid. %1 requiert au moins %n argument. %2 est donc invalide. %1 requiert au moins %n arguments. %2 est donc invalide. The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. Le premier argument de %1 ne peut être du type %2. Il doit être de type numérique, xs:yearMonthDuration ou xs:dayTimeDuration. The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. Le premier argument de %1 ne peut être du type %2. Il doit être de type %3, %4 ou %5. The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. Le deuxième argument de %1 ne peut être du type %2. Il doit être de type %3, %4 ou %5. %1 is not a valid XML 1.0 character. %1 n'est pas un caractère XML 1.0 valide. The first argument to %1 cannot be of type %2. Le premier argument de %1 ne peut être du type %2. If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. Si les deux valeurs ont des décalages de zone, elle doivent avoir le même. %1 et %2 sont différents. %1 was called. %1 a été appelé. %1 must be followed by %2 or %3, not at the end of the replacement string. %1 doit être suivi par %2 ou %3, et non à la fin de la chaîne de remplacement. In the replacement string, %1 must be followed by at least one digit when not escaped. Dans la chaîne de remplacement, %1 doit être suivi par au moins un chiffre s'il n'est pas échappé. In the replacement string, %1 can only be used to escape itself or %2, not %3 Dans la chaîne de remplacement, %1 peut seulement être utilisé pour échapper lui-même ou %2 mais pas %3 %1 matches newline characters %1 correspond à des caractères de saut de ligne %1 and %2 match the start and end of a line. %1 et %2 correspondent au début et à la fin d'une ligne. Matches are case insensitive Les correspondances ne sont pas sensibles à la casse Whitespace characters are removed, except when they appear in character classes Les blancs sont supprimés excepté quand ils apparaissent dans les classes de caractère %1 is an invalid regular expression pattern: %2 %1 est un modèle d'expression régulière invalide : %2 %1 is an invalid flag for regular expressions. Valid flags are: %1 est un flag invalide pour des expressions régulières. Les flags valides sont : If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. Si le premier argument est une sequence vide ou un chaîne vide (sans namespace), un préfixe ne peut être spécifié. Le préfixe %1 a été spécifié. It will not be possible to retrieve %1. Il sera impossible de récupérer %1. The root node of the second argument to function %1 must be a document node. %2 is not a document node. Le noeuds racine du deuxième argument à la fonction %1 doit être un noeuds document. %2 n'est pas un document. The default collection is undefined I'l n'y a pas de collection par défaut %1 cannot be retrieved %1 ne peut pas être récupéré The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). Le forme de normalisation %1 n'est pas supportée. Les formes supportées sont %2, %3, %4 et %5, et aucun, ie. une chaîne vide (pas de normalisation). A zone offset must be in the range %1..%2 inclusive. %3 is out of range. Un décalage de zone doit être dans l'intervalle %1..%2 inclus. %3 est hors de l'intervalle. %1 is not an whole number of minutes. %1 n'est pas un nombre complet de minutes. Required cardinality is %1; got cardinality %2. La cardinalité requise est %1; reçu %2. The item %1 did not match the required type %2. L'item %1 ne correspond pas au type requis %2. %1 is an unknown schema type. %1 est un type de schema inconnu. Only one %1 declaration can occur in the query prolog. Seulement une déclaration %1 peut intervenir lors du prologue de la requête. The initialization of variable %1 depends on itself L'initialisation de la variable %1 dépend d'elle-même No variable by name %1 exists Aucun variable nommée %1 existe The variable %1 is unused La variable %1 est inutilisée Version %1 is not supported. The supported XQuery version is 1.0. La version %1 n'est pas supportée. La version de XQuery supportée est 1.0. The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. L'encodage %1 est invalide. Il doit contenir uniquement des caractères latins, sans blanc et doit être conforme à l'expression régulière %2. No function with signature %1 is available Aucune fonction avec la signature %1 n'est disponible A default namespace declaration must occur before function, variable, and option declarations. Un déclaration de namespace par défaut doit être placée avant toute fonction, variable ou declaration d'option. Namespace declarations must occur before function, variable, and option declarations. Les declarations de namespace doivent être placées avant tout fonction, variable ou déclaration d'option. Module imports must occur before function, variable, and option declarations. Les imports de module doivent être placés avant tout fonction, variable ou déclaration d'option. It is not possible to redeclare prefix %1. Il est impossible de redéclarer le préfixe %1. Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1. Seul le préfixe %1 peut être déclaré pour lié le namespace %2. Par défaut, il est déjà lié au préfixe %1. Prefix %1 is already declared in the prolog. Le préfixe %1 est déjà déclaré dans le prologue. The name of an option must have a prefix. There is no default namespace for options. Le nom d'une option doit avoir un préfixe. Il n'y a pas de namespace par défaut pour les options. The Schema Import feature is not supported, and therefore %1 declarations cannot occur. La fonctionnalité "Schema Import" n'est pas supportée et les déclarations %1 ne peuvent donc intervenir. The target namespace of a %1 cannot be empty. Le namespace cible d'un %1 ne peut être vide. The module import feature is not supported La fonctionnalité "module import" n'est pas supportée A variable by name %1 has already been declared in the prolog. Une variable du nom %1 a déjà été déclarée dans le prologue. No value is available for the external variable by name %1. Aucune valeur n'est disponible pour la variable externe %1. The namespace for a user defined function cannot be empty(try the predefined prefix %1 which exists for cases like this) Le namespace d'une fonction définie par l'utilisateur ne peut être vide (essayez le préfixe prédéfini %1 qui existe pour ce genre de cas) A construct was encountered which only is allowed in XQuery. Construct n'est autorisé que dans XQuery. A template by name %1 has already been declared. Un template nommé %1 a déjà été déclaré. The keyword %1 cannot occur with any other mode name. Le mot-clé %1 ne peut pas apparaître avec un autre nom de mode. The value of attribute %1 must of type %2, which %3 isn't. La valeur de l'attribut %1 doit être du type %2, %3 n'en est pas. The prefix %1 can not be bound. By default, it is already bound to the namespace %2. Le préfixe %1 ne peut être lié. Par défault, il est déjà lié au namespace %2. A variable by name %1 has already been declared. Une variable nommée %1 a déjà été déclarée. A stylesheet function must have a prefixed name. Une fonction de feuille de style doit avoir un nom préfixé. The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) Le namespace d'une fonction utilisateur ne peut pas être vide (essayez le préfixe prédéfini %1 qui existe pour ce genre de cas) The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. Le namespace %1 est réservé; c'est pourquoi les fonctions définies par l'utilisateur ne peuvent l'utiliser. Essayez le préfixe prédéfini %2 qui existe pour ces cas. The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 Le namespace d'une fonction utilisateur dans un module de bibliothèque doit être équivalent au namespace du module. En d'autres mots, il devrait être %1 au lieu de %2 A function already exists with the signature %1. Une fonction avec la signature %1 existe déjà. No external functions are supported. All supported functions can be used directly, without first declaring them as external Les fonctions externes ne sont pas supportées. Toutes les fonctions supportées peuvent êter utilisées directement sans les déclarer préalablement comme externes An argument by name %1 has already been declared. Every argument name must be unique. Un argument nommé %1 a déjà été déclaré. Chaque nom d'argument doit être unique. When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal. Quand la fonction %1 est utilisée pour vérifier la correspondance dans un pattern, l'argument doit être une référence de variable ou une chaîne de caractères. In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching. Dans un pattern XSL-T, le premier argument à la fonction %1 doit être une chaîne de caractères quand utilisé pour correspondance. In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching. Dans un pattern XSL-T, le premier argument à la fonction %1 doit être un litéral ou une référence de variable. In an XSL-T pattern, function %1 cannot have a third argument. Dans un pattern XSL-T, la fonction %1 ne peut pas avoir de 3e argument. In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching. Dans un pattern XSL-T, seules les fonctions %1 et %2 (pas %3) peuvent être utilisées pour le matching. In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can. Dans un pattern XSL-T, l'axe %1 ne peut pas être utilisé, seulement %2 ou %3 le peuvent. %1 is an invalid template mode name. %1 est un nom de mode de template invalide. The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. Le nom d'une variable liée dans un expression for doit être different de la variable positionnelle. Les deux variables appelées %1 sont en conflit. The Schema Validation Feature is not supported. Hence, %1-expressions may not be used. La fonctionnalité "Schema Validation" n'est pas supportée. Les expressions %1 ne seront pas utilisées. None of the pragma expressions are supported. Therefore, a fallback expression must be present Aucune des expressions pragma n'est supportée. Une expression par défault doit être présente Each name of a template parameter must be unique; %1 is duplicated. Chaque nom d'un paramètre ede template doit être unique; %1 est dupliqué. The %1-axis is unsupported in XQuery L'axe %1 n'est pas supporté dans XQuery %1 is not a valid name for a processing-instruction. %1 n'est pas un nom valide pour une instruction de traitement. %1 is not a valid numeric literal. %1 n'est pas une valeur numérique valide. No function by name %1 is available. La fonction %1 n'est pas disponible. The namespace URI cannot be the empty string when binding to a prefix, %1. L'URI de namespace ne peut être une chaîne vide quand on le lie à un préfixe, %1. %1 is an invalid namespace URI. %1 est un URI de namespace invalide. It is not possible to bind to the prefix %1 Il est impossible de se lier au préfixe %1 Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared). Le namespace %1 peut seulement être lié à %2 (et doit être pré-déclaré). Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared). Le préfixe %1 peut seulement être lié à %2 (et doit être prédéclaré). Two namespace declaration attributes have the same name: %1. Deux attributs de déclarations de namespace ont le même nom : %1. The namespace URI must be a constant and cannot use enclosed expressions. L'URI de namespace doit être une constante et ne peut contenir d'expressions. An attribute by name %1 has already appeared on this element. Un attribute nommé %1 existe déjà pour cet élément. A direct element constructor is not well-formed. %1 is ended with %2. Un constructeur direct d'élément est mal-formé. %1 est terminé par %2. The name %1 does not refer to any schema type. Le nom %1 ne se réfère à aucun type de schema. %1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. %1 est une type complexe. Caster vers des types complexes n'est pas possible. Cependant, caster vers des types atomiques comme %2 marche. %1 is not an atomic type. Casting is only possible to atomic types. %1 n'est pas un type atomique. Il est uniquement possible de caster vers des types atomiques. %1 is not a valid name for a processing-instruction. Therefore this name test will never match. %1 n'est pas un nom valide pour une instruction de traitement. C'est pourquoi ce test de nom ne réussira jamais. %1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. %1 n'est pas dans les déclaration d'attribut in-scope. La fonctionnalité d'inport de schéma n'est pas supportée. The name of an extension expression must be in a namespace. Le nom d'une expression d'extension doit être dans un namespace. empty vide zero or one zéro ou un exactly one exactement un one or more un ou plus zero or more zéro ou plus Required type is %1, but %2 was found. Le type requis est %1, mais %2 a été reçu. Promoting %1 to %2 may cause loss of precision. La Promotion de %1 vers %2 peut causer un perte de précision. The focus is undefined. Le focus est indéfini. It's not possible to add attributes after any other kind of node. Il est impossible d'ajouter des attributs après un autre type de noeuds. An attribute by name %1 has already been created. Un attribute de nom %1 a déjà été créé. Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported. Seule le Unicode CodepointCollation est supporté (%1), %2 n'est pas supporté. %1 is not a whole number of minutes. %1 n'est pas un nombre entier de minutes. Attribute %1 can't be serialized because it appears at the top level. L'attribut %1 ne peut pas être sérialisé car il apparaît à la racine. %1 is an unsupported encoding. %1 est un encodage non supporté. %1 contains octets which are disallowed in the requested encoding %2. %1 contient 'octets', qui n'est pas autorisé pour l'encodage %2. The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character. Le codepoint %1 dans %2 et utilisant l'encodage %3 est un caractère XML invalide. Ambiguous rule match. Corresonpdance aux règles ambigüe. In a namespace constructor, the value for a namespace value cannot be an empty string. Dans un cosntructeur de namespace, la valeur pour un namespace ne peut pas être une chaîne vide. In a namespace constructor, the value for a namespace cannot be an empty string. Dans un constructeur d'espace de noms, la valeur pour un espace de noms ne peut pas être une chaîne vide. The prefix must be a valid %1, which %2 is not. Le préfixe doit être un valide %1; %2 n'e l'est pas. The prefix %1 cannot be bound. Le préfixe %1 ne peut être lié. Only the prefix %1 can be bound to %2 and vice versa. Seul le préfixe %1 peut être lié à %2, et vice versa. Circularity detected Circularité détectée The parameter %1 is required, but no corresponding %2 is supplied. Le paramètre %1 est requis, mais aucun %2 correspondant n'est fourni. The parameter %1 is passed, but no corresponding %2 exists. Le paramètre %1 est passé mais aucun %2 correspondant n'existe. The URI cannot have a fragment L'URI ne peut pas avoir de fragments L'élément %1 n'est pas autorisé à cet emplacement. Parse error: %1 Erreur : %1 The value of the XSL-T version attribute must be a value of type %1, which %2 isn't. La valeur de l'attribut de version XSL-T doit être du type %1, et non %2. Running an XSL-T 1.0 stylesheet with a 2.0 processor. Lancement d'une feuille de style XSL-T 1.0 avec un processeur 2.0. Unknown XSL-T attribute %1. Attribut XSL-T inconnu : %1. Attribute %1 and %2 are mutually exclusive. Les attributs %1 et %2 sont mutuellement exclusifs. In a simplified stylesheet module, attribute %1 must be present. Dans un module de feuille de style simplifié, l'attribut %1 doit être présent. If element %1 has no attribute %2, it cannot have attribute %3 or %4. Si l'élément %1 n'a pas d'attribut %2, il ne peut pas avoir d'attribut %3 ou %4. Element %1 must have at least one of the attributes %2 or %3. L'élement %1 doit avoir au moins un des attributs %2 ou %3. At least one mode must be specified in the %1-attribute on element %2. Au moins un mode doit être spécifié dans l'attribut %1 sur l'élément %2. Attribute %1 cannot appear on the element %2. Only the standard attributes can appear. L'attribut %1 ne peut pas apparaître sur l'élément %2. Seuls les attributs standard le peuvent. Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes. L'attribut %1 ne peut pas apparaître sur l'élément %2. Seul %3 est autorisé, ainsi que les attributs standard. Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes. L'attribut %1 ne peut pas apparaître sur l'élément %2. Seuls %3, %4 et les attributs standard le sont. Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes. L'attribut %1 ne peut pas apparaître sur l'élément %2. Seul %3 et les attributs standard le sont. XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is. Les attributs XSL-T sur des éléments XSL-T doivent être dans le namespace null, et pas dans %1. The attribute %1 must appear on element %2. L'attribut %1 doit apparaître sur l'élément %2. The element with local name %1 does not exist in XSL-T. L'élément avec le nom local %1 n'existe pas dans XSL-T. Element %1 is not allowed at this location. Text nodes are not allowed at this location. Element %1 must come last. L'élément %1 doit être le dernier. At least one %1-element must occur before %2. Au moins un élément %1 doit être placé avant %2. Only one %1-element can appear. Seulement un élément %1 peut apparaître. At least one %1-element must occur inside %2. Au moins un élément %1 doit apparaître dans %2. When attribute %1 is present on %2, a sequence constructor cannot be used. Quand l'attribut %1 est présent sur %2, un constructeur de séquence ne peut pas être utilisé. Element %1 must have either a %2-attribute or a sequence constructor. L'élément %1 doit avoir un attribut %2 ou un constructeur de séquence. When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor. Quand un paramètre est requis, un valeur par défault ne peut pas être fournie par un attribute %1 ou un constructeur de séquence. Element %1 cannot have children. L'élément %1 ne peut pas avoir de fils. Element %1 cannot have a sequence constructor. L'élément %1 ne peut pas avoir un constructuer de séquence. The attribute %1 cannot appear on %2, when it is a child of %3. L'attribut %1 ne peut pas apparaître sur %2 quand il est fils de %3. A parameter in a function cannot be declared to be a tunnel. Un paramètre de fonction ne peut pas être déclaré comme un tunnel. This processor is not Schema-aware and therefore %1 cannot be used. Ce processeur ne comprend pas les Schemas. C'est pourquoi %1 ne peut pas être utilisé. Top level stylesheet elements must be in a non-null namespace, which %1 isn't. Les élément d'une feuille de style de haut niveau doivent être dans un namespace non nul; %1 ne l'est pas. The value for attribute %1 on element %2 must either be %3 or %4, not %5. La valeur de l'attribut %1 de l'élement %2 doit être %3 ou %4, et pas %5. Attribute %1 cannot have the value %2. L'attribut %1 ne peut avoir la valeur %2. The attribute %1 can only appear on the first %2 element. L'attribute %1 peut seulement apparaître sur le premier élément %2. At least one %1 element must appear as child of %2. Au moins un élément %1 doit apparaître comme fils de %2. A template with name %1 has already been declared. Un template nommé %1 a déjà été déclaré. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid. Le nom de destination dans une instruction de traitement ne peut être %1. %2 est invalide. No variable with name %1 exists Aucune variable nommée %1 n'existe The value of attribute %1 must be of type %2, which %3 isn't. La valeur de l'attribut %1 doit être du type %2, %3 n'en est pas. The prefix %1 cannot be bound. By default, it is already bound to the namespace %2. Le préfixe %1 ne peut être lié. Par défault, il est déjà lié au namespace %2. A variable with name %1 has already been declared. Une variable nommée %1 a déjà été déclarée. No value is available for the external variable with name %1. Aucune valeur n'est disponible pour la variable externe %1. An argument with name %1 has already been declared. Every argument name must be unique. Un argument nommé %1 a déjà été déclaré. Chaque nom d'argument doit être unique. No function with name %1 is available. Aucune fonction nommée %1 n'est disponible. W3C XML Schema identity constraint selector W3C XML Schema identity constraint field A construct was encountered which is disallowed in the current language(%1). An attribute with name %1 has already appeared on this element. Un attribute nommé %1 existe déjà pour cet élément. %1 has inheritance loop in its base type %2. Circular inheritance of base type %1. Circular inheritance of union %1. %1 is not allowed to derive from %2 by restriction as the latter defines it as final. %1 is not allowed to derive from %2 by extension as the latter defines it as final. Base type of simple type %1 cannot be complex type %2. Simple type %1 cannot have direct base type %2. Simple type %1 is not allowed to have base type %2. Simple type %1 can only have simple atomic type as base type. Simple type %1 cannot derive from %2 as the latter defines restriction as final. Variety of item type of %1 must be either atomic or union. Variety of member types of %1 must be atomic. %1 is not allowed to derive from %2 by list as the latter defines it as final. Simple type %1 is only allowed to have %2 facet. Base type of simple type %1 must have variety of type list. Base type of simple type %1 has defined derivation by restriction as final. Item type of base type does not match item type of %1. Simple type %1 contains not allowed facet type %2. %1 is not allowed to derive from %2 by union as the latter defines it as final. %1 is not allowed to have any facets. Base type %1 of simple type %2 must have variety of union. Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute. Member type %1 cannot be derived from member type %2 of %3's base type %4. Derivation method of %1 must be extension because the base type %2 is a simple type. Complex type %1 has duplicated element %2 in its content model. Complex type %1 has non-deterministic content. Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3. Content model of complex type %1 is not a valid extension of content model of %2. Complex type %1 must have simple content. Complex type %1 must have the same simple type as its base class %2. Complex type %1 cannot be derived from base type %2%3. Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3. Complex type %1 with simple content cannot be derived from complex base type %2. Item type of simple type %1 cannot be a complex type. Member type of simple type %1 cannot be a complex type. %1 is not allowed to have a member type with the same name as itself. %1 facet collides with %2 facet. %1 facet must have the same value as %2 facet of base type. %1 facet must be equal or greater than %2 facet of base type. %1 facet must be less than or equal to %2 facet of base type. %1 facet contains invalid regular expression Unknown notation %1 used in %2 facet. %1 facet contains invalid value %2: %3. %1 facet cannot be %2 or %3 if %4 facet of base type is %5. %1 facet cannot be %2 if %3 facet of base type is %4. %1 facet must be less than or equal to %2 facet. %1 facet must be less than %2 facet of base type. %1 facet and %2 facet cannot appear together. %1 facet must be greater than %2 facet of base type. %1 facet must be less than %2 facet. %1 facet must be greater than or equal to %2 facet of base type. Simple type contains not allowed facet %1. %1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list. Only %1 and %2 facets are allowed when derived by union. %1 contains %2 facet with invalid data: %3. Attribute group %1 contains attribute %2 twice. Attribute group %1 contains two different attributes that both have types derived from %2. Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3. Complex type %1 contains attribute %2 twice. Complex type %1 contains two different attributes that both have types derived from %2. Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3. Element %1 is not allowed to have a value constraint if its base type is complex. Element %1 is not allowed to have a value constraint if its type is derived from %2. Value constraint of element %1 is not of elements type: %2. Element %1 is not allowed to have substitution group affiliation as it is no global element. Type of element %1 cannot be derived from type of substitution group affiliation. Value constraint of attribute %1 is not of attributes type: %2. Attribute %1 has value constraint but has type derived from %2. %1 attribute in derived complex type must be %2 like in base type. Attribute %1 in derived complex type must have %2 value constraint like in base type. Attribute %1 in derived complex type must have the same %2 value constraint like in base type. Attribute %1 in derived complex type must have %2 value constraint. processContent of base wildcard must be weaker than derived wildcard. Element %1 exists twice with different types. Particle contains non-deterministic wildcards. Base attribute %1 is required but derived attribute is not. Type of derived attribute %1 cannot be validly derived from type of base attribute. Value constraint of derived attribute %1 does not match value constraint of base attribute. Derived attribute %1 does not exist in the base definition. Derived attribute %1 does not match the wildcard in the base definition. Base attribute %1 is required but missing in derived definition. Derived definition contains an %1 element that does not exists in the base definition Derived wildcard is not a subset of the base wildcard. %1 of derived wildcard is not a valid restriction of %2 of base wildcard Attribute %1 from base type is missing in derived type. Type of derived attribute %1 differs from type of base attribute. Base definition contains an %1 element that is missing in the derived definition %1 references unknown %2 or %3 element %4. %1 references identity constraint %2 that is no %3 or %4 element. %1 has a different number of fields from the identity constraint %2 that it references. Base type %1 of %2 element cannot be resolved. Item type %1 of %2 element cannot be resolved. Member type %1 of %2 element cannot be resolved. Type %1 of %2 element cannot be resolved. Base type %1 of complex type cannot be resolved. %1 cannot have complex base type that has a %2. Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type. Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model. Type of %1 element must be a simple type, %2 is not. Substitution group %1 of %2 element cannot be resolved. Substitution group %1 has circular definition. Duplicated element names %1 in %2 element. Reference %1 of %2 element cannot be resolved. Circular group reference for %1. %1 element is not allowed in this scope %1 element cannot have %2 attribute with value other than %3. %1 element cannot have %2 attribute with value other than %3 or %4. %1 or %2 attribute of reference %3 does not match with the attribute declaration %4. Attribute group %1 has circular reference. %1 attribute in %2 must have %3 use like in base type %4. Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2. %1 has attribute wildcard but its base type %2 has not. Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible. Enumeration facet contains invalid content: {%1} is not a value of type %2. Namespace prefix of qualified name %1 is not defined. %1 element %2 is not a valid restriction of the %3 element it redefines: %4. Empty particle cannot be derived from non-empty particle. Derived particle is missing element %1. Derived element %1 is missing value constraint as defined in base particle. Derived element %1 has weaker value constraint than base particle. Fixed value constraint of element %1 differs from value constraint in base particle. Derived element %1 cannot be nillable as base element is not nillable. Block constraints of derived element %1 must not be more weaker than in the base element. Simple type of derived element %1 cannot be validly derived from base element. Complex type of derived element %1 cannot be validly derived from base element. Element %1 is missing in derived particle. Element %1 does not match namespace constraint of wildcard in base particle. Wildcard in derived particle is not a valid subset of wildcard in base particle. processContent of wildcard in derived particle is weaker than wildcard in base particle. Derived particle allows content that is not allowed in the base particle. Can not process unknown element %1, expected elements are: %2. Element %1 is not allowed in this scope, possible elements are: %2. Child element is missing in that scope, possible child elements are: %1. Document is not a XML schema. %1 attribute of %2 element contains invalid content: {%3} is not a value of type %4. %1 attribute of %2 element contains invalid content: {%3}. Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema. Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema. %1 element is not allowed to have the same %2 attribute value as the target namespace %3. %1 element without %2 attribute is not allowed inside schema without target namespace. %1 element is not allowed inside %2 element if %3 attribute is present. %1 element has neither %2 attribute nor %3 child element. %1 element with %2 child element must not have a %3 attribute. %1 attribute of %2 element must be %3 or %4. %1 attribute of %2 element must have a value of %3. %1 attribute of %2 element must have a value of %3 or %4. %1 element must not have %2 and %3 attribute together. Content of %1 attribute of %2 element must not be from namespace %3. %1 attribute of %2 element must not be %3. %1 attribute of %2 element must have the value %3 because the %4 attribute is set. Specifying use='prohibited' inside an attribute group has no effect. %1 element must have either %2 or %3 attribute. %1 element must have either %2 attribute or %3 or %4 as child element. %1 element requires either %2 or %3 attribute. Text or entity references not allowed inside %1 element %1 attribute of %2 element must contain %3, %4 or a list of URIs. %1 element is not allowed in this context. %1 attribute of %2 element has larger value than %3 attribute. Prefix of qualified name %1 is not defined. %1 attribute of %2 element must either contain %3 or the other values. Component with ID %1 has been defined previously. Element %1 already defined. Attribute %1 already defined. Type %1 already defined. Attribute group %1 already defined. Element group %1 already defined. Notation %1 already defined. Identity constraint %1 already defined. Duplicated facets in simple type %1. %1 is not valid according to %2. String content does not match the length facet. String content does not match the minLength facet. String content does not match the maxLength facet. String content does not match pattern facet. String content is not listed in the enumeration facet. Signed integer content does not match the maxInclusive facet. Signed integer content does not match the maxExclusive facet. Signed integer content does not match the minInclusive facet. Signed integer content does not match the minExclusive facet. Signed integer content is not listed in the enumeration facet. Signed integer content does not match pattern facet. Signed integer content does not match in the totalDigits facet. Unsigned integer content does not match the maxInclusive facet. Unsigned integer content does not match the maxExclusive facet. Unsigned integer content does not match the minInclusive facet. Unsigned integer content does not match the minExclusive facet. Unsigned integer content is not listed in the enumeration facet. Unsigned integer content does not match pattern facet. Unsigned integer content does not match in the totalDigits facet. Double content does not match the maxInclusive facet. Double content does not match the maxExclusive facet. Double content does not match the minInclusive facet. Double content does not match the minExclusive facet. Double content is not listed in the enumeration facet. Double content does not match pattern facet. Decimal content does not match in the fractionDigits facet. Decimal content does not match in the totalDigits facet. Date time content does not match the maxInclusive facet. Date time content does not match the maxExclusive facet. Date time content does not match the minInclusive facet. Date time content does not match the minExclusive facet. Date time content is not listed in the enumeration facet. Date time content does not match pattern facet. Duration content does not match the maxInclusive facet. Duration content does not match the maxExclusive facet. Duration content does not match the minInclusive facet. Duration content does not match the minExclusive facet. Duration content is not listed in the enumeration facet. Duration content does not match pattern facet. Boolean content does not match pattern facet. Binary content does not match the length facet. Binary content does not match the minLength facet. Binary content does not match the maxLength facet. Binary content is not listed in the enumeration facet. Invalid QName content: %1. QName content is not listed in the enumeration facet. QName content does not match pattern facet. Notation content is not listed in the enumeration facet. List content does not match length facet. List content does not match minLength facet. List content does not match maxLength facet. List content is not listed in the enumeration facet. List content does not match pattern facet. Union content is not listed in the enumeration facet. Union content does not match pattern facet. Data of type %1 are not allowed to be empty. Element %1 is missing child element. There is one IDREF value with no corresponding ID: %1. Loaded schema file is invalid. %1 contains invalid data. xsi:schemaLocation namespace %1 has already appeared earlier in the instance document. xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute. No schema defined for validation. No definition for element %1 available. Specified type %1 is not known to the schema. Element %1 is not defined in this scope. Declaration for element %1 does not exist. Element %1 contains invalid content. Element %1 is declared as abstract. Element %1 is not nillable. Attribute %1 contains invalid data: %2 Element contains content although it is nillable. Fixed value constraint not allowed if element is nillable. Element %1 cannot contain other elements, as it has a fixed content. Specified type %1 is not validly substitutable with element type %2. Complex type %1 is not allowed to be abstract. Element %1 contains not allowed attributes. Element %1 contains not allowed child element. Content of element %1 does not match its type definition: %2. Content of element %1 does not match defined value constraint. Element %1 contains not allowed child content. Element %1 contains not allowed text content. Element %1 is missing required attribute %2. Attribute %1 does not match the attribute wildcard. Declaration for attribute %1 does not exist. Element %1 contains two attributes of type %2. Attribute %1 contains invalid content. Element %1 contains unknown attribute %2. Content of attribute %1 does not match its type definition: %2. Content of attribute %1 does not match defined value constraint. Non-unique value found for constraint %1. Key constraint %1 contains absent fields. Key constraint %1 contains references nillable element %2. No referenced value found for key reference %1. More than one value found for field %1. Field %1 has no simple type. ID value '%1' is not unique. '%1' attribute contains invalid QName content: %2. VolumeSlider Muted Muet Volume: %1% Volume : %1% WebCore::PlatformScrollbar Scroll here Défiler jusqu'ici Left edge Extrême gauche Top En haut Right edge Extrême droite Bottom En bas Page left Page précédente Page up Page précédente Page right Page suivante Page down Page suivante Scroll left Défiler vers la gauche Scroll up Défiler vers le haut Scroll right Défiler vers la droite Scroll down Défiler vers le bas qstopmotion-2.3.2-Source/translations/qt_cs.ts000644 000000 000000 00001507522 12536560630 021552 0ustar00rootroot000000 000000 AudioEqualizer Frequency band, %1 Hz Kmitočtové pásmo, %1 Hz AudioOutput <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Zařízení pro přehrávání zvuku <b>%1</b> nepracuje.<br/>Místo něj <b>%2</b> se používá.</html> Revert back to device '%1' Přepnout zpět na zařízení '%1' <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> <html>Zařízení pro přehrávání zvuku <b>%1</b> bylo spuštěno,<br/>protože je právě dostupné a má větší přednost.</html> CloseButton Close Tab Zavřít kartu Debugger::JSAgentWatchData [Array of length %1] [Pole délky %1] <undefined> <nevymezeno> FakeReply Fake error ! Napodobená chyba! Fake error! Falešná chyba! Invalid URL Neplátné URL MAC_APPLICATION_MENU Services Služby Hide %1 Skrýt %1 Hide Others Skrýt ostatní Show All Ukázat vše Preferences... Nastavení... Quit %1 Ukončit %1 About %1 O %1 Phonon:: Games Hry Music Hudba Video Video Communication Spojení Accessibility Dostupnost Notifications Oznámení Phonon::AudioOutput <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Zařízení pro přehrávání zvuku <b>%1</b> nepracuje.<br/>Místo něj <b>%2</b> se používá.</html> <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> <html>Zařízení pro přehrávání zvuku <b>%1</b> bylo spuštěno,<br/>protože je právě dostupné a má větší přednost.</html> Revert back to device '%1' Přepnout zpět na zařízení '%1' <html>Switching to the audio playback device <b>%1</b><br/>which has higher preference or is specifically configured for this stream.</html> <html>Přepíná se na zvukové přehrávací zařízení <b>%1</b><br/>, které má větší přednost, nebo bylo zvláště nastaveno pro tento proud.</html> Phonon::Gstreamer::Backend Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabled Upozornění: Zdá se, že základní přídavné moduly pro GStreamer nejsou nainstalovány. Podpora audia a videa byla vypnuta Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled. Varování: Balíček gstreamer0.10-plugins-good není nainstalován. Některé vlastnosti videa nejsou dostupné. Phonon::Gstreamer::MediaObject Could not open media source. Zdroj s médii se nepodařilo otevřít. Could not decode media source. Zdroj s médii se nepodařilo rozluštit. Invalid source type. Neplatný typ zdroje s médii. Cannot start playback. Check your Gstreamer installation and make sure you have libgstreamer-plugins-base installed. Přehrávání nelze spustit. Ověřte, prosím, instalaci Gstreamer a ujistěte se, že je nainstalován balíček libgstreamer-plugins-base. Could not open audio device. The device is already in use. Zvukové zařízení se nepodařilo otevřít, protože se již používá. A required codec is missing. You need to install the following codec(s) to play this content: %0 Všechny vyžadované kodeky nejsou nainstalovány. Kvůli přehrání tohoto obsahu je potřeba nainstalovat následující kodek(y): %0 Cannot start playback. Check your GStreamer installation and make sure you have libgstreamer-plugins-base installed. Přehrávání nelze spustit. Ověřte, prosím, instalaci Gstreamer a ujistěte se, že je nainstalován balíček libgstreamer-plugins-base. Missing codec helper script assistant. Chybí skriptový pomocník pro nápovědu ke kodeku. Plugin codec installation failed for codec: %0 Instalace přídavného modulu kodeku se nezdařila pro kodek: %0 Could not locate media source. Zdroj s médii se nepodařilo nalézt. Phonon::MMF Audio Output Výstup zvuku The audio output device Zařízení pro výstup zvuku No error Žádná chyba Not found Nenalezeno Out of memory Není dostupná žádná další paměť Not supported Nepodporováno Overflow Přetečení Underflow Podtečení Already exists Již existuje Path not found Cesta nenalezena In use Již se používá Not ready Nepřipraven Access denied Přístup odepřen Could not connect Nepodařilo se vytvořit žádné spojení Disconnected Odpojeno Permission denied Přístup odepřen Insufficient bandwidth Nedostatečná šířka pásma Network unavailable Síť není dostupná Network communication error Chyba při spojení přes síť Streaming not supported Proudění nepodporováno Server alert Stav pohotovosti serveru Invalid protocol Neplatný protokol Invalid URL Neplátné URL Multicast error Chyba ve vícesměrovém vysílání Proxy server error Chyba při spojení u zprostředkujícího serveru (proxy) Proxy server not supported Zprostředkující server nepodporován Audio output error Chyba při výstupu zvuku Video output error Chyba při výstupu obrazu Decoder error Chyba v dekodéru Audio or video components could not be played Zvukové nebo obrazové složky se nepodařilo přehrát DRM error Chyba DRM Unknown error (%1) Neznámá chyba (%1) Phonon::MMF::AbstractMediaPlayer Not ready to play Nepřipraven k přehrávání Error opening file Soubor se nepodařilo otevřít Error opening URL Adresu se nepodařilo otevřít Error opening resource Nepodařilo se otevřít prostředky Error opening source: resource not opened Zdroj se nepodařilo otevřít: prostředek není otevřen Setting volume failed Hlasitost se nepodařilo nastavit Loading clip failed Ukázku se nepodařilo nahrát Playback complete Přehrávání dokončeno Download error Chyba při stahování Phonon::MMF::AbstractVideoPlayer Pause failed Pozastavení se nepodařilo provést Seek failed Hledání se nepodařilo provést Getting position failed Polohu se nepodařilo určit Opening clip failed Ukázku se nepodařilo otevřít Phonon::MMF::AudioEqualizer Frequency band, %1 Hz Kmitočtové pásmo, %1 Hz %1 Hz %1 Hz Phonon::MMF::AudioPlayer Getting position failed Polohu se nepodařilo určit Phonon::MMF::DsaVideoPlayer Video display error Chyba při zobrazení videa Phonon::MMF::EffectFactory audio equalizer zvukový ekvalizér Bass boost Zdůraznění basů Distance Attenuation Zeslabení v závislosti na vzdálenosti Environmental Reverb Vnější ozvěna Loudness Hlasitost Source Orientation Zaměření zdroje Stereo Widening Rozšíření sterea Enabled Povoleno Phonon::MMF::EnvironmentalReverb Decay HF ratio (%) DecayHFRatio: Ratio of high-frequency decay time to the value specified by DecayTime. Poměr dozvuku u vysokých kmitočtů (%) Decay time (ms) DecayTime: Time over which reverberation is diminished. Čas dozvuku (ms) Density (%) Density Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Diffusion value. Hustota (%) Diffusion (%) Diffusion: Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Density value. Rozptyl (%) Reflections delay (ms) ReflectionsDelay: Amount of delay between the arrival of the direct path from the source and the arrival of the first reflection. Zpoždění odrazu (ms) Reflections level (mB) ReflectionsLevel: Amplitude of reflections. This value is corrected by the RoomLevel to give the final reflection amplitude. Síla odrazu (mB) Reverb delay (ms) ReverbDelay: Amount of time between arrival of the first reflection and start of the late reverberation. Zpoždění ozvěny (ms) Reverb level (mB) ReverbLevel: Amplitude of reverberations. This value is corrected by the RoomLevel to give the final reverberation amplitude. Síla ozvěny (mB) Room HF level RoomHFLevel: Amplitude of low-pass filter used to attenuate the high frequency component of reflected sound. Hladina vysokého kmitočtu v prostoru Room level (mB) RoomLevel: Master volume control for all reflected sound. Hladina prostoru (mB) Phonon::MMF::MediaObject Error opening source: type not supported Zdroj se nepodařilo otevřít: tento typ není podporován Error opening source: resource is compressed Zdroj se nepodařilo otevřít: prostředek je zkomprimován Error opening source: resource not valid Zdroj se nepodařilo otevřít: prostředek není platný Error opening source: media type could not be determined Zdroj se nepodařilo otevřít: nepodařilo se určit typ média Failed to set requested IAP Nepodařilo se nastavit požadované IAP Phonon::MMF::StereoWidening Level (%) Síla (%) Phonon::MMF::SurfaceVideoPlayer Video display error Chyba při zobrazení videa Phonon::VolumeSlider Volume: %1% Hlasitost: %1% Use this slider to adjust the volume. The leftmost position is 0%. The rightmost is %1% Posuvník se používá k nastavení hlasitosti. Poloha nejvíce vlevo odpovídá 0%; poloha nejvíce vpravo odpovídá %1% Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1% Posuvník se používá k nastavení hlasitosti. Poloha nejvíce vlevo odpovídá 0%; poloha nejvíce vpravo odpovídá %1% Muted Ztlumeno Q3Accel %1, %2 not defined %1, %2 nejsou stanoveny Ambiguous %1 not handled Nejednoznačné %1 nemohou být zpracovány Q3DataTable True Pravdivý False Nepravdivý Delete Smazat Insert Vložit Update Obnovit Q3FileDialog &OK &OK &No &Ne Dir Adresář &Yes &Ano Back Zpět Date Datum File Soubor Name Název Open Otevřít Size Velikost Sort Roztřídit Type Typ &Open &Otevřít &Save &Uložit Error Chyba Open Otevřít Write: %1 Zapsat: %1 Sort by &Size Roztřídit podle &velikosti Sort by &Date Roztřídit podle &data Sort by &Name Roztřídit podle &názvu New Folder 1 Nová složka 1 the directory Adresář File &type: Typ &souboru: File &name: Název &souboru: Delete %1 Smazat %1 Cancel Zrušit R&eload Nahrát &znovu New Folder Nová složka &Unsorted &Neroztříděné Look &in: Hle&dat v: Preview File Contents Náhled obsahu souboru New Folder %1 Nová složka %1 Read-write Číst/Zapisovat Read-only Pouze číst Copy or Move a File Soubor kopírovat nebo posunout <qt>Are you sure you wish to delete %1 "%2"?</qt> <qt>Jste si jistý, že chcete smazat %1 "%2"?</qt> Find Directory Najít adresář Attributes Vlastnosti Show &hidden files &Ukázat skryté soubory Save As Uložit jako Inaccessible Nepřístupné %1 File not found. Check path and filename. %1 Soubor se nepodařilo nalézt. Ověřte cestu a název souboru. List View Pohled se seznamem Special Zvláštní vlastnost Write-only Pouze zápis the symlink Symbolický odkaz &Delete &Smazat All Files (*) Všechny soubory (*) Directories Adresáře Symlink to Special Symbolický odkaz k zvláštnímu souboru Select a Directory Vyberte adresář All Files (*.*) Všechny soubory (*.*) Read: %1 Číst: %1 &Rename &Přejmenovat Directory: Adresář: One directory up O jeden adresář nahoru Preview File Info Náhled informace o souboru the file Soubor Create New Folder Vytvořit novou složku Symlink to File Symbolický odkaz k souboru Symlink to Directory Symbolický odkaz k adresáři Detail View Podrobný pohled Q3LocalFs Could not open %1 Nepodařilo se otevřít: %1 Could not remove file or directory %1 Nepodařilo se odstranit soubor nebo adresář %1 Could not create directory %1 Nepodařilo se vytvořit adresář %1 Could not read directory %1 Nepodařilo se přečíst adresář %1 Could not rename %1 to %2 Nepodařilo se přejmenovat: %1 na %2 Could not write %1 Nepodařilo se zapsat: %1 Q3MainWindow Line up Uspořádat Customize... Přizpůsobit... Q3NetworkProtocol Operation stopped by the user Operace byla zastavena uživatelem Q3ProgressDialog Cancel Zrušit Q3TabDialog OK OK Help Nápověda Apply Použít Cancel Zrušit Defaults Výchozí Q3TextEdit Cu&t Vyj&mout &Copy &Kopírovat &Redo &Znovu &Undo &Zpět Clear Smazat &Paste &Vložit Select All Vybrat vše Q3TitleBar Close Zavřít Minimize Zmenšit Puts a minimized back to normal Dá velikost zmenšeného okna zpátky do obvyklého stavu Displays the name of the window and contains controls to manipulate it Zobrazí název okna a obsahuje příkazy pro zacházení s ním Makes the window full screen Dá okno na celou obrazovku System Systém Maximize Zvětšit Contains commands to manipulate the window Obsahuje příkazy pro zacházení s velikostí okna Restore up Obnovit Puts a minimized window back to normal Dá velikost zmenšeného okna zpátky do obvyklého stavu Closes the window Zavře okno Puts a maximized window back to normal Dá velikost zvětšeného okna zpátky do obvyklého stavu Moves the window out of the way Zmenší okno Restore down Obnovit Q3ToolBar More... Více... Q3UrlOperator The protocol `%1' does not support getting files Protokol `%1' nepodporuje nahrávání souborů The protocol `%1' does not support renaming files or directories Protokol `%1' nepodporuje přejmenovávání souborů nebo adresářů The protocol `%1' does not support listing directories Protokol `%1' nepodporuje sestavování seznamu adresářů (unknown) (neznámý) The protocol `%1' does not support removing files or directories Protokol `%1' nepodporuje odstraňování souborů nebo adresářů The protocol `%1' does not support putting files Protokol `%1' nepodporuje ukládání souborů The protocol `%1' is not supported Protokol `%1' není podporován The protocol `%1' does not support copying or moving files or directories Protokol `%1' nepodporuje kopírování či přesun souborů nebo adresářů The protocol `%1' does not support creating new directories Protokol `%1' nepodporuje vytváření nových adresářů Q3Wizard &Help &Nápověda &Cancel &Zrušit &Finish Do&končit &Next > &Další > < &Back < &Zpět QAbstractSocket Host not found Nepodařilo se najít počítač Connection refused Spojení bylo odmítnuto Connection timed out Časový limit pro spojení byl překročen Socket is not connected Socket není spojen Socket operation timed out Časový limit pro socket operaci byl překročen Network unreachable Síť není dosažitelná Operation on socket is not supported Tato socket operace není podporována QAbstractSpinBox Step &down Krok &dolů &Step up &Krok nahoru &Select All &Vybrat vše QAccessibleButton Uncheck Zrušit zaškrtnutí Check Zaškrtnout Press Stisknout QApplication Activates the program's main window Spustí hlavní okno programu QT_LAYOUT_DIRECTION LTR Activate Spustit Executable '%1' requires Qt %2, found Qt %3. Použití '%1' vyžaduje Qt %2; bylo ale nalezeno Qt %3. Incompatible Qt Library Error Qt není slučitelná QT_LAYOUT_DIRECTION Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. LTR QAxSelect OK OK COM &Object: COM-&Objekt: &Cancel &Zrušit Select ActiveX Control Vybrat prvek ActiveX QCheckBox Check Zaškrtnout Toggle Přepnout Uncheck Zrušit zaškrtnutí QColorDialog &Red: &Červená: &Sat: &Sytost: &Val: &Hodnota: Hu&e: &Odstín: Select Color Vybrat barvu &Add to Custom Colors &Přidat k uživatelem stanoveným barvám Bl&ue: &Modrá: &Green: &Zelená: &Basic colors Základní &barvy &Custom colors &Uživatelem stanovené barvy A&lpha channel: A&lfa kanál: QComboBox Open Otevřít True Pravdivý Close Zavřít False Nesprávný QCoreApplication %1: key is empty QSystemSemaphore %1: Neplatný údaj u klíče (prázdný) %1: unable to make key QSystemSemaphore %1: Nepodařilo se vytvořit klíč %1: ftok failed QSystemSemaphore %1: Vyvolání ftok se nezdařilo %1: key is empty %1: Neplatný údaj u klíče (prázdný) %1: unable to make key %1: Nepodařilo se vytvořit klíč %1: ftok failed %1: Vyvolání ftok se nezdařilo %1: already exists QSystemSemaphore %1: Již existuje %1: does not exist QSystemSemaphore %1: Neexistuje %1: out of resources QSystemSemaphore %1: Nejsou již použitelné zdroje %1: permission denied QSystemSemaphore %1: Přístup odepřen %1: unknown error %2 QSystemSemaphore %1: Neznámá chyba %2 QDB2Driver Unable to commit transaction Transakci se nepodařilo zapsat Unable to set autocommit 'autocommit' se nepodařilo nastavit Unable to connect Nepodařilo se navázat spojení Unable to rollback transaction Transakci se nepodařilo zvrátit QDB2Result Unable to bind variable Proměnnou se nepodařilo provést Unable to execute statement Příkaz se nepodařilo provést Unable to fetch next Další datový záznam se nepodařilo natáhnout Unable to prepare statement Příkaz se nepodařilo připravit Unable to fetch record %1 Datový záznam %1 se nepodařilo natáhnout Unable to fetch first První datový záznam se nepodařilo natáhnout QDateTimeEdit AM AM PM PM am am pm pm QDeclarativeAbstractAnimation Cannot animate non-existent property "%1" Vlastnost '%1" neexistuje a nelze ji proto animovat Cannot animate read-only property "%1" Vlastnost '%1" je pouze pro čtení a nelze ji proto animovat Animation is an abstract class Animace je abstraktní třída QDeclarativeAnchorAnimation Cannot set a duration of < 0 Nelze nastavit dobu trvání < 0 QDeclarativeAnchors Possible anchor loop detected on fill. Při operaci naplnění byla zjištěna případná nekonečná smyčka kotvy. Possible anchor loop detected on centerIn. Při operaci 'centerIn' byla zjištěna případná nekonečná smyčka kotvy. Cannot anchor to an item that isn't a parent or sibling. Cílem kotvy musí být rodičovský prvek nebo prvek na stejné úrovni. Possible anchor loop detected on vertical anchor. Při svislé kotvě byla zjištěna případná nekonečná smyčka kotvy. Possible anchor loop detected on horizontal anchor. Při vodorovné kotvě byla zjištěna případná nekonečná smyčka kotvy. Cannot specify left, right, and hcenter anchors. Nelze zadat kotevní údaje pro vlevo, vpravo a umístěno vodorovně do středu. Nesmí se vyskytovat společně. Cannot anchor to a null item. Nelze dát kotvu k nulovému prvku. Cannot anchor a horizontal edge to a vertical edge. Nelze ukotvit vodorovný okraj ke svislému. Cannot anchor item to self. Prvek nemůže mít kotvu k sobě samému. Cannot specify top, bottom, and vcenter anchors. Nelze zadat kotevní údaje pro nahoře, dole a umístěno svisle do středu. Nesmí se vyskytovat společně. Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors. Kotva pro výchozí bod se nesmí používat společně s dalšími kotevními údaji pro nahoře, dole a umístěno svisle do středu. Cannot anchor a vertical edge to a horizontal edge. Nelze ukotvit svislý okraj k vodorovnému. QDeclarativeAnimatedImage Qt was built without support for QMovie Qt bylo sestaveno bez podpory pro QMovie QDeclarativeApplication Application is an abstract class Aplikace je abstraktní třída QDeclarativeBehavior Cannot change the animation assigned to a Behavior. Animaci patřící k prvku Behavior nelze změnit. QDeclarativeBinding Binding loop detected for property "%1" U pro vlastnost "%1" zadané vazby byla zjištěna nekonečná smyčka QDeclarativeCompiledBindings Binding loop detected for property "%1" U pro vlastnost "%1" zadané vazby byla zjištěna nekonečná smyčka QDeclarativeCompiler Invalid property assignment: "%1" is a read-only property Neplatné přiřazení vlastnosti: "%1" je vlastnost pouze pro čtení Invalid property assignment: unknown enumeration Neplatné přiřazení vlastnosti: neplatná výčtová hodnota Invalid property assignment: string expected Neplatné přiřazení vlastnosti: očekáván řetězec Invalid property assignment: url expected Neplatné přiřazení vlastnosti: očekávána adresa (URL) Invalid property assignment: unsigned int expected Neplatné přiřazení vlastnosti: očekávána celočíselná hodnota bez znaménka Invalid property assignment: int expected Neplatné přiřazení vlastnosti: očekávána celočíselná hodnota Invalid property assignment: number expected Neplatné přiřazení vlastnosti: očekáváno číslo Invalid property assignment: color expected Neplatné přiřazení vlastnosti: očekáváno vymezení barvy Invalid property assignment: date expected Neplatné přiřazení vlastnosti: očekáván údaj s datem Invalid property assignment: time expected Neplatné přiřazení vlastnosti: očekáván časový údaj Invalid property assignment: datetime expected Neplatné přiřazení vlastnosti: očekáván údaj s datem Invalid property assignment: point expected Neplatné přiřazení vlastnosti: očekáván souřadnicový údaj pro jeden bod Invalid property assignment: size expected Neplatné přiřazení vlastnosti: očekáván údaj s velikostí Invalid property assignment: rect expected Neplatné přiřazení vlastnosti: očekáván parametr pro pravoúhelník Invalid property assignment: boolean expected Neplatné přiřazení vlastnosti: očekávána booleánská hodnota Invalid property assignment: 3D vector expected Neplatné přiřazení vlastnosti: očekáván třírozměrný vektor Invalid property assignment: unsupported type "%1" Neplatné přiřazení vlastnosti: Typ "%1" není podporován Element is not creatable. Příkaz nelze vytvořit. Component elements may not contain properties other than id Prvky součástek nesmí kromě ID obsahovat další vlastnosti Invalid component id specification Neplatné vymezení součástky id is not unique Hodnota ID není jednoznačná Invalid component body specification Neplatné vymezení obsahu součástky Component objects cannot declare new properties. Objekty součástek nemohou prohlásit nové vlastnosti. Component objects cannot declare new signals. Objekty součástek nemohou prohlásit nové signály. Component objects cannot declare new functions. Objekty součástek nemohou prohlásit nové funkce. Cannot create empty component specification Nelze vytvořit prázdné vymezení součástky "%1.%2" is not available in %3 %4.%5. "%1.%2" není dostupný v %3 %4.%5. "%1.%2" is not available due to component versioning. "%1.%2" není dostupný kvůli verzování součástky. Incorrectly specified signal assignment Nesprávně vymezené přiřazení signálu Cannot assign a value to a signal (expecting a script to be run) K signálu nelze přiřadit hodnotu (očekává se spuštění skriptu) Empty signal assignment Prázdné přiřazení signálu Empty property assignment Prázdné přiřazení vlastnosti Attached properties cannot be used here Na tomto místě nemohou být připojené vlastnosti (typu 'attached') používány Non-existent attached object Pro vlastnost neexistuje žádný připojený objekt Invalid attached object assignment Neplatné přiřazení připojeného objektu Cannot assign to non-existent default property Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost Cannot assign to non-existent property "%1" Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost pojmenovaná jako "%1" Invalid use of namespace Neplatné použití jmenného prostoru Not an attached property name Neplatný název pro připojenou vlastnost (typu 'attached') Invalid use of id property Neplatné použití vlastnosti typu 'id' Property has already been assigned a value Vlastnosti již byla přiřazena hodnota Invalid grouped property access Nesprávné seskupení při přístupu k vlastnosti Cannot assign a value directly to a grouped property U vlastnosti, která je částí seskupení, není žádné přímé přiřazení hodnoty přípustné Invalid property use Neplatné použití vlastnosti Property assignment expected Očekáváno přiřazení vlastnosti Single property assignment expected Očekáváno jednotlivé přiřazení vlastnosti Unexpected object assignment Nepřípustné přiřazení objektu Cannot assign object to list Přiřazení objektu k seznamům není přípustné Can only assign one binding to lists K seznamům lze přiřadit pouze jednu jedinou vazbu Cannot assign primitives to lists Přiřazení jednoduché hodnoty (primitivy) k seznamům není přípustné Cannot assign multiple values to a script property Přiřazení více hodnot k vlastnosti skriptu není přípustné Invalid property assignment: script expected Neplatné přiřazení vlastnosti: očekáván skript Cannot assign multiple values to a singular property Přiřazení více hodnot k jedné vlastnosti není přípustné Cannot assign object to property Přiřazení objektu k vlastnosti není přípustné "%1" cannot operate on "%2" "%1" nelze použít na "%2" Duplicate default property Zdvojená výchozí vlastnost Duplicate property name Zdvojený název vlastnosti Property names cannot begin with an upper case letter Názvy vlastností nesmí začínat velkým písmenem Illegal property name Neplatný název vlastnosti Duplicate signal name Zdvojený název signálu Signal names cannot begin with an upper case letter Názvy signálů nesmí začínat velkým písmenem Illegal signal name Neplatný název signálu Duplicate method name Zdvojený název metody Method names cannot begin with an upper case letter Názvy metod nesmí začínat velkým písmenem Illegal method name Neplatný název metody Property value set multiple times Vícenásobné přiřazení hodnoty k vlastnosti Invalid property nesting Neplatné vkládání vlastností Cannot override FINAL property Nelze přepsat vlastnost prohlašovanou jako 'FINAL' Invalid property type Neplatný typ vlastnosti Invalid empty ID Neplatná, protože prázdná, hodnota ID IDs cannot start with an uppercase letter Hodnoty ID nesmí začínat velkým písmenem IDs must start with a letter or underscore Hodnoty ID musí začínat písmenem nebo znakem _podtržítka IDs must contain only letters, numbers, and underscores Hodnoty ID musí obsahovat pouze písmena, číslice nebo znaky _podtržítka ID illegally masks global JavaScript property Hodnota ID nedovoleně zakrývá celkovou vlastnost z JavaScriptu No property alias location Vlastnost alias bez umístění Invalid alias location Neplatné umístění alias Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property> Neplatné odkazování na vlastnost alias. Odkazování na vlastnost alias musí být určeno jako <id>, <id>.<vlastnost> nebo <id>.<vlastnost hodnoty>.<vlastnost> Invalid alias reference. Unable to find id "%1" Neplatné odkazování na vlastnost alias. Nelze najít ID "%1" Alias property exceeds alias bounds Vlastnost alias překračuje vazby alias QDeclarativeComponent Invalid empty URL Neplátná prázdná adresa (URL) createObject: value is not an object createObject: Hodnota není objektem QDeclarativeConnections Cannot assign to non-existent property "%1" Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost pojmenovaná jako "%1" Connections: nested objects not allowed Spojení: vkládané objekty nejsou povoleny Connections: syntax error Spojení: chyba ve skladbě Connections: script expected Spojení: očekáván skript QDeclarativeEngine executeSql called outside transaction() 'executeSql' byl vyvolán mimo 'transaction()' Read-only Transaction Transakce pouze pro čtení Version mismatch: expected %1, found %2 Verzi %2 nelze používat; je třeba %1 SQL transaction failed Transakce SQL se nezdařila transaction: missing callback Transakce: chybí callback (zavolat znovu) SQL: database version mismatch SQL: Verze databáze neodpovídá očekávané verzi QDeclarativeFlipable front is a write-once property 'front' lze přidělit pouze jednou back is a write-once property 'back' lze přidělit pouze jednou QDeclarativeImportDatabase cannot load module "%1": File name case mismatch for "%2" Nelze nahrát modul "%1": Velikost písmen v názvu souboru neodpovídá pro %2 module "%1" definition "%2" not readable Modul "%1" vymezení "%2" nečitelné plugin cannot be loaded for module "%1": %2 Nelze nahrát přídavný modul pro modul "%1": %2 module "%1" plugin "%2" not found Modul "%1" přídavný modul "%2" nenalezen module "%1" version %2.%3 is not installed Modul "%1" verze %2.%3 není nainstalován module "%1" is not installed Modul "%1" není nainstalován "%1": no such directory "%1": žádný takový adresář není import "%1" has no qmldir and no namespace Zavedení "%1" nemá žádný qmldir a nemá žádný jmenný prostor - %1 is not a namespace - %1 jmenným prostorem - nested namespaces not allowed - vkládané jmenné prostory nejsou povoleny local directory Místní adresář is ambiguous. Found in %1 and in %2 je dvojznačný. Nalezen v %1 a v %2 is ambiguous. Found in %1 in version %2.%3 and %4.%5 je dvojznačný. Nalezen v %1 ve verzi %2.%3 a %4.%5 is instantiated recursively je doložen příkladem rekurzivně is not a type není typ File name case mismatch for "%1" Velikost písmen v názvu souboru neodpovídá pro "%1" File name case mismatch for "%2" Velikost písmen v názvu souboru neodpovídá pro %2 QDeclarativeKeyNavigationAttached KeyNavigation is only available via attached properties Klávesové navádění (KeyNavigation) je dostupné pouze pomocí připojených vlastností QDeclarativeKeysAttached Keys is only available via attached properties Keys je dostupné pouze pomocí připojených vlastností QDeclarativeLayoutMirroringAttached LayoutDirection attached property only works with Items Připojená vlastnost LayoutDirection pracuje jen s položkami LayoutMirroring is only available via attached properties LayoutMirroring je dostupné pouze prostřednictvím připojených vlastností QDeclarativeListModel remove: index %1 out of range odstranit (remove): Index %1 je mimo platnou oblast insert: value is not an object vložit (insert): Hodnota není objektem insert: index %1 out of range vložit (insert): Index %1 je mimo platnou oblast move: out of range přesunout (move): je mimo platnou oblast append: value is not an object připojit (append): Hodnota není objektem set: value is not an object nastavit (set): Hodnota není objektem set: index %1 out of range nastavit (set): Index %1 je mimo platnou oblast ListElement: cannot contain nested elements ListElement: nelze obsahovat vkládané prvky ListElement: cannot use reserved "id" property ListElement: nelze používat vlastnost "ID" ListElement: cannot use script for property value ListElement: nelze používat skript pro hodnotu vlastnosti ListModel: undefined property '%1' ListModel: Vlastnost '%1' není vymezena QDeclarativeLoader Loader does not support loading non-visual elements. Nahrávání neviditelných prvků není podporováno. QDeclarativeParentAnimation Unable to preserve appearance under complex transform Při složité proměně nelze zachovat vzhled Unable to preserve appearance under non-uniform scale Při nejednotné změně velikosti nelze zachovat vzhled Unable to preserve appearance under scale of 0 Při změně velikosti s 0 nelze zachovat vzhled QDeclarativeParentChange Unable to preserve appearance under complex transform Při složité proměně nelze zachovat vzhled Unable to preserve appearance under non-uniform scale Při nejednotné změně velikosti nelze zachovat vzhled Unable to preserve appearance under scale of 0 Při změně velikosti s 0 nelze zachovat vzhled QDeclarativeParser Illegal unicode escape sequence Neplatná úniková posloupnost unicode Illegal character Neplatný znak Unclosed string at end of line Neuzavřený řetězec na konci řádku Illegal escape squence Neplatná úniková posloupnost Illegal escape sequence Neplatná úniková posloupnost Unclosed comment at end of file Neuzavřená poznámka na konci souboru Illegal syntax for exponential number Neplatná skladba exponenciálního čísla Identifier cannot start with numeric literal Identifikátor nemůže začínat s číselným překlepem Unterminated regular expression literal Neuzavřený regulární výraz Invalid regular expression flag '%0' Neplatný příznak '%0' u regulárního výrazu Unterminated regular expression backslash sequence Neuzavřená posloupnost se zpětným lomítkem u regulárního výrazu Unterminated regular expression class Neuzavřená třída u neuzavřeného regulárního výrazu Syntax error Chyba ve skladbě Unexpected token `%1' Neočekávaný symbol `%1' Expected token `%1' Očekávaný symbol `%1' Property value set multiple times Vícenásobné přiřazení hodnoty k vlastnosti Expected type name Očekávaný název typu Invalid import qualifier ID Neplatný údaj o ID při zavádění Reserved name "Qt" cannot be used as an qualifier Zamluvený název "Qt" nemůže být použit jako kvalifikant Script import qualifiers must be unique. Kvalifikanty zadané pro zavedení skriptu musí být jednoznačné. Script import requires a qualifier Zavedení skriptu vyžaduje údaj o kvalifikantu Library import requires a version Zavedení knihovny vyžaduje údaj o verzi Expected parameter type Očekáván typ parametru Invalid property type modifier Neplatný modifikátor pro typ vlastnosti Unexpected property type modifier Neočekávaný modifikátor pro typ vlastnosti Expected property type Očekáván typ vlastnosti Readonly not yet supported "Pouze pro čtení" není na tomto místě ještě podporováno JavaScript declaration outside Script element Deklarace JavaScriptu není mimo prvek skriptu přípustná QDeclarativePauseAnimation Cannot set a duration of < 0 Nelze nastavit dobu trvání < 0 QDeclarativePixmap Error decoding: %1: %2 Chba při dekódování: %1: %2 Failed to get image from provider: %1 Obrazová data se od poskytovatele nepodařilo získat: %1 Cannot open: %1 Nelze otevřít: %1 QDeclarativePropertyAnimation Cannot set a duration of < 0 Nelze nastavit dobu trvání < 0 QDeclarativePropertyChanges PropertyChanges does not support creating state-specific objects. PropertyChanges nepodporuje vytváření objektů, které jsou přiřazeny jednomu stavu. Cannot assign to non-existent property "%1" Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost pojmenovaná jako "%1" Cannot assign to read-only property "%1" Vlastnost '%1" je pouze pro čtení a nelze ji proto přiřadit QDeclarativeTextInput Could not load cursor delegate Nepodařilo se nahrát zástupce kurzoru Could not instantiate cursor delegate Zástupce kurzoru se nepodařilo doložit příkladem QDeclarativeTypeLoader Script %1 unavailable Skript %1 nedostupný Type %1 unavailable Typ %1 nedostupný Namespace %1 cannot be used as a type Jmenný prostor %1 nelze použít jako typ %1 %2 %1 %2 QDeclarativeVME Unable to create object of type %1 Nepodařilo se vytvořit žádný objekt typu %1 Cannot assign value %1 to property %2 Hodnotu '%1' nelze přiřadit vlastnosti %2 Cannot assign object type %1 with no default method Typ objektu %1 nelze přiřadit, protože neexistuje žádná výchozí metoda Cannot connect mismatched signal/slot %1 %vs. %2 Nelze vytvořit žádné spojení mezi signálem %1 a zdířkou %2, protože se k sobě nehodí Cannot assign an object to signal property %1 Vlastnosti signálu %1 nelze přiřadit žádný objekt Cannot assign object to list Přiřazení objektu k seznamům není přípustné Cannot assign object to interface property Vlastnosti rozhraní nelze přiřadit žádný objekt Unable to create attached object Nepodařilo se vytvořit žádný připojený objekt (typu 'attached') Cannot set properties on %1 as it is null Vlastnosti nelze nastavit na %1, protože jsou 'null' QDeclarativeVisualDataModel Delegate component must be Item type. Součástka zástupce musí být typu 'item'. QDeclarativeXmlListModel Qt was built without support for xmlpatterns Qt bylo sestaveno bez podpory pro xmlpatterns QDeclarativeXmlListModelRole An XmlRole query must not start with '/' Vyhledávání XmlRole nesmí začínat s '/' QDeclarativeXmlRoleList An XmlListModel query must start with '/' or "//" Vyhledávání XmlListModel musí začínat s '/' nebo "//" QDial QDial QDial SliderHandle Posuvník SpeedoMeter Rychloměr QDialog Done Hotovo What's This? Co je toto? QDialogButtonBox OK OK &OK &OK &No &Ne &Yes &Ano Help Nápověda Open Otevřít Save Uložit &Save &Uložit Abort Zrušit Apply Použít Close Zavřít Reset Vrátit Retry Opakovat Restore Defaults Obnovit výchozí &Close &Zavřít Cancel Zrušit Ignore Přehlížet Close without Saving Zavřít bez uložení N&o to All N&e, žádné Save All Uložit vše &Cancel &Zrušit Discard Odmítnout Yes to &All Ano, &vše Don't Save Neukládat QDirModel Kind Druh Name Název Size Velikost Kind Match OS X Finder Druh Type All other platforms Typ Type Typ Date Modified Datum změny QDockWidget Dock Vplout do panelu Close Zavřít Float Plout QDoubleSpinBox Less Méně More Více QErrorMessage &OK &OK Fatal Error: Osudová chyba: &Show this message again Toto hlášení &ukázat ještě jednou Debug Message: Hlášení o odladění: Warning: Varování: QFile Cannot create %1 for output %1 se nepodařilo zřídit pro výstup Failure to write block Datový blok se nepodařilo zapsat Will not rename sequential file using block copy Nepřejmenuje posloupný soubor pomocí kopie bloku Cannot remove source file Nelze odstranit zdrojový soubor Cannot open %1 for input %1 se nepodařilo otevřít pro čtení No file engine available or engine does not support UnMapExtension Není dostupný žádný souborový stroj nebo stroj nepodporuje UnMapExtension Destination file exists Cílový soubor již existuje Cannot open for output Nepodařilo se otevřít pro zápis QFileDialog Back Zpět File Soubor File Folder Match Windows Explorer Souborová složka Folder All other platforms Složka Alias Mac OS X Finder Přezdívka Shortcut All other platforms Zkratka Open Otevřít &Open &Otevřít &Save &Uložit Drive Disková jednotka Show Ukázat '%1' is write protected. Do you want to delete it anyway? '%1' je chráněn proti zápisu. Přesto chcete soubor smazat? File &name: Název &souboru: New Folder Nová složka Parent Directory Nadřazený adresář &New Folder &Nová složka Remove Odstranit My Computer Můj počítač Look in: Hledat v: Files of type: Soubory typu: Find Directory Najít adresář Show &hidden files &Ukázat skryté soubory Are sure you want to delete '%1'? Jste si jistý, že %1 chcete smazat? Save As Uložit jako %1 Directory not found. Please verify the correct directory name was given. %1 Adresář se nepodařilo nalézt. Ověřte, prosím, že byl zadán správný název adresáře. List View Pohled se seznamem &Choose &Vybrat &Delete &Smazat All Files (*) Všechny soubory (*) Directories Adresáře All Files (*.*) Všechny soubory (*.*) &Rename &Přejmenovat Could not delete directory. Adresář se nepodařilo smazat. Directory: Adresář: Unknown Neznámý %1 already exists. Do you want to replace it? Soubor %1 již existuje. Chcete jej nahradit? Forward Dopředu Recent Places Naposledy navštívené Create New Folder Vytvořit novou složku Detail View Podrobný pohled %1 File not found. Please verify the correct file name was given. %1 Soubor se nepodařilo nalézt. Ověřte, prosím, že byl zadán správný název souboru. Go back Jít zpět Go forward Jít dopředu Go to the parent directory Jít do rodičovského adresáře Create a New Folder Vytvořit novou složku Change to list view mode Změnit na režim pohledu se seznamem Change to detail view mode Změnit na režim s podrobným pohledem QFileSystemModel Kind Druh Name Název Size Velikost Type Typ %1 GB %1 GB %1 KB %1 KB %1 MB %1 MB %1 TB %1 TB <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. <b>Název "%1" nelze použít.</b><p>Zkuste použít jiný název, s menším počtem znaků nebo bez zvláštních znaků. %1 bytes %1 bytů My Computer Můj počítač Computer Počítač Invalid filename Neplatný název souboru Kind Match OS X Finder Druh Type All other platforms Typ Date Modified Datum změny %1 byte(s) %1 byt(ů) QFontDatabase Any Všechna Lao Laoské Bold Tučné Demi Polotučné Thai Thajské Black Černé Greek Řecké Khmer Khmerské Latin Latinské Light Jemné Ogham Ogamské Oriya Oriya Runic Runové Tamil Tamilské Cyrillic Cyrilské Kannada Kannada Malayalam Malayalam Simplified Chinese Zjednodušená čínština N'Ko N'Ko Demi Bold Polotučné Arabic Arabské Hebrew Hebrejské Myanmar Myanmar Italic Kurzíva Korean Korejské Normal Normální Oblique Skloněné Telugu Telugu Thaana Thaana Symbol Symbol Syriac Syrské Devanagari Devanagari Japanese Japonské Bengali Bengálské Armenian Arménské Sinhala Sinhálské Tibetan Tibetské Vietnamese Větnamské Gujarati Gujarati Traditional Chinese Tradiční čínština Georgian Gruzínské Gurmukhi Gurmukhi QFontDialog &Font &Písmo &Size &Velikost Sample Vzorek Font st&yle Druh pís&ma Wr&iting System Způsob &psaní Select Font Vybrat písmo &Underline &Podtrhnout Effects Efekty Stri&keout Pře&škrtnout QFtp Listing directory failed: %1 Obsah adresářů nelze ukázat: %1 Creating directory failed: %1 Vytvoření adresářů se nezdařilo: %1 Not connected Žádné spojení Connection refused for data connection Odmítnuto spojení pro data Login failed: %1 Přihlášení se nezdařilo: %1 Downloading file failed: %1 Stažení souboru se nezdařilo: %1 Connected to host Spojení s počítačem navázáno Connection timed out to host %1 Časový limit pro spojení s počítačem '%1' byl překročen Connected to host %1 Spojeno s počítačem %1 Connecting to host failed: %1 Spojení s počítačem se nezdařilo: %1 Host %1 not found Počítač %1 se nepodařilo nalézt Uploading file failed: %1 Nahrání souboru se nezdařilo: %1 Changing directory failed: %1 Změna adresáře se nezdařila: %1 Host found Počítač byl nalezen Removing directory failed: %1 Odstranění adresáře se nezdařilo: %1 Connection refused to host %1 Spojení s počítačem %1 odmítnuto Connection to %1 closed Spojení s %1 ukončeno Removing file failed: %1 Odstranění souboru se nezdařilo: %1 Host %1 found Počítač %1 byl nalezen Unknown error Neznámá chyba Connection closed Spojení ukončeno QGroupBox Toggle Přepnout QHostInfo Unknown error Neznámá chyba No host name given Nebyl zadán název pro hostitelský počítač QHostInfoAgent Host not found Nepodařilo se najít počítač Unknown address type Neznámý typ adresy Unknown error Neznámá chyba No host name given Nebyl zadán název pro hostitelský počítač Invalid hostname Neplatný název pro hostitelský počítač Unknown error (%1) Neznámá chyba (%1) QHttp Connection refused (or timed out) Spojení bylo odmítnuto (nebo byl překročen časový limit) Data corrupted Data jsou poškozena Connected to host Spojení s počítačem navázáno Connected to host %1 Spojeno s počítačem %1 Host %1 not found Počítač %1 se nepodařilo nalézt Host requires authentication Hostitelský počítač požaduje autentizaci Error writing response to device Při psaní odpovědi výstupnímu zařízení se vyskytla chyba HTTPS connection requested but SSL support not compiled in Požadované HTTPS spojení nelze vytvořit, protože neexistuje žádná SSL podpora Host found Počítač byl nalezen Connection refused Spojení bylo odmítnuto Proxy authentication required Požadována proxy autentizace Unknown protocol specified Byl zadán neznámý protokol HTTP request failed HTTP dotaz se nezdařil Proxy requires authentication Proxy server požaduje autentizaci Authentication required Požadována autentizace SSL handshake failed Během startu SSL protokolu se vyskytla chyba Connection to %1 closed Spojení s %1 ukončeno Invalid HTTP chunked body Obsah (chunked body - rozkouskované tělo) HTTP je neplatný Host %1 found Počítač %1 byl nalezen Wrong content length Neplatný údaj o délce obsahu Unknown error Neznámá chyba Invalid HTTP response header Hlavička HTTP odpovědi není platná Unknown authentication method Neznámý způsob autentizace Connection closed Spojení ukončeno No server set to connect to Pro spojení nebyl nastaven žádný počítač - server Server closed connection unexpectedly Server neočekávaně uzavřel spojení Request aborted Požadavek byl zrušen QHttpSocketEngine Proxy connection refused Proxy server odmítl navázání spojení Proxy denied connection Proxy server odmítl spojení Proxy server not found Nepodařilo se najít žádný proxy server Proxy server connection timed out Při spojení s proxy serverem byl překročen časový limit Did not receive HTTP response from proxy Žádná HTTP odpověď od proxy serveru Proxy connection closed prematurely Proxy server předčasně ukončil spojení Error communicating with HTTP proxy Chyba při spojení s proxy serverem Authentication required Požadována autentizace Error parsing authentication request from proxy Chyba při vyhodnocení autentizačního požadavku proxy serveru QIBaseDriver Unable to commit transaction Transakci se nepodařilo zapsat Could not start transaction Nepodařilo se spustit žádnou transakci Error opening database Nepodařilo se otevřít spojení s databází Unable to rollback transaction Transakci se nepodařilo zvrátit QIBaseResult Unable to commit transaction Transakci se nepodařilo zapsat Unable to open BLOB Nepodařilo se otevřít BLOB Could not describe statement Nepodařilo se získat žádný popis příkazu Could not describe input statement Nepodařilo se získat žádný popis vstupního příkazu Could not allocate statement Přidělení příkazu se nezdařilo Unable to write BLOB Nepodařilo se zapsat BLOB Could not start transaction Nepodařilo se spustit žádnou transakci Unable to close statement Příkaz se nepodařilo zavřít Could not get query info Požadované informace k vyhledávání nejsou k dispozici Could not find array Nepodařilo se najít pole Could not get array data Nepodařilo se přečíst data pole Unable to execute query Dotaz se nepodařilo provést Could not prepare statement Příkaz se nepodařilo připravit Could not fetch next item Další prvek se nepodařilo vyzvednout Could not get statement info K dispozici není žádná informace k příkazu Unable to create BLOB Nepodařilo se vytvořit žádný BLOB Unable to read BLOB BLOB se nepodařilo přečíst QIODevice No such file or directory Nepodařilo se najít žádný takový soubor nebo adresář Permission denied Přístup odepřen No space left on device Na zařízení není žádný volný úložný prostor Unknown error Neznámá chyba Too many open files Příliš mnoho otevřených souborů QInputContext XIM XIM FEP FEP Windows input method Windows-vstupní metoda S60 FEP input method S60 FEP-vstupní metoda XIM input method XIM-vstupní metoda Mac OS X input method Mac OS X-vstupní metoda QInputDialog Enter a value: Zadejte hodnotu: QLibrary Could not unmap '%1': %2 Operace unmap, zrušit zobrazení, se nezdařila u '%1': %2 Cannot unload library %1: %2 Knihovnu %1 nelze vyjmout: %2 Cannot load library %1: %2 Knihovnu %1 nelze nahrát: %2 The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] Přídavný modul '%1' používá neslučitelnou Qt knihovnu. (%2.%3.%4) [%5] Cannot resolve symbol "%1" in %2: %3 Symbol "%1" nelze v %2 vyřešit: %3 Plugin verification data mismatch in '%1' Ověřovací data přídavného nesouhlasí v '%1' The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) Přídavný modul '%1' používá neslučitelnou Qt knihovnu. (Knihovny vytvořené v režimu ladění a vydání nemohou být používány společně.) The file '%1' is not a valid Qt plugin. Soubor '%1' není platným přídavným modulem Qt. The shared library was not found. Nepodařilo se nalézt sdílenou knihovnu. Unknown error Neznámá chyba The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3" Přídavný modul '%1' používá neslučitelnou Qt knihovnu. Potřebný byl zvláštní klíč pro sestavení "%2", obdržen "%3" Could not mmap '%1': %2 Operace mmap se nezdařila u '%1': %2 '%1' is not an ELF object (%2) '%1' není objekt ELF (%2) '%1' is not an ELF object '%1' není objekt ELF '%1' is an invalid ELF object (%2) '%1' je neplatný objekt ELF (%2) QLineEdit Cu&t &Vyjmout &Copy &Kopírovat &Redo &Znovu &Undo &Zpět &Paste &Vložit Delete Smazat Select All Vybrat vše QLocalServer %1: Name error %1: Chybný název %1: Unknown error %2 %1: Neznámá chyba %2 %1: Permission denied %1: Přístup odepřen %1: Address in use %1: Adresa se již používá QLocalSocket %1: Connection error %1: Chyba spojení %1: Connection refused %1: Spojení bylo odmítnuto %1: Unknown error %2 %1: Neznámá chyba %2 %1: Socket access error %1: Chyba při přístupu k socketu %1: Socket resource error %1: Chyba socketu - potíže se zdrojem %1: The socket operation is not supported %1: Tato operace se socketem není podporována %1: Invalid name %1: Neplatný název %1: Unknown error %1: Neznámá chyba %1: Socket operation timed out %1: Překročení času při operaci se socketem %1: Datagram too large %1: Datagram je příliš veliký %1: Remote closed %1: Spojení bylo protější stranou uzavřeno %1: Access denied Přístup odepřen QMYSQLDriver Unable to commit transaction Transakci se nepodařilo zapsat Unable to open database ' Nepodařilo se otevřít spojení s databází ' Unable to connect Nepodařilo se navázat spojení Unable to rollback transaction Transakci se nepodařilo zvrátit Unable to begin transaction Transakci se nepodařilo spustit QMYSQLResult Unable to execute statement Příkaz se nepodařilo provést Unable to store statement results Výsledky příkazu se nepodařilo uložit Unable to execute next query Další dotaz nelze provést Unable to bind outvalues Výstupní hodnoty se nepodařilo spojit Unable to store next result Další výsledek nelze uložit Unable to fetch data Nepodařilo se natáhnout žádná data Unable to prepare statement Příkaz se nepodařilo připravit Unable to store result Výsledek se nepodařilo uložit Unable to bind value Hodnotu se nepodařilo spojit Unable to execute query Dotaz se nepodařilo provést Unable to reset statement Příkaz se nepodařilo znovu nastavit QMdiArea (Untitled) (Bez názvu) QMdiSubWindow Help Nápověda Menu Menu &Move Po&sunout &Size Změnit &velikost Close Zavřít Minimize Zmenšit Shade Navinout Stay on &Top Zůstat v &popředí &Close &Zavřít - [%1] - [%1] %1 - [%2] %1 - [%2] &Restore &Obnovit Restore Obnovit Maximize Zvětšit Unshade Odvinout Mi&nimize Zmen&šit Ma&ximize Zvě&tšit Restore Down Obnovit QMenu Open Otevřít Close Zavřít Execute Provést QMenuBar Actions Činnosti Corner Toolbar Rohový nástrojový pruh QMessageBox OK OK Help Nápověda <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.digia.com/product/licensing">qt.digia.com/product/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).</p><p>Qt is a Digia product. See <a href="http://qt.digia.com/">qt.digia.com</a> for more information.</p> <p>Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.</p><p>Qt poskytuje snadnou přenositelnost a jednotný zdrojový kód pro MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux a všechny hlavní prodejní varianty systému Unix. Qt je rovněž dostupné pro vestavěná zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupné pod třemi rozdílnými licencemi navrženými tak, aby vyhověly potřebám našich různých uživatelů.</p>Qt s naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde nechcete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt s licencí GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem) za předpokladu, že můžete souhlasit s požadavky a podmínkami GNU LGPL verze 2.1.</p><p>Qt s licencí GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochotni souhlasit s podmínkami GNU GPL ve verzi 3.0.</p><p>Více informací najdete na <a href="http://qt.digia.com/product/licensing">qt.digia.com/product/licensing</a>.</p><p>Autorské právo (C) 2012 Digia Plc a/nebo její dceřinná(é) společnost(i).</p><p>Qt je výrobkem společnosti Digia. Další informace najdete na <a href="http://qt.digia.com/">qt.digia.com</a>.</p> Show Details... Ukázat podrobnosti... <h3>About Qt</h3><p>This program uses Qt version %1.</p> <h3>O Qt</h3><p>Tento program používá Qt-verze %1.</p> About Qt O Qt <p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> for an overview of Qt licensing.</p> <p>Tento program používá Qt Open Source Edition verze %1.</p><p>Qt Open Source Edition je zamýšlena pro vývoj Open Source aplikací. Pro vývoj vlastnických aplikací (uzavřené zdrojové kódy) potřebujete Qt licenci.</p><p>Podívejte se, prosím, na <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> kvůli přehledu licencování Qt.</p> Hide Details... Skrýt podrobnosti... <p>This program uses Qt version %1.</p> <p>Tento program používá Qt-verze %1.</p> QMultiInputContext Select IM Zvolit způsob vstupu QMultiInputContextPlugin Multiple input method switcher that uses the context menu of the text widgets Přepínač pro více způsobů vstupu, který používá související nabídku textového prvku Multiple input method switcher Přepínač pro více způsobů vstupu QNativeSocketEngine The proxy type is invalid for this operation Tuto operaci nelze s tímto typem proxy provést Network operation timed out Časový limit pro síťovou operaci byl překročen The remote host closed the connection Vzdálený počítač uzavřel spojení Invalid socket descriptor Neplatný deskriptor socketu Host unreachable Cílový počítač je nedosažitelný Protocol type not supported Protokol tohoto typu není podporován Datagram was too large to send Datagram byl pro odeslání příliš veliký Attempt to use IPv6 socket on a platform with no IPv6 support Vyzkoušelo se použít IPv6 socket na systému bez podpory IPv6 Unable to receive a message Zprávu se nepodařilo přijmout Permission denied Přístup odepřen Connection refused Spojení bylo odmítnuto Unable to write Nepodařilo se zapsat Another socket is already listening on the same port Na tomto portu již naslouchá jiný socket Unable to send a message Nepodařilo se odeslat hlášení The bound address is already in use Uvedená adresa se už používá Connection timed out Časový limit pro spojení byl překročen Network error Síťová chyba Unsupported socket operation Nepodporovaná socket operace Operation on non-socket Operace mimo socket Unable to initialize broadcast socket Socket pro vysílání se nepodařilo spustit Unknown error Neznámá chyba Unable to initialize non-blocking socket Neblokující socket se nepodařilo spustit The address is protected Adresa je chráněna Network unreachable Síť je nedosažitelná The address is not available Adresa není dostupná Out of resources Nejsou dostupné žádné zdroje QNetworkAccessCacheBackend Error opening %1 %1 se nepodařilo otevřít QNetworkAccessDataBackend Operation not supported on %1 Tato operace není %1 podporována Invalid URI: %1 Neplatný URI: %1 QNetworkAccessDebugPipeBackend Write error writing to %1: %2 Při zápisu do souboru %1: %2 nastala chyba Socket error on %1: %2 Chyba socketu u %1: %2 Remote host closed the connection prematurely on %1 Vzdálený počítač předčasně ukončil spojení s %1 QNetworkAccessFileBackend Request for opening non-local file %1 Požadavek na otevření souboru přes síť %1 Read error reading from %1: %2 Při čtení ze souboru %1 nastala chyba: %2 Cannot open %1: Path is a directory %1 nelze otevřít: Jedná se o adresář Error opening %1: %2 %1 se nepodařilo otevřít: %2 Write error writing to %1: %2 Při zápisu do souboru %1: %2 nastala chyba QNetworkAccessFtpBackend No suitable proxy found Nepodařilo se najít žádný vhodný proxy server Error while downloading %1: %2 Při stahování %1 se vyskytla chyba: %2 Error while uploading %1: %2 Při nahrávání %1 se vyskytla chyba: %2 Cannot open %1: is a directory %1 nelze otevřít: Jedná se o adresář Logging in to %1 failed: authentication required Přihlášení do %1 se nezdařilo: Je požadována autentizace QNetworkAccessHttpBackend No suitable proxy found Nepodařilo se najít žádný vhodný proxy server QNetworkAccessManager Network access is disabled. Přístup k síti není dovolen. QNetworkReply Error downloading %1 - server replied: %2 Při stahování %1 se vyskytla chyba - Odpověď serveru je: %2 Protocol "%1" is unknown Protokol "%1" není znám Network session error. Chyba při spojení přes síť. backend start error. Chyba spuštění podpůrné vrstvy. Temporary network failure. Síť dočasně vypadla. QNetworkReplyImpl Operation canceled Operace byla zrušena QNetworkSession Invalid configuration. Neplatné nastavení. QNetworkSessionPrivateImpl Roaming error Chyba při toulání se (roaming) Session aborted by user or system Spojení bylo zrušeno buď uživatelem nebo operačním systémem The specified configuration cannot be used. Zadané nastavení nelze použít. Unidentified Error Neznámá chyba Unknown session error. Neznámá chyba při spojení přes síť. The session was aborted by the user or system. Spojení bylo zrušeno buď uživatelem nebo operačním systémem. The requested operation is not supported by the system. Požadovaná operace není systémem podporována. Roaming was aborted or is not possible. Toulání se (roaming) bylo buď zrušeno, nebo zde není možné. QOCIDriver Unable to commit transaction Transakci se nepodařilo zapsat Unable to initialize Inicializace se nezdařila Unable to logon Přihlášení se nezdařilo Unable to rollback transaction Transakci se nepodařilo zvrátit Unable to begin transaction Transakci se nepodařilo spustit Unable to initialize QOCIDriver Spuštění se nezdařilo QOCIResult Unable to alloc statement Přidělení příkazu se nepodařilo Unable to goto next Nelze jít k dalšímu prvku Unable to get statement type Nepodařilo se získat typ příkazu Unable to execute statement Příkaz se nepodařilo provést Unable to bind column for batch execute Nepodařilo se spojit sloupec pro provedení příkazu dávkového zpracování Unable to execute select statement Výběrové vyhledávání se nepodařilo provést Unable to prepare statement Příkaz se nepodařilo připravit Unable to execute batch statement Příkaz pro dávkové zpracování se nepodařilo provést Unable to bind value Hodnotu se nepodařilo spojit QODBCDriver Unable to commit transaction Transakci se nepodařilo zapsat Unable to enable autocommit 'autocommit' se nepodařilo povolit Unable to connect - Driver doesn't support all needed functionality Nepodařilo se navázat spojení, protože ovladač nutnou funkcionalitu plně nepodporuje Unable to disable autocommit 'autocommit', automatické zapsání, se nepodařilo zastavit Unable to connect Nepodařilo se navázat spojení Unable to connect - Driver doesn't support all functionality required Nepodařilo se navázat spojení, protože ovladač nutnou funkcionalitu plně nepodporuje Unable to rollback transaction Transakci se nepodařilo zvrátit QODBCResult Unable to bind variable Proměnnou se nepodařilo provést Unable to execute statement Příkaz se nepodařilo provést Unable to fetch next Další datový záznam se nepodařilo natáhnout Unable to fetch last Poslední datový záznam se nepodařilo natáhnout Unable to prepare statement Příkaz se nepodařilo spustit Unable to fetch previous Předchozí datový záznam se nepodařilo natáhnout Unable to fetch Nepodařilo se natáhnout žádná data QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult::reset: 'SQL_CURSOR_STATIC' se nepodařilo nastavit jako příkaz vlastnosti . Ověřte, prosím, nastavení svého ODBC ovladače Unable to fetch first První datový záznam se nepodařilo natáhnout QObject Invalid hostname Neplatný název pro hostitelský počítač Home Home Protocol error: packet of size 0 received Chyba v zápisu: Byl přijat paket o nulové velikosti Invalid URI: %1 Neplátná URI: %1 Socket error on %1: %2 Chyba zásuvky (socketu) u %1: %2 No host name given Nebyl zadán název pro hostitelský počítač Read error reading from %1: %2 Při čtení ze souboru %1 nastala chyba: %2 Remote host closed the connection prematurely on %1 Vzdálený počítač předčasně ukončil spojení s %1 Operation not supported on %1 Tato operace není %1 podporována Write error writing to %1: %2 Při zápisu do souboru %1: %2 nastala chyba PulseAudio Sound Server Zvukový server PulseAudio "%1" duplicates a previous role name and will be disabled. "%1" je již zadán jako název předchozí úlohy, a je proto vypnut. invalid query: "%1" Neplátný dotaz: "%1" Host not found Nepodařilo se najít počítač Could not read image data Nepodařilo se přečíst data obrazu Sequential device (eg socket) for image read not supported Postupné zařízení (např. socket - komunikační kanál) pro čtení obrazu nepodporováno Seek file/device for image read failed Vyhledání souboru/zařízení pro čtení obrazu se nezdařilo Image mHeader read failed Čtení mHeader obrazu se nezdařilo Image type not supported Typ obrazu nepodporován Image depth not valid Hloubka obrazu nepodporována Could not seek to image read footer Nepodařilo se vyhledat zápatí čtení obrazu Could not read footer Nepodařilo se přečíst zápatí Image type (non-TrueVision 2.0) not supported Typ obrazu (non-TrueVision 2.0) nepodporován Could not reset to start position Nepodařilo se vrátit na počáteční polohu QPPDOptionsModel Name Název Value Hodnota QPSQLDriver Unable to subscribe Registrace se nezdařila Could not begin transaction Transakci se nepodařilo spustit Could not rollback transaction Transakci se nepodařilo zvrátit Could not commit transaction Transakci se nepodařilo zapsat Unable to connect Nepodařilo se navázat spojení Unable to unsubscribe Registraci se nepodařilo zrušit QPSQLResult Unable to prepare statement Příkaz se nepodařilo připravit Unable to create query Nepodařilo se vytvořit žádný dotaz QPageSetupWidget Form Formulář bottom margin Dolní okraj Paper Papír Paper source: Zdroj papíru: Centimeters (cm) Centimetry (cm) right margin Pravý okraj Margins Okraje Landscape Formát na šířku Width: Šířka: Orientation Zaměření Portrait Formát na výšku top margin Horní okraj left margin Levý okraj Page size: Velikost stran: Reverse portrait Obrácený formát na výšku Millimeters (mm) Milimetry (mm) Points (pt) Body (pt) Inches (in) Palce (in) Reverse landscape Obrácený formát na šířku Height: Výška: QPluginLoader The plugin was not loaded. Přídavný modul nebyl nahrán. Unknown error Neznámá chyba QPrintDialog A0 A0 A1 A1 A2 A2 A3 A3 A4 A4 A5 A5 A6 A6 A7 A7 A8 A8 A9 A9 B0 B0 B1 B1 B2 B2 B3 B3 B4 B4 B5 B5 B6 B6 B7 B7 B8 B8 B9 B9 OK OK B10 B10 C5E C5E DLE DLE A6 (105 x 148 mm) A6 (105 x 148 mm) Legal (8.5 x 14 inches, 216 x 356 mm) US Legal (8,5 x 14 palců, 216 x 356 mm) Folio Folio Legal US Legal Print all Tisknout vše Print Tisk &Options << &Nastavení << &Options >> &Nastavení >> B6 (125 x 176 mm) B6 (125 x 176 mm) B8 (62 x 88 mm) B8 (62 x 88 mm) A8 (52 x 74 mm) A8 (52 x 74 mm) B9 (44 x 62 mm) B9 (44 x 62 mm) A9 (37 x 52 mm) A9 (37 x 52 mm) B0 (1000 x 1414 mm) B0 (1000 x 1414 mm) A5 (148 x 210 mm) A5 (148 x 210 mm) Tabloid (279 x 432 mm) US Tabloid (279 x 432 mm) B10 (31 x 44 mm) B10 (31 x 44 mm) B2 (500 x 707 mm) B2 (500 x 707 mm) &Print &Tisk A3 (297 x 420 mm) A3 (297 x 420 mm) Print selection Tisk výběru Print to File (Postscript) Tisk do souboru (Postscript) B4 (250 x 353 mm) B4 (250 x 353 mm) %1 already exists. Do you want to overwrite it? Soubor %1 již existuje. Má se přepsat? A1 (594 x 841 mm) A1 (594 x 841 mm) Custom Stanovený uživatelem B1 (707 x 1000 mm) B1 (707 x 1000 mm) Folio (210 x 330 mm) Folio (210 x 330 mm) Ledger US Ledger Letter US Letter DLE (110 x 220 mm) DLE (110 x 220 mm) C5E (163 x 229 mm) C5E (163 x 229 mm) B5 (176 x 250 mm, 6.93 x 9.84 inches) B5 (176 x 250 mm, 6.93 x 9.84 palců Print range Tisková oblast Print current page Vytisknout tuto stranu File exists Soubor již existuje Write %1 file Zapsat %1 soubor A0 (841 x 1189 mm) A0 (841 x 1189 mm) Local file Místní soubor locally connected přímo spojeno Ledger (432 x 279 mm) US Ledger (432 x 279 mm) Aliases: %1 Přezdívka: %1 Print to File (PDF) Tisk do souboru (PDF) Print To File ... Tisk do souboru... US Common #10 Envelope (105 x 241 mm) US běžná #10 obálka (105 x 241 mm) Tabloid US Tabloid A4 (210 x 297 mm, 8.26 x 11.7 inches) A4 (210 x 297 mm, 8.26 x 11.7 palců) Executive US Executive unknown Neznámý <qt>Do you want to overwrite it?</qt> <qt>Chcete jej přepsat?</qt> Executive (7.5 x 10 inches, 191 x 254 mm) US Executive (7,5 x 10 palců, 191 x 254 mm) Letter (8.5 x 11 inches, 216 x 279 mm) US Letter (8,5 x 11 palců, 216 x 279 mm) The 'From' value cannot be greater than the 'To' value. Údaj pro první stranu nesmí být větší než údaj pro poslední stranu. US Common #10 Envelope US běžná #10 obálka %1 is a directory. Please choose a different file name. %1 je adresář. Zvolte, prosím, pro soubor jiný název. File %1 is not writable. Please choose a different file name. Soubor %1 je chráněn proti zápisu. Zvolte, prosím, pro soubor jiný název. B3 (353 x 500 mm) B3 (353 x 500 mm) A7 (74 x 105 mm) A7 (74 x 105 mm) A2 (420 x 594 mm) A2 (420 x 594 mm) B7 (88 x 125 mm) B7 (88 x 125 mm) QPrintPreviewDialog %1% %1% Print Preview Náhled tisku Close Zavřít Print Tisk Fit page Přizpůsobit stranu Zoom in Zvětšit Landscape Formát na šířku Zoom out Zmenšit Fit width Přizpůsobit šířku Portrait Formát na výšku Page Setup Nastavení strany Page setup Nastavení strany Show overview of all pages Ukázat přehled všech stran First page První strana Last page Poslední strana Show single page Ukázat jednotlivé strany Export to PDF Vyvést do PDF Previous page Předchozí strana Next page Další strana Show facing pages Ukázat strany ležící naproti Export to PostScript Vyvést do PostScriptu QPrintPropertiesWidget Form Formulář Page Strana Advanced Rozšířené QPrintSettingsOutput to do Form Formulář None Žádný Color Barva Print all Tisknout vše Selection Výběr Long side Dlouhá strana Copies Počet exemplářů Print range Tisk oblasti Color Mode Barevný režim Options Volby Output Settings Nastavení výstupu Reverse Obrácený Grayscale Odstíny šedi Short side Krátká strana Collate Srovnat Copies: Počet exemplářů: Pages from Strany od Duplex Printing Oboustranný tisk Current Page Nynější strana QPrintWidget ... ... Form Formulář Type: Typ: &Name: &Název: Output &file: Výstupní &soubor: P&roperties &Vlastnosti Preview Náhled Printer Tiskárna Location: Umístění: QProcess Error writing to process Zápis do procesu se nezdařil No program defined Nestanoven žádný program Resource error (fork failure): %1 Potíže se zdroji (selhání rozcestí - "fork failure"): %1 Error reading from process Čtení z procesu se nezdařilo Process failed to start Spuštění procesu se nezdařilo Could not open input redirection for reading Vstupní přesměrování se nepodařilo otevřít pro čtení Could not open output redirection for writing Výstupní přesměrování se nepodařilo otevřít pro zápis Process operation timed out Překročení času u procesu Process crashed Proces spadl Process failed to start: %1 Proces se nepodařilo spustit: %1 QProgressDialog Cancel Zrušit QPushButton Open Otevřít QRadioButton Check Zaškrtnout QRegExp bad lookahead syntax nesprávná syntax pro dopředný výrok (lookahead) no error occurred žádná chyba missing left delim chybějící levý oddělovač bad char class syntax nesprávná syntax pro třídu znaků disabled feature used byla použita zakázaná vlastnost lookbehinds not supported, see QTBUG-2371 zpětné výroky (lookbehind) nejsou podporovány, viz QTBUG-2371 invalid octal value neplatná osmičková hodnota invalid interval neplatný interval invalid category neplatná skupina bad repetition syntax nesprávná syntax pro opakování met internal limit dosažena vnitřní mez unexpected end neočekávaný konec QSQLite2Driver Unable to commit transaction Transakci se nepodařilo zapsat Error to open database Nepodařilo se otevřít spojení s datatabází Unable to rollback Transaction Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila) Unable to begin transaction Transakci se nepodařilo spustit Error opening database Nepodařilo se otevřít spojení s databází Unable to rollback transaction Transakci se nepodařilo zvrátit QSQLite2Result Unable to execute statement Příkaz se nepodařilo provést Unable to fetch results Výsledek se nepodařilo natáhnout QSQLiteDriver Unable to commit transaction Transakci se nepodařilo zapsat Error closing database Nepodařilo se uzavřít spojení s datatabází Error opening database Nepodařilo se otevřít spojení s databází Unable to rollback transaction Transakci se nepodařilo zvrátit Unable to begin transaction Transakci se nepodařilo spustit QSQLiteResult Unable to fetch row Řádek se nepodařilo natáhnout No query Žádný požadavek Unable to execute statement Příkaz se nepodařilo provést Unable to execute multiple statements at a time Více příkazů naráz se nepodařilo provést Unable to bind parameters Parametry se nepodařilo spojit Unable to reset statement Příkaz se nepodařilo znovu nastavit Parameter count mismatch Počet parametrů není správný QScriptBreakpointsModel ID ID Location Umístění Condition Podmínka Ignore-count Spustit po Single-shot Spustit jednou Hit-count Spuštěný QScriptBreakpointsWidget New Nový Delete Smazat QScriptDebugger Go to Line Jít na řádek Line: Řádek: Interrupt Přerušit Shift+F5 Shift+F5 Continue Pokračovat F5 F5 Step Into Krok do F11 F11 Step Over Krok přes F10 F10 Step Out Krok ven Shift+F11 Shift+F11 Run to Cursor Provést po kurzor Ctrl+F10 Ctrl+F10 Run to New Script Provést po nový skript Toggle Breakpoint Přepnout bod přerušení (zastavení) F9 F9 Clear Debug Output Smazat výstup ladění Clear Error Log Smazat výstupní zápis s chybami Clear Console Smazat konzoli &Find in Script... &Hledat ve skriptu... Ctrl+F Ctrl+F Find &Next Najít &další F3 F3 Find &Previous Najít &předchozí Shift+F3 Shift+F3 Ctrl+G Ctrl+G Debug Ladit QScriptDebuggerCodeFinderWidget Close Zavřít Previous Předchozí Next Další Case Sensitive Rozlišující velká a malá písmena Whole words Celá slova <img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped <img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Hledání dosáhlo konce QScriptDebuggerLocalsModel Name Název Value Hodnota QScriptDebuggerStackModel Level Úroveň Name Název Location Umístění QScriptEdit Toggle Breakpoint Přepnout bod zastavení Disable Breakpoint Vypnout bod zastavení Enable Breakpoint Zapnout bod zastavení Breakpoint Condition: Podmínka zastavení: QScriptEngineDebugger Loaded Scripts Nahrané skripty Breakpoints Body zastavení Stack Zásobník Locals Místní proměnné Console Konzole Debug Output Výstup ladění Error Log Výstupní zápis s chybami Search Hledat View Pohled Qt Script Debugger Qt ladění skriptů QScriptNewBreakpointWidget Close Zavřít QScrollBar Top Začátek Scroll down Projíždět dolů Scroll here Projíždět až sem Scroll left Projíždět doleva Line up O jeden řádek nahoru Line down O jeden řádek dolů Bottom Konec Page up O stranu nahoru Position Poloha Page right O stranu doprava Scroll up Projíždět nahoru Scroll right Projíždět doprava Left edge Levý okraj Page down O stranu dolů Page left O stranu doleva Right edge Pravý okraj QSharedMemory %1: doesn't exist %1: Neexistuje %1: UNIX key file doesn't exist %1: Soubor s unixovým klíčem neexistuje %1: system-imposed size restrictions %1: Bylo dosaženo systémem podmíněné meze velikosti %1: bad name %1: Špatný název %1: unix key file doesn't exists %1: Soubor s unixovým klíčem neexistuje %1: doesn't exists %1: Neexistuje %1: key is empty %1: Neplatný údaj u klíče (prázdný) %1: key error %1: Chybný klíč %1: create size is less then 0 %1: Údaj o velikosti vytvoření je menší než nula %1: already exists %1: Již existuje %1: unknown error %2 %1: Neznámá chyba %2 %1: invalid size %1: Neplatná velikost %1: unable to make key %1: Nepodařilo se vytvořit klíč %1: unable to set key on lock %1: Nepodařilo se nastavit klíč pro uzavření %1: unable to unlock %1: Uzavření se nepodařilo zrušit %1: permission denied %1: Přístup odepřen %1: ftok failed %1: Vyvolání ftok se nezdařilo %1: out of resources %1: Nejsou již použitelné zdroje %1: not attached %1: Nepřipojen %1: size query failed %1: Vyhledání velikosti se nezdařilo %1: unable to lock %1: Uzavření se nezdařilo QShortcut + + No Ne Up Nahoru Alt Alt F%1 F%1 Del Delete End End Esc Esc Ins Insert Tab Tab Yes Ano Back Zpět Call Button to start a call (note: a separate button is used to end the call) Volání Ctrl Ctrl Down Dolů Flip Obrátit Help Nápověda Home Home Left Vlevo Menu Menu Toggle Call/Hangup Button that will hang up if we're in call, or make a call if we're not. Přepnout volat/zavěsit Voice Dial Button to trigger voice dialing Hlasové vytáčení Last Number Redial Button to redial the last number called Opakované vytáčení posledního čísla Camera Shutter Button to trigger the camera shutter (take a picture) Závěrka kamery Camera Focus Button to focus the camera Zaostření kamery Kanji Kandži Muhenkan Muhenkan Henkan Henkan Romaji Rómadži Hiragana Hiragana Katakana Katakana Hiragana Katakana Hiragana Katakana Zenkaku Zenkaku Hankaku Hankaku Zenkaku Hankaku Zenkaku Hankaku Touroku Touroku Massyo Massyo Kana Lock Kana Zámek Kana Shift Kany Posun Eisu Shift Eisu Posun Eisu toggle Eisu Přepínač Code input Vstup pro kód Multiple Candidate Více návrhů Previous Candidate Předchozí návrh Hangul Hangul Hangul Start Hangul začátek Hangul End Hangul konec Hangul Hanja Hangul Hanja Hangul Jamo Hangul Jamo Hangul Romaja Hangul Romaja Hangul Jeonja Hangul Jeonja Hangul Banja Hangul Banja Hangul PreHanja Hangul PreHanja Hangul PostHanja Hangul PostHanja Hangul Special Hangul zvláštní Meta Meta PgUp PgUp Stop Stop Enter Enter Pause Pause Print Print Right Vpravo Shift Shift Space This and all following "incomprehensible" strings in QShortcut context are key names. Please use the localized names appearing on actual keyboards or whatever is commonly used. Mezerník Media Record Nahrát Print Screen Print Screen Treble Down Výšky - Scroll Lock Scroll Lock Volume Down Hlasitost - Volume Mute Ztlumit hlasitost Media Previous Předchozí Home Page Domovská stránka Volume Up Hlasitost + Launch (6) Spustit (6) Launch (7) Spustit (7) Launch (8) Spustit (8) Launch (9) Spustit (9) Launch (2) Spustit (2) Launch (3) Spustit (3) Launch (4) Spustit (4) Launch (5) Spustit (5) Launch (0) Spustit (0) Launch (1) Spustit (1) Launch (F) Spustit (F) Launch (B) Spustit (B) Launch (C) Spustit (C) Launch (D) Spustit (D) Launch (E) Spustit (E) Launch (A) Spustit (A) Delete Delete Escape Escape Hangup Button to end a call (note: a separate button is used to start the call) Zavěsit Insert Insert Bass Boost Zesílení basů PgDown PgDown Return Return Search Hledat Select Vybrat SysReq SysReq NumLock NumLock ScrollLock ScrollLock Media Pause Media player pause button Pozastavení přehrávání Toggle Media Play/Pause Media player button to toggle between playing and paused Přepnout přehrávat/pozastavit Monitor Brightness Up Zvýšit jas obrazovky Monitor Brightness Down Snížit jas obrazovky Keyboard Light On/Off Zapnout/Vypnout podsvícení klávesnice Keyboard Brightness Up Zvýšit jas klávesnice Keyboard Brightness Down Snížit jas klávesnice Power Off Vypnout Wake Up Probudit Eject Vysunout Screensaver Spořič/Šetřič obrazovky WWW Internet Sleep Režim spánku LightBulb Osvětlení Shop Obchod History Průběh Add Favorite Přidat záložku Hot Links Doporučené odkazy Adjust Brightness Upravit jas Finance Finance Community Společenství Audio Rewind Zvuk přetočit zpět Back Forward Zpět dopředu Application Left Aplikace vlevo Application Right Aplikace vpravo Book Kniha CD CD Calculator Kalkulačka Clear Smazat Clear Grab Smazat přístup Close Zavřít Copy Kopírovat Cut Vyjmout Display Zobrazit DOS DOS Documents Dokumenty Spreadsheet Tabulkový dokument Browser Prohlížeč Game Hra Go Do toho iTouch iTouch Logoff Odhlásit se Market Trh Meeting Setkání Keyboard Menu Nabídka klávesnice Menu PB Nabídka PB My Sites Moje místa News Zprávy Home Office Domácí kancelář Option Volba Paste Vložit Phone Telefon Reply Odpovědět Reload Nahrát znovu Rotate Windows Otáčet okny Rotation PB Otáčení PB Rotation KB Otáčení KB Save Uložit Send Poslat Spellchecker Ověření pravopisu Split Screen Rozdělit obrazovku Support Podpora Task Panel Panel s úkoly Terminal Terminál Tools Nástroje Travel Cestování Video Video Word Processor Zpracování textu XFer XFer Zoom In Přiblížit Zoom Out Oddálit Away Pryč Messenger Posel WebCam Internetová kamera Mail Forward Předání dál Pictures Obrázky Music Hudba Battery Baterie Bluetooth Modrozub Wireless Bezdrát Ultra Wide Band Ultra široké pásmo Audio Forward Zvuk přetočit dopředu Audio Repeat Opakovat zvuk Audio Random Play Zvuk přehrávat náhodně Subtitle Titulky Audio Cycle Track Změnit zvukovou stopu Time Čas View Pohled Top Menu Hlavní nabídka Suspend Uspat Hibernate Hibernovat Context1 Kontext1 Context2 Kontext2 Context3 Kontext3 Context4 Kontext4 Page Up Page Up Open URL Otevřít URL Caps Lock Caps Lock System Request Žádost systému CapsLock CapsLock Backtab Zpět-Tab Bass Up Basy + Refresh Obnovit Launch Mail Spustit e-mail Backspace Backspace Bass Down Basy - Standby V pohotovosti Treble Up Výšky + Num Lock Num Lock Number Lock Zahlen-Feststelltaste Favorites Oblíbené Forward Dopředu Page Down Obraz dolů Media Play Přehrávání Media Stop Zastavit přehrávání Media Next Další Launch Media Spustit přehrávač QSlider Page up O stranu nahoru Position Poloha Page right O stranu doprava Page down O stranu dolů Page left O stranu doleva QSocks5SocketEngine Network operation timed out Časový limit pro síťovou operaci byl překročen Connection to proxy closed prematurely Proxy server předčasně ukončil spojení Proxy authentication failed: %1 Autentizace u proxy serveru se nezdařila: %1 Proxy authentication failed Autentizace u proxy serveru se nezdařila General SOCKSv5 server failure Všeobecná chyba při spojení s SOCKSv5 serverem Unknown SOCKSv5 proxy error code 0x%1 Byl obdržen neznámý chybový kód od SOCKSv5 proxy serveru: 0x%1 Connection not allowed by SOCKSv5 server SOCKSv5 server odmítl spojení SOCKSv5 command not supported Tento SOCKSv5 příkaz není podporován Connection to proxy timed out Při spojení s proxy serverem byl překročen časový limit Proxy host not found Proxy server se nepodařilo najit TTL expired TTL uplynul Address type not supported Tento typ adresy není podporován Connection to proxy refused Proxy server odmítl navázání spojení SOCKS version 5 protocol error Chyba protokolu (SOCKS verze 5) QSoftKeyManager Ok OK OK OK Select Vybrat Done Hotovo Options Volby Cancel Zrušit Exit Ukončit QSpinBox Less Méně More Více QSql No Ne Yes Ano Cancel Zrušit Delete Delete Insert Vložit Update Obnovit Delete this record? Smazat tento zápis? Save edits? Uložit změny? Confirm Potvrdit Cancel your edits? Zrušit změny? QSslSocket Error creating SSL session: %1 Nepodařilo se vytvořit sezení SSL: %1 Error creating SSL session, %1 Nepodařilo se vytvořit sezení SSL, %1 Cannot provide a certificate with no key, %1 Bez klíče nelze poskytnout žádné osvědčení k volnému použití, %1 Private key does not certify public key, %1 Soukromý klíč nedosvědčuje veřejný klíč, %1 Unable to write data: %1 Data se nepodařilo zapsat: %1 Unable to decrypt data: %1 Data se nepodařilo rozluštit: %1 Error during SSL handshake: %1 Během startu SSL protokolu se vyskytla chyba: %1 Error loading local certificate, %1 Nepodařilo se nahrát místní osvědčení, %1 Invalid or empty cipher list (%1) Neplatný či prázdný seznam se šifrovacími klíči (%1) Private key does not certificate public key, %1 Vystavení osvědčení k veřejnému klíči přes soukromý klíč se nezdařilo, %1 Error creating SSL context (%1) Nepodařilo se vytvořit žádný kontext SSL (%1) Error while reading: %1 Při čtení se vyskytla chyba: %1 Error loading private key, %1 Soukromý klíč se nepodařilo nahrát, %1 No error Žádná chyba The issuer certificate could not be found Osvědčení od vydavatele se nepodařilo nalézt The certificate signature could not be decrypted Podpis osvědčení se nepodařilo rozluštit The public key in the certificate could not be read Veřejný klíč v osvědčení se nepodařilo přečíst The signature of the certificate is invalid Podpis osvědčení je neplatný The certificate is not yet valid Osvědčení ještě není platné The certificate has expired Platnost osvědčení uplynula The certificate's notBefore field contains an invalid time Pole osvědčení 'notBefore' obsahuje neplatný čas The certificate's notAfter field contains an invalid time Pole osvědčení 'notAfter' obsahuje neplatný čas The certificate is self-signed, and untrusted Osvědčení je podepsáno samo sebou, a proto není důvěryhodné The root certificate of the certificate chain is self-signed, and untrusted Kořenové osvědčení řetězce osvědčení je podepsáno samo sebou, a proto není důvěryhodné The issuer certificate of a locally looked up certificate could not be found Osvědčení od vydavatele místně nalezeného osvědčení se nepodařilo najít No certificates could be verified Žádný z osvědčení se nepodařilo ověřit One of the CA certificates is invalid Jedno z osvědčení osvědčovacího místa (CA) je neplatné The basicConstraints path length parameter has been exceeded Délka cesty 'basicConstraints'byla překročena The supplied certificate is unsuitable for this purpose Poskytnuté osvědčení nelze v tomto případě použít; není vhodné pro tento účel The root CA certificate is not trusted for this purpose Kořenové osvědčení osvědčovacího místa není pro tento případ důvěryhodné The root CA certificate is marked to reject the specified purpose Kořenové osvědčení osvědčovacího místa odmítá tento případ na základě zvláštního označení The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate Osvědčení sledovaného vydavatele bylo odmítnuto, protože jeho předmětný název neodpovídá názvu vydavatele současného osvědčení The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate Osvědčení sledovaného vydavatele bylo odmítnuto, protože název vydavatele a sériové číslo jsou přítomny a neodpovídají identifikátoru osvědčovacího místa současného osvědčení The peer did not present any certificate Protější místo neudalo žádné osvědčení The host name did not match any of the valid hosts for this certificate Název hostitelského počítače neodpovídá žádnému z hostitelů platných pro toto osvědčení, kteří jsou na seznamu The peer certificate is blacklisted Osvědčení protějšího místa je na černé listině Unknown error Neznámá chyba QStateMachine Missing initial state in compound state '%1' Chybí počáteční stav složeného stavu '%1' Missing default state in history state '%1' Chybí výchozí stav ve vývoji stavu '%1' No common ancestor for targets and source of transition from state '%1' Cíl a zdroj přechodu ze stavu '%1' nemají žádný společný původ Unknown error Neznámá chyba QSymSQLDriver Invalid option: Neplatná volba: Error opening database Nepodařilo se otevřít spojení s databází POLICY_DB_DEFAULT must be defined before any other POLICY definitions can be used POLICY_DB_DEFAULT musí být stanoveno předtím, než mohou být použity jiné definice POLICY Unable to begin transaction Transakci se nepodařilo spustit Unable to commit transaction Transakci se nepodařilo zapsat Unable to rollback transaction Transakci se nepodařilo zvrátit QSymSQLResult Error retrieving column count Chyba při získávání počtu sloupců Error retrieving column name Chyba při získávání názvu sloupce Error retrieving column type Chyba při získávání typu sloupce Unable to fetch row Řádek se nepodařilo natáhnout Unable to execute statement Příkaz se nepodařilo provést Statement is not prepared Příkaz není připraven Unable to reset statement Příkaz se nepodařilo znovu nastavit Unable to bind parameters Parametry se nepodařilo spojit Parameter count mismatch Počet parametrů není správný QSymbianSocketEngine Unable to initialize non-blocking socket Neblokující socket se nepodařilo spustit Unable to initialize broadcast socket Socket pro vysílání se nepodařilo spustit Attempt to use IPv6 socket on a platform with no IPv6 support Vyzkoušelo se použít IPv6 socket na systému bez podpory IPv6 The remote host closed the connection Vzdálený počítač uzavřel spojení Network operation timed out Časový limit pro síťovou operaci byl překročen Out of resources Nejsou dostupné žádné zdroje Unsupported socket operation Nepodporovaná socket operace Protocol type not supported Protokol tohoto typu není podporován Invalid socket descriptor Neplatný deskriptor socketu Host unreachable Cílový počítač je nedosažitelný Network unreachable Síť není dosažitelná Permission denied Přístup odepřen Connection timed out Časový limit pro spojení byl překročen Connection refused Spojení bylo odmítnuto The bound address is already in use Uvedená adresa se už používá The address is not available Adresa není dostupná The address is protected Adresa je chráněna Datagram was too large to send Datagram byl pro odeslání příliš veliký Unable to send a message Nepodařilo se odeslat zprávu Unable to receive a message Zprávu se nepodařilo přijmout Unable to write Nepodařilo se zapsat Network error Síťová chyba Another socket is already listening on the same port Na tomto portu již naslouchá jiný socket Operation on non-socket Operaci mimo socket The proxy type is invalid for this operation Tuto operaci nelze s tímto typem proxy provést The address is invalid for this operation Adresa pro tuto operaci není platná The specified network session is not opened Zadané síťové sezení není otevřeno Unknown error Neznámá chyba QSystemSemaphore %1: does not exist %1: Neexistuje %1: already exists %1: Již existuje %1: name error %1: Chybný název %1: unknown error %2 %1: Neznámá chyba %2 %1: permission denied %1: Přístup odepřen %1: out of resources %1: Nejsou již použitelné zdroje QTDSDriver Unable to open connection Nepodařilo se otevřít spojení s databází Unable to use database Databázi se nepodařilo použít QTabBar Scroll Left Projíždět doleva Scroll Right Projíždět doprava Close Zavřít Activate Spustit Press Stisknout Close the tab Zavřít kartu Activate the tab Zapnout kartu QTcpServer Operation on socket is not supported Tato socket operace není podporována QTextControl Cu&t Vyj&mout &Copy &Kopírovat &Redo &Znovu &Undo &Zpět &Paste &Vložit Delete Smazat Select All Vybrat vše Copy &Link Location &Kopírovat adresu odkazu QToolButton Open Otevřít Press Stisknout QUdpSocket This platform does not support IPv6 Tato platforma nepodporuje IPv6 QUndoGroup Redo Znovu Undo Zpět Undo %1 Zpět %1 Undo Default text for undo action Zpět Redo %1 Znovu %1 Redo Default text for redo action Znovu QUndoModel <empty> <prázdný> QUndoStack Redo Znovu Undo Zpět Undo %1 Zpět %1 Undo Default text for undo action Zpět Redo %1 Znovu %1 Redo Default text for redo action Znovu QUnicodeControlCharacterMenu RLE Start of right-to-left embedding RLE Začátek vložení zprava doleva ZWSP Zero width space ZWSP Nulová mezera Insert Unicode control character Vložit kontrolní znak Unicode LRO Start of left-to-right override LRO Začátek přepsání zleva doprava LRE Start of left-to-right embedding LRE Začátek vložení zleva doprava RLM Right-to-left mark RLM Značka zprava doleva PDF Pop directional formatting PDF Konec vložení/přepsání směru ZWNJ Zero width non-joiner ZWNJ Nulová mezera nespojovací RLO Start of right-to-left override RLO Začátek přepsání zprava doleva ZWJ Zero width joiner ZWJ Nulová mezera spojovací LRM Left-to-right mark LRM Značka zleva doprava QWebFrame Request blocked Požadavek byl odmítnut Request cancelled Požadavek byl zrušen Request canceled Požadavek byl zrušen Cannot show URL Adresu (URL) nelze ukázat Frame load interrupted by policy change Nahrání rámce bylo přerušeno změnou směrnice Loading is handled by the media engine O nahrávání se stará multimediální stroj Frame load interruped by policy change Nahrání rámce bylo přerušeno změnou směrnice File does not exist Soubor neexistuje Cannot show mimetype Tento mime typ nelze ukázat QWebPage Cut Vyjmout LTR Zleva doprava RTL Zprava doleva Top Začátek Bold Tučné Copy Kopírovat Stop Ukončit Open Frame Otevřít rámec Open Image Vyobrazení otevřít v novém okně Fonts Písma Paste Vložit Reset Vrátit Inspect Provést prohlídku Select to the start of the block Vybrat až po začátek bloku Move the cursor to the end of the block Ukazatel polohy posunout až na konec bloku JavaScript Alert - %1 Upozornění od JavaScriptu - %1 JavaScript Confirm - %1 Potvrzení od JavaScriptu - %1 JavaScript Prompt - %1 Výzva od JavaScriptu - %1 JavaScript Problem - %1 Potíže s JavaScriptem - %1 The script on this page appears to have a problem. Do you want to stop the script? Vypadá to na to, že skript na této straně má potíže. Chcete tento skript zastavit? Select all Vybrat vše Select to the start of the line Vybrat až po začátek řádku Insert a new paragraph Vložit nový odstavec Insert a new line Vložit nový řádek Paste and Match Style Vložit a odpovídat stylu Remove formatting Odstranit formátování Strikethrough Přeškrtnuto Subscript Dolní index Superscript Horní index Insert Bulleted List Vložit seznam s odrážkami Insert Numbered List Vložit číslovaný seznam Indent Odsadit Outdent Zrušit odsazení Center Na střed Justify Do bloku Align Left Zarovnat vlevo Align Right Zarovnat vpravo Look Up In Dictionary Podívat se do slovníku Search The Web Hledat na síti Check Spelling While Typing Kontrolovat pravopis během psaní Add To Dictionary Přidat do slovníku Delete to the start of the word Smazat až po začátek slova Recent searches Dosavadní hledané výrazy Move the cursor to the next word Ukazatel polohy posunout k následujícímu slovu Move the cursor to the next line Ukazatel polohy posunout k následujícímu řádku Scroll down Projíždět dolů Scroll here Projíždět až sem Scroll left Projíždět doleva Move the cursor to the start of the block Ukazatel polohy posunout na začátek bloku Text Direction Směr psaní Bottom Konec Ignore Nevšímat si Italic Kurzívní Move the cursor to the end of the line Ukazatel polohy posunout na konec řádku Move the cursor to the start of the line Ukazatel polohy posunout na začátek řádku Reload Nahrát znovu Submit Poslat Web Inspector - %2 Web Inspektor - %2 Page up O stranu nahoru Spelling Pravopis Outline Obrys Check Grammar With Spelling Kontrolovat mluvnici společně s pravopisem No file selected Nebyl vybrán žádný soubor Submit default label for Submit buttons in forms on web pages Poslat Reset default label for Reset buttons in forms on web pages Vrátit This is a searchable index. Enter search keywords: text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' Tento rejstřík má funkci hledání. Zadejte nějaký hledaný výraz: Choose File title for file button used in HTML forms Vybrat soubor No file selected text to display in file button used in HTML forms when no file is selected Nebyl vybrán žádný soubor Details text to display in <details> tag when it has no <summary> child Podrobnosti Open in New Window Open in New Window context menu item Otevřít v novém okně Save Link... Download Linked File context menu item Uložit odkaz... Copy Link Copy Link context menu item Kopírovat adresu odkazu Open Image Open Image in New Window context menu item Obrázek otevřít v novém okně Save Image Download Image context menu item Uložit obrázek Copy Image Copy Link context menu item Kopírovat obrázek Copy Image Address Copy Image Address menu item Kopírovat adresu obrázku Open Video Open Video in New Window Otevřít video Open Audio Open Audio in New Window Otevřít zvuk Copy Video Copy Video Link Location Kopírovat video Copy Audio Copy Audio Link Location Kopírovat umístění odkazu na zvuk Toggle Controls Toggle Media Controls Přepnout ovládání Toggle Loop Toggle Media Loop Playback Přepnout smyčku Enter Fullscreen Switch Video to Fullscreen Vejít do režimu na celou obrazovku Play Play Přehrát Pause Pause Pozastavit Mute Mute Ztlumit Open Frame Open Frame in New Window context menu item Otevřít rámec Copy Copy context menu item Kopírovat Go Back Back context menu item Jít zpět Go Forward Forward context menu item Jít dopředu Stop Stop context menu item Zastavit Reload Reload context menu item Nahrát znovu Cut Cut context menu item Vyjmout Paste Paste context menu item Vložit Select All Select All context menu item Vybrat vše No Guesses Found No Guesses Found context menu item Nebyly nalezeny žádné návrhy Ignore Ignore Spelling context menu item Přehlížet Add To Dictionary Learn Spelling context menu item Přidat do slovníku Search The Web Search The Web context menu item Hledat na síti Look Up In Dictionary Look Up in Dictionary context menu item Podívat se do slovníku Open Link Open Link context menu item Otevřít adresu odkazu Ignore Ignore Grammar context menu item Přehlížet Spelling Spelling and Grammar context sub-menu item Pravopis Show Spelling and Grammar menu item title Ukázat pravopis a mluvnici Hide Spelling and Grammar menu item title Skrýt pravopis a mluvnici Check Spelling Check spelling context menu item Ověření pravopisu Check Spelling While Typing Check spelling while typing context menu item Ověřovat pravopis během psaní Check Grammar With Spelling Check grammar with spelling context menu item Ověřovat mluvnici společně s pravopisem Fonts Font context sub-menu item Písma Bold Bold context menu item Tučné Italic Italic context menu item Kurzíva Underline Underline context menu item Podtržení Outline Outline context menu item Obrys Direction Writing direction context sub-menu item Směr Text Direction Text direction context sub-menu item Směr psaní Default Default writing direction context menu item Výchozí Left to Right Left to Right context menu item Zleva doprava Right to Left Right to Left context menu item Zprava doleva Missing Plug-in Label text to be used when a plug-in is missing Chybějící přídavný modul Loading... Media controller status message when the media is loading Nahrává se... Live Broadcast Media controller status message when watching a live broadcast Živý přenos Audio Element Media controller element Zvukový prvek Video Element Media controller element Videoprvek Mute Button Media controller element Tlačítko pro ztlumení Unmute Button Media controller element Tlačítko pro zrušení ztlumení Play Button Media controller element Tlačítko pro přehrávání Pause Button Media controller element Tlačítko pro pozastavení Slider Media controller element Posuvník Slider Thumb Media controller element Palec posuvníku Rewind Button Media controller element Tlačítko pro přetočení Return to Real-time Button Media controller element Tlačítko pro návrat ke skutečnému času Elapsed Time Media controller element Uplynulý čas Remaining Time Media controller element Zbývající čas Status Display Media controller element Údaj o stavu Fullscreen Button Media controller element Tlačítko pro zobrazení na celou obrazovku Seek Forward Button Media controller element Tlačítko pro hledání dopředu Seek Back Button Media controller element Tlačítko pro hledání dozadu Audio element playback controls and status display Media controller element Řízení přehrávání zvuku a zobrazení stavu Video element playback controls and status display Media controller element Řízení přehrávání videa a zobrazení stavu Mute audio tracks Media controller element Ztlumit zvukové stopy Unmute audio tracks Media controller element Zrušit ztlumení zvukových stop Begin playback Media controller element Začít přehrávání Pause playback Media controller element Pozastavit přehrávání Movie time scrubber Media controller element Čas přehrávání Movie time scrubber thumb Media controller element Palec pro nastavení času přehrávání Rewind movie Media controller element Přetočit film zpět Return streaming movie to real-time Media controller element Vrátit film na skutečný čas Current movie time Media controller element Čas přehrávání filmu Remaining movie time Media controller element Zbývající čas z přehrávání filmu Current movie status Media controller element Stav filmu Play movie in full-screen mode Media controller element Přehrávat film v režimu zobrazení na celou obrazovku Seek quickly back Media controller element Rychlé zpětné hledání Seek quickly forward Media controller element Rychlé dopředné hledání Indefinite time Media time description Neomezený čas %1 days %2 hours %3 minutes %4 seconds Media time description %1 dny %2 hodiny %3 minuty %4 sekundy %1 hours %2 minutes %3 seconds Media time description %1 hodiny %2 minuty %3 sekundy %1 minutes %2 seconds Media time description %1 minuty %2 sekundy %1 seconds Media time description %1 sekundy LTR Left to Right context menu item Zleva doprava RTL Right to Left context menu item Zprava doleva Inspect Inspect Element context menu item Provést prohlídku No recent searches Label for only item in menu that appears when clicking on the search field image, when no searches have been performed Neexistují žádné naposledy hledané výrazy Recent searches label for first item in the menu that appears when clicking on the search field image, used as embedded menu title Dosavadní hledané výrazy Clear recent searches menu item in Recent Searches menu that empties menu's contents Smazat naposledy hledané výrazy Unknown Unknown filesize FTP directory listing item Neznámý %1 (%2x%3 pixels) Title string for images %1 (%2x%3 pixelů) Save Image Uložit vyobrazení Save Link... Uložit odkaz... No recent searches Neexistují žádné naposledy hledané výrazy Page right O stranu doprava Move the cursor to the start of the document Ukazatel polohy posunout na začátek dokumentu Move the cursor to the next character Ukazatel polohy posunout k následujícímu znaku Copy Link Kopírovat adresu odkazu Select to the previous line Vybrat až po předchozí řádek Select to the previous word Vybrat až po předchozí slovo Check Spelling Kontrola pravopisu Select to the next character Vybrat až po následující znak Show Spelling and Grammar Ukázat pravopis a mluvnici Delete to the end of the word Smazat až po konec slova Direction Směr Select to the end of the line Vybrat až po začátek řádku Submit Submit (input element) alt text for <input> elements with no alt, title, or value Poslat Choose File Vybrat soubor Scroll up Projíždět nahoru Clear recent searches Smazat naposledy hledané výrazy Select to the start of the document Vybrat až po začátek dokumentu Default Výchozí Underline Podtrhnout Move the cursor to the previous character Ukazatel polohy posunout k předchozímu znaku Copy Image Kopírovat vyobrazení Select to the end of the document Vybrat až po konec dokumentu Select to the end of the block Vybrat až po konec bloku Scroll right Projíždět doprava No Guesses Found Nebyly nalezeny žádné návrhy Open Link Otevřít adresu odkazu Redirection limit reached Dosaženo krajní meze pro přesměrování Bad HTTP request Neplatný požadavek HTTP Unknown Neznámý Move the cursor to the previous word Ukazatel polohy posunout k předchozímu slovu Move the cursor to the previous line Ukazatel polohy posunout na předchozí řádku %n file(s) %n soubor(ů) Left edge Levý okraj Go Forward Jít dopředu Page down O stranu dolů Page left O stranu doleva This is a searchable index. Enter search keywords: Tento index má funkci hledání. Zadejte nějaký hledaný výraz: Select to the previous character Vybrat až po předchozí znak Go Back Jít zpět Open in New Window Otevřít v novém okně Right edge Pravý okraj Move the cursor to the end of the document Ukazatel polohy posunout na konec dokumentu Hide Spelling and Grammar Skrýt pravopis a mluvnici %1 (%2x%3 pixels) %1 (%2x%3 pixelů) Select to the next word Vybrat až po následující slovo Select to the next line Vybrat až po následující řádek %n file(s) number of chosen file jeden soubor %n soubory %n souborů QWhatsThisAction What's This? Co je toto? QWidget * * QWizard Done Hotovo Help Nápověda &Help &Nápověda &Next &Další Cancel Zrušit Commit Použít Continue Pokračovat &Finish Do&končit &Next > &Další > Go Back Jít zpět < &Back < &Zpět QWorkspace &Move Po&sunout &Size Změnit &velikost Close Zavřít Minimize Zmenšit Stay on &Top Zůstat v &popředí &Close &Zavřít %1 - [%2] %1 - [%2] Sh&ade &Navinout &Restore &Obnovit &Unshade &Odvinout Mi&nimize &Zmenšit Ma&ximize Zvě&tšit Restore Down Obnovit QXml unparsed entity reference in wrong context používán nevyhodnocený odkaz na entitu v nesprávné souvislosti external parsed general entity reference not allowed in DTD v DTD nejsou dovoleny žádné odkazy na vnější obecnou entitu wrong value for standalone declaration nesprávná hodnota vlastnosti standalone encoding declaration or standalone declaration expected while reading the XML declaration chybějící deklarace kódování nebo deklarace samostatnosti při čtení deklarace XML no error occurred žádná chyba error occurred while parsing reference při vyhodnocení odkazu se vyskytla chyba standalone declaration expected while reading the XML declaration chybějící deklarace samostatnosti při čtení deklarace XML invalid name for processing instruction neplatný název pro pokyn pro zpracování error triggered by consumer chyba spuštěná spotřebitelem error occurred while parsing element při vyhodnocení prvku se vyskytla chyba unexpected character neočekávaný znak tag mismatch Značky prvků nejsou vkládány správně error occurred while parsing content při vyhodnocení obsahu se vyskytla chyba error occurred while parsing comment při vyhodnocení poznámky se vyskytla chyba internal general entity reference not allowed in DTD v DTD nejsou dovoleny žádné odkazy na vnitřní obecnou entitu recursive entities rekurzivní entity more than one document type definition více definicí typu dokumentu version expected while reading the XML declaration chybějící verze při čtení deklarace XML letter is expected na tomto místě je potřeba písmeno unexpected end of file neočekávaný konec souboru external parsed general entity reference not allowed in attribute value v hodnotě vlastnosti nejsou dovoleny žádné odkazy na vnější obecnou entitu error in the text declaration of an external entity Chyba v deklaraci textu vnější entity error occurred while parsing document type definition při vyhodnocení definice typu dokumentu se vyskytla chyba QXmlPatternistCLI Warning in %1, at line %2, column %3: %4 Varování v %1, na řádku %2, sloupec %3: %4 Warning in %1: %2 Varování v %1: %2 Unknown location Neznámé umístění Error %1 in %2, at line %3, column %4: %5 Chyba %1 v %2, na řádku %3, sloupec %4: %5 Error %1 in %2: %3 Chyba %1 v %2: %3 QXmlStream Reference to unparsed entity '%1'. Odkaz na nevyhodnocenou entitu '%1'. Unexpected character '%1' in public id literal. '%1' není platným znakem v údaji veřejného id, který je tvořen písmeny. Illegal namespace declaration. Neplatná deklarace jmenného prostoru. Invalid XML character. Neplatný znak XML. Expected character data. Byly očekávány údaje o znacích. Standalone accepts only yes or no. Hodnota pro vlastnost standalone může být pouze "ano" nebo "ne". Invalid XML version string. Neplatný údaj o verzi XML. Invalid processing instruction name. Název pokynu pro zpracování je neplatný. Namespace prefix '%1' not declared Předpona jmenného prostoru '%1' nebyla prohlášena Entity '%1' not declared. Entita '%1' není prohlášena. %1 is an invalid processing instruction name. %1 není platným názvem pokynu pro zpracování. The standalone pseudo attribute must appear after the encoding. Pseudovlastnost standalone musí následovat bezprostředně po kódování. Sequence ']]>' not allowed in content. Sled znaků ']]>' není v obsahu povolen. %1 is an invalid encoding name. %1 není platným názvem pro kódování. , but got ' očekáváno, namísto toho obdrženo ' Start tag expected. Očekáván otevírající prvek. Invalid character reference. Odkaz na neplatný znak. Reference to external entity '%1' in attribute value. V hodnotě vlastnosti byla odkazována entita '%1'. Expected Bylo Invalid document. Neplatný dokument. Opening and ending tag mismatch. Počet otevírajících prvků neodpovídá počtu zavírajících prvků. Encountered incorrectly encoded content. Byl nalezen obsah s neplatným kódováním. Invalid attribute in XML declaration. Deklarace XML obsahuje neplatnou vlastnost. Attribute redefined. Vlastnost byla nově vymezena. %1 is an invalid PUBLIC identifier. %1 není platným údajem VEŘEJNÉHO identifikátoru (id). Extra content at end of document. Přebytečný obsah za koncem dokumentu. Invalid XML name. Neplatný název XML. Premature end of document. Předčasný konec dokumentu. XML declaration not at start of document. Deklarace XML se nenachází na začátku dokumentu. Recursive entity detected. Byla zjištěna rekurzivní entita. Unsupported XML version. Tato verze XML není podporována. Unexpected ' Na tomto místě neplatný ' Invalid entity value. Neplatná hodnota entity. Encoding %1 is unsupported Kódování %1 není podporováno NDATA in parameter entity declaration. Deklarace parametrické entity nesmí obsahovat NDATA. QmlJSDebugger::LiveSelectionTool Items Položky QmlJSDebugger::QmlToolBar Inspector Mode Režim inspektora Play/Pause Animations Přehrát/Pozastavit animace Select Vybrat Select (Marquee) Vybrat (Marquee) Zoom Přiblížit/Oddálit Color Picker Volič barvy Apply Changes to QML Viewer Použít změny na prohlížeč QML Apply Changes to Document Použít změny na dokument Tools Nástroje 1x 1x 0.5x 0.5x 0.25x 0.25x 0.125x 0.125x 0.1x 0.1x QmlJSDebugger::ToolBarColorBox Copy Color Kopírovat barvu QmlJSDebugger::ZoomTool Zoom to &100% Zvětšit na &100% Zoom In Přiblížit Zoom Out Oddálit QtXmlPatterns A comment cannot contain %1 Poznámka nesmí obsahovat %1 Version %1 is not supported. The supported XQuery version is 1.0. Verze %1 není podporována. Podporovanou verzí XQuery je 1.0. The root node of the second argument to function %1 must be a document node. %2 is not a document node. Nadřízený uzel druhého agumentu funkce %1 musí být uzlem dokumentu, což není případ %2. The parameter %1 is required, but no corresponding %2 is supplied. Pro vyžadovaný parametr %1 nebyl zadán odpovídající %2. Namespace declarations must occur before function, variable, and option declarations. Deklarace jmenných prostorů musí stát před prohlášeními funkcí, proměnných nebo prohlášeními voleb. empty prázdný The namespace URI cannot be the empty string when binding to a prefix, %1. Jmenný prostor-URI nesmí být prázdný, když je spojen s prefixem %1. A comment cannot end with a %1. Poznámka nesmí končit na %1. Top level stylesheet elements must be in a non-null namespace, which %1 isn't. Úplně nahoře stojící prvky prováděcího listu se nesmí nacházet v nulovém jmenném prostoru, což je případ %1. Integer division (%1) by zero (%2) is undefined. Celočíselné dělení (%1) nulou (%2) není stanoveno. A library module cannot be evaluated directly. It must be imported from a main module. Knihovní modul nemůže být posouzen přímo, musí být zaveden z hlavního modulu. Time %1:%2:%3.%4 is invalid. Časový údaj %1:%2:%3.%4 je neplatný. Attribute %1 cannot appear on the element %2. Only the standard attributes can appear. Prvek %2 může mít pouze obvyklé vlastnosti, ne však %1. A value of type %1 must contain an even number of digits. The value %2 does not. Počet míst hodnoty typu %1 musí být stejný. To není případ %2. Modulus division (%1) by zero (%2) is undefined. Dělení absolutní hodnoty (%1) nulou(%2) není stanoveno. No function with signature %1 is available Neexistuje žádná funkce s podpisem %1 None of the pragma expressions are supported. Therefore, a fallback expression must be present Musí být přítomen záložní výraz, neboť nejsou podporovány žádné věcné výrazy In the replacement string, %1 can only be used to escape itself or %2, not %3 V nahrazení může být použit pouze %1, aby se chránil sám, nebo %2, ne však pro %3 The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character. Kódovací bod %1 z %2 s kódováním %3 není platným znakem XML. Network timeout. Časový limit síťové operace byl překročen. No casting is possible with %1 as the target type. Nelze provádět žádné výběrové ("cast") operace s typem %1. The Schema Import feature is not supported, and therefore %1 declarations cannot occur. Deklarace %1 je nepřípustná, protože není podporováno zavedení schémat. Attribute %1 and %2 are mutually exclusive. Vlastnosti %1 a %2 se vzájemně vylučující. Parse error: %1 Chyba vyhodnocení: %1 If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. Nelze zadat žádnou předponu, jestliže je první argument prázdný nebo je prázdný řetězec znaků (žádný jmenný prostor). Byla zadána předpona %1. In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching. V XSL-T vyhledávacím vzoru musí být první argument k funkci %1 při použití k hledání odkaz tvořený písmeny nebo proměnný. At least one component must be present. Alespoň jedna součást musí být přítomna. In a namespace constructor, the value for a namespace value cannot be an empty string. Ve staviteli jmenného prostoru nesmí mýt hodnota jmenného prostoru prázdným řetězcem. An attribute by name %1 has already been created. Již byla vytvořena jedna vlastnost s názvem %1. An argument by name %1 has already been declared. Every argument name must be unique. Již existuje jeden argument s názvem %1. Názvy argumentů musí být jednoznačné. %1 is an invalid flag for regular expressions. Valid flags are: %1 není pro regulérní výrazy platným příznakem. Platnými příznaky jsou: At least one %1-element must occur inside %2. V %2 se musí vyskytovat alespoň jeden %1-prvek. Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported. Je podporován pouze Unicode Codepoint Collation (%1). %2 není podporován. Matches are case insensitive Na psaní velkých/malých písmen není brán zřetel The name of an extension expression must be in a namespace. Název výrazu rozšíření se musí nacházet ve jmenném prostoru. Each name of a template parameter must be unique; %1 is duplicated. Názvy parametrů předloh musí být jednoznačné, %1 již existuje. At least one mode must be specified in the %1-attribute on element %2. Ve %1-vlastnosti prvku %2 musí být zadán alespoň jeden způsob. %1 matches newline characters Výraz '%1' odpovídá znakům pro nový řádek Year %1 is invalid because it begins with %2. %1 není platným údajem pro rok, protože začíná %2. The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. Druhý argument %1 nemůže být typ %2. Musí to být typ %3, %4 nebo %5. Element %1 cannot have children. Prvek %1 nemůže mít podprvky. Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes. Prvek %2 může mít jen vlastnost %3 nebo vlastnosti, které jsou obvyklé, ne však %1. Only one %1-element can appear. Může být jen jeden jediný %1-prvek. The name for a computed attribute cannot have the namespace URI %1 with the local name %2. Název počítané vlastnosti nesmí mít jmenný prostor-URI %1 s místním názvem %2. A positional predicate must evaluate to a single numeric value. Poziční predikát se musí vyhodnotit jako jednoduchá, číselná hodnota. Element %1 can't be serialized because it appears outside the document element. Prvek %1 nemůže být vydáván na pokračování, protože se objevuje mimo prvky dokumentu. %1 and %2 match the start and end of a line. Výrazy %1 a %2 vždy odpovídají začátku nebo konci libovolného řádku. Running an XSL-T 1.0 stylesheet with a 2.0 processor. Je zpracováván jeden XSL-T 1.0 stylový list jedním procesorem verze 2.0. A stylesheet function must have a prefixed name. Název funkce stylového listu musí mít předponu. %1 cannot be retrieved %1 nelze určit It's not possible to cast the value %1 of type %2 to %3 Nelze provést operaci předvedení hodnoty %1 typu %2 k %3 The value of the XSL-T version attribute must be a value of type %1, which %2 isn't. Hodnota XSL-T vlastnosti verze musí být hodnotou typu %1, což není případ %2. In a namespace constructor, the value for a namespace cannot be an empty string. Ve staviteli jmenného prostoru nesmí mýt hodnota jmenného prostoru prázdným řetězcem. The prefix %1 cannot be bound. Předponu %1 nelze spojit. The prefix must be a valid %1, which %2 is not. Předpona musí být platný %1, což není případ %2. The keyword %1 cannot occur with any other mode name. Klíčové slovo %1 se nemůže používat dohromady s jiným názvem způsobu. Type error in cast, expected %1, received %2. Chyba typu při přetypování, bylo očekáváno %1, ale přijato %2. %1 is not a valid numeric literal. %1 není platný číselný údaj tvořený písmeny. %1 takes at most %n argument(s). %2 is therefore invalid. %1 má jen %n argument; údaj %2 z tohoto důvodu neplatný. %1 má jen %n argumenty; údaj %2 z tohoto důvodu neplatný. %1 má jen %n argumenty; údaj %2 z tohoto důvodu neplatný. Circularity detected byla zjištěna cirkulární závislost A variable by name %1 has already been declared. Proměnná s názvem %1 již byla prohlášena. The prefix %1 can not be bound. By default, it is already bound to the namespace %2. Předpona %1 nemůže být spojena. Ve výchozím nastavení je již spojena se jmenným prostorem %2. An %1-attribute must have a valid %2 as value, which %3 isn't. Vlastnost s názvem %1 musí mít platnou %2-hodnotu. %3 není platnou hodnotou. If element %1 has no attribute %2, it cannot have attribute %3 or %4. Prvek %1 nesmí mít vlastnost %3 nebo %4, pokud nemá vlastnost %2. A function already exists with the signature %1. Již existuje funkce s podpisem %1. When casting to %1 from %2, the source value cannot be %3. Při přetypování z %1 na %2 nesmí být zdrojová hodnota %3. Attribute %1 can't be serialized because it appears at the top level. Vlastnost %1 nemůže být vydáván na pokračování, protože se objevuje na nejvyšší rovině. No comparisons can be done involving the type %1. S typem %1 nemohou být prováděny žádné srovnávací operace. No value is available for the external variable by name %1. Pro vnější proměnnou s názvem %1 není dostupná žádná hodnota. The value of attribute %1 must of type %2, which %3 isn't. Hodnota vlastnosti %1 musí být typu %2. %3 není platnou hodnotou. The item %1 did not match the required type %2. Prvek %1 neodpovídá požadovanému typu %2. Element %1 cannot have a sequence constructor. Prvek %1 nemůže mít stavitele posloupnosti. When attribute %1 is present on %2, a sequence constructor cannot be used. Nelze používat žádného stavitele posloupnosti, když %2 má vlastnost %1. one or more jeden nebo více The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. Kódování %1 je neplatné; smí sestávat pouze z latinských písmen a musí odpovídat pravidelnéu výrazu %2. %1 requires at least %n argument(s). %2 is therefore invalid. %1 vyžaduje alespoň %n argument; údaj %2 je z toho důvodu neplatný. %1 vyžaduje alespoň %n argumenty; údaj %2 je z toho důvodu neplatný. %1 vyžaduje alespoň %n argumenty; údaj %2 je z toho důvodu neplatný. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid. %2 není platným cílovým názvem pokynu pro zpracování, protože tento nesmí být %1 (nehledě na psaní velkých/malých písmen). The focus is undefined. Není stanoveno ohnisko. %1 is an unknown schema type. %1 je neznámým typem schematu. The value for attribute %1 on element %2 must either be %3 or %4, not %5. Hodnota vlastnosti %1 prvku %2 může být jen %3 nebo %4, ne však %5. In the replacement string, %1 must be followed by at least one digit when not escaped. V nahrazovacím řetězci musí po %1 následovat alespoň jedna číslice, když není chráněn znakem Escape. In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can. V XSL-T vyhledávacím vzoru se smějí používat jen osy %2 nebo %3, ne však %1. The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) Jmenný prostor uživatelem stanovené funkce nesmí být prázdný (pro tento účel je předstanovená předpona %1) The first operand in an integer division, %1, cannot be infinity (%2). První veličina, operand, celočíselného dělení %1 nesmí být nekonečno (%2). %1 is not a valid value of type %2. %1 není platnou hodnotou typu %2. Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. Násobení hodnoty typu %1 s %2 nebo %3 (kladné nebo záporné nekonečno) není přípustné. The variable %1 is unused Proměnná %1 se nepoužívá The %1-axis is unsupported in XQuery Osa %1 není v XQuery podporována No function with name %1 is available. Neexistuje žádná funkce s názvem %1. An attribute with name %1 has already appeared on this element. Prvek má již vlastnost s názvem %1. A direct element constructor is not well-formed. %1 is ended with %2. Byl nalezen chybný stavitel přímého prvku. %1 končí %2. Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. Dělení hodnoty typu %1 prostřednictvím %2 nebo %3 (kladná nebo záporná nula) není přípustné. Attribute %1 cannot have the value %2. Vlastnost %1 nesmí mít hodnotu %2. It will not be possible to retrieve %1. %1 nelze určit. In an XSL-T pattern, function %1 cannot have a third argument. V XSL-T vyhledávacím vzoru nesmí mít funkce %1 třetí argument. The namespace URI in the name for a computed attribute cannot be %1. URI jmenného prostoru v názvu vypočítané vlastnosti nesmí být %1. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid. Cílový název příkazu pro zpracování nemůže být %1 (nezávisle na psaní velkých/malých písmen). %2 je z toho důvodu neplatný. %1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. %1 není platným cílovým názvem pokynu pro zpracování. Musí to být hodnota %2 jakou je například %3. %1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. %1 je složeným typem. Přetypování u složených typů není možné. Může se ovšem provádět přetypování do atomických typů jako %2. zero or one žádný nebo jeden No operand in an integer division, %1, can be %2. U celočíselného dělení %1 nesmí být veličina, operand, %2. The element with local name %1 does not exist in XSL-T. V XSL-T neexistuje žádný prvek s místním názvem %1. Two namespace declaration attributes have the same name: %1. Byly nalezeny dvě vlastnosti deklarace jmenného prostoru se stejným názvem (%1). Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values. Skutečná booleanská hodnota nemůže být vypočítána pro posloupnost ze dvou nebo více atomických hodnot. %1 is an invalid %2 %1 je neplatný %2 The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. První argument k %1 nesmí být typu %2; musí to být číselný typ, xs:yearMonthDuration nebo xs:dayTimeDuration. Division (%1) by zero (%2) is undefined. Dělení (%1) nulou (%2) není stanoveno. No template by name %1 exists. Neexistuje žádná předloha s názvem %1. The attribute %1 must appear on element %2. Prvek %2 musí mít vlastnost %1. An attribute by name %1 has already appeared on this element. Prvek má již vlastnost s názvem %1. The default collection is undefined Pro sbírku není stanovena žádná předloha Only the prefix %1 can be bound to %2 and vice versa. S %2 může být spojena pouze předpona %1 (a obráceně). Value %1 of type %2 exceeds maximum (%3). Hodnota %1 typu %2 překračuje maximum (%3). Whitespace characters are removed, except when they appear in character classes Prázdné znaky jsou odstraněny v případě, že se neobjeví ve znakových třídách Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated. Nemohou se provádět žádné operace předvedení k typu %1, protože je to abstraktní typ ist a nelze je doložit příkladem. Operator %1 cannot be used on type %2. Operátor %1 nelze použít na typ %2. The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. Jmenný prostor %1 je vyhrazen a z toho důvodu jej nemohou používat uživatelem stanovené funkce (pro tento účel je tu předstanovená předpona %2). The target namespace of a %1 cannot be empty. Cílový jmenný prostor %1 nesmí být prázdný. %1 must be followed by %2 or %3, not at the end of the replacement string. Po %1 musí následovat %2 nebo %3; nesmí se objevit na konci nahrazovacího řetězce. %1 is an invalid namespace URI. %1 není platným jmenným prostorem-URI. The attribute %1 cannot appear on %2, when it is a child of %3. %2 nesmí mít vlastnost %1 v případě, že je potomkem %3. The attribute %1 can only appear on the first %2 element. Pouze první %2-prvek smí mít vlastnost %1. Element %1 must have either a %2-attribute or a sequence constructor. Prvek %1 musí mít buď jednu %2-vlastnost nebo se musí používat stavitel posloupnosti. Module imports must occur before function, variable, and option declarations. Zavedení modulů musí nastat před deklaracemi funkcí, proměnných a voleb. Day %1 is outside the range %2..%3. Údaj dne %1 je mimo rozsah %2..%3. %1 contains octets which are disallowed in the requested encoding %2. %1 obsahuje oktety, které v kódování %2 nejsou přípustné. When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor. Výchozí hodnota požadovaného parametru nemůže být zadána ani prostřednictvím %1-vlastnosti ani přes stavitele posloupnosti. In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching. V XSL-T vyhledávacím vzoru musí být první argument k funkci %1 při použití k hledání řetězec tvořený písmeny. Text nodes are not allowed at this location. Na tomto místě nesmí stát žádné textové uzly. A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type. Hodnoty typu %1 nesmí být predikátem. Pro predikáty jsou přípustné pouze typ číselný nebo účinný booleánský. %1 is not a valid name for a processing-instruction. %1 není platným názvem pokynu pro zpracování. %1 was called. %1 byl volán. It's not possible to add attributes after any other kind of node. Vlastnosti nesmí následovat za jinými druhy uzlů. At least one %1-element must occur before %2. Před %2 musí stát alespoň jeden %1-prvek. The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). Tato forma normalizování %1 není podporována. Podporovanými formami normalizování jsou %2, %3, %4 a %5, a "žádný" (prázdný znakový řetězec zastupuje "žádné normalizování"). When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed. Při přetypování na typ %1 nebo do odvozených typů musí být zdrojovou hodnotou řetězec znaků tvořený písmeny nebo hodnota stejného typu. Typ %2 je neplatný. A parameter in a function cannot be declared to be a tunnel. Parameter funkce nelze prohlásit za tunel. XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is. XSL-T vlastnosti XSL-T prvku musí být v nulovém jmenném prostoru, nikoli v XSL-T jmenném prostoru, jako %1. The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 Jmenný prostor uživatelem stanovené funkce v modulu knihovny musí odpovídat jmennému prostoru modulu (Jinými slovy by měl být %1 namísto %2) Day %1 is invalid for month %2. Ǔdaj o dni %1 je neplatným pro měsíc %2. Overflow: Can't represent date %1. Nelze představit datum %1 (Přetečení). In a simplified stylesheet module, attribute %1 must be present. Ve zjednodušeném modulu stylového listu musí být přítomna vlastnost %1. Unknown XSL-T attribute %1. Neznámá XSL-T vlastnost: %1. It is not possible to redeclare prefix %1. Předponu %1 nelze prohlásit. exactly one přesně jeden %1 is an invalid regular expression pattern: %2 %1 není platným pravidelným výrazem: %2 Element %1 is not allowed at this location. Prvek %1 nesmí stát na tomto místě. The Schema Validation Feature is not supported. Hence, %1-expressions may not be used. %1-výrazy se nemohou používat, protože funkce ověřování platnosti schématu není podporována. At least one %1 element must appear as child of %2. Alespoň jeden %1-prvek musí být potomkem %2. This processor is not Schema-aware and therefore %1 cannot be used. %1 se nemůže používat, protože tento procesor nepodporuje žádné schéma. Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes. Prvek %2 může mít jen %3 nebo obvyklé vlastnosti, ne však %1. Dividing a value of type %1 by %2 (not-a-number) is not allowed. Dělení hodnoty typu %1 prostřednictvím %2 (není číselnou hodnotou) není přípustné. Required cardinality is %1; got cardinality %2. Požadované kardinální číslo (mohutnost množiny) je %1 (v současnosti %2). A construct was encountered which only is allowed in XQuery. Tento výtvor je přípustný pouze v XQuery. No function by name %1 is available. Neexistuje žádná funkce s názvem %1. The URI cannot have a fragment URI nesmí obsahovat kousek %1 is not an atomic type. Casting is only possible to atomic types. %1 není atomickým typem. Přetypování se dá provádět pouze s atomickými typy. The first argument to %1 cannot be of type %2. První argument %1 nemůže být typu %2. The namespace URI must be a constant and cannot use enclosed expressions. Jmenný prostor-URI musí být konstantou a nesmí používat vložené výrazy. Prefix %1 is already declared in the prolog. Předpona %1 byla prohlášena již v předmluvě (prologu). Ambiguous rule match. Víceznačné pravidlo. Promoting %1 to %2 may cause loss of precision. Postoupení od %1 k %2 může vést ke ztrátě přesnosti. In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching. V XSL-T vyhledávacím vzoru se smějí pro srovnávání používat jen funkce %1 a %2, ne však %3. A default namespace declaration must occur before function, variable, and option declarations. Deklarace výchozích jmenných prostorů musí stát před deklaracemi funkcí-, proměnných- nebo deklaracemi voleb. Operator %1 cannot be used on atomic values of type %2 and %3. Operátor %1 se nemůže používat u atomických hodnot typů %2 a %3. The module import feature is not supported Funkce zavedení modulu není podporována The parameter %1 is passed, but no corresponding %2 exists. Neexistuje žádný odpovídající %2 pro předaný parameter %1. A value of type %1 cannot have an Effective Boolean Value. Hodnota typu %1 nemůže mít žádnou účinnou booleánskou hodnotu. The data of a processing instruction cannot contain the string %1 Data pokynu pro zpracování nesmí obsahovat řetězec znaků %1 Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; Časový údaj 24:%1:%2.%3 je neplatný. U hodinového údaje je 24, ale minuty, sekundy a milisekundy musí být všechny 0; A template by name %1 has already been declared. Předloha s názvem %1 už byla prohlášena. It is not possible to bind to the prefix %1 Předponu %1 nelze spojit Value %1 of type %2 is below minimum (%3). Hodnota %1 typu %2 zůstává pod minimem (%3). Required type is %1, but %2 was found. Požadovaný typ je %1, byl ale zadán %2. %1 is an unsupported encoding. Kódování %1 není podporováno. The name of an option must have a prefix. There is no default namespace for options. Název volby musí mít předponu. Pro volby není žádná předloha pro jmenný prostor. Element %1 must come last. Prvek %1 musí stát jako poslední. Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes. Prvek %2 může mít jen vlastnost %3, %4 nebo vlastnosti, které jsou obvyklé, ne však %1. No namespace binding exists for the prefix %1 in %2 Neexistuje žádné svázání jmenného prostoru pro předponu %1 v %2 The name %1 does not refer to any schema type. Název %1 nemá žádnou spojitost s jakýmkoli typem schématu. Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared). Předponu %1 lze spojit pouze s %2. Toto je prohlášeno již dopředu.. W3C XML Schema identity constraint selector Přepínač omezení totožnosti W3C XML schéma W3C XML Schema identity constraint field Pole omezení totožnosti W3C XML schéma A construct was encountered which is disallowed in the current language(%1). Narazilo se na výtvor, který v nynějším jazyce není povolen (%1). A template with name %1 has already been declared. Předloha s názvem %1 již existuje. The initialization of variable %1 depends on itself Inicializace proměnné %1 je závislá na její vlastní hodnotě An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place. Uzel vlastnosti se nesmí objevit jako potomek uzlu dokumentu. Objevil se uzel vlastnosti s názvem %1, který je proto nevhodný. Month %1 is outside the range %2..%3. Údaj o měsíci %1 je mimo rozsah %2..%3. The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. Název proměnné úzce spojené s pro-výrazem se musí lišit od poziční proměnné. Dvě proměnné s názvem %1 se z tohoto důvodu střetávají. No namespace binding exists for the prefix %1 Neexistuje žádné svázání jmenného prostoru pro předponu %1 An %1-attribute with value %2 has already been declared. Prvek má již jednu vlastnost s názvem %1 s hodnotou %2. %1 is not valid as a value of type %2. %1 není platný jako hodnota typu %2. zero or more žádný nebo více %1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. %1 se nenachází v oblasti pod prohlášením vlastností. Všimněte si, že funkce zavedení schématu není podporována. When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal. Při použití funkce %1 k vyhodnocování uvnitř vyhledávacího vzoru musí být argumentem odkaz na proměnnou nebo řetězec tvořený písmeny. No variable with name %1 exists Neexistuje žádná proměnná s názvem %1 The value of attribute %1 must be of type %2, which %3 isn't. Hodnota vlastnosti %1 musí být typu %2. %3 není platnou hodnotou. The prefix %1 cannot be bound. By default, it is already bound to the namespace %2. Předpona %1 nemůže být spojena. Ve výchozím nastavení je již spojena se jmenným prostorem %2. A variable with name %1 has already been declared. Proměnná s názvem %1 již byla prohlášena. No value is available for the external variable with name %1. Pro vnější proměnnou s názvem %1 není dostupná žádná hodnota. The namespace for a user defined function cannot be empty (try the predefined prefix %1, which exists for cases like this) Jmenný prostor uživatelem stanovené funkce nesmí být prázdný (pro tento účel je přednastavena předpona (prefix) %1) An argument with name %1 has already been declared. Every argument name must be unique. Již byl prohlášen jeden argument s názvem %1. Názvy argumentů musí být jednoznačné. %1 is an invalid template mode name. %1 není platným názvem pro řežim předlohy. At least one time component must appear after the %1-delimiter. Po %1-oddělovači se musí objevit alespoň jedna složka času. Overflow: Date can't be represented. Nelze představit datum (Přetečení). Operator %1 is not available between atomic values of type %2 and %3. Operátor %1 se nemůže používat u atomárních hodnot typů %2 a %3. A zone offset must be in the range %1..%2 inclusive. %3 is out of range. Rozdíl v časové zóně musí ležet v oblasti %1..%2 (včetně). %3 leží mimo oblast. %1 is not a valid XML 1.0 character. %1 není platný znak XML 1.0. The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. První argument %1 nemůže být typu %2. Musí to být typ %3, %4 nebo %5. %1 is not a whole number of minutes. %1 není celočíselným údajem o minutách. Failure when casting from %1 to %2: %3 Operace předvedení od %1 do %2 se nepodařila: %3 It is not possible to cast from %1 to %2. Nelze provádět žádnou operaci předvedení od %1 do %2. No variable by name %1 exists Neexistuje žádná proměnná s názvem %1 Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared). Jmenný prostor %1 lze spojit pouze s %2. Toto je stanoveno již dopředu. The second operand in a division, %1, cannot be zero (%2). Druhá veličina, operand, dělení %1 nesmí být nula (%2). Only one %1 declaration can occur in the query prolog. Prolog k dotazu smí obsahovat pouze jednu %1 deklaraci. Element %1 must have at least one of the attributes %2 or %3. Prvek %1 musí mít alespoň jednu z vlastností %2 nebo %3. If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. Když jsou zadány obě hodnoty s časovými zónami, musí mít ten samý rozdíl v časové zóně. %1 a %2 nejsou to samé a jsou tím pádem nepřípustné. No external functions are supported. All supported functions can be used directly, without first declaring them as external Nejsou podporovány vnější funkce. Všechny podporované funkce se dají používat přímo, bez toho, že by byly nejprve prohlášeny za vnější The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. Poslední krok cesty musí obsahovat buď jen uzly nebo jen atomické hodnoty. Nesmí se vyskytovat společně. Empty particle cannot be derived from non-empty particle. Prázdnou částici nelze odvodit z částice, která není prázdná. Derived particle is missing element %1. V odvozené částici chybí prvek %1. Derived element %1 is missing value constraint as defined in base particle. V odvozeném prvku %1 chybí omezení hodnoty, jak je to stanoveno v základní částici. Derived element %1 has weaker value constraint than base particle. Odvozený prvek %1 má slabší omezení hodnoty než má základní částice. Fixed value constraint of element %1 differs from value constraint in base particle. Pevné omezení hodnoty prvku %1 se liší od omezení hodnoty základní částici. Derived element %1 cannot be nillable as base element is not nillable. Odvozený prvek %1 nemůže mít žádnou vlastnost 'nillable', neboť základní prvek žádnou nestanovuje. Block constraints of derived element %1 must not be more weaker than in the base element. Omezení bloku odvozeného prvku %1 nesmí být slabší než v základním prvku. Simple type of derived element %1 cannot be validly derived from base element. Jednoduchý typ odvozeného prvku %1 nemůže být platně odvozen ze základního prvku. Complex type of derived element %1 cannot be validly derived from base element. Složitý typ odvozeného prvku %1 nemůže být platně odvozen ze základního prvku. Element %1 is missing in derived particle. Prvek %1 chybí v odvozené částici. Element %1 does not match namespace constraint of wildcard in base particle. Prvek %1 neodpovídá omezení jmenného prostoru zástupného symbolu (vzor hledání) v základní částici. Wildcard in derived particle is not a valid subset of wildcard in base particle. Zástupný symbol (vzor hledání) v odvozené částici není platnou dílčí množinou zástupného symbolu v základní částici. processContent of wildcard in derived particle is weaker than wildcard in base particle. Vlastnost processContent zástupného symbolu (vzor hledání) odvozené částice je slabší než zástupný symbol (vzor hledání) v základní částici. Derived particle allows content that is not allowed in the base particle. Odvozená částice dovoluje obsah, který není přípustný pro základní částici. %1 has inheritance loop in its base type %2. %1 má ve svém základním typu %2 v kruzích prováděnou dědičnost. Circular inheritance of base type %1. V kruzích prováděná dědičnost v základním typu %1. Circular inheritance of union %1. V kruzích prováděná dědičnost při sjednocení %1. %1 is not allowed to derive from %2 by restriction as the latter defines it as final. %1 není dovoleno odvodit z %2 pomocí omezení, neboť posledně uvedený ji určuje jako konečnou. %1 is not allowed to derive from %2 by extension as the latter defines it as final. %1 není dovoleno odvodit z %2 pomocí rozšíření, neboť posledně uvedený ji určuje jako konečnou. Base type of simple type %1 cannot be complex type %2. Složitý typ %2 nemůže být základním typem jednoduchého typu %1. Simple type %1 cannot have direct base type %2. Jednoduchý typ %1 nemůže mít přímý základní typ %2. Simple type %1 is not allowed to have base type %2. Jednoduchý typ %1 nesmí mít základní typ %2. Simple type %1 can only have simple atomic type as base type. Jednoduchý typ %1 může mít jen jednoduchý atomický základní typ. Simple type %1 cannot derive from %2 as the latter defines restriction as final. Jednoduchý typ %1 nesmí být odvozen z %2 , kterýžto určuje omezení jako konečné. Variety of item type of %1 must be either atomic or union. Typ prvku %1 musí být druhu atomického anebo druhu sjednocení. Variety of member types of %1 must be atomic. Typy členů %1 musí být druhu atomického. %1 is not allowed to derive from %2 by list as the latter defines it as final. %1 není dovoleno odvodit z %2 pomocí seznamu, neboť posledně uvedený ji určuje jako konečnou. Simple type %1 is only allowed to have %2 facet. Jednoduchý typ %1 může mít jen omezující vlastnosti %2. Base type of simple type %1 must have variety of type list. Základní typ jednoduchého typu %1 musí být druhu seznamu typů. Base type of simple type %1 has defined derivation by restriction as final. Základní typ jednoduchého typu %1 určuje sjednocení pomocí omezení jako konečné. Item type of base type does not match item type of %1. Složkový typ základního typu neodpovídá složkovému typu %1. Simple type %1 contains not allowed facet type %2. Jednoduchý typ %1 obsahuje nedovolený typ omezující vlastnosti %2. %1 is not allowed to derive from %2 by union as the latter defines it as final. %1 není dovoleno odvodit z %2 pomocí sjednocení, neboť posledně uvedený ji určuje jako konečnou. %1 is not allowed to have any facets. %1 nesmí mít žádné omezující vlastnosti. Base type %1 of simple type %2 must have variety of union. Základní typ %1 jednoduchého typu %2 musí být druhu sjednocení. Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute. Základní typ %1 jednoduchého typu %2 nesmí mít žádné omezení vlastnosti %3. Member type %1 cannot be derived from member type %2 of %3's base type %4. Členský typ %1 nemůže být odvozen z členského typu %2 ze základního typu %4 %3. Derivation method of %1 must be extension because the base type %2 is a simple type. Rozšíření musí používat jako způsob dědičnosti (odvození) pro %1, neboť základní typ %2 je jednoduchým typem. Complex type %1 has duplicated element %2 in its content model. Složitý typ %1 má zdvojený prvek %2 ve svém modelu obsahu. Complex type %1 has non-deterministic content. Složitý typ %1 nemá deterministický obsah. Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3. Vlastnosti složitého typu %1 nejsou žádným platným rozšířením vlastností základního typu %2: %3. Content model of complex type %1 is not a valid extension of content model of %2. Model obsahu složitého typu %1 není žádným platným rozšířením modelu obsahu %2. Complex type %1 must have simple content. Složitý typ %1 musí mít jednoduchý obsah. Complex type %1 must have the same simple type as its base class %2. Složitý typ %1 musí mít jednoduchý obsah. Complex type %1 cannot be derived from base type %2%3. Složitý typ %2 nemůže být odvozen ze základního typu %2%3. Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3. Vlastnosti složitého typu %1 nejsou žádným platným omezením vlastností základního typu %2: %3. Complex type %1 with simple content cannot be derived from complex base type %2. Složitý typ %1 s jednoduchým obsahem nemůže být odvozen ze složitého základního typu %2. Item type of simple type %1 cannot be a complex type. Složkový typ jednoduchého typu %1 nemůže být složitým typem. Member type of simple type %1 cannot be a complex type. Členský typ jednoduchého typu %1 nemůže být složitým typem. %1 is not allowed to have a member type with the same name as itself. %1 nesmí mít členský typ se stejným názvem, jaký má sám. %1 facet collides with %2 facet. Omezující vlastnost %1 se střetává s omezující vlastností %2. %1 facet must have the same value as %2 facet of base type. Omezující vlastnost %1 musí mít tutéž hodnotu, jakou má omezující vlastnost %2 základního typu. %1 facet must be equal or greater than %2 facet of base type. Omezující vlastnost %1 musí být stejná nebo větší než omezující vlastnost %2 základního typu. %1 facet must be less than or equal to %2 facet of base type. Omezující vlastnost %1 musí být menší nebo stejná jako omezující vlastnost %2 základního typu. %1 facet contains invalid regular expression Omezující vlastnost %1 obsahuje neplatný pravidelný výraz Unknown notation %1 used in %2 facet. Omezující vlastnost %2 obsahuje neplatný zápis %1. %1 facet contains invalid value %2: %3. Omezující vlastnost %1 obsahuje neplatnou hodnotu %2: %3. %1 facet cannot be %2 or %3 if %4 facet of base type is %5. Omezující vlastnost %1 nesmí být %2 nebo %3, pokud je omezující vlastnost %4 základního typu %5. %1 facet cannot be %2 if %3 facet of base type is %4. Omezující vlastnost %1 nesmí být %2, pokud je omezující vlastnost %3 základního typu %4. %1 facet must be less than or equal to %2 facet. Omezující vlastnost %1 musí být menší nebo stejná jako omezující vlastnost %2. %1 facet must be less than %2 facet of base type. Omezující vlastnost %1 musí být menší než omezující vlastnost %2 základního typu. %1 facet and %2 facet cannot appear together. Omezující vlastnosti %1 a %2 se nemohou objevit spolu. %1 facet must be greater than %2 facet of base type. Omezující vlastnost %1 musí být větší než omezující vlastnost %2 základního typu. %1 facet must be less than %2 facet. Omezující vlastnost %1 musí být menší než omezující vlastnost %2. %1 facet must be greater than or equal to %2 facet of base type. Omezující vlastnost %1 musí být větší nebo stejná jako omezující vlastnost %2 základního typu. Simple type contains not allowed facet %1. Jednoduchý typ obsahuje nedovolenou omezující vlastnost %1. %1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list. Omezující vlastnosti %1, %2, %3, %4, %5 a %6 nejsou při odvození (dědičnosti) pomocí seznamu dovoleny. Only %1 and %2 facets are allowed when derived by union. Při odvození (dědičnosti) pomocí sjednocení jsou dovoleny pouze omezující vlastnosti %1 a %2. %1 contains %2 facet with invalid data: %3. %1 obsahuje omezující vlastnost %2 s neplatnými daty: %3. Attribute group %1 contains attribute %2 twice. Skupina vlastností %1 obsahuje vlastnost %2 dvakrát. Attribute group %1 contains two different attributes that both have types derived from %2. Skupina vlastností %1 obsahuje dvě rozdílné vlastnosti, obě s typy, které jsou odvozeny z %2. Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3. Skupina vlastností %1 obsahuje vlastnost %2 s omezením hodnoty, typ je ale odvozen z %3. Complex type %1 contains attribute %2 twice. Složitý typ %1 obsahuje vlastnost %2 dvakrát. Complex type %1 contains two different attributes that both have types derived from %2. Složitý typ %1 obsahuje dvě rozdílné vlastnosti, obě s typy, které jsou odvozeny z %2. Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3. Složitý typ %1 obsahuje vlastnost %2 s omezením hodnoty, typ je ale odvozen z %3. Element %1 is not allowed to have a value constraint if its base type is complex. Prvek %1 nesmí mít omezení hodnoty, když je základní typ složitý. Element %1 is not allowed to have a value constraint if its type is derived from %2. Prvek %1 nesmí mít omezení hodnoty, když je jeho typ odvozen z %2. Value constraint of element %1 is not of elements type: %2. Omezení hodnoty prvku %1 není z typu prvku: %2. Element %1 is not allowed to have substitution group affiliation as it is no global element. Prvek %1 nesmí patřit k skupině nahrazení, neboť není celkovým prvkem. Type of element %1 cannot be derived from type of substitution group affiliation. Typ prvku %1 nemůže být odvozen z typu příslušné skupiny nahrazení. Value constraint of attribute %1 is not of attributes type: %2. Omezení hodnoty vlastnosti %1 není z typu vlastnosti: %2. Attribute %1 has value constraint but has type derived from %2. Vlastnost %1 má mezení hodnoty, ale její typ je odvozen z %2. %1 attribute in derived complex type must be %2 like in base type. Vlastnost %1 v odvozeném složitém typu musí být jako v základním typu %2. Attribute %1 in derived complex type must have %2 value constraint like in base type. Vlastnost %1 v odvozeném složitém typu musí mít omezení hodnoty jako v základním typu %2. Attribute %1 in derived complex type must have the same %2 value constraint like in base type. Vlastnost %1 v odvozeném složitém typu musí mít stejné omezení hodnoty %2 jako v základním typu. Attribute %1 in derived complex type must have %2 value constraint. Vlastnost %1 v odvozeném složitém typu musí omezení hodnoty %2. processContent of base wildcard must be weaker than derived wildcard. Vlastnost 'processContent' základního zástupného symbolu (vzor hledání) musí být slabší než odvozený zástupný symbol (vzor hledání). Element %1 exists twice with different types. Prvek %1 existuje dvakrát s rozdílnými typy. Particle contains non-deterministic wildcards. Částice má nedeterministické zástupné symboly (vzory hledání). Base attribute %1 is required but derived attribute is not. Základní vlastnost %1 je vyžadována, ale odvozená vlastnost není. Type of derived attribute %1 cannot be validly derived from type of base attribute. Typ odvozené vlastnosti %1 nemůže být platně odvozen z typu základní vlastnosti. Value constraint of derived attribute %1 does not match value constraint of base attribute. Omezení hodnoty odvozené vlastnosti %1 neodpovídá omezení hodnoty základní vlastnosti. Derived attribute %1 does not exists in the base definition. Odvozená vlastnost %1 neexistuje v základním vymezení. Derived attribute %1 does not exist in the base definition. Odvozená vlastnost %1 neexistuje v základní definici. Derived attribute %1 does not match the wildcard in the base definition. Odvozená vlastnost %1 neodpovídá zástupnému symbolu (vzoru hledání) v základní definici. Base attribute %1 is required but missing in derived definition. Základní vlastnost %1 je vyžadována, ale chybí v odvozené definici. Derived definition contains an %1 element that does not exists in the base definition Odvozená definice obsahuje prvek %1, který v základní definici neexistuje Derived wildcard is not a subset of the base wildcard. Odvozený zástupný symbol (vzor hledání) není žádnou dílčí množinou základního zástupného symbolu (vzoru hledání). %1 of derived wildcard is not a valid restriction of %2 of base wildcard Vlastnost %1 odvozeného zástupného symbolu (vzoru hledání) není platným omezením %2 základního zástupného symbolu (vzoru hledání) Attribute %1 from base type is missing in derived type. Vlastnost %1 základního typu chybí v odvozeném typu. Type of derived attribute %1 differs from type of base attribute. Typ odvozené vlastnosti %1 se liší od typu základní vlastnosti. Base definition contains an %1 element that is missing in the derived definition Základní definice obsahuje prvek %1, který v odvozené definici chybí Can not process unknown element %1, expected elements are: %2. Nelze zpracovat neznámý prvek %1, očekávanými prvky jsou: %2. Element %1 is not allowed in this scope, possible elements are: %2. Prvek %1 není v této oblasti dovolen; možnými prvky jsou: %2. Child element is missing in that scope, possible child elements are: %1. Podprvek v oblasti chybí; možnými podprvky jsou: %1. Document is not a XML schema. Dokument není schématem XML. %1 attribute of %2 element contains invalid content: {%3} is not a value of type %4. Vlastnost %1 prvku %2 obsahuje neplatný obsah: {%3} není hodnotou typu %4. %1 attribute of %2 element contains invalid content: {%3}. Vlastnost %1 prvku %2 obsahuje neplatný obsah: {%3}. Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema. Cílový jmenný prostor %1 zahrnutého schématu se liší od jím vymezeného cílového jmenného prostoru %2. Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema. Cílový jmenný prostor %1 zavedeného schématu se liší od jím vymezeného cílového jmenného prostoru %2. %1 element is not allowed to have the same %2 attribute value as the target namespace %3. Prvek %1 nemůže stanovit cílový jmenný prostor %3 jako hodnotu vlastnosti %2. %1 element without %2 attribute is not allowed inside schema without target namespace. Ve schématu bez jmenného prostoru musí mít prvek %1 vlastnost %2. %1 element is not allowed inside %2 element if %3 attribute is present. Když je přítomna vlastnost %3, nesmí se vyskytovat prvek %1 v prvku %2. %1 element has neither %2 attribute nor %3 child element. Prvek %1 nemá ani vlastnost %2 ani podprvek %3. %1 element with %2 child element must not have a %3 attribute. Prvek %1 nesmí mít vlastnost %3, když existuje podprvek %2. %1 attribute of %2 element must be %3 or %4. Vlastnost %1 prvku %2 může být jen %3 nebo %4. %1 attribute of %2 element must have a value of %3. Vlastnost %1 prvku %2 musí mít hodnotu %3. %1 attribute of %2 element must have a value of %3 or %4. Vlastnost %1 prvku %2 může mít jen jednu z hodnot %3 nebo %4. %1 element must not have %2 and %3 attribute together. Vlastnosti %2 a %3 se v prvku %1 nemohou objevit společně. Content of %1 attribute of %2 element must not be from namespace %3. Obsah vlastnosti %1 prvku %2 nemůže pocházet ze jmenného prostoru %3. %1 attribute of %2 element must not be %3. Vlastnost %1 prvku %2 nemůže být %3. %1 attribute of %2 element must have the value %3 because the %4 attribute is set. Vlastnost %1 prvku %2 musí mít hodnotu %3, protože je nastavena vlastnost %4. Specifying use='prohibited' inside an attribute group has no effect. Zadání use='prohibited' ve skupině vlastností nemá naprosto žádný účinek. %1 element must have either %2 or %3 attribute. Prvek %1 musí mít buď vlastnost %2 nebo %3. %1 element must have either %2 attribute or %3 or %4 as child element. Prvek %1 musí mít buď vlastnost %2, nebo mít %3 nebo %4 jako podprvek. %1 element requires either %2 or %3 attribute. Prvek %1 vyžaduje buď vlastnost %2 nebo %3. Text or entity references not allowed inside %1 element Text nebo odkazy na entitu nejsou v prvku %1 dovoleny %1 attribute of %2 element must contain %3, %4 or a list of URIs. Vlastnost %1 prvku %2 musí obsahovat %3, %4 nebo seznam adres (URL). %1 element is not allowed in this context. Prvek %1 není v této souvislosti dovolen. %1 attribute of %2 element has larger value than %3 attribute. Hodnota vlastnosti %1 prvku %2 je větší než hodnota vlastnosti %3. Prefix of qualified name %1 is not defined. Předpona způsobilého názvu %1 není stanovena. %1 attribute of %2 element must either contain %3 or the other values. Hodnota vlastnosti %1 prvku %2 musí obsahovat buď %3 nebo jiné hodnoty. Component with ID %1 has been defined previously. Součást s ID %1 je již stanovena. Component with id %1 has been defined previously. Součást s ID %1 je již stanovena. Element %1 already defined. Prvek %1 je již stanoven. Attribute %1 already defined. Vlastnost %1 je již stanovena. Type %1 already defined. Typ %1 je již stanoven. Attribute group %1 already defined. Skupina vlastností %1 je již stanovena. Element group %1 already defined. Skupina prvků %1 je již stanovena. Notation %1 already defined. Zápis %1 je již stanoven. Identity constraint %1 already defined. Omezení totožnosti %1 je již stanoveno. Duplicated facets in simple type %1. Zdvojené omezující vlastnosti v jednoduchém typu %1. %1 references unknown %2 or %3 element %4. %1 odkazuje na neznámý prvek %4 (%2 nebo %3). %1 references identity constraint %2 that is no %3 or %4 element. %1 odkazuje na omezení totožnosti %2, které není ani prvek '%3' ani '%4'. %1 has a different number of fields from the identity constraint %2 that it references. U %1 se liší počet polí od omezení totožnosti %2, na kterou odkazuje. Base type %1 of %2 element cannot be resolved. Základní typ %1 prvku %2 nemůže být vyřešen. Item type %1 of %2 element cannot be resolved. Složkový typ %1 prvku %2 nemůže být vyřešen. Member type %1 of %2 element cannot be resolved. Členský typ %1 prvku %2 nemůže být vyřešen. Type %1 of %2 element cannot be resolved. Typ %1 prvku %2 nemůže být vyřešen. Base type %1 of complex type cannot be resolved. Základní typ %1 složitého typu nemůže být vyřešen. %1 cannot have complex base type that has a %2. %1 nelze mít žádný složitý základní typ, který má %2. Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type. Model obsahu složitého typu %1 obsahuje prvek %2; nelze jej proto odvodit pomocí rozšíření z ne-prázdného typu. Content model of complex type %1 contains %2 element, so it cannot be derived by extension from a non-empty type. Model obsahu složitého typu %1 obsahuje prvek %2; nelze jej proto odvodit pomocí rozšíření z neprázdného typu. Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model. Složitý typ %1 nemůže být odvozen pomocí rozšíření z %2, neboť poslední obsahuje prvek '%3' ve svém modelu obsahu. Type of %1 element must be a simple type, %2 is not. Typ prvku %1 musí být jednoduchým prvkem, což %2 není. Substitution group %1 of %2 element cannot be resolved. Skupina nahrazení %1 prvku %2 nemůže být vyřešena. Substitution group %1 has circular definition. Skupina nahrazení %1 má má cyklickou definici. Duplicated element names %1 in %2 element. Název prvku %1 se vyskytuje v prvku %2 vícekrát. Reference %1 of %2 element cannot be resolved. Odkaz %1 prvku %2 nemůže být vyřešen. Circular group reference for %1. V kruzích prováděný skupinový odkaz pro %1. %1 element is not allowed in this scope Prvek %1 není v této oblasti dovolen %1 element cannot have %2 attribute with value other than %3. Hodnota vlastnosti %2 prvku %1 může být pouze %3. %1 element cannot have %2 attribute with value other than %3 or %4. Hodnota vlastnosti %2 prvku %1 může být pouze %3 nebo %4. %1 or %2 attribute of reference %3 does not match with the attribute declaration %4. Vlastnost %1 nebo %2 odkazu %3 neodpovídá prohlášení vlastnosti %4. Attribute group %1 has circular reference. Skupina vlastnosti %1 má cyklický odkaz. %1 attribute in %2 must have %3 use like in base type %4. Vlastnost %1 v %2 musí mít použití '%3' jako v základním typu %4. Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2. Zástupný symbol vlastnosti (vzor hledání) %1není platným omezením zástupného symbolu vlastnosti (vzoru hledání) základního typu %2. %1 has attribute wildcard but its base type %2 has not. %1 má zástupný symbol vlastnosti (vzor hledání), ale jeho základní typ %2 nemá. Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible. Sjednocení zástupného symbolu vlastnosti (vzoru hledání) typu %1 a zástupného symbolu vlastnosti (vzoru hledání) jeho základního typu %2 není vyjádřitelné. Enumeration facet contains invalid content: {%1} is not a value of type %2. Výčtová omezující vlastnost obsahuje neplatný obsah: {%1} není hodnotou typu %2. Namespace prefix of qualified name %1 is not defined. Předpona jmenného prostoru způsobilého názvu %1 není stanovena. %1 element %2 is not a valid restriction of the %3 element it redefines: %4. Prvek %2 (%1) není platným omezením přepisovaného prvku (%3): %4. %1 is not valid according to %2. %1 je podle %2 neplatné. String content does not match the length facet. Obsah řetězce znaků neodpovídá omezující vlastnosti délky. String content does not match the minLength facet. Obsah řetězce znaků neodpovídá omezující vlastnosti délky (nejmenší; 'minLength'). String content does not match the maxLength facet. Obsah řetězce znaků neodpovídá omezující vlastnosti délky (největší; 'maxLength'). String content does not match pattern facet. Obsah řetězce znaků neodpovídá omezující vlastnosti vzoru pro hledání. String content is not listed in the enumeration facet. Obsah řetězce znaků není obsažen ve výčtové omezující vlastnosti. Signed integer content does not match the maxInclusive facet. Celočíselná hodnota označená znaménkem neodpovídá omezující vlastnosti 'maxInclusive'. Signed integer content does not match the maxExclusive facet. Celočíselná hodnota označená znaménkem neodpovídá omezující vlastnosti 'maxExclusive'. Signed integer content does not match the minInclusive facet. Celočíselná hodnota označená znaménkem neodpovídá omezující vlastnosti 'minInclusive'. Signed integer content does not match the minExclusive facet. Celočíselná hodnota označená znaménkem neodpovídá omezující vlastnosti 'minExclusive'. Signed integer content is not listed in the enumeration facet. Celočíselná hodnota označená znaménkem není obsažena ve výčtové omezující vlastnosti. Signed integer content does not match pattern facet. Celočíselná hodnota označená znaménkem neodpovídá omezující vlastnosti vzoru pro hledání. Signed integer content does not match in the totalDigits facet. Celočíselná hodnota označená znaménkem neodpovídá omezující vlastnosti 'totalDigits'. Unsigned integer content does not match the maxInclusive facet. Celočíselná hodnota jsoucí bez znaménka neodpovídá omezující vlastnosti 'maxInclusive'. Unsigned integer content does not match the maxExclusive facet. Celočíselná hodnota jsoucí bez znaménka neodpovídá omezující vlastnosti 'maxExclusive'. Unsigned integer content does not match the minInclusive facet. Celočíselná hodnota jsoucí bez znaménka neodpovídá omezující vlastnosti 'minInclusive'. Unsigned integer content does not match the minExclusive facet. Celočíselná hodnota jsoucí bez znaménka neodpovídá omezující vlastnosti 'minExclusive'. Unsigned integer content is not listed in the enumeration facet. Celočíselná hodnota jsoucí bez znaménka není obsažena ve výčtové omezující vlastnosti. Unsigned integer content does not match pattern facet. Celočíselná hodnota jsoucí bez znaménka neodpovídá omezující vlastnosti vzoru pro hledání. Unsigned integer content does not match in the totalDigits facet. Celočíselná hodnota jsoucí bez znaménka neodpovídá omezující vlastnosti 'totalDigits'. Double content does not match the maxInclusive facet. Číslo s pohyblivou čárkou neodpovídá omezující vlastnosti 'maxInclusive'. Double content does not match the maxExclusive facet. Číslo s pohyblivou čárkou neodpovídá omezující vlastnosti 'maxExclusive'. Double content does not match the minInclusive facet. Číslo s pohyblivou čárkou neodpovídá omezující vlastnosti 'minInclusive'. Double content does not match the minExclusive facet. Číslo s pohyblivou čárkou neodpovídá omezující vlastnosti 'minExclusive'. Double content is not listed in the enumeration facet. Číslo s pohyblivou čárkou není obsaženo ve výčtové omezující vlastnosti. Double content does not match pattern facet. Číslo s pohyblivou čárkou neodpovídá omezující vlastnosti vzoru pro hledání. Decimal content does not match in the fractionDigits facet. Desetinné číslo neodpovídá omezující vlastnosti 'fractionDigits'. Decimal content does not match in the totalDigits facet. Desetinné číslo neodpovídá omezující vlastnosti 'totalDigits'. Date time content does not match the maxInclusive facet. Údaj o datu neodpovídá omezující vlastnosti 'maxInclusive'. Date time content does not match the maxExclusive facet. Údaj o datu neodpovídá omezující vlastnosti 'maxExclusive'. Date time content does not match the minInclusive facet. Údaj o datu neodpovídá omezující vlastnosti 'minInclusive'. Date time content does not match the minExclusive facet. Údaj o datu neodpovídá omezující vlastnosti 'minExclusive'. Date time content is not listed in the enumeration facet. Údaj o datu není obsažen ve výčtové omezující vlastnosti. Date time content does not match pattern facet. Údaj o datu neodpovídá omezující vlastnosti vzoru pro hledání. Duration content does not match the maxInclusive facet. Údaj o době trvání neodpovídá omezující vlastnosti 'maxInclusive'. Duration content does not match the maxExclusive facet. Údaj o době trvání neodpovídá omezující vlastnosti 'maxExclusive'. Duration content does not match the minInclusive facet. Údaj o době trvání neodpovídá omezující vlastnosti 'minInclusive'. Duration content does not match the minExclusive facet. Údaj o době trvání neodpovídá omezující vlastnosti 'minExclusive'. Duration content is not listed in the enumeration facet. Údaj o době trvání není obsažen ve výčtové omezující vlastnosti. Duration content does not match pattern facet. Údaj o době trvání neodpovídá omezující vlastnosti vzoru pro hledání. Boolean content does not match pattern facet. Booleánská hodnota neodpovídá omezující vlastnosti vzoru pro hledání. Binary content does not match the length facet. Binární obsah neodpovídá omezující vlastnosti délky. Binary content does not match the minLength facet. Binární obsah neodpovídá omezující vlastnosti 'minLength'. Binary content does not match the maxLength facet. Binární obsah neodpovídá omezující vlastnosti 'maxLength'. Binary content is not listed in the enumeration facet. Binární obsah není obsažen ve výčtové omezující vlastnosti. Invalid QName content: %1. Obsah způsobilého názvu ('QName') je neplatný: %1. QName content is not listed in the enumeration facet. Obsah způsobilého názvu ('QName') není obsažen ve výčtové omezující vlastnosti. QName content does not match pattern facet. Obsah způsobilého názvu ('QName') neodpovídá omezující vlastnosti vzoru pro hledání. Notation content is not listed in the enumeration facet. Obsah zápisu není obsažen ve výčtové omezující vlastnosti. List content does not match length facet. Obsah seznamu neodpovídá omezující vlastnosti délky. List content does not match minLength facet. Obsah seznamu neodpovídá omezující vlastnosti 'minLength'. List content does not match maxLength facet. Obsah seznamu neodpovídá omezující vlastnosti 'maxLength'. List content is not listed in the enumeration facet. Obsah seznamu není obsažen ve výčtové omezující vlastnosti. List content does not match pattern facet. Obsah seznamu neodpovídá omezující vlastnosti vzoru pro hledání. Union content is not listed in the enumeration facet. Obsah sjednocení není obsažen ve výčtové omezující vlastnosti. Union content does not match pattern facet. Obsah sjednocení neodpovídá omezující vlastnosti vzoru pro hledání. Data of type %1 are not allowed to be empty. Data typu %1 nemohou být prázdná. Element %1 is missing child element. U prvku %1 chybí podprvek. There is one IDREF value with no corresponding ID: %1. Existuje hodnota IDREF, pro kterou neexistuje příslušné ID: %1. Loaded schema file is invalid. Nahraný soubor se schématem je neplatný. %1 contains invalid data. %1 obsahuje neplatná data. xsi:schemaLocation namespace %1 has already appeared earlier in the instance document. Jmenný prostor xsi:schemaLocation %1 byl již dříve v případovém dokumentu stanoven. xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute. xsi:noNamespaceSchemaLocation se nemůže objevit po prvním prvku nebo vlastnosti bez jmenného prostoru. No schema defined for validation. Pro schválení není stanoveno žádné schéma. No definition for element %1 available. Pro prvek %1 není dostupná žádná definice. Specified type %1 is not known to the schema. Zadaný typ %1 není ve schématu stanoven. Element %1 is not defined in this scope. Prvek %1 není v této oblasti stanoven. Declaration for element %1 does not exist. Pro prvek %1 není dostupná žádná deklarace. Element %1 contains invalid content. Prvek %1 obsahuje neplatný obsah. Element %1 is declared as abstract. Prvek %1 je prohlášen jako abstraktní. Element %1 is not nillable. Prvek %1 nemá zadánu vlastnost 'nillable'. Attribute %1 contains invalid data: %2 Vlastnost %1 obsahuje neplatná data: %2 Element contains content although it is nillable. Prvek má obsah, ačkoli je 'nillable'. Fixed value constraint not allowed if element is nillable. Pevné omezení hodnoty není dovoleno, pokud je prvek 'nillable'. Element %1 cannot contain other elements, as it has fixed content. Prvek %1 nesmí obsahovat žádné jiné prvky, protože má pevný obsah. Element %1 cannot contain other elements, as it has a fixed content. Prvek %1 nesmí obsahovat žádné jiné prvky, protože má pevný obsah. Fixed value constrained not allowed if element is nillable. Pevné omezení hodnoty není dovoleno, pokud je prvek 'nillable'. Specified type %1 is not validly substitutable with element type %2. Zadaný typ %1 není platně nahraditelný typem prvku %2. Complex type %1 is not allowed to be abstract. Složitý typ %1 nemůže být abstraktní. Element %1 contains not allowed attributes. Prvek %1 obsahuje nepřípustné vlastnosti. Element %1 contains not allowed child element. Prvek %1 obsahuje nepřípustný podprvek. Content of element %1 does not match its type definition: %2. Obsah prvku %1 neodpovídá definici svého typu: %2. Content of element %1 does not match defined value constraint. Obsah prvku %1 neodpovídá stanovenému omezení hodnoty. Element %1 contains not allowed child content. Prvek %1 obsahuje nepřípustný podobsah. Element %1 contains not allowed text content. Prvek %1 obsahuje nepřípustný textový obsah. Element %1 can not contain other elements, as it has a fixed content. Prvek %1 nesmí obsahovat žádné podprvky, protože má pevný obsah. Element %1 is missing required attribute %2. U prvku %1 chybí vyžadovaná vlastnost %2. Attribute %1 does not match the attribute wildcard. Vlastnost %1 neodpovídá zástupnému symbolu (vzoru hledání) vlastnosti. Declaration for attribute %1 does not exist. Pro vlastnost %1 není dostupná žádná deklarace. Element %1 contains two attributes of type %2. Prvek %1 obsahuje dvě vlastnosti typu %2. Attribute %1 contains invalid content. Vlastnost %1 má neplatný obsah. Element %1 contains unknown attribute %2. Prvek %1 obsahuje neznámou vlastnost %2. Content of attribute %1 does not match its type definition: %2. Obsah vlastnosti %1 neodpovídá definici svého typu: %2. Content of attribute %1 does not match defined value constraint. Obsah vlastnosti %1 neodpovídá stanovenému omezení hodnoty. Non-unique value found for constraint %1. Pro omezení %1 byla nalezena ne jednoznačně stanovená hodnota. Key constraint %1 contains absent fields. Omezení klíče %1 obsahuje nepřítomná pole. Key constraint %1 contains references nillable element %2. Omezení klíče %1 obsahuje odkazy na prvek %2, který je 'nillable'. No referenced value found for key reference %1. Odkazovanou hodnotu odkazu na klíč %1 se nepodařilo najít. More than one value found for field %1. Pro pole %1 bylo nalezeno více hodnot. Field %1 has no simple type. Pole %1 nemá žádný jednoduchý typ. ID value '%1' is not unique. Hodnota ID %1 není jednoznačná. '%1' attribute contains invalid QName content: %2. Vlastnost %1 obsahuje neplatný způsobilý název: %2. VolumeSlider Muted Ztlumení Volume: %1% Hlasitost: %1% qstopmotion-2.3.2-Source/translations/qt_cs.qm000644 000000 000000 00001160624 12536560630 021537 0ustar00rootroot000000 000000 ;XMneO=+OZJ}nmn(5#+;5+;N+;G+O5s+O 1E@BFоH4HYuH)IюI@,IAYIC&JMbJ&J&vK:dLD(sL(PS0 RT]ZrG[`[`\LY\N_M_[y1D-߈E'61 1 w.GK8 Q A $["+,"y&L Xw9&L9vECEXVE'X%;=% )֍k֍֍u֍E5*0J00ie00-095/ +7,,YUtfef~fYfl<ffg1l?orSxBDDA`DAA`F^y 5H54eeDM'K] yG ~]^\[QWHt*3!ntAvSǡV$&S.c(2(4(4(4&w(5 (5?**yK*yW*yB*T!*0Xp*0+FhD+F+L+f5+fs+zc+K~+X^++zc+6=+|++!+h+C+įK+įX+į+c3 :4r77H":9`9;=E@BjH1C:.C:F0iՕFn4Fn4GH/Hw9J Hw9I'SI{I] IatIJ+KJ+$J6L|J6e/J6J6EJ6i2J6kJ6TJ6 J6aJ6$J6J6JcbJK hL (@L*NCLZ(L3Le^Lb; LM5Mb3MM~M?NNB\O|dPFEOPFEjwPFE`PC xQ 0QeRR|_R̼ 7R<SS8^TT<Tʴ0TFU?^}U|U}V1V1XVl>VV>V?VoVVE?W]KWWPWTeWTaWT@X~]X9A_XX˙>XAYvYYk"YDoYZ+DZgEZ Z[;^[=I[f3I([f3 \\]4"\]4S\]4\C\ \Z\JatXgcތlGrUN2Bt>z5|^|^T|A/cTevovSԱ.Pf))CMMdW^yD4L5 ].X(6CduIAGeȾpy[Eg*jI9,ÉsyXtDD%2H`tB8,+>ɤZH]<p:55#Qp%UTP%UT)(Ŏ)9~*4-ctfL-ct6.y2ʯ3y#^hNTurJt.ǥJr0T߮՗SI^Q2 & ~A YdO $ !g)N"l!%%,&XdS)\-*|/=NJ/Xt&01$T1$$5~%:s < N<3 g=}Q>?2?NR@Eq@VxB!3:FRNkyUiW~]EQ`kF`jtlgSlyzO7l}>oivty.ChN%$1ml%"Y;&q;n  9=4nV)K9 s66h6S^*KKX,|RTR=.~.&Cf-zEsEϾ{=8A9τugNO.nA(3Q6[yǜLnQt SCC[nUH(kd@~DmhMgMiE$KE0&nwI*wX6e9^p Iv kڎ:t:lT 4fM;!e&)K*/eK*++N$,/R,Nb1E 6:ϭ;;V; i B?4cByEc:FFIQK~$NjZO{Zf[ \S~;\cTO\0`gb6 bjb-5cփ9cT,fg&4 jCmnfq^ qtuSu(/y{>Pc}kaWW}R>2l~&&_ yl Y>K%z$C$Ue&:qG+L!(Lu:,.ߝʁr^K2DL֊dwc*>.Sހ.q nl /cc,D. 3h>ffqN;yƦω# aOap-LI*T>_A^_Cn  np7^0x1H1,=M&HCk&n,n,}2../B0sV4r4!+50f5>{8h8wt?^BM?C6IxSb&J&KrL%LOvR.{R>6UXmXE%YM$YM0^}^ȣdKh^QiVn nFndrqsscsrw %x/^!2_"%Nۊdatx;Tt]]I&~mI8IIIJQIQIVIX IYIF(&ZvQI4Y4i52y5p334:4x3B3I656*6h65uD(uD5Dto/Q,3r,X,,&,ZG,]?> 3rfxN4V._>;q.ɘe(˓Ȃ5$? 4:Q8QfR=EfRG>]*_<U?=_I9*N*hN-NQ~-cThSPq+VfR0|T306Zb  Q3 M^rcn/2QJN@ebn l2"o3$$ڴ%CQ&~&?)2Q)S+,)/`Ϊ53588888;_?"bs?>uy?%̍AqFuKNK-"M!N>O>wR2U5\V|]@]GeBg^>Gk??y^Nn{yѸw?3JiT5tA#F2A:Ξ2G8 Aw@G%"n[nn vǥC+D+Y+ D`nt6q{y; Q/UxA rU9\GsQiϾY6N%a%,co8:={nI,C-dwm5=U.üNC^5ƨ4Cƨ[L˾H1h|xҝz<Ұ{ل)1pi`9է?Zr؊=V؊=ҒZ>zi}Lzܓ7ܳߺZCサfft`롥gd` +!.=\~NxmIW^!-dDD< u   Uf$f%~b~bo>iVMPt  `e!E%?I['()ўʦ+u2+3G,8_//؊/1@4~6 C8Ȣ<q? 2AB>N*DEQFg6G#G Gb[HULAUM~UOrPPѧQ3RC/Sn©TD?UQULaUUUT?X%YĻ|ZZ%@Z%vZ%Z%[[]k*]Q^n_PN_P_po`ud`d`e=i)ai5kQm?$oNxy;ah{{X}u>}ww}wO}wƆ}uZhs]1;p~}3z~|$~'~&lyMr' p~{z~z~%~$BH%vtDtYd%..O3PiUS>fh tu kU5+DY[l^qztY t1.tft4=p')4-ndl_ > aUs|Ȅ-FdCʢlʢʬ2ƴjdmde-ddd59E!эi+<4PcNS㵾mF  u[+HlkNy~UUd:THeBhlwOSs 2,%@3;^%#e E {! e''+8/Aq23^Y425@576*7Dg9 :=7:%T?;dCU]CUHDE[GocINZJ0JK@!Q~CU|#V7WmXw\\D]/t'are ng*.gld$n8k6nWp&qwt?wp y'lz5Ը|l}wZ5}$.}$Os}$?~9T4D̟ϗH/Z|~BVND:L>{9%NU q`lhiv&n-nK<E.0ͮ<·e·[·ý@/d׳:N5:n4T~ (n\/3fC#uan-ney8tEUB~eU7bkE"7ȥKNvlU'ON u8%5TܡQ?0 e~i~6W1BDMb MiV9%ֈb:d!~#[#%f%%d!'%-.E.5kEm=i ==?Zh?_@J$L@TICtIcEfqNP;PV%,V%.DXU qZ `awbDGNbGR7ffdf*gAFhIi$kn-Blsfwx1 #z*2 |F|QRRd8JCc{U!cJ(.P!zc.8~4+C5ܨ^Q1 y/Xm#PenH@b†5qiCq~U.ʴ5h}ʴ5 ʶj ϡ$nы#ƼD^ >"Ӟt1g} Ԅ۔#TD'NdAVF5NF5iY'p<+>RN4Nv9&DI;IAs8D m? }$f qe. ڤ ڤ ڥ dV Eb Ep d AcA0 Ac R[ n *Ϳ 35' 359 6.= A Wɾ WMNw `B{ bj bb3 b`T b`Й dG gU]# i3U kk la lfz lp$ ok qv qv qzKJ tN} u@h xq |o ~ | | ϝ n{3  7 Jz H  t@ tj eV .  . "W   ) F> V " o  lel Yl   U   B ҉ 4 h \ 2} > >} $ Vے $  u" Y+ Y>F 0 KL  @w} 쉥f 팤 E k l~`M %' MN" 4w 7" $ /> C2 O =B qw  D#  } 9s o Ą` 4  U} $ )ד )q )? */ +? .>^ 5 74 7u ;TY > u v" :cY f 7 f    4D d .  (z s: s ~ AA+: 9 1_  9g 05 r')  m,D* 5 ݡ,y ! #-tk #-tz ' 0N^ 5v 5\ :  A\f CU!} E9@ G]E Ip L LX L Mc\ Oa O7 P..r R SF VK7 W X\d Z< \Otb ]$j ` c f)7 f) q f=ݍ io> jK l#B% luI m`Q2 n|n2! w@h xR<7 yr {n }QN ~L' >% n > H5 H A \>  ni С+ $ } .@J= ͍ H i <PJ F  L? Y   zdP +\ % J: J .   ѩ t. km ӇL [ M J N>R /! ̺"c &h NX -D#L .W% xd ۷ r k kN g U)6W C T>< <O g   0=O ,  $rC  ~n[  (  4  I ) 9N %!& lx N g n%W = A>9 L s xH;e _X I? " A !p} $ %6b6 )Ε .b 2 7Fq < =ю* >+ >- >/& >: >M >W > > >uZ >w > ?t| A^ B~8O DT2 Fn7 G' I] Ia J>֌ K K L2 MbE8 P@9 QT RVn RV Rn͆ S.Y SGi S T~ Y Yk [ \ eN׆ hۮ j7o! m( pb sL @ u,. v? H BI h Ti T` T T Ń Jh l,  G J Q /.o  ,'. ,0- S )d )d T] R^ d .jN .Bu .a . .e .R . .z c  * W >+ U .- aG a P yOG  s e.e4 x/ CK '` N +  hN* ɾd$z ɾd& e3 ̈́^uU > ҂8 Ӵ ءt ߢ.  >i % u t l Y |} $ b" H XtL8 n\D ) t ق a_ a .Ӆ )| :b6 UqB jB f ʜa f f f $P*     $ {w #W   #$ #= %n!J '. (I$P* (N= +>d7 +kQ8 0E* 64 ;ɾ Cnm Fg K9t Lch Ptj< Pt( R"y8 S,G T>ٷ ^Ug `K c dB fe fe g I gb hQ$- iFC)E i3 i) jN j jӮڎ kGnL l"T m9 nU s'~t; u>u ue u_= v  v& v{ w wN wŻ w} w}O0 w} ynF |[ ؐ uL % 0 < h J=U bW ՚ | ^ % ~ / $M }U S* R %7v;  xN "? U[ ɰel FH rl  X> Mm bl Y &Y  9 xd D?;  +  t5i t5 gc  ? >N j  )2 7 P$ORե;Qw>>Y: @a  T[G+h6P<n.gT[pS pS3K !a&-*X*+m/EZX/E/E4Qt#7SIELI.!I_7xKNIOO\S5XRuXIZo][ [ fa.Ya.<a%!=gcQi#nyGsW)v6v< vɅEy$y?.FH~9%->me-"=,4(}N~BhN)4^'d,4yd~ aSL*N;b^5>e:.Z5qDBWM5L3Ӯ`pӮ`Ӯ`A֒~h 8rYXݖmUt[y_4^G)qrF }jGj n . . 9S  GAlDn;S"#"#|$UC%40%4'ya*!*]Â,-oB-vU0i)9s0:#1c1c`2wT8>kDR F74aGHC[Jd8J5KUL$.RxW[{)\/b4rc5c5)c.g3iCiTl-pqiiv)MyCR{`r{~a7g~506$rV#&&DD/pE`x$t/{m`n5Yu[>)Nn,ķͣ?J: tN5 E"~RgdNL7rZr-1tpky!֠U ڔ.ߋ"|'T.44\LnJ>|BPσvt2_?` [zdUeiZavYt kartu Close Tab CloseButton<nevymezeno> Debugger::JSAgentWatchData[Pole dlky %1][Array of length %1]Debugger::JSAgentWatchDataFalean chyba! Fake error! FakeReplyNepltn URL Invalid URL FakeReplyO %1About %1MAC_APPLICATION_MENUSkrt %1Hide %1MAC_APPLICATION_MENUSkrt ostatn Hide OthersMAC_APPLICATION_MENUNastaven...Preferences...MAC_APPLICATION_MENUUkon it %1Quit %1MAC_APPLICATION_MENU Slu~byServicesMAC_APPLICATION_MENUUkzat vaeShow AllMAC_APPLICATION_MENUDostupnost AccessibilityPhonon::Spojen CommunicationPhonon::HryGamesPhonon:: HudbaMusicPhonon::Oznmen NotificationsPhonon:: VideoVideoPhonon::<html>PYepn se na zvukov pYehrvac zaYzen <b>%1</b><br/>, kter m vta pYednost, nebo bylo zvlat nastaveno pro tento proud.</html>Switching to the audio playback device %1
which has higher preference or is specifically configured for this stream.Phonon::AudioOutput<html>ZaYzen pro pYehrvn zvuku <b>%1</b> bylo spuatno,<br/>proto~e je prv dostupn a m vta pYednost.</html>xSwitching to the audio playback device %1
which just became available and has higher preference.Phonon::AudioOutput<html>ZaYzen pro pYehrvn zvuku <b>%1</b> nepracuje.<br/>Msto nj <b>%2</b> se pou~v.</html>^The audio playback device %1 does not work.
Falling back to %2.Phonon::AudioOutput<PYepnout zpt na zaYzen '%1'Revert back to device '%1'Phonon::AudioOutputUpozornn: Zd se, ~e zkladn pYdavn moduly pro GStreamer nejsou nainstalovny. Podpora audia a videa byla vypnuta~Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabledPhonon::Gstreamer::BackendVarovn: Bal ek gstreamer0.10-plugins-good nen nainstalovn. Nkter vlastnosti videa nejsou dostupn.Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled.Phonon::Gstreamer::BackendVaechny vy~adovan kodeky nejsou nainstalovny. Kvoli pYehrn tohoto obsahu je potYeba nainstalovat nsledujc kodek(y): %0`A required codec is missing. You need to install the following codec(s) to play this content: %0Phonon::Gstreamer::MediaObjectPYehrvn nelze spustit. OvYte, prosm, instalaci Gstreamer a ujistte se, ~e je nainstalovn bal ek libgstreamer-plugins-base.wCannot start playback. Check your GStreamer installation and make sure you have libgstreamer-plugins-base installed.Phonon::Gstreamer::MediaObjectLZdroj s mdii se nepodaYilo rozluatit.Could not decode media source.Phonon::Gstreamer::MediaObjectFZdroj s mdii se nepodaYilo nalzt.Could not locate media source.Phonon::Gstreamer::MediaObject~Zvukov zaYzen se nepodaYilo otevYt, proto~e se ji~ pou~v.:Could not open audio device. The device is already in use.Phonon::Gstreamer::MediaObjectHZdroj s mdii se nepodaYilo otevYt.Could not open media source.Phonon::Gstreamer::MediaObject8Neplatn typ zdroje s mdii.Invalid source type.Phonon::Gstreamer::MediaObject`Chyb skriptov pomocnk pro npovdu ke kodeku.&Missing codec helper script assistant.Phonon::Gstreamer::MediaObjectzInstalace pYdavnho modulu kodeku se nezdaYila pro kodek: %0.Plugin codec installation failed for codec: %0Phonon::Gstreamer::MediaObjectPYstup odepYen Access denied Phonon::MMFJi~ existujeAlready exists Phonon::MMFVstup zvuku Audio Output Phonon::MMFdZvukov nebo obrazov slo~ky se nepodaYilo pYehrt-Audio or video components could not be played Phonon::MMF.Chyba pYi vstupu zvukuAudio output error Phonon::MMFHNepodaYilo se vytvoYit ~dn spojenCould not connect Phonon::MMFChyba DRM DRM error Phonon::MMF Chyba v dekodru Decoder error Phonon::MMFOdpojeno Disconnected Phonon::MMFJi~ se pou~vIn use Phonon::MMF0Nedostate n aYka psmaInsufficient bandwidth Phonon::MMFNepltn URL Invalid URL Phonon::MMF"Neplatn protokolInvalid protocol Phonon::MMF<Chyba ve vcesmrovm vyslnMulticast error Phonon::MMF4Chyba pYi spojen pYes seNetwork communication error Phonon::MMF"Se nen dostupnNetwork unavailable Phonon::MMF}dn chybaNo error Phonon::MMFNenalezeno Not found Phonon::MMFNepYipraven Not ready Phonon::MMFNepodporovno Not supported Phonon::MMF>Nen dostupn ~dn dala pame Out of memory Phonon::MMFPYete enOverflow Phonon::MMF Cesta nenalezenaPath not found Phonon::MMFPYstup odepYenPermission denied Phonon::MMFjChyba pYi spojen u zprostYedkujcho serveru (proxy)Proxy server error Phonon::MMFFZprostYedkujc server nepodporovnProxy server not supported Phonon::MMF0Stav pohotovosti serveru Server alert Phonon::MMF,Proudn nepodporovnoStreaming not supported Phonon::MMF2ZaYzen pro vstup zvukuThe audio output device Phonon::MMFPodte en Underflow Phonon::MMF$Neznm chyba (%1)Unknown error (%1) Phonon::MMF0Chyba pYi vstupu obrazuVideo output error Phonon::MMF&Chyba pYi stahovnDownload error Phonon::MMF::AbstractMediaPlayer8Adresu se nepodaYilo otevYtError opening URL Phonon::MMF::AbstractMediaPlayer8Soubor se nepodaYilo otevYtError opening file Phonon::MMF::AbstractMediaPlayer@NepodaYilo se otevYt prostYedkyError opening resource Phonon::MMF::AbstractMediaPlayerhZdroj se nepodaYilo otevYt: prostYedek nen otevYen)Error opening source: resource not opened Phonon::MMF::AbstractMediaPlayer6Ukzku se nepodaYilo nahrtLoading clip failed Phonon::MMF::AbstractMediaPlayer0NepYipraven k pYehrvnNot ready to play Phonon::MMF::AbstractMediaPlayer(PYehrvn dokon enoPlayback complete Phonon::MMF::AbstractMediaPlayer@Hlasitost se nepodaYilo nastavitSetting volume failed Phonon::MMF::AbstractMediaPlayer4Polohu se nepodaYilo ur itGetting position failed Phonon::MMF::AbstractVideoPlayer8Ukzku se nepodaYilo otevYtOpening clip failed Phonon::MMF::AbstractVideoPlayerBPozastaven se nepodaYilo provst Pause failed Phonon::MMF::AbstractVideoPlayer:Hledn se nepodaYilo provst Seek failed Phonon::MMF::AbstractVideoPlayer %1 Hz%1 HzPhonon::MMF::AudioEqualizer4Polohu se nepodaYilo ur itGetting position failedPhonon::MMF::AudioPlayer2Chyba pYi zobrazen videaVideo display errorPhonon::MMF::DsaVideoPlayerPovolenoEnabledPhonon::MMF::EffectFactoryJPomr dozvuku u vysokch kmito to (%)Decay HF ratio (%) Phonon::MMF::EnvironmentalReverb  as dozvuku (ms)Decay time (ms) Phonon::MMF::EnvironmentalReverbHustota (%) Density (%) Phonon::MMF::EnvironmentalReverbRozptyl (%) Diffusion (%) Phonon::MMF::EnvironmentalReverb(Zpo~dn odrazu (ms)Reflections delay (ms) Phonon::MMF::EnvironmentalReverb Sla odrazu (mB)Reflections level (mB) Phonon::MMF::EnvironmentalReverb(Zpo~dn ozvny (ms)Reverb delay (ms) Phonon::MMF::EnvironmentalReverb Sla ozvny (mB)Reverb level (mB) Phonon::MMF::EnvironmentalReverbHHladina vysokho kmito tu v prostoru Room HF level Phonon::MMF::EnvironmentalReverb*Hladina prostoru (mB)Room level (mB) Phonon::MMF::EnvironmentalReverbtZdroj se nepodaYilo otevYt: nepodaYilo se ur it typ mdia8Error opening source: media type could not be determinedPhonon::MMF::MediaObjectnZdroj se nepodaYilo otevYt: prostYedek je zkomprimovn,Error opening source: resource is compressedPhonon::MMF::MediaObjectfZdroj se nepodaYilo otevYt: prostYedek nen platn(Error opening source: resource not validPhonon::MMF::MediaObjectlZdroj se nepodaYilo otevYt: tento typ nen podporovn(Error opening source: type not supportedPhonon::MMF::MediaObjectJNepodaYilo se nastavit po~adovan IAPFailed to set requested IAPPhonon::MMF::MediaObjectSla (%) Level (%)Phonon::MMF::StereoWidening2Chyba pYi zobrazen videaVideo display errorPhonon::MMF::SurfaceVideoPlayerZtlumenoMutedPhonon::VolumeSliderPosuvnk se pou~v k nastaven hlasitosti. Poloha nejvce vlevo odpovd 0%; poloha nejvce vpravo odpovd %1%WUse this slider to adjust the volume. The leftmost position is 0%. The rightmost is %1%Phonon::VolumeSliderHlasitost: %1% Volume: %1%Phonon::VolumeSlider.%1, %2 nejsou stanoveny%1, %2 not definedQ3AccelNNejednozna n %1 nemohou bt zpracovnyAmbiguous %1 not handledQ3Accel SmazatDelete Q3DataTableNepravdivFalse Q3DataTable Vlo~itInsert Q3DataTablePravdivTrue Q3DataTableObnovitUpdate Q3DataTablez%1 Soubor se nepodaYilo nalzt. OvYte cestu a nzev souboru.+%1 File not found. Check path and filename. Q3FileDialog&Smazat&Delete Q3FileDialog&Ne&No Q3FileDialog&OK&OK Q3FileDialog&OtevYt&Open Q3FileDialog&PYejmenovat&Rename Q3FileDialog&Ulo~it&Save Q3FileDialog&NeroztYdn &Unsorted Q3FileDialog&Ano&Yes Q3FileDialogb<qt>Jste si jist, ~e chcete smazat %1 "%2"?</qt>1Are you sure you wish to delete %1 "%2"? Q3FileDialog&Vaechny soubory (*) All Files (*) Q3FileDialog*Vaechny soubory (*.*)All Files (*.*) Q3FileDialogVlastnosti Attributes Q3FileDialogZptBack Q3FileDialog ZruaitCancel Q3FileDialog<Soubor koprovat nebo posunoutCopy or Move a File Q3FileDialog*VytvoYit novou slo~kuCreate New Folder Q3FileDialog DatumDate Q3FileDialogSmazat %1 Delete %1 Q3FileDialogPodrobn pohled Detail View Q3FileDialogAdresYDir Q3FileDialogAdresYe Directories Q3FileDialogAdresY: Directory: Q3FileDialog ChybaError Q3FileDialog SouborFile Q3FileDialogNzev &souboru: File &name: Q3FileDialogTyp &souboru: File &type: Q3FileDialogNajt adresYFind Directory Q3FileDialogNepYstupn Inaccessible Q3FileDialog$Pohled se seznamem List View Q3FileDialogHle&dat v: Look &in: Q3FileDialog NzevName Q3FileDialogNov slo~ka New Folder Q3FileDialogNov slo~ka %1 New Folder %1 Q3FileDialogNov slo~ka 1 New Folder 1 Q3FileDialog,O jeden adresY nahoruOne directory up Q3FileDialogOtevYtOpen Q3FileDialogOtevYtOpen  Q3FileDialog*Nhled obsahu souboruPreview File Contents Q3FileDialog4Nhled informace o souboruPreview File Info Q3FileDialogNahrt &znovuR&eload Q3FileDialogPouze  st Read-only Q3FileDialog st/Zapisovat Read-write Q3FileDialog st: %1Read: %1 Q3FileDialogUlo~it jakoSave As Q3FileDialogVyberte adresYSelect a Directory Q3FileDialog,&Ukzat skryt souboryShow &hidden files Q3FileDialogVelikostSize Q3FileDialogRoztYditSort Q3FileDialog*RoztYdit podle &data Sort by &Date Q3FileDialog,RoztYdit podle &nzvu Sort by &Name Q3FileDialog4RoztYdit podle &velikosti Sort by &Size Q3FileDialog$Zvlatn vlastnostSpecial Q3FileDialog6Symbolick odkaz k adresYiSymlink to Directory Q3FileDialog4Symbolick odkaz k souboruSymlink to File Q3FileDialogJSymbolick odkaz k zvlatnmu souboruSymlink to Special Q3FileDialogTypType Q3FileDialogPouze zpis Write-only Q3FileDialogZapsat: %1 Write: %1 Q3FileDialogAdresY the directory Q3FileDialog Souborthe file Q3FileDialog Symbolick odkaz the symlink Q3FileDialogBNepodaYilo se vytvoYit adresY %1Could not create directory %1 Q3LocalFs2NepodaYilo se otevYt: %1Could not open %1 Q3LocalFs@NepodaYilo se pYe st adresY %1Could not read directory %1 Q3LocalFs\NepodaYilo se odstranit soubor nebo adresY %1%Could not remove file or directory %1 Q3LocalFsFNepodaYilo se pYejmenovat: %1 na %2Could not rename %1 to %2 Q3LocalFs0NepodaYilo se zapsat: %1Could not write %1 Q3LocalFsPYizposobit... Customize... Q3MainWindowUspoYdatLine up Q3MainWindowBOperace byla zastavena u~ivatelemOperation stopped by the userQ3NetworkProtocol ZruaitCancelQ3ProgressDialog Pou~tApply Q3TabDialog ZruaitCancel Q3TabDialogVchozDefaults Q3TabDialogNpovdaHelp Q3TabDialogOKOK Q3TabDialog&Koprovat&Copy Q3TextEdit&Vlo~it&Paste Q3TextEdit &Znovu&Redo Q3TextEdit &Zpt&Undo Q3TextEdit SmazatClear Q3TextEditVyj&moutCu&t Q3TextEditVybrat vae Select All Q3TextEdit ZavYtClose Q3TitleBarZavYe oknoCloses the window Q3TitleBar^Obsahuje pYkazy pro zachzen s velikost okna*Contains commands to manipulate the window Q3TitleBarrZobraz nzev okna a obsahuje pYkazy pro zachzen s nmFDisplays the name of the window and contains controls to manipulate it Q3TitleBar4D okno na celou obrazovkuMakes the window full screen Q3TitleBarZvtaitMaximize Q3TitleBarZmenaitMinimize Q3TitleBarZmena oknoMoves the window out of the way Q3TitleBarjD velikost zvtaenho okna zptky do obvyklho stavu&Puts a maximized window back to normal Q3TitleBarjD velikost zmenaenho okna zptky do obvyklho stavu&Puts a minimized window back to normal Q3TitleBarObnovit Restore down Q3TitleBarObnovit Restore up Q3TitleBar SystmSystem Q3TitleBarVce...More... Q3ToolBar(neznm) (unknown) Q3UrlOperatorProtokol `%1' nepodporuje koprovn  i pYesun souboro nebo adresYoIThe protocol `%1' does not support copying or moving files or directories Q3UrlOperatorfProtokol `%1' nepodporuje vytvYen novch adresYo;The protocol `%1' does not support creating new directories Q3UrlOperatorVProtokol `%1' nepodporuje nahrvn souboro0The protocol `%1' does not support getting files Q3UrlOperatorlProtokol `%1' nepodporuje sestavovn seznamu adresYo6The protocol `%1' does not support listing directories Q3UrlOperatorTProtokol `%1' nepodporuje ukldn souboro0The protocol `%1' does not support putting files Q3UrlOperatorxProtokol `%1' nepodporuje odstraHovn souboro nebo adresYo@The protocol `%1' does not support removing files or directories Q3UrlOperator|Protokol `%1' nepodporuje pYejmenovvn souboro nebo adresYo@The protocol `%1' does not support renaming files or directories Q3UrlOperator:Protokol `%1' nen podporovn"The protocol `%1' is not supported Q3UrlOperator&Zruait&CancelQ3WizardDo&kon it&FinishQ3Wizard&Npovda&HelpQ3Wizard&Dala >&Next >Q3Wizard< &Zpt< &BackQ3Wizard,Spojen bylo odmtnutoConnection refusedQAbstractSocketL asov limit pro spojen byl pYekro enConnection timed outQAbstractSocket6NepodaYilo se najt po ta Host not foundQAbstractSocket(Se nen dosa~itelnNetwork unreachableQAbstractSocketHTato socket operace nen podporovna$Operation on socket is not supportedQAbstractSocket$Socket nen spojenSocket is not connectedQAbstractSocketZ asov limit pro socket operaci byl pYekro enSocket operation timed outQAbstractSocket&Vybrat vae &Select AllQAbstractSpinBox&Krok nahoru&Step upQAbstractSpinBoxKrok &dolo Step &downQAbstractSpinBoxZaakrtnoutCheckQAccessibleButtonStisknoutPressQAccessibleButton"Zruait zaakrtnutUncheckQAccessibleButtonSpustitActivate QApplication6Spust hlavn okno programu#Activates the program's main window QApplicationjPou~it '%1' vy~aduje Qt %2; bylo ale nalezeno Qt %3.,Executable '%1' requires Qt %2, found Qt %3. QApplication$Qt nen slu itelnIncompatible Qt Library Error QApplicationLTRTranslate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.QT_LAYOUT_DIRECTION QApplication&Zruait&Cancel QAxSelectCOM-&Objekt: COM &Object: QAxSelectOKOK QAxSelect(Vybrat prvek ActiveXSelect ActiveX Control QAxSelectZaakrtnoutCheck QCheckBoxPYepnoutToggle QCheckBox"Zruait zaakrtnutUncheck QCheckBoxL&PYidat k u~ivatelem stanovenm barvm&Add to Custom Colors QColorDialogZkladn &barvy &Basic colors QColorDialog6&U~ivatelem stanoven barvy&Custom colors QColorDialog&Zelen:&Green: QColorDialog& erven:&Red: QColorDialog&Sytost:&Sat: QColorDialog&Hodnota:&Val: QColorDialogA&lfa kanl:A&lpha channel: QColorDialog&Modr:Bl&ue: QColorDialog&Odstn:Hu&e: QColorDialogVybrat barvu Select Color QColorDialog ZavYtClose QComboBoxNesprvnFalse QComboBoxOtevYtOpen QComboBoxPravdivTrue QComboBox %1: Ji~ existuje%1: already existsQCoreApplication%1: Neexistuje%1: does not existQCoreApplication<%1: Vyvoln ftok se nezdaYiloQSystemSemaphore%1: ftok failedQCoreApplicationF%1: Neplatn daj u kl e (przdn)QSystemSemaphore%1: key is emptyQCoreApplication@%1: Nejsou ji~ pou~iteln zdroje%1: out of resourcesQCoreApplication&%1: PYstup odepYen%1: permission deniedQCoreApplication>%1: NepodaYilo se vytvoYit kl QSystemSemaphore%1: unable to make keyQCoreApplication(%1: Neznm chyba %2%1: unknown error %2QCoreApplication<Transakci se nepodaYilo zapsatUnable to commit transaction QDB2Driver:NepodaYilo se navzat spojenUnable to connect QDB2Driver>Transakci se nepodaYilo zvrtitUnable to rollback transaction QDB2DriverF'autocommit' se nepodaYilo nastavitUnable to set autocommit QDB2Driver>Promnnou se nepodaYilo provstUnable to bind variable QDB2Result8PYkaz se nepodaYilo provstUnable to execute statement QDB2ResultVPrvn datov zznam se nepodaYilo nathnoutUnable to fetch first QDB2ResultVDala datov zznam se nepodaYilo nathnoutUnable to fetch next QDB2ResultPDatov zznam %1 se nepodaYilo nathnoutUnable to fetch record %1 QDB2Result<PYkaz se nepodaYilo pYipravitUnable to prepare statement QDB2ResultAMAM QDateTimeEditPMPM QDateTimeEditamam QDateTimeEditpmpm QDateTimeEdit6Animace je abstraktn tYdaAnimation is an abstract classQDeclarativeAbstractAnimationfVlastnost '%1" neexistuje a nelze ji proto animovat)Cannot animate non-existent property "%1"QDeclarativeAbstractAnimationvVlastnost '%1" je pouze pro  ten a nelze ji proto animovat&Cannot animate read-only property "%1"QDeclarativeAbstractAnimation<Nelze nastavit dobu trvn < 0Cannot set a duration of < 0QDeclarativeAnchorAnimationKotva pro vchoz bod se nesm pou~vat spole n s dalami kotevnmi daji pro nahoYe, dole a umstno svisle do stYedu.SBaseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.QDeclarativeAnchorsTNelze ukotvit vodorovn okraj ke svislmu.3Cannot anchor a horizontal edge to a vertical edge.QDeclarativeAnchorsRNelze ukotvit svisl okraj k vodorovnmu.3Cannot anchor a vertical edge to a horizontal edge.QDeclarativeAnchorsJPrvek nemo~e mt kotvu k sob sammu.Cannot anchor item to self.QDeclarativeAnchorsBNelze dt kotvu k nulovmu prvku.Cannot anchor to a null item.QDeclarativeAnchorsClem kotvy mus bt rodi ovsk prvek nebo prvek na stejn rovni.8Cannot anchor to an item that isn't a parent or sibling.QDeclarativeAnchorsNelze zadat kotevn daje pro vlevo, vpravo a umstno vodorovn do stYedu. Nesm se vyskytovat spole n.0Cannot specify left, right, and hcenter anchors.QDeclarativeAnchorsNelze zadat kotevn daje pro nahoYe, dole a umstno svisle do stYedu. Nesm se vyskytovat spole n.0Cannot specify top, bottom, and vcenter anchors.QDeclarativeAnchorsPYi operaci 'centerIn' byla zjiatna pYpadn nekone n smy ka kotvy.*Possible anchor loop detected on centerIn.QDeclarativeAnchorsPYi operaci naplnn byla zjiatna pYpadn nekone n smy ka kotvy.&Possible anchor loop detected on fill.QDeclarativeAnchorsPYi vodorovn kotv byla zjiatna pYpadn nekone n smy ka kotvy.3Possible anchor loop detected on horizontal anchor.QDeclarativeAnchors~PYi svisl kotv byla zjiatna pYpadn nekone n smy ka kotvy.1Possible anchor loop detected on vertical anchor.QDeclarativeAnchorsPQt bylo sestaveno bez podpory pro QMovie'Qt was built without support for QMovieQDeclarativeAnimatedImage8Aplikace je abstraktn tYda Application is an abstract classQDeclarativeApplication\Animaci patYc k prvku Behavior nelze zmnit.3Cannot change the animation assigned to a Behavior.QDeclarativeBehaviorU pro vlastnost "%1" zadan vazby byla zjiatna nekone n smy ka'Binding loop detected for property "%1"QDeclarativeBindingU pro vlastnost "%1" zadan vazby byla zjiatna nekone n smy ka'Binding loop detected for property "%1"QDeclarativeCompiledBindings2"%1" nelze pou~t na "%2""%1" cannot operate on "%2"QDeclarativeCompiler`"%1.%2" nen dostupn kvoli verzovn sou stky.5"%1.%2" is not available due to component versioning.QDeclarativeCompilerB"%1.%2" nen dostupn v %3 %4.%5.%"%1.%2" is not available in %3 %4.%5.QDeclarativeCompilerLVlastnost alias pYekra uje vazby alias#Alias property exceeds alias boundsQDeclarativeCompilerNa tomto mst nemohou bt pYipojen vlastnosti (typu 'attached') pou~vny'Attached properties cannot be used hereQDeclarativeCompilerbK seznamom lze pYiYadit pouze jednu jedinou vazbu$Can only assign one binding to listsQDeclarativeCompilerU vlastnosti, kter je  st seskupen, nen ~dn pYm pYiYazen hodnoty pYpustn4Cannot assign a value directly to a grouped propertyQDeclarativeCompiler|K signlu nelze pYiYadit hodnotu (o ekv se spuatn skriptu)@Cannot assign a value to a signal (expecting a script to be run)QDeclarativeCompilerrPYiYazen vce hodnot k vlastnosti skriptu nen pYpustn2Cannot assign multiple values to a script propertyQDeclarativeCompilernPYiYazen vce hodnot k jedn vlastnosti nen pYpustn4Cannot assign multiple values to a singular propertyQDeclarativeCompilerVPYiYazen objektu k seznamom nen pYpustnCannot assign object to listQDeclarativeCompilerZPYiYazen objektu k vlastnosti nen pYpustn Cannot assign object to propertyQDeclarativeCompilerPYiYazen jednoduch hodnoty (primitivy) k seznamom nen pYpustn!Cannot assign primitives to listsQDeclarativeCompilerNelze provst ~dn pYiYazen, neboe neexistuje vchoz vlastnost.Cannot assign to non-existent default propertyQDeclarativeCompilerNelze provst ~dn pYiYazen, neboe neexistuje vchoz vlastnost pojmenovan jako "%1"+Cannot assign to non-existent property "%1"QDeclarativeCompilerRNelze vytvoYit przdn vymezen sou stky+Cannot create empty component specificationQDeclarativeCompilerdNelze pYepsat vlastnost prohlaaovanou jako 'FINAL'Cannot override FINAL propertyQDeclarativeCompilerrPrvky sou stek nesm krom ID obsahovat dala vlastnosti;Component elements may not contain properties other than idQDeclarativeCompiler`Objekty sou stek nemohou prohlsit nov funkce./Component objects cannot declare new functions.QDeclarativeCompilerhObjekty sou stek nemohou prohlsit nov vlastnosti.0Component objects cannot declare new properties.QDeclarativeCompilerbObjekty sou stek nemohou prohlsit nov signly.-Component objects cannot declare new signals.QDeclarativeCompiler4Zdvojen vchoz vlastnostDuplicate default propertyQDeclarativeCompiler*Zdvojen nzev metodyDuplicate method nameQDeclarativeCompiler2Zdvojen nzev vlastnostiDuplicate property nameQDeclarativeCompiler,Zdvojen nzev signluDuplicate signal nameQDeclarativeCompiler,PYkaz nelze vytvoYit.Element is not creatable.QDeclarativeCompiler8Przdn pYiYazen vlastnostiEmpty property assignmentQDeclarativeCompiler2Przdn pYiYazen signluEmpty signal assignmentQDeclarativeCompiler|Hodnota ID nedovolen zakrv celkovou vlastnost z JavaScriptu-ID illegally masks global JavaScript propertyQDeclarativeCompilerPHodnoty ID nesm za nat velkm psmenem)IDs cannot start with an uppercase letterQDeclarativeCompilerHodnoty ID mus obsahovat pouze psmena,  slice nebo znaky _podtr~tka7IDs must contain only letters, numbers, and underscoresQDeclarativeCompilerpHodnoty ID mus za nat psmenem nebo znakem _podtr~tka*IDs must start with a letter or underscoreQDeclarativeCompiler*Neplatn nzev metodyIllegal method nameQDeclarativeCompiler2Neplatn nzev vlastnostiIllegal property nameQDeclarativeCompiler,Neplatn nzev signluIllegal signal nameQDeclarativeCompilerHNesprvn vymezen pYiYazen signlu'Incorrectly specified signal assignmentQDeclarativeCompiler.Neplatn umstn aliasInvalid alias locationQDeclarativeCompiler6Neplatn odkazovn na vlastnost alias. Odkazovn na vlastnost alias mus bt ur eno jako <id>, <id>.<vlastnost> nebo <id>.<vlastnost hodnoty>.<vlastnost>zInvalid alias reference. An alias reference must be specified as , . or ..QDeclarativeCompilervNeplatn odkazovn na vlastnost alias. Nelze najt ID "%1"/Invalid alias reference. Unable to find id "%1"QDeclarativeCompilerLNeplatn pYiYazen pYipojenho objektu"Invalid attached object assignmentQDeclarativeCompilerDNeplatn vymezen obsahu sou stky$Invalid component body specificationQDeclarativeCompiler6Neplatn vymezen sou stky"Invalid component id specificationQDeclarativeCompilerJNeplatn, proto~e przdn, hodnota IDInvalid empty IDQDeclarativeCompilerZNesprvn seskupen pYi pYstupu k vlastnostiInvalid grouped property accessQDeclarativeCompilerNeplatn pYiYazen vlastnosti: "%1" je vlastnost pouze pro  ten9Invalid property assignment: "%1" is a read-only propertyQDeclarativeCompilertNeplatn pYiYazen vlastnosti: o ekvn tYrozmrn vektor/Invalid property assignment: 3D vector expectedQDeclarativeCompilervNeplatn pYiYazen vlastnosti: o ekvna boolensk hodnota-Invalid property assignment: boolean expectedQDeclarativeCompilernNeplatn pYiYazen vlastnosti: o ekvno vymezen barvy+Invalid property assignment: color expectedQDeclarativeCompilerhNeplatn pYiYazen vlastnosti: o ekvn daj s datem*Invalid property assignment: date expectedQDeclarativeCompilerhNeplatn pYiYazen vlastnosti: o ekvn daj s datem.Invalid property assignment: datetime expectedQDeclarativeCompilerxNeplatn pYiYazen vlastnosti: o ekvna celo seln hodnota)Invalid property assignment: int expectedQDeclarativeCompiler\Neplatn pYiYazen vlastnosti: o ekvno  slo,Invalid property assignment: number expectedQDeclarativeCompilerNeplatn pYiYazen vlastnosti: o ekvn souYadnicov daj pro jeden bod+Invalid property assignment: point expectedQDeclarativeCompilerNeplatn pYiYazen vlastnosti: o ekvn parametr pro pravohelnk*Invalid property assignment: rect expectedQDeclarativeCompiler\Neplatn pYiYazen vlastnosti: o ekvn skript,Invalid property assignment: script expectedQDeclarativeCompilerpNeplatn pYiYazen vlastnosti: o ekvn daj s velikost*Invalid property assignment: size expectedQDeclarativeCompiler^Neplatn pYiYazen vlastnosti: o ekvn Yetzec,Invalid property assignment: string expectedQDeclarativeCompilerfNeplatn pYiYazen vlastnosti: o ekvn  asov daj*Invalid property assignment: time expectedQDeclarativeCompilernNeplatn pYiYazen vlastnosti: neplatn v tov hodnota0Invalid property assignment: unknown enumerationQDeclarativeCompilerNeplatn pYiYazen vlastnosti: o ekvna celo seln hodnota bez znamnka2Invalid property assignment: unsigned int expectedQDeclarativeCompilernNeplatn pYiYazen vlastnosti: Typ "%1" nen podporovn2Invalid property assignment: unsupported type "%1"QDeclarativeCompilerjNeplatn pYiYazen vlastnosti: o ekvna adresa (URL))Invalid property assignment: url expectedQDeclarativeCompiler8Neplatn vkldn vlastnostInvalid property nestingQDeclarativeCompiler.Neplatn typ vlastnostiInvalid property typeQDeclarativeCompiler6Neplatn pou~it vlastnostiInvalid property useQDeclarativeCompilerJNeplatn pou~it vlastnosti typu 'id'Invalid use of id propertyQDeclarativeCompilerDNeplatn pou~it jmennho prostoruInvalid use of namespaceQDeclarativeCompilerRNzvy metod nesm za nat velkm psmenem3Method names cannot begin with an upper case letterQDeclarativeCompiler8Vlastnost alias bez umstnNo property alias locationQDeclarativeCompiler^Pro vlastnost neexistuje ~dn pYipojen objektNon-existent attached objectQDeclarativeCompilerrNeplatn nzev pro pYipojenou vlastnost (typu 'attached')Not an attached property nameQDeclarativeCompiler<O ekvno pYiYazen vlastnostiProperty assignment expectedQDeclarativeCompilerJVlastnosti ji~ byla pYiYazena hodnota*Property has already been assigned a valueQDeclarativeCompiler\Nzvy vlastnost nesm za nat velkm psmenem5Property names cannot begin with an upper case letterQDeclarativeCompilerTVcensobn pYiYazen hodnoty k vlastnosti!Property value set multiple timesQDeclarativeCompilerVNzvy signlo nesm za nat velkm psmenem3Signal names cannot begin with an upper case letterQDeclarativeCompilerRO ekvno jednotliv pYiYazen vlastnosti#Single property assignment expectedQDeclarativeCompiler:NepYpustn pYiYazen objektuUnexpected object assignmentQDeclarativeCompiler6Hodnota ID nen jednozna nid is not uniqueQDeclarativeCompiler:Nepltn przdn adresa (URL)Invalid empty URLQDeclarativeComponentFcreateObject: Hodnota nen objektem$createObject: value is not an objectQDeclarativeComponentNelze provst ~dn pYiYazen, neboe neexistuje vchoz vlastnost pojmenovan jako "%1"+Cannot assign to non-existent property "%1"QDeclarativeConnectionsRSpojen: vkldan objekty nejsou povoleny'Connections: nested objects not allowedQDeclarativeConnections0Spojen: o ekvn skriptConnections: script expectedQDeclarativeConnections2Spojen: chyba ve skladbConnections: syntax errorQDeclarativeConnections2Transakce pouze pro  tenRead-only TransactionQDeclarativeEngine4Transakce SQL se nezdaYilaSQL transaction failedQDeclarativeEngine\SQL: Verze databze neodpovd o ekvan verziSQL: database version mismatchQDeclarativeEngineHVerzi %2 nelze pou~vat; je tYeba %1'Version mismatch: expected %1, found %2QDeclarativeEngineZ'executeSql' byl vyvoln mimo 'transaction()''executeSql called outside transaction()QDeclarativeEngineRTransakce: chyb callback (zavolat znovu)transaction: missing callbackQDeclarativeEngine@'back' lze pYidlit pouze jednouback is a write-once propertyQDeclarativeFlipableB'front' lze pYidlit pouze jednoufront is a write-once propertyQDeclarativeFlipable>"%1": ~dn takov adresY nen"%1": no such directoryQDeclarativeImportDatabase,- %1 jmennm prostorem- %1 is not a namespaceQDeclarativeImportDatabaseT- vkldan jmenn prostory nejsou povoleny- nested namespaces not allowedQDeclarativeImportDatabasefVelikost psmen v nzvu souboru neodpovd pro "%1" File name case mismatch for "%1"QDeclarativeImportDatabasevZaveden "%1" nem ~dn qmldir a nem ~dn jmenn prostor*import "%1" has no qmldir and no namespaceQDeclarativeImportDatabaseDje dvojzna n. Nalezen v %1 a v %2#is ambiguous. Found in %1 and in %2QDeclarativeImportDatabasedje dvojzna n. Nalezen v %1 ve verzi %2.%3 a %4.%54is ambiguous. Found in %1 in version %2.%3 and %4.%5QDeclarativeImportDatabase>je dolo~en pYkladem rekurzivnis instantiated recursivelyQDeclarativeImportDatabasenen typ is not a typeQDeclarativeImportDatabaseMstn adresYlocal directoryQDeclarativeImportDatabase8Modul "%1" nen nainstalovnmodule "%1" is not installedQDeclarativeImportDatabasePModul "%1" pYdavn modul "%2" nenalezen!module "%1" plugin "%2" not foundQDeclarativeImportDatabasePModul "%1" verze %2.%3 nen nainstalovn*module "%1" version %2.%3 is not installedQDeclarativeImportDatabase\Nelze nahrt pYdavn modul pro modul "%1": %2+plugin cannot be loaded for module "%1": %2QDeclarativeImportDatabaseKlvesov navdn (KeyNavigation) je dostupn pouze pomoc pYipojench vlastnost7KeyNavigation is only available via attached properties!QDeclarativeKeyNavigationAttachedhKeys je dostupn pouze pomoc pYipojench vlastnost.Keys is only available via attached propertiesQDeclarativeKeysAttachedvPYipojen vlastnost LayoutDirection pracuje jen s polo~kami7LayoutDirection attached property only works with Items#QDeclarativeLayoutMirroringAttachedLayoutMirroring je dostupn pouze prostYednictvm pYipojench vlastnost9LayoutMirroring is only available via attached properties#QDeclarativeLayoutMirroringAttachedVListElement: nelze obsahovat vkldan prvky+ListElement: cannot contain nested elementsQDeclarativeListModelTListElement: nelze pou~vat vlastnost "ID".ListElement: cannot use reserved "id" propertyQDeclarativeListModelrListElement: nelze pou~vat skript pro hodnotu vlastnosti1ListElement: cannot use script for property valueQDeclarativeListModelNListModel: Vlastnost '%1' nen vymezena"ListModel: undefined property '%1'QDeclarativeListModelPpYipojit (append): Hodnota nen objektemappend: value is not an objectQDeclarativeListModel`vlo~it (insert): Index %1 je mimo platnou oblastinsert: index %1 out of rangeQDeclarativeListModelLvlo~it (insert): Hodnota nen objekteminsert: value is not an objectQDeclarativeListModelPpYesunout (move): je mimo platnou oblastmove: out of rangeQDeclarativeListModelfodstranit (remove): Index %1 je mimo platnou oblastremove: index %1 out of rangeQDeclarativeListModel^nastavit (set): Index %1 je mimo platnou oblastset: index %1 out of rangeQDeclarativeListModelJnastavit (set): Hodnota nen objektemset: value is not an objectQDeclarativeListModel^Nahrvn neviditelnch prvko nen podporovno.4Loader does not support loading non-visual elements.QDeclarativeLoaderRPYi slo~it promn nelze zachovat vzhled5Unable to preserve appearance under complex transformQDeclarativeParentAnimationhPYi nejednotn zmn velikosti nelze zachovat vzhled5Unable to preserve appearance under non-uniform scaleQDeclarativeParentAnimationZPYi zmn velikosti s 0 nelze zachovat vzhled.Unable to preserve appearance under scale of 0QDeclarativeParentAnimationRPYi slo~it promn nelze zachovat vzhled5Unable to preserve appearance under complex transformQDeclarativeParentChangehPYi nejednotn zmn velikosti nelze zachovat vzhled5Unable to preserve appearance under non-uniform scaleQDeclarativeParentChangeZPYi zmn velikosti s 0 nelze zachovat vzhled.Unable to preserve appearance under scale of 0QDeclarativeParentChange,O ekvn typ parametruExpected parameter typeQDeclarativeParser.O ekvn typ vlastnostiExpected property typeQDeclarativeParser*O ekvan symbol `%1'Expected token `%1'QDeclarativeParser(O ekvan nzev typuExpected type nameQDeclarativeParserbIdentifiktor nemo~e za nat s  selnm pYeklepem,Identifier cannot start with numeric literalQDeclarativeParserNeplatn znakIllegal characterQDeclarativeParser8Neplatn nikov posloupnostIllegal escape sequenceQDeclarativeParserLNeplatn skladba exponencilnho  sla%Illegal syntax for exponential numberQDeclarativeParserHNeplatn nikov posloupnost unicodeIllegal unicode escape sequenceQDeclarativeParser>Neplatn daj o ID pYi zavdnInvalid import qualifier IDQDeclarativeParserNNeplatn modifiktor pro typ vlastnostiInvalid property type modifierQDeclarativeParserTNeplatn pYznak '%0' u regulrnho vrazu$Invalid regular expression flag '%0'QDeclarativeParsernDeklarace JavaScriptu nen mimo prvek skriptu pYpustn-JavaScript declaration outside Script elementQDeclarativeParserNZaveden knihovny vy~aduje daj o verzi!Library import requires a versionQDeclarativeParserTVcensobn pYiYazen hodnoty k vlastnosti!Property value set multiple timesQDeclarativeParsern"Pouze pro  ten" nen na tomto mst jeat podporovnoReadonly not yet supportedQDeclarativeParsernZamluven nzev "Qt" nemo~e bt pou~it jako kvalifikant1Reserved name "Qt" cannot be used as an qualifierQDeclarativeParser|Kvalifikanty zadan pro zaveden skriptu mus bt jednozna n.(Script import qualifiers must be unique.QDeclarativeParserZZaveden skriptu vy~aduje daj o kvalifikantu"Script import requires a qualifierQDeclarativeParser Chyba ve skladb Syntax errorQDeclarativeParserHNeuzavYen poznmka na konci souboruUnclosed comment at end of fileQDeclarativeParserBNeuzavYen Yetzec na konci YdkuUnclosed string at end of lineQDeclarativeParserTNeo ekvan modifiktor pro typ vlastnosti!Unexpected property type modifierQDeclarativeParser.Neo ekvan symbol `%1'Unexpected token `%1'QDeclarativeParser~NeuzavYen posloupnost se zptnm lomtkem u regulrnho vrazu2Unterminated regular expression backslash sequenceQDeclarativeParserdNeuzavYen tYda u neuzavYenho regulrnho vrazu%Unterminated regular expression classQDeclarativeParser4NeuzavYen regulrn vraz'Unterminated regular expression literalQDeclarativeParser<Nelze nastavit dobu trvn < 0Cannot set a duration of < 0QDeclarativePauseAnimation"Nelze otevYt: %1Cannot open: %1QDeclarativePixmap6Chba pYi dekdovn: %1: %2Error decoding: %1: %2QDeclarativePixmapnObrazov data se od poskytovatele nepodaYilo zskat: %1%Failed to get image from provider: %1QDeclarativePixmap<Nelze nastavit dobu trvn < 0Cannot set a duration of < 0QDeclarativePropertyAnimationNelze provst ~dn pYiYazen, neboe neexistuje vchoz vlastnost pojmenovan jako "%1"+Cannot assign to non-existent property "%1"QDeclarativePropertyChangesvVlastnost '%1" je pouze pro  ten a nelze ji proto pYiYadit(Cannot assign to read-only property "%1"QDeclarativePropertyChangesPropertyChanges nepodporuje vytvYen objekto, kter jsou pYiYazeny jednomu stavu.APropertyChanges does not support creating state-specific objects.QDeclarativePropertyChanges`Zstupce kurzoru se nepodaYilo dolo~it pYkladem%Could not instantiate cursor delegateQDeclarativeTextInputJNepodaYilo se nahrt zstupce kurzoruCould not load cursor delegateQDeclarativeTextInput %1 %2%1 %2QDeclarativeTypeLoaderNJmenn prostor %1 nelze pou~t jako typ%Namespace %1 cannot be used as a typeQDeclarativeTypeLoader(Skript %1 nedostupnScript %1 unavailableQDeclarativeTypeLoader"Typ %1 nedostupnType %1 unavailableQDeclarativeTypeLoaderbVlastnosti signlu %1 nelze pYiYadit ~dn objekt-Cannot assign an object to signal property %1QDeclarativeVME^Vlastnosti rozhran nelze pYiYadit ~dn objekt*Cannot assign object to interface propertyQDeclarativeVMEVPYiYazen objektu k seznamom nen pYpustnCannot assign object to listQDeclarativeVMETyp objektu %1 nelze pYiYadit, proto~e neexistuje ~dn vchoz metoda3Cannot assign object type %1 with no default methodQDeclarativeVMERHodnotu '%1' nelze pYiYadit vlastnosti %2%Cannot assign value %1 to property %2QDeclarativeVMENelze vytvoYit ~dn spojen mezi signlem %1 a zdYkou %2, proto~e se k sob nehod0Cannot connect mismatched signal/slot %1 %vs. %2QDeclarativeVMEhVlastnosti nelze nastavit na %1, proto~e jsou 'null')Cannot set properties on %1 as it is nullQDeclarativeVME~NepodaYilo se vytvoYit ~dn pYipojen objekt (typu 'attached') Unable to create attached objectQDeclarativeVMEVNepodaYilo se vytvoYit ~dn objekt typu %1"Unable to create object of type %1QDeclarativeVMEPSou stka zstupce mus bt typu 'item'.%Delegate component must be Item type.QDeclarativeVisualDataModelZQt bylo sestaveno bez podpory pro xmlpatterns,Qt was built without support for xmlpatternsQDeclarativeXmlListModelNVyhledvn XmlRole nesm za nat s '/'(An XmlRole query must not start with '/'QDeclarativeXmlListModelRolejVyhledvn XmlListModel mus za nat s '/' nebo "//"1An XmlListModel query must start with '/' or "//"QDeclarativeXmlRoleList QDialQDialQDialPosuvnk SliderHandleQDialRychlomr SpeedoMeterQDial HotovoDoneQDialogCo je toto? What's This?QDialog&Zruait&CancelQDialogButtonBox&ZavYt&CloseQDialogButtonBox&Ne&NoQDialogButtonBox&OK&OKQDialogButtonBox&Ulo~it&SaveQDialogButtonBox&Ano&YesQDialogButtonBox ZruaitAbortQDialogButtonBox Pou~tApplyQDialogButtonBox ZruaitCancelQDialogButtonBox ZavYtCloseQDialogButtonBox$ZavYt bez ulo~enClose without SavingQDialogButtonBoxOdmtnoutDiscardQDialogButtonBoxNeukldat Don't SaveQDialogButtonBoxNpovdaHelpQDialogButtonBoxPYehl~etIgnoreQDialogButtonBoxN&e, ~dn N&o to AllQDialogButtonBoxOKOKQDialogButtonBoxOtevYtOpenQDialogButtonBox VrtitResetQDialogButtonBoxObnovit vchozRestore DefaultsQDialogButtonBoxOpakovatRetryQDialogButtonBox Ulo~itSaveQDialogButtonBoxUlo~it vaeSave AllQDialogButtonBoxAno, &vae Yes to &AllQDialogButtonBoxDatum zmny Date Modified QDirModelDruhMatch OS X FinderKind QDirModel NzevName QDirModelVelikostSize QDirModelTypAll other platformsType QDirModel ZavYtClose QDockWidget Vplout do paneluDock QDockWidget PloutFloat QDockWidgetMnLessQDoubleSpinBoxVceMoreQDoubleSpinBox&OK&OK QErrorMessageBToto hlaen &ukzat jeat jednou&Show this message again QErrorMessage&Hlaen o odladn:Debug Message: QErrorMessageOsudov chyba: Fatal Error: QErrorMessageVarovn:Warning: QErrorMessageD%1 se nepodaYilo zYdit pro vstupCannot create %1 for outputQFileD%1 se nepodaYilo otevYt pro  tenCannot open %1 for inputQFile>NepodaYilo se otevYt pro zpisCannot open for outputQFile>Nelze odstranit zdrojov souborCannot remove source fileQFile4Clov soubor ji~ existujeDestination file existsQFile@Datov blok se nepodaYilo zapsatFailure to write blockQFileNen dostupn ~dn souborov stroj nebo stroj nepodporuje UnMapExtensionBNo file engine available or engine does not support UnMapExtensionQFile`NepYejmenuje posloupn soubor pomoc kopie bloku0Will not rename sequential file using block copyQFile%1 AdresY se nepodaYilo nalzt. OvYte, prosm, ~e byl zadn sprvn nzev adresYe.K%1 Directory not found. Please verify the correct directory name was given. QFileDialog%1 Soubor se nepodaYilo nalzt. OvYte, prosm, ~e byl zadn sprvn nzev souboru.A%1 File not found. Please verify the correct file name was given. QFileDialogXSoubor %1 ji~ existuje. Chcete jej nahradit?-%1 already exists. Do you want to replace it? QFileDialog&Vybrat&Choose QFileDialog&Smazat&Delete QFileDialog&Nov slo~ka &New Folder QFileDialog&OtevYt&Open QFileDialog&PYejmenovat&Rename QFileDialog&Ulo~it&Save QFileDialogt'%1' je chrnn proti zpisu. PYesto chcete soubor smazat?9'%1' is write protected. Do you want to delete it anyway? QFileDialogPYezdvkaAlias QFileDialog&Vaechny soubory (*) All Files (*) QFileDialog*Vaechny soubory (*.*)All Files (*.*) QFileDialogFJste si jist, ~e %1 chcete smazat?!Are sure you want to delete '%1'? QFileDialogZptBack QFileDialogHZmnit na re~im s podrobnm pohledemChange to detail view mode QFileDialogFZmnit na re~im pohledu se seznamemChange to list view mode QFileDialog:AdresY se nepodaYilo smazat.Could not delete directory. QFileDialog*VytvoYit novou slo~kuCreate New Folder QFileDialog*VytvoYit novou slo~kuCreate a New Folder QFileDialogPodrobn pohled Detail View QFileDialogAdresYe Directories QFileDialogAdresY: Directory: QFileDialog Diskov jednotkaDrive QFileDialog SouborFile QFileDialogNzev &souboru: File &name: QFileDialog Souborov slo~ka File Folder QFileDialogSoubory typu:Files of type: QFileDialogNajt adresYFind Directory QFileDialog Slo~kaFolder QFileDialogDopYeduForward QFileDialogJt zptGo back QFileDialogJt dopYedu Go forward QFileDialog8Jt do rodi ovskho adresYeGo to the parent directory QFileDialog$Pohled se seznamem List View QFileDialogHledat v:Look in: QFileDialogMoj po ta  My Computer QFileDialogNov slo~ka New Folder QFileDialogOtevYtOpen QFileDialog"NadYazen adresYParent Directory QFileDialog(Naposledy navatven Recent Places QFileDialogOdstranitRemove QFileDialogUlo~it jakoSave As QFileDialogZkratkaShortcut QFileDialogUkzat Show  QFileDialog,&Ukzat skryt souboryShow &hidden files QFileDialogNeznmUnknown QFileDialog %1 GB%1 GBQFileSystemModel %1 KB%1 KBQFileSystemModel %1 MB%1 MBQFileSystemModel %1 TB%1 TBQFileSystemModel%1 byt(o) %1 byte(s)QFileSystemModel%1 byto%1 bytesQFileSystemModel<b>Nzev "%1" nelze pou~t.</b><p>Zkuste pou~t jin nzev, s menam po tem znako nebo bez zvlatnch znako.oThe name "%1" can not be used.

Try using another name, with fewer characters or no punctuations marks.QFileSystemModelPo ta ComputerQFileSystemModelDatum zmny Date ModifiedQFileSystemModel,Neplatn nzev souboruInvalid filenameQFileSystemModelDruhMatch OS X FinderKindQFileSystemModelMoj po ta  My ComputerQFileSystemModel NzevNameQFileSystemModelVelikostSizeQFileSystemModelTypAll other platformsTypeQFileSystemModelVaechnaAny QFontDatabaseArabskArabic QFontDatabaseArmnskArmenian QFontDatabaseBenglskBengali QFontDatabase  ernBlack QFontDatabase Tu nBold QFontDatabaseCyrilskCyrillic QFontDatabasePolotu nDemi QFontDatabasePolotu n Demi Bold QFontDatabaseDevanagari Devanagari QFontDatabaseGruznskGeorgian QFontDatabase XeckGreek QFontDatabaseGujaratiGujarati QFontDatabaseGurmukhiGurmukhi QFontDatabaseHebrejskHebrew QFontDatabaseKurzvaItalic QFontDatabaseJaponskJapanese QFontDatabaseKannadaKannada QFontDatabaseKhmerskKhmer QFontDatabaseKorejskKorean QFontDatabase LaoskLao QFontDatabaseLatinskLatin QFontDatabase JemnLight QFontDatabaseMalayalam Malayalam QFontDatabaseMyanmarMyanmar QFontDatabaseN'KoN'Ko QFontDatabaseNormlnNormal QFontDatabaseSklonnOblique QFontDatabaseOgamskOgham QFontDatabase OriyaOriya QFontDatabase RunovRunic QFontDatabase*Zjednoduaen  natinaSimplified Chinese QFontDatabaseSinhlskSinhala QFontDatabase SymbolSymbol QFontDatabase SyrskSyriac QFontDatabaseTamilskTamil QFontDatabase TeluguTelugu QFontDatabase ThaanaThaana QFontDatabaseThajskThai QFontDatabaseTibetskTibetan QFontDatabase"Tradi n  natinaTraditional Chinese QFontDatabaseVtnamsk Vietnamese QFontDatabase &Psmo&Font QFontDialog&Velikost&Size QFontDialog&Podtrhnout &Underline QFontDialog EfektyEffects QFontDialogDruh ps&ma Font st&yle QFontDialog VzorekSample QFontDialogVybrat psmo Select Font QFontDialogPYe&akrtnout Stri&keout QFontDialogZposob &psanWr&iting System QFontDialog>Zmna adresYe se nezdaYila: %1Changing directory failed: %1QFtp8Spojen s po ta em navznoConnected to hostQFtp,Spojeno s po ta em %1Connected to host %1QFtpHSpojen s po ta em se nezdaYilo: %1Connecting to host failed: %1QFtp Spojen ukon enoConnection closedQFtp4Odmtnuto spojen pro data&Connection refused for data connectionQFtp@Spojen s po ta em %1 odmtnutoConnection refused to host %1QFtpn asov limit pro spojen s po ta em '%1' byl pYekro enConnection timed out to host %1QFtp*Spojen s %1 ukon enoConnection to %1 closedQFtpFVytvoYen adresYo se nezdaYilo: %1Creating directory failed: %1QFtp@Sta~en souboru se nezdaYilo: %1Downloading file failed: %1QFtp,Po ta %1 byl nalezen Host %1 foundQFtp>Po ta %1 se nepodaYilo nalztHost %1 not foundQFtp&Po ta byl nalezen Host foundQFtp>Obsah adresYo nelze ukzat: %1Listing directory failed: %1QFtp6PYihlaen se nezdaYilo: %1Login failed: %1QFtp}dn spojen Not connectedQFtpHOdstrann adresYe se nezdaYilo: %1Removing directory failed: %1QFtpFOdstrann souboru se nezdaYilo: %1Removing file failed: %1QFtpNeznm chyba Unknown errorQFtp@Nahrn souboru se nezdaYilo: %1Uploading file failed: %1QFtpPYepnoutToggle QGroupBoxRNebyl zadn nzev pro hostitelsk po ta No host name given QHostInfoNeznm chyba Unknown error QHostInfo6NepodaYilo se najt po ta Host not foundQHostInfoAgentLNeplatn nzev pro hostitelsk po ta Invalid hostnameQHostInfoAgentRNebyl zadn nzev pro hostitelsk po ta No host name givenQHostInfoAgent$Neznm typ adresyUnknown address typeQHostInfoAgentNeznm chyba Unknown errorQHostInfoAgent$Neznm chyba (%1)Unknown error (%1)QHostInfoAgent,Po~adovna autentizaceAuthentication requiredQHttp8Spojen s po ta em navznoConnected to hostQHttp,Spojeno s po ta em %1Connected to host %1QHttp Spojen ukon enoConnection closedQHttp,Spojen bylo odmtnutoConnection refusedQHttppSpojen bylo odmtnuto (nebo byl pYekro en  asov limit)!Connection refused (or timed out)QHttp*Spojen s %1 ukon enoConnection to %1 closedQHttp&Data jsou poakozenaData corruptedQHttppPYi psan odpovdi vstupnmu zaYzen se vyskytla chyba Error writing response to deviceQHttp,HTTP dotaz se nezdaYilHTTP request failedQHttpPo~adovan HTTPS spojen nelze vytvoYit, proto~e neexistuje ~dn SSL podpora:HTTPS connection requested but SSL support not compiled inQHttp,Po ta %1 byl nalezen Host %1 foundQHttp>Po ta %1 se nepodaYilo nalztHost %1 not foundQHttp&Po ta byl nalezen Host foundQHttpPHostitelsk po ta po~aduje autentizaciHost requires authenticationQHttptObsah (chunked body - rozkouskovan tlo) HTTP je neplatnInvalid HTTP chunked bodyQHttpDHlavi ka HTTP odpovdi nen platnInvalid HTTP response headerQHttpbPro spojen nebyl nastaven ~dn po ta - serverNo server set to connect toQHttp8Po~adovna proxy autentizaceProxy authentication requiredQHttpBProxy server po~aduje autentizaciProxy requires authenticationQHttp(Po~adavek byl zruaenRequest abortedQHttpXBhem startu SSL protokolu se vyskytla chybaSSL handshake failedQHttpDServer neo ekvan uzavYel spojen%Server closed connection unexpectedlyQHttp4Neznm zposob autentizaceUnknown authentication methodQHttpNeznm chyba Unknown errorQHttp4Byl zadn neznm protokolUnknown protocol specifiedQHttp8Neplatn daj o dlce obsahuWrong content lengthQHttp,Po~adovna autentizaceAuthentication requiredQHttpSocketEngineF}dn HTTP odpov od proxy serveru(Did not receive HTTP response from proxyQHttpSocketEngineDChyba pYi spojen s proxy serverem#Error communicating with HTTP proxyQHttpSocketEnginexChyba pYi vyhodnocen autentiza nho po~adavku proxy serveru/Error parsing authentication request from proxyQHttpSocketEngineLProxy server pYed asn ukon il spojen#Proxy connection closed prematurelyQHttpSocketEngineHProxy server odmtl navzn spojenProxy connection refusedQHttpSocketEngine6Proxy server odmtl spojenProxy denied connectionQHttpSocketEnginenPYi spojen s proxy serverem byl pYekro en  asov limit!Proxy server connection timed outQHttpSocketEngineLNepodaYilo se najt ~dn proxy serverProxy server not foundQHttpSocketEngineLNepodaYilo se spustit ~dnou transakciCould not start transaction QIBaseDriverPNepodaYilo se otevYt spojen s databzError opening database QIBaseDriver<Transakci se nepodaYilo zapsatUnable to commit transaction QIBaseDriver>Transakci se nepodaYilo zvrtitUnable to rollback transaction QIBaseDriver<PYidlen pYkazu se nezdaYiloCould not allocate statement QIBaseResultdNepodaYilo se zskat ~dn popis vstupnho pYkazu"Could not describe input statement QIBaseResultPNepodaYilo se zskat ~dn popis pYkazuCould not describe statement QIBaseResultHDala prvek se nepodaYilo vyzvednoutCould not fetch next item QIBaseResult0NepodaYilo se najt poleCould not find array QIBaseResult>NepodaYilo se pYe st data poleCould not get array data QIBaseResultjPo~adovan informace k vyhledvn nejsou k dispoziciCould not get query info QIBaseResultTK dispozici nen ~dn informace k pYkazuCould not get statement info QIBaseResult<PYkaz se nepodaYilo pYipravitCould not prepare statement QIBaseResultLNepodaYilo se spustit ~dnou transakciCould not start transaction QIBaseResult6PYkaz se nepodaYilo zavYtUnable to close statement QIBaseResult<Transakci se nepodaYilo zapsatUnable to commit transaction QIBaseResultBNepodaYilo se vytvoYit ~dn BLOBUnable to create BLOB QIBaseResult6Dotaz se nepodaYilo provstUnable to execute query QIBaseResult4NepodaYilo se otevYt BLOBUnable to open BLOB QIBaseResult4BLOB se nepodaYilo pYe stUnable to read BLOB QIBaseResult2NepodaYilo se zapsat BLOBUnable to write BLOB QIBaseResultVNa zaYzen nen ~dn voln lo~n prostorNo space left on device QIODevicehNepodaYilo se najt ~dn takov soubor nebo adresYNo such file or directory QIODevicePYstup odepYenPermission denied QIODevice>PYlia mnoho otevYench souboroToo many open files QIODeviceNeznm chyba Unknown error QIODeviceFEPFEP QInputContext.Mac OS X-vstupn metodaMac OS X input method QInputContext,S60 FEP-vstupn metodaS60 FEP input method QInputContext,Windows-vstupn metodaWindows input method QInputContextXIMXIM QInputContext$XIM-vstupn metodaXIM input method QInputContext Zadejte hodnotu:Enter a value: QInputDialog@'%1' je neplatn objekt ELF (%2)"'%1' is an invalid ELF object (%2)QLibrary('%1' nen objekt ELF'%1' is not an ELF objectQLibrary2'%1' nen objekt ELF (%2)'%1' is not an ELF object (%2)QLibrary8Knihovnu %1 nelze nahrt: %2Cannot load library %1: %2QLibraryDSymbol "%1" nelze v %2 vyYeait: %3$Cannot resolve symbol "%1" in %2: %3QLibrary:Knihovnu %1 nelze vyjmout: %2Cannot unload library %1: %2QLibraryVOvYovac data pYdavnho nesouhlas v '%1')Plugin verification data mismatch in '%1'QLibrary\Soubor '%1' nen platnm pYdavnm modulem Qt.'The file '%1' is not a valid Qt plugin.QLibraryPYdavn modul '%1' pou~v neslu itelnou Qt knihovnu. (%2.%3.%4) [%5]=The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]QLibraryPYdavn modul '%1' pou~v neslu itelnou Qt knihovnu. (Knihovny vytvoYen v re~imu ladn a vydn nemohou bt pou~vny spole n.)WThe plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)QLibraryPYdavn modul '%1' pou~v neslu itelnou Qt knihovnu. PotYebn byl zvlatn kl pro sestaven "%2", obdr~en "%3"OThe plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"QLibraryNNepodaYilo se nalzt sdlenou knihovnu.!The shared library was not found.QLibraryNeznm chyba Unknown errorQLibrary&Koprovat&Copy QLineEdit&Vlo~it&Paste QLineEdit &Znovu&Redo QLineEdit &Zpt&Undo QLineEdit&VyjmoutCu&t QLineEdit SmazatDelete QLineEditVybrat vae Select All QLineEdit2%1: Adresa se ji~ pou~v%1: Address in use QLocalServer %1: Chybn nzev%1: Name error QLocalServer&%1: PYstup odepYen%1: Permission denied QLocalServer(%1: Neznm chyba %2%1: Unknown error %2 QLocalServerPYstup odepYen%1: Access denied QLocalSocket"%1: Chyba spojen%1: Connection error QLocalSocket4%1: Spojen bylo odmtnuto%1: Connection refused QLocalSocket:%1: Datagram je pYlia velik%1: Datagram too large QLocalSocket$%1: Neplatn nzev%1: Invalid name QLocalSocketT%1: Spojen bylo protja stranou uzavYeno%1: Remote closed QLocalSocket@%1: Chyba pYi pYstupu k socketu%1: Socket access error QLocalSocketV%1: PYekro en  asu pYi operaci se socketem%1: Socket operation timed out QLocalSocketJ%1: Chyba socketu - pot~e se zdrojem%1: Socket resource error QLocalSocketZ%1: Tato operace se socketem nen podporovna)%1: The socket operation is not supported QLocalSocket"%1: Neznm chyba%1: Unknown error QLocalSocket(%1: Neznm chyba %2%1: Unknown error %2 QLocalSocket>Transakci se nepodaYilo spustitUnable to begin transaction QMYSQLDriver<Transakci se nepodaYilo zapsatUnable to commit transaction QMYSQLDriver:NepodaYilo se navzat spojenUnable to connect QMYSQLDriverTNepodaYilo se otevYt spojen s databz 'Unable to open database ' QMYSQLDriver>Transakci se nepodaYilo zvrtitUnable to rollback transaction QMYSQLDriverJVstupn hodnoty se nepodaYilo spojitUnable to bind outvalues QMYSQLResult8Hodnotu se nepodaYilo spojitUnable to bind value QMYSQLResult2Dala dotaz nelze provstUnable to execute next query QMYSQLResult6Dotaz se nepodaYilo provstUnable to execute query QMYSQLResult8PYkaz se nepodaYilo provstUnable to execute statement QMYSQLResultDNepodaYilo se nathnout ~dn dataUnable to fetch data QMYSQLResult<PYkaz se nepodaYilo pYipravitUnable to prepare statement QMYSQLResultFPYkaz se nepodaYilo znovu nastavitUnable to reset statement QMYSQLResult6Dala vsledek nelze ulo~itUnable to store next result QMYSQLResult:Vsledek se nepodaYilo ulo~itUnable to store result QMYSQLResultJVsledky pYkazu se nepodaYilo ulo~it!Unable to store statement results QMYSQLResult(Bez nzvu) (Untitled)QMdiArea%1 - [%2] %1 - [%2] QMdiSubWindow&ZavYt&Close QMdiSubWindowPo&sunout&Move QMdiSubWindow&Obnovit&Restore QMdiSubWindow Zmnit &velikost&Size QMdiSubWindow - [%1]- [%1] QMdiSubWindow ZavYtClose QMdiSubWindowNpovdaHelp QMdiSubWindowZv&tait Ma&ximize QMdiSubWindowZvtaitMaximize QMdiSubWindowMenuMenu QMdiSubWindowZmen&ait Mi&nimize QMdiSubWindowZmenaitMinimize QMdiSubWindowObnovitRestore QMdiSubWindowObnovit Restore Down QMdiSubWindowNavinoutShade QMdiSubWindow"Zostat v &popYed Stay on &Top QMdiSubWindowOdvinoutUnshade QMdiSubWindow ZavYtCloseQMenuProvstExecuteQMenuOtevYtOpenQMenu innostiActionsQMenuBar,Rohov nstrojov pruhCorner ToolbarQMenuBarl<h3>O Qt</h3><p>Tento program pou~v Qt-verze %1.</p>8

About Qt

This program uses Qt version %1.

 QMessageBox <p>Qt je sadou softwarovch nstrojo C++ ur ench pro vvoj aplikac napY platformami.</p><p>Qt poskytuje snadnou pYenositelnost a jednotn zdrojov kd pro MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux a vaechny hlavn prodejn varianty systmu Unix. Qt je rovn~ dostupn pro vestavn zaYzen jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupn pod tYemi rozdlnmi licencemi navr~enmi tak, aby vyhovly potYebm naaich roznch u~ivatelo.</p>Qt s naa obchodn licen n smlouvou je vhodn pro vvoj soukromho/obchodnho software, kde nechcete sdlet jakkoli zdrojov kd se tYetmi stranami, nebo jinak Ye eno, kdy~ nemo~ete vyhovt podmnkm GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt s licenc GNU LGPL ve verzi 2.1 je vhodn pro vvoj Qt aplikac (soukromch nebo s otevYenm zdrojovm kdem) za pYedpokladu, ~e mo~ete souhlasit s po~adavky a podmnkami GNU LGPL verze 2.1.</p><p>Qt s licenc GNU General Public License ve verzi 3.0 je vhodn pro vvoj aplikac Qt, u nich~ si pYejete pou~t takovou aplikaci ve spojen se software, kter podlh po~adavkom GNU GPL ve verzi 3.0, nebo kde jste jinak ochotni souhlasit s podmnkami GNU GPL ve verzi 3.0.</p><p>Vce informac najdete na <a href="http://qt.digia.com/product/licensing">qt.digia.com/product/licensing</a>.</p><p>Autorsk prvo (C) 2012 Digia Plc a/nebo jej dceYinn() spole nost(i).</p><p>Qt je vrobkem spole nosti Digia. Dala informace najdete na <a href="http://qt.digia.com/">qt.digia.com</a>.</p>

Qt is a C++ toolkit for cross-platform application development.

Qt provides single-source portability across MS Windows, Mac OS X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.

Qt is available under three different licensing options designed to accommodate the needs of our various users.

Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.

Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.

Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.

Please see qt.digia.com/product/licensing for an overview of Qt licensing.

Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).

Qt is a Digia product. See qt.digia.com for more information.

 QMessageBoxO QtAbout Qt QMessageBoxNpovdaHelp QMessageBox(Skrt podrobnosti...Hide Details... QMessageBoxOKOK QMessageBox*Ukzat podrobnosti...Show Details... QMessageBox(Zvolit zposob vstupu Select IMQMultiInputContext@PYepna pro vce zposobo vstupuMultiple input method switcherQMultiInputContextPluginPYepna pro vce zposobo vstupu, kter pou~v souvisejc nabdku textovho prvkuMMultiple input method switcher that uses the context menu of the text widgetsQMultiInputContextPluginPNa tomto portu ji~ naslouch jin socket4Another socket is already listening on the same portQNativeSocketEnginexVyzkouaelo se pou~t IPv6 socket na systmu bez podpory IPv6=Attempt to use IPv6 socket on a platform with no IPv6 supportQNativeSocketEngine,Spojen bylo odmtnutoConnection refusedQNativeSocketEngineL asov limit pro spojen byl pYekro enConnection timed outQNativeSocketEngineNDatagram byl pro odesln pYlia velikDatagram was too large to sendQNativeSocketEngine>Clov po ta je nedosa~itelnHost unreachableQNativeSocketEngine6Neplatn deskriptor socketuInvalid socket descriptorQNativeSocketEngineSeov chyba Network errorQNativeSocketEngine\ asov limit pro seovou operaci byl pYekro enNetwork operation timed outQNativeSocketEngine(Se je nedosa~itelnNetwork unreachableQNativeSocketEngine&Operace mimo socketOperation on non-socketQNativeSocketEngine8Nejsou dostupn ~dn zdrojeOut of resourcesQNativeSocketEnginePYstup odepYenPermission deniedQNativeSocketEngineHProtokol tohoto typu nen podporovnProtocol type not supportedQNativeSocketEngine(Adresa nen dostupnThe address is not availableQNativeSocketEngine$Adresa je chrnnaThe address is protectedQNativeSocketEngine8Uveden adresa se u~ pou~v#The bound address is already in useQNativeSocketEngine\Tuto operaci nelze s tmto typem proxy provst,The proxy type is invalid for this operationQNativeSocketEngine@Vzdlen po ta uzavYel spojen%The remote host closed the connectionQNativeSocketEngineRSocket pro vysln se nepodaYilo spustit%Unable to initialize broadcast socketQNativeSocketEnginePNeblokujc socket se nepodaYilo spustit(Unable to initialize non-blocking socketQNativeSocketEngine:Zprvu se nepodaYilo pYijmoutUnable to receive a messageQNativeSocketEngine:NepodaYilo se odeslat hlaenUnable to send a messageQNativeSocketEngine(NepodaYilo se zapsatUnable to writeQNativeSocketEngineNeznm chyba Unknown errorQNativeSocketEngine8Nepodporovan socket operaceUnsupported socket operationQNativeSocketEngine0%1 se nepodaYilo otevYtError opening %1QNetworkAccessCacheBackend Neplatn URI: %1Invalid URI: %1QNetworkAccessDataBackend^Vzdlen po ta pYed asn ukon il spojen s %13Remote host closed the connection prematurely on %1QNetworkAccessDebugPipeBackend,Chyba socketu u %1: %2Socket error on %1: %2QNetworkAccessDebugPipeBackendTPYi zpisu do souboru %1: %2 nastala chybaWrite error writing to %1: %2QNetworkAccessDebugPipeBackendH%1 nelze otevYt: Jedn se o adresY#Cannot open %1: Path is a directoryQNetworkAccessFileBackend8%1 se nepodaYilo otevYt: %2Error opening %1: %2QNetworkAccessFileBackendRPYi  ten ze souboru %1 nastala chyba: %2Read error reading from %1: %2QNetworkAccessFileBackendRPo~adavek na otevYen souboru pYes se %1%Request for opening non-local file %1QNetworkAccessFileBackendTPYi zpisu do souboru %1: %2 nastala chybaWrite error writing to %1: %2QNetworkAccessFileBackendH%1 nelze otevYt: Jedn se o adresYCannot open %1: is a directoryQNetworkAccessFtpBackendLPYi stahovn %1 se vyskytla chyba: %2Error while downloading %1: %2QNetworkAccessFtpBackendLPYi nahrvn %1 se vyskytla chyba: %2Error while uploading %1: %2QNetworkAccessFtpBackendpPYihlaen do %1 se nezdaYilo: Je po~adovna autentizace0Logging in to %1 failed: authentication requiredQNetworkAccessFtpBackendZNepodaYilo se najt ~dn vhodn proxy serverNo suitable proxy foundQNetworkAccessFtpBackendZNepodaYilo se najt ~dn vhodn proxy serverNo suitable proxy foundQNetworkAccessHttpBackend8PYstup k sti nen dovolen.Network access is disabled.QNetworkAccessManagervPYi stahovn %1 se vyskytla chyba - Odpov serveru je: %2)Error downloading %1 - server replied: %2 QNetworkReply6Chyba pYi spojen pYes se.Network session error. QNetworkReply.Protokol "%1" nen znmProtocol "%1" is unknown QNetworkReply(Se do asn vypadla.Temporary network failure. QNetworkReply>Chyba spuatn podporn vrstvy.backend start error. QNetworkReply(Operace byla zruaenaOperation canceledQNetworkReplyImpl&Neplatn nastaven.Invalid configuration.QNetworkSession<Chyba pYi touln se (roaming) Roaming errorQNetworkSessionPrivateImplvTouln se (roaming) bylo bu zruaeno, nebo zde nen mo~n.'Roaming was aborted or is not possible.QNetworkSessionPrivateImplvSpojen bylo zruaeno bu u~ivatelem nebo opera nm systmem!Session aborted by user or systemQNetworkSessionPrivateImplZPo~adovan operace nen systmem podporovna.7The requested operation is not supported by the system.QNetworkSessionPrivateImplxSpojen bylo zruaeno bu u~ivatelem nebo opera nm systmem..The session was aborted by the user or system.QNetworkSessionPrivateImpl<Zadan nastaven nelze pou~t.+The specified configuration cannot be used.QNetworkSessionPrivateImplNeznm chybaUnidentified ErrorQNetworkSessionPrivateImplFNeznm chyba pYi spojen pYes se.Unknown session error.QNetworkSessionPrivateImpl>Transakci se nepodaYilo spustitUnable to begin transaction QOCIDriver<Transakci se nepodaYilo zapsatUnable to commit transaction QOCIDriver*Spuatn se nezdaYilo QOCIDriverUnable to initialize QOCIDriver.PYihlaen se nezdaYiloUnable to logon QOCIDriver>Transakci se nepodaYilo zvrtitUnable to rollback transaction QOCIDriver>PYidlen pYkazu se nepodaYiloUnable to alloc statement QOCIResultNepodaYilo se spojit sloupec pro proveden pYkazu dvkovho zpracovn'Unable to bind column for batch execute QOCIResult8Hodnotu se nepodaYilo spojitUnable to bind value QOCIResultfPYkaz pro dvkov zpracovn se nepodaYilo provst!Unable to execute batch statement QOCIResult8PYkaz se nepodaYilo provstUnable to execute statement QOCIResult@NepodaYilo se zskat typ pYkazuUnable to get statement type QOCIResult2Nelze jt k dalamu prvkuUnable to goto next QOCIResult<PYkaz se nepodaYilo pYipravitUnable to prepare statement QOCIResult<Transakci se nepodaYilo zapsatUnable to commit transaction QODBCDriver:NepodaYilo se navzat spojenUnable to connect QODBCDriverNepodaYilo se navzat spojen, proto~e ovlada nutnou funkcionalitu pln nepodporujeEUnable to connect - Driver doesn't support all functionality required QODBCDriverr'autocommit', automatick zapsn, se nepodaYilo zastavitUnable to disable autocommit QODBCDriverD'autocommit' se nepodaYilo povolitUnable to enable autocommit QODBCDriver>Transakci se nepodaYilo zvrtitUnable to rollback transaction QODBCDriver QODBCResult::reset: 'SQL_CURSOR_STATIC' se nepodaYilo nastavit jako pYkaz vlastnosti . OvYte, prosm, nastaven svho ODBC ovlada eyQODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult>Promnnou se nepodaYilo provstUnable to bind variable QODBCResult8PYkaz se nepodaYilo provstUnable to execute statement QODBCResultDNepodaYilo se nathnout ~dn dataUnable to fetch QODBCResultVPrvn datov zznam se nepodaYilo nathnoutUnable to fetch first QODBCResult\Posledn datov zznam se nepodaYilo nathnoutUnable to fetch last QODBCResultVDala datov zznam se nepodaYilo nathnoutUnable to fetch next QODBCResult^PYedchoz datov zznam se nepodaYilo nathnoutUnable to fetch previous QODBCResult8PYkaz se nepodaYilo spustitUnable to prepare statement QODBCResult"%1" je ji~ zadn jako nzev pYedchoz lohy, a je proto vypnut.:"%1" duplicates a previous role name and will be disabled.QObject8NepodaYilo se pYe st zpatCould not read footerQObjectBNepodaYilo se pYe st data obrazuCould not read image dataQObjectPNepodaYilo se vrtit na po te n polohu!Could not reset to start positionQObjectTNepodaYilo se vyhledat zpat  ten obrazu#Could not seek to image read footerQObject6NepodaYilo se najt po ta Host not foundQObject8Hloubka obrazu nepodporovnaImage depth not validQObjectB ten mHeader obrazu se nezdaYiloImage mHeader read failedQObjectXTyp obrazu (non-TrueVision 2.0) nepodporovn-Image type (non-TrueVision 2.0) not supportedQObject.Typ obrazu nepodporovnImage type not supportedQObject2Zvukov server PulseAudioPulseAudio Sound ServerQObjectpVyhledn souboru/zaYzen pro  ten obrazu se nezdaYilo&Seek file/device for image read failedQObjectPostupn zaYzen (napY. socket - komunika n kanl) pro  ten obrazu nepodporovno:Sequential device (eg socket) for image read not supportedQObject(Nepltn dotaz: "%1"invalid query: "%1"QObject NzevNameQPPDOptionsModelHodnotaValueQPPDOptionsModel>Transakci se nepodaYilo spustitCould not begin transaction QPSQLDriver<Transakci se nepodaYilo zapsatCould not commit transaction QPSQLDriver>Transakci se nepodaYilo zvrtitCould not rollback transaction QPSQLDriver:NepodaYilo se navzat spojenUnable to connect QPSQLDriver.Registrace se nezdaYilaUnable to subscribe QPSQLDriver>Registraci se nepodaYilo zruaitUnable to unsubscribe QPSQLDriverDNepodaYilo se vytvoYit ~dn dotazUnable to create query QPSQLResult<PYkaz se nepodaYilo pYipravitUnable to prepare statement QPSQLResultCentimetry (cm)Centimeters (cm)QPageSetupWidgetFormulYFormQPageSetupWidget Vaka:Height:QPageSetupWidgetPalce (in) Inches (in)QPageSetupWidgetFormt na aYku LandscapeQPageSetupWidget OkrajeMarginsQPageSetupWidgetMilimetry (mm)Millimeters (mm)QPageSetupWidgetZamYen OrientationQPageSetupWidgetVelikost stran: Page size:QPageSetupWidget PaprPaperQPageSetupWidgetZdroj papru: Paper source:QPageSetupWidgetBody (pt) Points (pt)QPageSetupWidgetFormt na vakuPortraitQPageSetupWidget0Obrcen formt na aYkuReverse landscapeQPageSetupWidget0Obrcen formt na vakuReverse portraitQPageSetupWidget `Yka:Width:QPageSetupWidgetDoln okraj bottom marginQPageSetupWidgetLev okraj left marginQPageSetupWidgetPrav okraj right marginQPageSetupWidgetHorn okraj top marginQPageSetupWidget8PYdavn modul nebyl nahrn.The plugin was not loaded. QPluginLoaderNeznm chyba Unknown error QPluginLoaderLSoubor %1 ji~ existuje. M se pYepsat?/%1 already exists. Do you want to overwrite it? QPrintDialogj%1 je adresY. Zvolte, prosm, pro soubor jin nzev.7%1 is a directory. Please choose a different file name. QPrintDialog&Nastaven <<  &Options << QPrintDialog&Nastaven >> &Options >> QPrintDialog &Tisk&Print QPrintDialog8<qt>Chcete jej pYepsat?</qt>%Do you want to overwrite it? QPrintDialogA0A0 QPrintDialog$A0 (841 x 1189 mm)A0 (841 x 1189 mm) QPrintDialogA1A1 QPrintDialog"A1 (594 x 841 mm)A1 (594 x 841 mm) QPrintDialogA2A2 QPrintDialog"A2 (420 x 594 mm)A2 (420 x 594 mm) QPrintDialogA3A3 QPrintDialog"A3 (297 x 420 mm)A3 (297 x 420 mm) QPrintDialogA4A4 QPrintDialogHA4 (210 x 297 mm, 8.26 x 11.7 palco)%A4 (210 x 297 mm, 8.26 x 11.7 inches) QPrintDialogA5A5 QPrintDialog"A5 (148 x 210 mm)A5 (148 x 210 mm) QPrintDialogA6A6 QPrintDialog"A6 (105 x 148 mm)A6 (105 x 148 mm) QPrintDialogA7A7 QPrintDialog A7 (74 x 105 mm)A7 (74 x 105 mm) QPrintDialogA8A8 QPrintDialogA8 (52 x 74 mm)A8 (52 x 74 mm) QPrintDialogA9A9 QPrintDialogA9 (37 x 52 mm)A9 (37 x 52 mm) QPrintDialogPYezdvka: %1 Aliases: %1 QPrintDialogB0B0 QPrintDialog&B0 (1000 x 1414 mm)B0 (1000 x 1414 mm) QPrintDialogB1B1 QPrintDialog$B1 (707 x 1000 mm)B1 (707 x 1000 mm) QPrintDialogB10B10 QPrintDialog B10 (31 x 44 mm)B10 (31 x 44 mm) QPrintDialogB2B2 QPrintDialog"B2 (500 x 707 mm)B2 (500 x 707 mm) QPrintDialogB3B3 QPrintDialog"B3 (353 x 500 mm)B3 (353 x 500 mm) QPrintDialogB4B4 QPrintDialog"B4 (250 x 353 mm)B4 (250 x 353 mm) QPrintDialogB5B5 QPrintDialogFB5 (176 x 250 mm, 6.93 x 9.84 palco%B5 (176 x 250 mm, 6.93 x 9.84 inches) QPrintDialogB6B6 QPrintDialog"B6 (125 x 176 mm)B6 (125 x 176 mm) QPrintDialogB7B7 QPrintDialog B7 (88 x 125 mm)B7 (88 x 125 mm) QPrintDialogB8B8 QPrintDialogB8 (62 x 88 mm)B8 (62 x 88 mm) QPrintDialogB9B9 QPrintDialogB9 (44 x 62 mm)B9 (44 x 62 mm) QPrintDialogC5EC5E QPrintDialog$C5E (163 x 229 mm)C5E (163 x 229 mm) QPrintDialog(Stanoven u~ivatelemCustom QPrintDialogDLEDLE QPrintDialog$DLE (110 x 220 mm)DLE (110 x 220 mm) QPrintDialogUS Executive Executive QPrintDialogVUS Executive (7,5 x 10 palco, 191 x 254 mm))Executive (7.5 x 10 inches, 191 x 254 mm) QPrintDialogSoubor %1 je chrnn proti zpisu. Zvolte, prosm, pro soubor jin nzev.=File %1 is not writable. Please choose a different file name. QPrintDialog&Soubor ji~ existuje File exists QPrintDialog FolioFolio QPrintDialog(Folio (210 x 330 mm)Folio (210 x 330 mm) QPrintDialogUS LedgerLedger QPrintDialog0US Ledger (432 x 279 mm)Ledger (432 x 279 mm) QPrintDialogUS LegalLegal QPrintDialogNUS Legal (8,5 x 14 palco, 216 x 356 mm)%Legal (8.5 x 14 inches, 216 x 356 mm) QPrintDialogUS LetterLetter QPrintDialogPUS Letter (8,5 x 11 palco, 216 x 279 mm)&Letter (8.5 x 11 inches, 216 x 279 mm) QPrintDialogMstn soubor Local file QPrintDialogOKOK QPrintDialogTiskPrint QPrintDialog$Tisk do souboru...Print To File ... QPrintDialogTisknout vae Print all QPrintDialog,Vytisknout tuto stranuPrint current page QPrintDialogTiskov oblast Print range QPrintDialogTisk vbruPrint selection QPrintDialog*Tisk do souboru (PDF)Print to File (PDF) QPrintDialog8Tisk do souboru (Postscript)Print to File (Postscript) QPrintDialogUS TabloidTabloid QPrintDialog2US Tabloid (279 x 432 mm)Tabloid (279 x 432 mm) QPrintDialogdaj pro prvn stranu nesm bt vta ne~ daj pro posledn stranu.7The 'From' value cannot be greater than the 'To' value. QPrintDialog&US b~n #10 oblkaUS Common #10 Envelope QPrintDialogDUS b~n #10 oblka (105 x 241 mm)%US Common #10 Envelope (105 x 241 mm) QPrintDialog Zapsat %1 soubor Write %1 file QPrintDialogpYmo spojenolocally connected QPrintDialogNeznmunknown QPrintDialog%1%%1%QPrintPreviewDialog ZavYtCloseQPrintPreviewDialogVyvst do PDF Export to PDFQPrintPreviewDialog*Vyvst do PostScriptuExport to PostScriptQPrintPreviewDialogPrvn strana First pageQPrintPreviewDialog$PYizposobit stranuFit pageQPrintPreviewDialog"PYizposobit aYku Fit widthQPrintPreviewDialogFormt na aYku LandscapeQPrintPreviewDialogPosledn strana Last pageQPrintPreviewDialogDala strana Next pageQPrintPreviewDialog Nastaven strany Page SetupQPrintPreviewDialog Nastaven strany Page setupQPrintPreviewDialogFormt na vakuPortraitQPrintPreviewDialog PYedchoz strana Previous pageQPrintPreviewDialogTiskPrintQPrintPreviewDialogNhled tisku Print PreviewQPrintPreviewDialog8Ukzat strany le~c naprotiShow facing pagesQPrintPreviewDialog4Ukzat pYehled vaech stranShow overview of all pagesQPrintPreviewDialog0Ukzat jednotliv stranyShow single pageQPrintPreviewDialogZvtaitZoom inQPrintPreviewDialogZmenaitZoom outQPrintPreviewDialogRozaYenAdvancedQPrintPropertiesWidgetFormulYFormQPrintPropertiesWidget StranaPageQPrintPropertiesWidgetSrovnatCollateQPrintSettingsOutput BarvaColorQPrintSettingsOutputBarevn re~im Color ModeQPrintSettingsOutputPo et exemplYoCopiesQPrintSettingsOutput Po et exemplYo:Copies:QPrintSettingsOutputNynja strana Current PageQPrintSettingsOutput Oboustrann tiskDuplex PrintingQPrintSettingsOutputFormulYFormQPrintSettingsOutputOdstny aedi GrayscaleQPrintSettingsOutputDlouh strana Long sideQPrintSettingsOutput }dnNoneQPrintSettingsOutput VolbyOptionsQPrintSettingsOutput"Nastaven vstupuOutput SettingsQPrintSettingsOutputStrany od Pages fromQPrintSettingsOutputTisknout vae Print allQPrintSettingsOutputTisk oblasti Print rangeQPrintSettingsOutputObrcenReverseQPrintSettingsOutput Vbr SelectionQPrintSettingsOutputKrtk strana Short sideQPrintSettingsOutputdotoQPrintSettingsOutput&Nzev:&Name: QPrintWidget...... QPrintWidgetFormulYForm QPrintWidgetUmstn: Location: QPrintWidget"Vstupn &soubor: Output &file: QPrintWidget&Vlastnosti P&roperties QPrintWidget NhledPreview QPrintWidgetTiskrnaPrinter QPrintWidgetTyp:Type: QPrintWidgethVstupn pYesmrovn se nepodaYilo otevYt pro  ten,Could not open input redirection for readingQProcessjVstupn pYesmrovn se nepodaYilo otevYt pro zpis-Could not open output redirection for writingQProcess8 ten z procesu se nezdaYiloError reading from processQProcess8Zpis do procesu se nezdaYilError writing to processQProcess0Nestanoven ~dn programNo program definedQProcessProces spadlProcess crashedQProcess@Proces se nepodaYilo spustit: %1Process failed to start: %1QProcess2PYekro en  asu u procesuProcess operation timed outQProcesspPot~e se zdroji (selhn rozcest - "fork failure"): %1!Resource error (fork failure): %1QProcess ZruaitCancelQProgressDialogOtevYtOpen QPushButtonZaakrtnoutCheck QRadioButton@nesprvn syntax pro tYdu znakobad char class syntaxQRegExp^nesprvn syntax pro dopYedn vrok (lookahead)bad lookahead syntaxQRegExp<nesprvn syntax pro opakovnbad repetition syntaxQRegExp>byla pou~ita zakzan vlastnostdisabled feature usedQRegExp neplatn skupinainvalid categoryQRegExp"neplatn intervalinvalid intervalQRegExp4neplatn osmi kov hodnotainvalid octal valueQRegExpzzptn vroky (lookbehind) nejsou podporovny, viz QTBUG-2371)lookbehinds not supported, see QTBUG-2371QRegExp(dosa~ena vnitYn mezmet internal limitQRegExp0chybjc lev oddlova missing left delimQRegExp~dn chybano error occurredQRegExp"neo ekvan konecunexpected endQRegExpPNepodaYilo se otevYt spojen s databzError opening databaseQSQLite2Driver>Transakci se nepodaYilo spustitUnable to begin transactionQSQLite2Driver<Transakci se nepodaYilo zapsatUnable to commit transactionQSQLite2Driver>Transakci se nepodaYilo zvrtitUnable to rollback transactionQSQLite2Driver8PYkaz se nepodaYilo provstUnable to execute statementQSQLite2Result@Vsledek se nepodaYilo nathnoutUnable to fetch resultsQSQLite2ResultTNepodaYilo se uzavYt spojen s datatabzError closing database QSQLiteDriverPNepodaYilo se otevYt spojen s databzError opening database QSQLiteDriver>Transakci se nepodaYilo spustitUnable to begin transaction QSQLiteDriver<Transakci se nepodaYilo zapsatUnable to commit transaction QSQLiteDriver>Transakci se nepodaYilo zvrtitUnable to rollback transaction QSQLiteDriver}dn po~adavekNo query QSQLiteResult8Po et parametro nen sprvnParameter count mismatch QSQLiteResult<Parametry se nepodaYilo spojitUnable to bind parameters QSQLiteResultPVce pYkazo narz se nepodaYilo provst/Unable to execute multiple statements at a time QSQLiteResult8PYkaz se nepodaYilo provstUnable to execute statement QSQLiteResult:Xdek se nepodaYilo nathnoutUnable to fetch row QSQLiteResultFPYkaz se nepodaYilo znovu nastavitUnable to reset statement QSQLiteResultPodmnka ConditionQScriptBreakpointsModelSpuatn Hit-countQScriptBreakpointsModelIDIDQScriptBreakpointsModelSpustit po Ignore-countQScriptBreakpointsModelUmstnLocationQScriptBreakpointsModelSpustit jednou Single-shotQScriptBreakpointsModel SmazatDeleteQScriptBreakpointsWidgetNovNewQScriptBreakpointsWidget*&Hledat ve skriptu...&Find in Script...QScriptDebuggerSmazat konzoli Clear ConsoleQScriptDebugger(Smazat vstup ladnClear Debug OutputQScriptDebugger>Smazat vstupn zpis s chybamiClear Error LogQScriptDebuggerPokra ovatContinueQScriptDebugger Ctrl+FCtrl+FQScriptDebuggerCtrl+F10Ctrl+F10QScriptDebugger Ctrl+GCtrl+GQScriptDebugger LaditDebugQScriptDebuggerF10F10QScriptDebuggerF11F11QScriptDebuggerF3F3QScriptDebuggerF5F5QScriptDebuggerF9F9QScriptDebuggerNajt &dala Find &NextQScriptDebugger Najt &pYedchozFind &PreviousQScriptDebuggerJt na Ydek Go to LineQScriptDebuggerPYeruait InterruptQScriptDebugger Xdek:Line:QScriptDebugger"Provst po kurzor Run to CursorQScriptDebugger,Provst po nov skriptRun to New ScriptQScriptDebuggerShift+F11 Shift+F11QScriptDebuggerShift+F3Shift+F3QScriptDebuggerShift+F5Shift+F5QScriptDebuggerKrok do Step IntoQScriptDebuggerKrok venStep OutQScriptDebuggerKrok pYes Step OverQScriptDebuggerDPYepnout bod pYeruaen (zastaven)Toggle BreakpointQScriptDebugger<img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Hledn doshlo konceJ Search wrappedQScriptDebuggerCodeFinderWidget@Rozliaujc velk a mal psmenaCase SensitiveQScriptDebuggerCodeFinderWidget ZavYtCloseQScriptDebuggerCodeFinderWidget DalaNextQScriptDebuggerCodeFinderWidgetPYedchozPreviousQScriptDebuggerCodeFinderWidgetCel slova Whole wordsQScriptDebuggerCodeFinderWidget NzevNameQScriptDebuggerLocalsModelHodnotaValueQScriptDebuggerLocalsModel roveHLevelQScriptDebuggerStackModelUmstnLocationQScriptDebuggerStackModel NzevNameQScriptDebuggerStackModel&Podmnka zastaven:Breakpoint Condition: QScriptEdit*Vypnout bod zastavenDisable Breakpoint QScriptEdit*Zapnout bod zastavenEnable Breakpoint QScriptEdit,PYepnout bod zastavenToggle Breakpoint QScriptEditBody zastaven BreakpointsQScriptEngineDebuggerKonzoleConsoleQScriptEngineDebuggerVstup ladn Debug OutputQScriptEngineDebugger0Vstupn zpis s chybami Error LogQScriptEngineDebuggerNahran skriptyLoaded ScriptsQScriptEngineDebuggerMstn promnnLocalsQScriptEngineDebugger"Qt ladn skriptoQt Script DebuggerQScriptEngineDebugger HledatSearchQScriptEngineDebuggerZsobnkStackQScriptEngineDebugger PohledViewQScriptEngineDebugger ZavYtCloseQScriptNewBreakpointWidget KonecBottom QScrollBarLev okraj Left edge QScrollBar$O jeden Ydek dolo Line down QScrollBar(O jeden Ydek nahoruLine up QScrollBarO stranu dolo Page down QScrollBarO stranu doleva Page left QScrollBar O stranu doprava Page right QScrollBarO stranu nahoruPage up QScrollBar PolohaPosition QScrollBarPrav okraj Right edge QScrollBarProj~dt dolo Scroll down QScrollBar Proj~dt a~ sem Scroll here QScrollBar Proj~dt doleva Scroll left QScrollBar"Proj~dt doprava Scroll right QScrollBar Proj~dt nahoru Scroll up QScrollBarZa tekTop QScrollBarN%1: Soubor s unixovm kl em neexistuje%1: UNIX key file doesn't exist QSharedMemory %1: Ji~ existuje%1: already exists QSharedMemory %1: `patn nzev %1: bad name QSharedMemory`%1: daj o velikosti vytvoYen je mena ne~ nula%1: create size is less then 0 QSharedMemory%1: Neexistuje%1: doesn't exist QSharedMemory%1: Neexistuje%1: doesn't exists QSharedMemory<%1: Vyvoln ftok se nezdaYilo%1: ftok failed QSharedMemory*%1: Neplatn velikost%1: invalid size QSharedMemoryF%1: Neplatn daj u kl e (przdn)%1: key is empty QSharedMemory%1: NepYipojen%1: not attached QSharedMemory@%1: Nejsou ji~ pou~iteln zdroje%1: out of resources QSharedMemory&%1: PYstup odepYen%1: permission denied QSharedMemoryH%1: Vyhledn velikosti se nezdaYilo%1: size query failed QSharedMemoryf%1: Bylo dosa~eno systmem podmnn meze velikosti$%1: system-imposed size restrictions QSharedMemory2%1: UzavYen se nezdaYilo%1: unable to lock QSharedMemory>%1: NepodaYilo se vytvoYit kl %1: unable to make key QSharedMemoryX%1: NepodaYilo se nastavit kl pro uzavYen%1: unable to set key on lock QSharedMemoryB%1: UzavYen se nepodaYilo zruait%1: unable to unlock QSharedMemory(%1: Neznm chyba %2%1: unknown error %2 QSharedMemory++ QShortcutPYidat zlo~ku Add Favorite QShortcutUpravit jasAdjust Brightness QShortcutAltAlt QShortcutAplikace vlevoApplication Left QShortcutAplikace vpravoApplication Right QShortcut*Zmnit zvukovou stopuAudio Cycle Track QShortcut*Zvuk pYeto it dopYedu Audio Forward QShortcut,Zvuk pYehrvat nhodnAudio Random Play QShortcutOpakovat zvuk Audio Repeat QShortcut$Zvuk pYeto it zpt Audio Rewind QShortcutPry Away QShortcutZptBack QShortcutZpt dopYedu Back Forward QShortcutBackspace Backspace QShortcutZpt-TabBacktab QShortcutZeslen baso Bass Boost QShortcut Basy - Bass Down QShortcut Basy +Bass Up QShortcutBaterieBattery QShortcutModrozub Bluetooth QShortcut KnihaBook QShortcutProhl~e Browser QShortcutCDCD QShortcutKalkula ka Calculator QShortcut VolnCall QShortcut ZaostYen kamery Camera Focus QShortcutZvrka kameryCamera Shutter QShortcutCaps Lock Caps Lock QShortcutCapsLockCapsLock QShortcut SmazatClear QShortcutSmazat pYstup Clear Grab QShortcut ZavYtClose QShortcutVstup pro kd Code input QShortcutSpole enstv Community QShortcutKontext1Context1 QShortcutKontext2Context2 QShortcutKontext3Context3 QShortcutKontext4Context4 QShortcutKoprovatCopy QShortcutCtrlCtrl QShortcutVyjmoutCut QShortcutDOSDOS QShortcut DeleteDel QShortcut DeleteDelete QShortcutZobrazitDisplay QShortcutDokumenty Documents QShortcutDoloDown QShortcutEisu Posun Eisu Shift QShortcutEisu PYepna  Eisu toggle QShortcutVysunoutEject QShortcutEndEnd QShortcut EnterEnter QShortcutEscEsc QShortcut EscapeEscape QShortcutF%1F%1 QShortcutOblben Favorites QShortcutFinanceFinance QShortcutObrtitFlip QShortcutDopYeduForward QShortcutHraGame QShortcutDo tohoGo QShortcut HangulHangul QShortcutHangul Banja Hangul Banja QShortcutHangul konec Hangul End QShortcutHangul Hanja Hangul Hanja QShortcutHangul Jamo Hangul Jamo QShortcutHangul Jeonja Hangul Jeonja QShortcut Hangul PostHanjaHangul PostHanja QShortcutHangul PreHanjaHangul PreHanja QShortcutHangul Romaja Hangul Romaja QShortcutHangul zvlatnHangul Special QShortcutHangul za tek Hangul Start QShortcutZavsitHangup QShortcutHankakuHankaku QShortcutNpovdaHelp QShortcut HenkanHenkan QShortcutHibernovat Hibernate QShortcutHiraganaHiragana QShortcut"Hiragana KatakanaHiragana Katakana QShortcut ProbhHistory QShortcutHomeHome QShortcutDomc kancelY Home Office QShortcut Domovsk strnka Home Page QShortcut"Doporu en odkazy Hot Links QShortcut InsertIns QShortcut InsertInsert QShortcutKana Zmek Kana Lock QShortcutKany Posun Kana Shift QShortcut Kand~iKanji QShortcutKatakanaKatakana QShortcut*Sn~it jas klvesniceKeyboard Brightness Down QShortcut*Zvait jas klvesniceKeyboard Brightness Up QShortcutJZapnout/Vypnout podsvcen klvesniceKeyboard Light On/Off QShortcut$Nabdka klvesnice Keyboard Menu QShortcutFOpakovan vyt en poslednho  slaLast Number Redial QShortcutSpustit (0) Launch (0) QShortcutSpustit (1) Launch (1) QShortcutSpustit (2) Launch (2) QShortcutSpustit (3) Launch (3) QShortcutSpustit (4) Launch (4) QShortcutSpustit (5) Launch (5) QShortcutSpustit (6) Launch (6) QShortcutSpustit (7) Launch (7) QShortcutSpustit (8) Launch (8) QShortcutSpustit (9) Launch (9) QShortcutSpustit (A) Launch (A) QShortcutSpustit (B) Launch (B) QShortcutSpustit (C) Launch (C) QShortcutSpustit (D) Launch (D) QShortcutSpustit (E) Launch (E) QShortcutSpustit (F) Launch (F) QShortcutSpustit e-mail Launch Mail QShortcut"Spustit pYehrva  Launch Media QShortcut VlevoLeft QShortcutOsvtlen LightBulb QShortcutOdhlsit seLogoff QShortcutPYedn dl Mail Forward QShortcutTrhMarket QShortcut MassyoMassyo QShortcut Dala Media Next QShortcut,Pozastaven pYehrvn Media Pause QShortcutPYehrvn Media Play QShortcutPYedchozMedia Previous QShortcut Nahrt Media Record QShortcut&Zastavit pYehrvn Media Stop QShortcutSetknMeeting QShortcutMenuMenu QShortcutNabdka PBMenu PB QShortcut Posel Messenger QShortcutMetaMeta QShortcut(Sn~it jas obrazovkyMonitor Brightness Down QShortcut(Zvait jas obrazovkyMonitor Brightness Up QShortcutMuhenkanMuhenkan QShortcutVce nvrhoMultiple Candidate QShortcut HudbaMusic QShortcutMoje mstaMy Sites QShortcut ZprvyNews QShortcutNeNo QShortcutNum LockNum Lock QShortcutNumLockNumLock QShortcut*Zahlen-Feststelltaste Number Lock QShortcutOtevYt URLOpen URL QShortcut VolbaOption QShortcutObraz dolo Page Down QShortcutPage UpPage Up QShortcut Vlo~itPaste QShortcut PausePause QShortcut PgDownPgDown QShortcutPgUpPgUp QShortcutTelefonPhone QShortcutObrzkyPictures QShortcutVypnout Power Off QShortcutPYedchoz nvrhPrevious Candidate QShortcut PrintPrint QShortcutPrint Screen Print Screen QShortcutObnovitRefresh QShortcutNahrt znovuReload QShortcutOdpovdtReply QShortcut ReturnReturn QShortcut VpravoRight QShortcutRmad~iRomaji QShortcutOt et oknyRotate Windows QShortcutOt en KB Rotation KB QShortcutOt en PB Rotation PB QShortcut Ulo~itSave QShortcut.SpoYi /`etYi obrazovky Screensaver QShortcutScroll Lock Scroll Lock QShortcutScrollLock ScrollLock QShortcut HledatSearch QShortcut VybratSelect QShortcut PoslatSend QShortcut ShiftShift QShortcut ObchodShop QShortcutRe~im spnkuSleep QShortcutMezernkSpace QShortcut"OvYen pravopisu Spellchecker QShortcut$Rozdlit obrazovku Split Screen QShortcut$Tabulkov dokument Spreadsheet QShortcutV pohotovostiStandby QShortcutStopStop QShortcutTitulkySubtitle QShortcutPodporaSupport QShortcut UspatSuspend QShortcut SysReqSysReq QShortcut}dost systmuSystem Request QShortcutTabTab QShortcutPanel s koly Task Panel QShortcutTerminlTerminal QShortcut asTime QShortcut,PYepnout volat/zavsitToggle Call/Hangup QShortcut:PYepnout pYehrvat/pozastavitToggle Media Play/Pause QShortcutNstrojeTools QShortcutHlavn nabdkaTop Menu QShortcutTourokuTouroku QShortcutCestovnTravel QShortcutVaky - Treble Down QShortcutVaky + Treble Up QShortcut$Ultra airok psmoUltra Wide Band QShortcut NahoruUp QShortcut VideoVideo QShortcut PohledView QShortcut Hlasov vyt en Voice Dial QShortcutHlasitost - Volume Down QShortcut"Ztlumit hlasitost Volume Mute QShortcutHlasitost + Volume Up QShortcutInternetWWW QShortcutProbuditWake Up QShortcut$Internetov kameraWebCam QShortcutBezdrtWireless QShortcut Zpracovn textuWord Processor QShortcutXFerXFer QShortcutAnoYes QShortcutZenkakuZenkaku QShortcutZenkaku HankakuZenkaku Hankaku QShortcutPYibl~itZoom In QShortcutOddlitZoom Out QShortcut iTouchiTouch QShortcutO stranu dolo Page downQSliderO stranu doleva Page leftQSlider O stranu doprava Page rightQSliderO stranu nahoruPage upQSlider PolohaPositionQSlider@Tento typ adresy nen podporovnAddress type not supportedQSocks5SocketEngine:SOCKSv5 server odmtl spojen(Connection not allowed by SOCKSv5 serverQSocks5SocketEngineLProxy server pYed asn ukon il spojen&Connection to proxy closed prematurelyQSocks5SocketEngineHProxy server odmtl navzn spojenConnection to proxy refusedQSocks5SocketEnginenPYi spojen s proxy serverem byl pYekro en  asov limitConnection to proxy timed outQSocks5SocketEngine\Vaeobecn chyba pYi spojen s SOCKSv5 serveremGeneral SOCKSv5 server failureQSocks5SocketEngine\ asov limit pro seovou operaci byl pYekro enNetwork operation timed outQSocks5SocketEnginePAutentizace u proxy serveru se nezdaYilaProxy authentication failedQSocks5SocketEngineXAutentizace u proxy serveru se nezdaYila: %1Proxy authentication failed: %1QSocks5SocketEngine@Proxy server se nepodaYilo najitProxy host not foundQSocks5SocketEngine>Chyba protokolu (SOCKS verze 5)SOCKS version 5 protocol errorQSocks5SocketEngineHTento SOCKSv5 pYkaz nen podporovnSOCKSv5 command not supportedQSocks5SocketEngineTTL uplynul TTL expiredQSocks5SocketEngine|Byl obdr~en neznm chybov kd od SOCKSv5 proxy serveru: 0x%1%Unknown SOCKSv5 proxy error code 0x%1QSocks5SocketEngine ZruaitCancelQSoftKeyManager HotovoDoneQSoftKeyManagerUkon itExitQSoftKeyManagerOKOKQSoftKeyManager VolbyOptionsQSoftKeyManager VybratSelectQSoftKeyManagerMnLessQSpinBoxVceMoreQSpinBox ZruaitCancelQSqlZruait zmny?Cancel your edits?QSqlPotvrditConfirmQSql DeleteDeleteQSql&Smazat tento zpis?Delete this record?QSql Vlo~itInsertQSqlNeNoQSqlUlo~it zmny? Save edits?QSqlObnovitUpdateQSqlAnoYesQSqlBez kl e nelze poskytnout ~dn osvd en k volnmu pou~it, %1,Cannot provide a certificate with no key, %1 QSslSocketZNepodaYilo se vytvoYit ~dn kontext SSL (%1)Error creating SSL context (%1) QSslSocketJNepodaYilo se vytvoYit sezen SSL, %1Error creating SSL session, %1 QSslSocketJNepodaYilo se vytvoYit sezen SSL: %1Error creating SSL session: %1 QSslSocket`Bhem startu SSL protokolu se vyskytla chyba: %1Error during SSL handshake: %1 QSslSocketRNepodaYilo se nahrt mstn osvd en, %1#Error loading local certificate, %1 QSslSocketLSoukrom kl se nepodaYilo nahrt, %1Error loading private key, %1 QSslSocket>PYi  ten se vyskytla chyba: %1Error while reading: %1 QSslSockethNeplatn  i przdn seznam se aifrovacmi kl i (%1)!Invalid or empty cipher list (%1) QSslSocketL}dn z osvd en se nepodaYilo ovYit!No certificates could be verified QSslSocket}dn chybaNo error QSslSocketlJedno z osvd en osvd ovacho msta (CA) je neplatn%One of the CA certificates is invalid QSslSocketVSoukrom kl nedosvd uje veYejn kl , %1+Private key does not certify public key, %1 QSslSocketZDlka cesty 'basicConstraints'byla pYekro enaTransakci se nepodaYilo spustitUnable to begin transaction QSymSQLDriver<Transakci se nepodaYilo zapsatUnable to commit transaction QSymSQLDriver>Transakci se nepodaYilo zvrtitUnable to rollback transaction QSymSQLDriverBChyba pYi zskvn po tu sloupcoError retrieving column count QSymSQLResultBChyba pYi zskvn nzvu sloupceError retrieving column name QSymSQLResult@Chyba pYi zskvn typu sloupceError retrieving column type QSymSQLResult8Po et parametro nen sprvnParameter count mismatch QSymSQLResult*PYkaz nen pYipravenStatement is not prepared QSymSQLResult<Parametry se nepodaYilo spojitUnable to bind parameters QSymSQLResult8PYkaz se nepodaYilo provstUnable to execute statement QSymSQLResult:Xdek se nepodaYilo nathnoutUnable to fetch row QSymSQLResultFPYkaz se nepodaYilo znovu nastavitUnable to reset statement QSymSQLResultPNa tomto portu ji~ naslouch jin socket4Another socket is already listening on the same portQSymbianSocketEnginexVyzkouaelo se pou~t IPv6 socket na systmu bez podpory IPv6=Attempt to use IPv6 socket on a platform with no IPv6 supportQSymbianSocketEngine,Spojen bylo odmtnutoConnection refusedQSymbianSocketEngineL asov limit pro spojen byl pYekro enConnection timed outQSymbianSocketEngineNDatagram byl pro odesln pYlia velikDatagram was too large to sendQSymbianSocketEngine>Clov po ta je nedosa~itelnHost unreachableQSymbianSocketEngine6Neplatn deskriptor socketuInvalid socket descriptorQSymbianSocketEngineSeov chyba Network errorQSymbianSocketEngine\ asov limit pro seovou operaci byl pYekro enNetwork operation timed outQSymbianSocketEngine(Se nen dosa~itelnNetwork unreachableQSymbianSocketEngine&Operaci mimo socketOperation on non-socketQSymbianSocketEngine8Nejsou dostupn ~dn zdrojeOut of resourcesQSymbianSocketEnginePYstup odepYenPermission deniedQSymbianSocketEngineHProtokol tohoto typu nen podporovnProtocol type not supportedQSymbianSocketEngineFAdresa pro tuto operaci nen platn)The address is invalid for this operationQSymbianSocketEngine(Adresa nen dostupnThe address is not availableQSymbianSocketEngine$Adresa je chrnnaThe address is protectedQSymbianSocketEngine8Uveden adresa se u~ pou~v#The bound address is already in useQSymbianSocketEngine\Tuto operaci nelze s tmto typem proxy provst,The proxy type is invalid for this operationQSymbianSocketEngine@Vzdlen po ta uzavYel spojen%The remote host closed the connectionQSymbianSocketEngineDZadan seov sezen nen otevYeno+The specified network session is not openedQSymbianSocketEngineRSocket pro vysln se nepodaYilo spustit%Unable to initialize broadcast socketQSymbianSocketEnginePNeblokujc socket se nepodaYilo spustit(Unable to initialize non-blocking socketQSymbianSocketEngine:Zprvu se nepodaYilo pYijmoutUnable to receive a messageQSymbianSocketEngine8NepodaYilo se odeslat zprvuUnable to send a messageQSymbianSocketEngine(NepodaYilo se zapsatUnable to writeQSymbianSocketEngineNeznm chyba Unknown errorQSymbianSocketEngine8Nepodporovan socket operaceUnsupported socket operationQSymbianSocketEngine %1: Ji~ existuje%1: already existsQSystemSemaphore%1: Neexistuje%1: does not existQSystemSemaphore %1: Chybn nzev%1: name errorQSystemSemaphore@%1: Nejsou ji~ pou~iteln zdroje%1: out of resourcesQSystemSemaphore&%1: PYstup odepYen%1: permission deniedQSystemSemaphore(%1: Neznm chyba %2%1: unknown error %2QSystemSemaphorePNepodaYilo se otevYt spojen s databzUnable to open connection QTDSDriver:Databzi se nepodaYilo pou~tUnable to use database QTDSDriverSpustitActivateQTabBarZapnout kartuActivate the tabQTabBar ZavYtCloseQTabBarZavYt kartu Close the tabQTabBarStisknoutPressQTabBar Proj~dt doleva Scroll LeftQTabBar"Proj~dt doprava Scroll RightQTabBarHTato socket operace nen podporovna$Operation on socket is not supported QTcpServer&Koprovat&Copy QTextControl&Vlo~it&Paste QTextControl &Znovu&Redo QTextControl &Zpt&Undo QTextControl0&Koprovat adresu odkazuCopy &Link Location QTextControlVyj&moutCu&t QTextControl SmazatDelete QTextControlVybrat vae Select All QTextControlOtevYtOpen QToolButtonStisknoutPress QToolButton>Tato platforma nepodporuje IPv6#This platform does not support IPv6 QUdpSocket ZnovuDefault text for redo actionRedo QUndoGroupZnovu %1Redo %1 QUndoGroupZptDefault text for undo actionUndo QUndoGroupZpt %1Undo %1 QUndoGroup<przdn> QUndoModel ZnovuDefault text for redo actionRedo QUndoStackZnovu %1Redo %1 QUndoStackZptDefault text for undo actionUndo QUndoStackZpt %1Undo %1 QUndoStack:Vlo~it kontroln znak Unicode Insert Unicode control characterQUnicodeControlCharacterMenuBLRE Za tek vlo~en zleva doprava$LRE Start of left-to-right embeddingQUnicodeControlCharacterMenu0LRM Zna ka zleva dopravaLRM Left-to-right markQUnicodeControlCharacterMenuDLRO Za tek pYepsn zleva doprava#LRO Start of left-to-right overrideQUnicodeControlCharacterMenu@PDF Konec vlo~en/pYepsn smruPDF Pop directional formattingQUnicodeControlCharacterMenuBRLE Za tek vlo~en zprava doleva$RLE Start of right-to-left embeddingQUnicodeControlCharacterMenu0RLM Zna ka zprava dolevaRLM Right-to-left markQUnicodeControlCharacterMenuDRLO Za tek pYepsn zprava doleva#RLO Start of right-to-left overrideQUnicodeControlCharacterMenu6ZWJ Nulov mezera spojovacZWJ Zero width joinerQUnicodeControlCharacterMenu<ZWNJ Nulov mezera nespojovacZWNJ Zero width non-joinerQUnicodeControlCharacterMenu$ZWSP Nulov mezeraZWSP Zero width spaceQUnicodeControlCharacterMenu2Adresu (URL) nelze ukzatCannot show URL QWebFrame6Tento mime typ nelze ukzatCannot show mimetype QWebFrame"Soubor neexistujeFile does not exist QWebFrameXNahrn rmce bylo pYeruaeno zmnou smrnice'Frame load interrupted by policy change QWebFramePO nahrvn se star multimediln stroj&Loading is handled by the media engine QWebFrame,Po~adavek byl odmtnutRequest blocked QWebFrame(Po~adavek byl zruaenRequest canceled QWebFrame(Po~adavek byl zruaenRequest cancelled QWebFrame"%1 (%2x%3 pixelo)Title string for images%1 (%2x%3 pixels)QWebPageJ%1 dny %2 hodiny %3 minuty %4 sekundy&%1 days %2 hours %3 minutes %4 secondsQWebPage<%1 hodiny %2 minuty %3 sekundy%1 hours %2 minutes %3 secondsQWebPage(%1 minuty %2 sekundy%1 minutes %2 secondsQWebPage%1 sekundy %1 secondsQWebPagejeden soubor%n soubory%n souboronumber of chosen file %n file(s)QWebPage$PYidat do slovnku Learn Spelling context menu itemAdd To DictionaryQWebPageZarovnat vlevo Align LeftQWebPageZarovnat vpravo Align RightQWebPageZvukov prvek Audio ElementQWebPageRXzen pYehrvn zvuku a zobrazen stavu2Audio element playback controls and status displayQWebPage Za t pYehrvnBegin playbackQWebPage Tu nBold context menu itemBoldQWebPage KonecBottomQWebPageNa stYedCenterQWebPageNOvYovat mluvnici spole n s pravopisem-Check grammar with spelling context menu itemCheck Grammar With SpellingQWebPage"OvYen pravopisu Check spelling context menu itemCheck SpellingQWebPage:OvYovat pravopis bhem psan-Check spelling while typing context menu itemCheck Spelling While TypingQWebPageVybrat soubor(title for file button used in HTML forms Choose FileQWebPage>Smazat naposledy hledan vrazy>menu item in Recent Searches menu that empties menu's contentsClear recent searchesQWebPageKoprovatCopy context menu itemCopyQWebPageBKoprovat umstn odkazu na zvuk Copy AudioQWebPage"Koprovat obrzekCopy Link context menu item Copy ImageQWebPage0Koprovat adresu obrzkuCopy Image AddressQWebPage.Koprovat adresu odkazuCopy Link context menu item Copy LinkQWebPageKoprovat video Copy VideoQWebPageStav filmuCurrent movie statusQWebPage( as pYehrvn filmuCurrent movie timeQWebPageVyjmoutCut context menu itemCutQWebPageVchoz+Default writing direction context menu itemDefaultQWebPage0Smazat a~ po konec slovaDelete to the end of the wordQWebPage4Smazat a~ po za tek slovaDelete to the start of the wordQWebPagePodrobnostiDetailsQWebPageSmr'Writing direction context sub-menu item DirectionQWebPageUplynul  as Elapsed TimeQWebPageDVejt do re~imu na celou obrazovkuEnter FullscreenQWebPage PsmaFont context sub-menu itemFontsQWebPageRTla tko pro zobrazen na celou obrazovkuFullscreen ButtonQWebPageJt zptBack context menu itemGo BackQWebPageJt dopYeduForward context menu item Go ForwardQWebPage2Skrt pravopis a mluvnicimenu item titleHide Spelling and GrammarQWebPagePYehl~et Ignore Grammar context menu itemIgnoreQWebPagePYehl~et!Ignore Spelling context menu itemIgnoreQWebPageNeomezen  asIndefinite timeQWebPageOdsaditIndentQWebPage2Vlo~it seznam s odr~kamiInsert Bulleted ListQWebPage.Vlo~it  slovan seznamInsert Numbered ListQWebPage"Vlo~it nov YdekInsert a new lineQWebPage(Vlo~it nov odstavecInsert a new paragraphQWebPage"Provst prohldku!Inspect Element context menu itemInspectQWebPageKurzvaItalic context menu itemItalicQWebPage<Upozornn od JavaScriptu - %1JavaScript Alert - %1QWebPage:Potvrzen od JavaScriptu - %1JavaScript Confirm - %1QWebPage4Pot~e s JavaScriptem - %1JavaScript Problem - %1QWebPage2Vzva od JavaScriptu - %1JavaScript Prompt - %1QWebPageDo blokuJustifyQWebPageLev okraj Left edgeQWebPageZleva doprava Left to RightQWebPage}iv pYenosLive BroadcastQWebPageNahrv se... Loading...QWebPage,Podvat se do slovnku'Look Up in Dictionary context menu itemLook Up In DictionaryQWebPage0Chybjc pYdavn modulMissing Plug-inQWebPageTUkazatel polohy posunout a~ na konec bloku'Move the cursor to the end of the blockQWebPageVUkazatel polohy posunout na konec dokumentu*Move the cursor to the end of the documentQWebPageNUkazatel polohy posunout na konec Ydku&Move the cursor to the end of the lineQWebPage\Ukazatel polohy posunout k nsledujcmu znaku%Move the cursor to the next characterQWebPage\Ukazatel polohy posunout k nsledujcmu Ydku Move the cursor to the next lineQWebPage\Ukazatel polohy posunout k nsledujcmu slovu Move the cursor to the next wordQWebPageXUkazatel polohy posunout k pYedchozmu znaku)Move the cursor to the previous characterQWebPageVUkazatel polohy posunout na pYedchoz Ydku$Move the cursor to the previous lineQWebPageXUkazatel polohy posunout k pYedchozmu slovu$Move the cursor to the previous wordQWebPageRUkazatel polohy posunout na za tek bloku)Move the cursor to the start of the blockQWebPageZUkazatel polohy posunout na za tek dokumentu,Move the cursor to the start of the documentQWebPageRUkazatel polohy posunout na za tek Ydku(Move the cursor to the start of the lineQWebPage as pYehrvnMovie time scrubberQWebPageFPalec pro nastaven  asu pYehrvnMovie time scrubber thumbQWebPageZtlumitMuteQWebPage*Tla tko pro ztlumen Mute ButtonQWebPage*Ztlumit zvukov stopyMute audio tracksQWebPage8Nebyly nalezeny ~dn nvrhy"No Guesses Found context menu itemNo Guesses FoundQWebPage2Nebyl vybrn ~dn souborJtext to display in file button used in HTML forms when no file is selectedNo file selectedQWebPageRNeexistuj ~dn naposledy hledan vrazyvLabel for only item in menu that appears when clicking on the search field image, when no searches have been performedNo recent searchesQWebPageOtevYt zvuk Open AudioQWebPageOtevYt rmec*Open Frame in New Window context menu item Open FrameQWebPage8Obrzek otevYt v novm okn*Open Image in New Window context menu item Open ImageQWebPage*OtevYt adresu odkazuOpen Link context menu item Open LinkQWebPageOtevYt video Open VideoQWebPage(OtevYt v novm okn$Open in New Window context menu itemOpen in New WindowQWebPageZruait odsazenOutdentQWebPage ObrysOutline context menu itemOutlineQWebPageO stranu dolo Page downQWebPageO stranu doleva Page leftQWebPage O stranu doprava Page rightQWebPageO stranu nahoruPage upQWebPage Vlo~itPaste context menu itemPasteQWebPage0Vlo~it a odpovdat styluPaste and Match StyleQWebPagePozastavitPauseQWebPage0Tla tko pro pozastaven Pause ButtonQWebPage*Pozastavit pYehrvnPause playbackQWebPagePYehrtPlayQWebPage.Tla tko pro pYehrvn Play ButtonQWebPagehPYehrvat film v re~imu zobrazen na celou obrazovkuPlay movie in full-screen modeQWebPage0Dosavadn hledan vrazyrlabel for first item in the menu that appears when clicking on the search field image, used as embedded menu titleRecent searchesQWebPageJDosa~eno krajn meze pro pYesmrovnRedirection limit reachedQWebPageNahrt znovuReload context menu itemReloadQWebPageZbvajc  asRemaining TimeQWebPage@Zbvajc  as z pYehrvn filmuRemaining movie timeQWebPage*Odstranit formtovnRemove formattingQWebPage Vrtit5default label for Reset buttons in forms on web pagesResetQWebPage6Vrtit film na skute n  as#Return streaming movie to real-timeQWebPageLTla tko pro nvrat ke skute nmu  asuReturn to Real-time ButtonQWebPage,Tla tko pro pYeto en Rewind ButtonQWebPage$PYeto it film zpt Rewind movieQWebPagePrav okraj Right edgeQWebPageZprava doleva Right to LeftQWebPageUlo~it obrzek Download Image context menu item Save ImageQWebPageUlo~it odkaz...&Download Linked File context menu item Save Link...QWebPageProj~dt dolo Scroll downQWebPage Proj~dt a~ sem Scroll hereQWebPage Proj~dt doleva Scroll leftQWebPage"Proj~dt doprava Scroll rightQWebPage Proj~dt nahoru Scroll upQWebPageHledat na sti Search The Web context menu itemSearch The WebQWebPage6Tla tko pro hledn dozaduSeek Back ButtonQWebPage8Tla tko pro hledn dopYeduSeek Forward ButtonQWebPage*Rychl zptn hlednSeek quickly backQWebPage.Rychl dopYedn hlednSeek quickly forwardQWebPageVybrat vae Select AllQWebPage0Vybrat a~ po konec blokuSelect to the end of the blockQWebPage8Vybrat a~ po konec dokumentu!Select to the end of the documentQWebPage4Vybrat a~ po za tek YdkuSelect to the end of the lineQWebPage:Vybrat a~ po nsledujc znakSelect to the next characterQWebPage<Vybrat a~ po nsledujc YdekSelect to the next lineQWebPage<Vybrat a~ po nsledujc slovoSelect to the next wordQWebPage6Vybrat a~ po pYedchoz znak Select to the previous characterQWebPage8Vybrat a~ po pYedchoz YdekSelect to the previous lineQWebPage8Vybrat a~ po pYedchoz slovoSelect to the previous wordQWebPage4Vybrat a~ po za tek bloku Select to the start of the blockQWebPage<Vybrat a~ po za tek dokumentu#Select to the start of the documentQWebPage4Vybrat a~ po za tek YdkuSelect to the start of the lineQWebPage4Ukzat pravopis a mluvnicimenu item titleShow Spelling and GrammarQWebPagePosuvnkSliderQWebPagePalec posuvnku Slider ThumbQWebPagePravopis*Spelling and Grammar context sub-menu itemSpellingQWebPagedaj o stavuStatus DisplayQWebPageZastavitStop context menu itemStopQWebPagePYeakrtnuto StrikethroughQWebPage PoslatQSubmit (input element) alt text for elements with no alt, title, or valueSubmitQWebPage Poslat6default label for Submit buttons in forms on web pagesSubmitQWebPageDoln index SubscriptQWebPageHorn index SuperscriptQWebPageSmr psan$Text direction context sub-menu itemText DirectionQWebPageVypad to na to, ~e skript na tto stran m pot~e. Chcete tento skript zastavit?RThe script on this page appears to have a problem. Do you want to stop the script?QWebPage~Tento rejstYk m funkci hledn. Zadejte njak hledan vraz:_text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'3This is a searchable index. Enter search keywords: QWebPage"PYepnout ovldnToggle ControlsQWebPagePYepnout smy ku Toggle LoopQWebPageZa tekTopQWebPagePodtr~enUnderline context menu item UnderlineQWebPageNeznm+Unknown filesize FTP directory listing itemUnknownQWebPage:Tla tko pro zruaen ztlumen Unmute ButtonQWebPage<Zruait ztlumen zvukovch stopUnmute audio tracksQWebPageVideoprvek Video ElementQWebPageRXzen pYehrvn videa a zobrazen stavu2Video element playback controls and status displayQWebPage$Web Inspektor - %2Web Inspector - %2QWebPageCo je toto? What's This?QWhatsThisAction**QWidgetDo&kon it&FinishQWizard&Npovda&HelpQWizard &Dala&NextQWizard&Dala >&Next >QWizard< &Zpt< &BackQWizard ZruaitCancelQWizard Pou~tCommitQWizardPokra ovatContinueQWizard HotovoDoneQWizardJt zptGo BackQWizardNpovdaHelpQWizard%1 - [%2] %1 - [%2] QWorkspace&ZavYt&Close QWorkspacePo&sunout&Move QWorkspace&Obnovit&Restore QWorkspace Zmnit &velikost&Size QWorkspace&Odvinout&Unshade QWorkspace ZavYtClose QWorkspaceZv&tait Ma&ximize QWorkspace&Zmenait Mi&nimize QWorkspaceZmenaitMinimize QWorkspaceObnovit Restore Down QWorkspace&NavinoutSh&ade QWorkspace"Zostat v &popYed Stay on &Top QWorkspacechybjc deklarace kdovn nebo deklarace samostatnosti pYi  ten deklarace XMLYencoding declaration or standalone declaration expected while reading the XML declarationQXmlJChyba v deklaraci textu vnja entity3error in the text declaration of an external entityQXmlTpYi vyhodnocen poznmky se vyskytla chyba$error occurred while parsing commentQXmlPpYi vyhodnocen obsahu se vyskytla chyba$error occurred while parsing contentQXmlrpYi vyhodnocen definice typu dokumentu se vyskytla chyba5error occurred while parsing document type definitionQXmlNpYi vyhodnocen prvku se vyskytla chyba$error occurred while parsing elementQXmlPpYi vyhodnocen odkazu se vyskytla chyba&error occurred while parsing referenceQXml8chyba spuatn spotYebitelemerror triggered by consumerQXmlvv DTD nejsou dovoleny ~dn odkazy na vnja obecnou entitu;external parsed general entity reference not allowed in DTDQXmlv hodnot vlastnosti nejsou dovoleny ~dn odkazy na vnja obecnou entituGexternal parsed general entity reference not allowed in attribute valueQXmlxv DTD nejsou dovoleny ~dn odkazy na vnitYn obecnou entitu4internal general entity reference not allowed in DTDQXmlNneplatn nzev pro pokyn pro zpracovn'invalid name for processing instructionQXmlBna tomto mst je potYeba psmenoletter is expectedQXml8vce definic typu dokumentu&more than one document type definitionQXml~dn chybano error occurredQXml"rekurzivn entityrecursive entitiesQXmlrchybjc deklarace samostatnosti pYi  ten deklarace XMLAstandalone declaration expected while reading the XML declarationQXmlHZna ky prvko nejsou vkldny sprvn tag mismatchQXml neo ekvan znakunexpected characterQXml2neo ekvan konec souboruunexpected end of fileQXml|pou~vn nevyhodnocen odkaz na entitu v nesprvn souvislosti*unparsed entity reference in wrong contextQXmlNchybjc verze pYi  ten deklarace XML2version expected while reading the XML declarationQXmlNnesprvn hodnota vlastnosti standalone&wrong value for standalone declarationQXmlTChyba %1 v %2, na Ydku %3, sloupec %4: %5)Error %1 in %2, at line %3, column %4: %5QXmlPatternistCLI"Chyba %1 v %2: %3Error %1 in %2: %3QXmlPatternistCLI Neznm umstnUnknown locationQXmlPatternistCLITVarovn v %1, na Ydku %2, sloupec %3: %4(Warning in %1, at line %2, column %3: %4QXmlPatternistCLI"Varovn v %1: %2Warning in %1: %2QXmlPatternistCLIj%1 nen platnm dajem VEXEJNHO identifiktoru (id).#%1 is an invalid PUBLIC identifier. QXmlStreamH%1 nen platnm nzvem pro kdovn.%1 is an invalid encoding name. QXmlStreamZ%1 nen platnm nzvem pokynu pro zpracovn.-%1 is an invalid processing instruction name. QXmlStreamDo ekvno, namsto toho obdr~eno ' , but got ' QXmlStream:Vlastnost byla nov vymezena.Attribute redefined. QXmlStream8Kdovn %1 nen podporovnoEncoding %1 is unsupported QXmlStreamPByl nalezen obsah s neplatnm kdovnm.(Encountered incorrectly encoded content. QXmlStream8Entita '%1' nen prohlaena.Entity '%1' not declared. QXmlStream Bylo  Expected  QXmlStream>Byly o ekvny daje o znacch.Expected character data. QXmlStreamJPYebyte n obsah za koncem dokumentu.!Extra content at end of document. QXmlStreamJNeplatn deklarace jmennho prostoru.Illegal namespace declaration. QXmlStream$Neplatn znak XML.Invalid XML character. QXmlStream&Neplatn nzev XML.Invalid XML name. QXmlStream4Neplatn daj o verzi XML.Invalid XML version string. QXmlStreamVDeklarace XML obsahuje neplatnou vlastnost.%Invalid attribute in XML declaration. QXmlStream.Odkaz na neplatn znak.Invalid character reference. QXmlStream$Neplatn dokument.Invalid document. QXmlStream0Neplatn hodnota entity.Invalid entity value. QXmlStreamPNzev pokynu pro zpracovn je neplatn.$Invalid processing instruction name. QXmlStreamhDeklarace parametrick entity nesm obsahovat NDATA.&NDATA in parameter entity declaration. QXmlStreambPYedpona jmennho prostoru '%1' nebyla prohlaena"Namespace prefix '%1' not declared QXmlStream|Po et otevrajcch prvko neodpovd po tu zavrajcch prvko. Opening and ending tag mismatch. QXmlStream4PYed asn konec dokumentu.Premature end of document. QXmlStream@Byla zjiatna rekurzivn entita.Recursive entity detected. QXmlStreambV hodnot vlastnosti byla odkazovna entita '%1'.5Reference to external entity '%1' in attribute value. QXmlStreamHOdkaz na nevyhodnocenou entitu '%1'."Reference to unparsed entity '%1'. QXmlStreamNSled znako ']]>' nen v obsahu povolen.&Sequence ']]>' not allowed in content. QXmlStreamHodnota pro vlastnost standalone mo~e bt pouze "ano" nebo "ne"."Standalone accepts only yes or no. QXmlStream6O ekvn otevrajc prvek.Start tag expected. QXmlStreamPseudovlastnost standalone mus nsledovat bezprostYedn po kdovn.?The standalone pseudo attribute must appear after the encoding. QXmlStream4Na tomto mst neplatn '  Unexpected ' QXmlStream'%1' nen platnm znakem v daji veYejnho id, kter je tvoYen psmeny./Unexpected character '%1' in public id literal. QXmlStream@Tato verze XML nen podporovna.Unsupported XML version. QXmlStream`Deklarace XML se nenachz na za tku dokumentu.)XML declaration not at start of document. QXmlStreamPolo~kyItems QmlJSDebugger::LiveSelectionTool 0.125x0.125xQmlJSDebugger::QmlToolBar0.1x0.1xQmlJSDebugger::QmlToolBar 0.25x0.25xQmlJSDebugger::QmlToolBar0.5x0.5xQmlJSDebugger::QmlToolBar1x1xQmlJSDebugger::QmlToolBar0Pou~t zmny na dokumentApply Changes to DocumentQmlJSDebugger::QmlToolBar:Pou~t zmny na prohl~e QMLApply Changes to QML ViewerQmlJSDebugger::QmlToolBarVoli barvy Color PickerQmlJSDebugger::QmlToolBar Re~im inspektoraInspector ModeQmlJSDebugger::QmlToolBar4PYehrt/Pozastavit animacePlay/Pause AnimationsQmlJSDebugger::QmlToolBar VybratSelectQmlJSDebugger::QmlToolBar Vybrat (Marquee)Select (Marquee)QmlJSDebugger::QmlToolBarNstrojeToolsQmlJSDebugger::QmlToolBar"PYibl~it/OddlitZoomQmlJSDebugger::QmlToolBarKoprovat barvu Copy ColorQmlJSDebugger::ToolBarColorBoxPYibl~itZoom InQmlJSDebugger::ZoomToolOddlitZoom OutQmlJSDebugger::ZoomTool Zvtait na &100% Zoom to &100%QmlJSDebugger::ZoomToolVrazy %1 a %2 v~dy odpovdaj za tku nebo konci libovolnho Ydku.,%1 and %2 match the start and end of a line. QtXmlPatternsVlastnost %1 v %2 mus mt pou~it '%3' jako v zkladnm typu %4.9%1 attribute in %2 must have %3 use like in base type %4. QtXmlPatternsVlastnost %1 v odvozenm slo~itm typu mus bt jako v zkladnm typu %2.B%1 attribute in derived complex type must be %2 like in base type. QtXmlPatternsVlastnost %1 prvku %2 obsahuje neplatn obsah: {%3} nen hodnotou typu %4.T%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4. QtXmlPatternshVlastnost %1 prvku %2 obsahuje neplatn obsah: {%3}.:%1 attribute of %2 element contains invalid content: {%3}. QtXmlPatternsHodnota vlastnosti %1 prvku %2 je vta ne~ hodnota vlastnosti %3.>%1 attribute of %2 element has larger value than %3 attribute. QtXmlPatterns\Vlastnost %1 prvku %2 mo~e bt jen %3 nebo %4.,%1 attribute of %2 element must be %3 or %4. QtXmlPatternsVlastnost %1 prvku %2 mus obsahovat %3, %4 nebo seznam adres (URL).A%1 attribute of %2 element must contain %3, %4 or a list of URIs. QtXmlPatternsHodnota vlastnosti %1 prvku %2 mus obsahovat bu %3 nebo jin hodnoty.F%1 attribute of %2 element must either contain %3 or the other values. QtXmlPatternszVlastnost %1 prvku %2 mo~e mt jen jednu z hodnot %3 nebo %4.9%1 attribute of %2 element must have a value of %3 or %4. QtXmlPatternsTVlastnost %1 prvku %2 mus mt hodnotu %3.3%1 attribute of %2 element must have a value of %3. QtXmlPatternsVlastnost %1 prvku %2 mus mt hodnotu %3, proto~e je nastavena vlastnost %4.R%1 attribute of %2 element must have the value %3 because the %4 attribute is set. QtXmlPatternsHVlastnost %1 prvku %2 nemo~e bt %3.*%1 attribute of %2 element must not be %3. QtXmlPatterns%1 nelze ur it%1 cannot be retrieved QtXmlPatternsj%1 nelze mt ~dn slo~it zkladn typ, kter m %2./%1 cannot have complex base type that has a %2. QtXmlPatternsr%1 obsahuje omezujc vlastnost %2 s neplatnmi daty: %3.+%1 contains %2 facet with invalid data: %3. QtXmlPatterns4%1 obsahuje neplatn data.%1 contains invalid data. QtXmlPatternsr%1 obsahuje oktety, kter v kdovn %2 nejsou pYpustn.E%1 contains octets which are disallowed in the requested encoding %2. QtXmlPatternsPrvek %2 (%1) nen platnm omezenm pYepisovanho prvku (%3): %4.L%1 element %2 is not a valid restriction of the %3 element it redefines: %4. QtXmlPatternsrHodnota vlastnosti %2 prvku %1 mo~e bt pouze %3 nebo %4.C%1 element cannot have %2 attribute with value other than %3 or %4. QtXmlPatternsbHodnota vlastnosti %2 prvku %1 mo~e bt pouze %3.=%1 element cannot have %2 attribute with value other than %3. QtXmlPatterns^Prvek %1 nem ani vlastnost %2 ani podprvek %3.9%1 element has neither %2 attribute nor %3 child element. QtXmlPatternsRPrvek %1 nen v tto souvislosti dovolen.*%1 element is not allowed in this context. QtXmlPatternsHPrvek %1 nen v tto oblasti dovolen'%1 element is not allowed in this scope QtXmlPatternsKdy~ je pYtomna vlastnost %3, nesm se vyskytovat prvek %1 v prvku %2.G%1 element is not allowed inside %2 element if %3 attribute is present. QtXmlPatternsPrvek %1 nemo~e stanovit clov jmenn prostor %3 jako hodnotu vlastnosti %2.Y%1 element is not allowed to have the same %2 attribute value as the target namespace %3. QtXmlPatternsPrvek %1 mus mt bu vlastnost %2, nebo mt %3 nebo %4 jako podprvek.F%1 element must have either %2 attribute or %3 or %4 as child element. QtXmlPatternsVPrvek %1 mus mt bu vlastnost %2 nebo %3./%1 element must have either %2 or %3 attribute. QtXmlPatternstVlastnosti %2 a %3 se v prvku %1 nemohou objevit spole n.6%1 element must not have %2 and %3 attribute together. QtXmlPatternsVPrvek %1 vy~aduje bu vlastnost %2 nebo %3..%1 element requires either %2 or %3 attribute. QtXmlPatternsvPrvek %1 nesm mt vlastnost %3, kdy~ existuje podprvek %2.>%1 element with %2 child element must not have a %3 attribute. QtXmlPatternsVe schmatu bez jmennho prostoru mus mt prvek %1 vlastnost %2.V%1 element without %2 attribute is not allowed inside schema without target namespace. QtXmlPatternslOmezujc vlastnosti %1 a %2 se nemohou objevit spolu.-%1 facet and %2 facet cannot appear together. QtXmlPatternsOmezujc vlastnost %1 nesm bt %2, pokud je omezujc vlastnost %3 zkladnho typu %4.5%1 facet cannot be %2 if %3 facet of base type is %4. QtXmlPatternsOmezujc vlastnost %1 nesm bt %2 nebo %3, pokud je omezujc vlastnost %4 zkladnho typu %5.;%1 facet cannot be %2 or %3 if %4 facet of base type is %5. QtXmlPatternszOmezujc vlastnost %1 se stYetv s omezujc vlastnost %2. %1 facet collides with %2 facet. QtXmlPatternsrOmezujc vlastnost %1 obsahuje neplatn pravideln vraz,%1 facet contains invalid regular expression QtXmlPatternsrOmezujc vlastnost %1 obsahuje neplatnou hodnotu %2: %3.'%1 facet contains invalid value %2: %3. QtXmlPatternsOmezujc vlastnost %1 mus bt stejn nebo vta ne~ omezujc vlastnost %2 zkladnho typu.=%1 facet must be equal or greater than %2 facet of base type. QtXmlPatternsOmezujc vlastnost %1 mus bt vta ne~ omezujc vlastnost %2 zkladnho typu.4%1 facet must be greater than %2 facet of base type. QtXmlPatternsOmezujc vlastnost %1 mus bt vta nebo stejn jako omezujc vlastnost %2 zkladnho typu.@%1 facet must be greater than or equal to %2 facet of base type. QtXmlPatternsOmezujc vlastnost %1 mus bt mena ne~ omezujc vlastnost %2 zkladnho typu.1%1 facet must be less than %2 facet of base type. QtXmlPatternsOmezujc vlastnost %1 mus bt mena ne~ omezujc vlastnost %2.$%1 facet must be less than %2 facet. QtXmlPatternsOmezujc vlastnost %1 mus bt mena nebo stejn jako omezujc vlastnost %2 zkladnho typu.=%1 facet must be less than or equal to %2 facet of base type. QtXmlPatternsOmezujc vlastnost %1 mus bt mena nebo stejn jako omezujc vlastnost %2.0%1 facet must be less than or equal to %2 facet. QtXmlPatternsOmezujc vlastnost %1 mus mt tut~ hodnotu, jakou m omezujc vlastnost %2 zkladnho typu.;%1 facet must have the same value as %2 facet of base type. QtXmlPatternsU %1 se lia po et pol od omezen toto~nosti %2, na kterou odkazuje.W%1 has a different number of fields from the identity constraint %2 that it references. QtXmlPatterns%1 m zstupn symbol vlastnosti (vzor hledn), ale jeho zkladn typ %2 nem.7%1 has attribute wildcard but its base type %2 has not. QtXmlPatterns%1 m ve svm zkladnm typu %2 v kruzch provdnou ddi nost.,%1 has inheritance loop in its base type %2. QtXmlPatterns%1 je slo~enm typem. PYetypovn u slo~ench typo nen mo~n. Mo~e se ovaem provdt pYetypovn do atomickch typo jako %2.s%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. QtXmlPatterns"%1 je neplatn %2%1 is an invalid %2 QtXmlPatterns%1 nen pro regulrn vrazy platnm pYznakem. Platnmi pYznaky jsou:?%1 is an invalid flag for regular expressions. Valid flags are: QtXmlPatternsL%1 nen platnm jmennm prostorem-URI.%1 is an invalid namespace URI. QtXmlPatternsN%1 nen platnm pravidelnm vrazem: %2/%1 is an invalid regular expression pattern: %2 QtXmlPatternsT%1 nen platnm nzvem pro Ye~im pYedlohy.$%1 is an invalid template mode name. QtXmlPatterns<%1 je neznmm typem schematu.%1 is an unknown schema type. QtXmlPatterns:Kdovn %1 nen podporovno.%1 is an unsupported encoding. QtXmlPatterns8%1 nen platn znak XML 1.0.$%1 is not a valid XML 1.0 character. QtXmlPatternsZ%1 nen platnm nzvem pokynu pro zpracovn.4%1 is not a valid name for a processing-instruction. QtXmlPatternsX%1 nen platn  seln daj tvoYen psmeny."%1 is not a valid numeric literal. QtXmlPatterns%1 nen platnm clovm nzvem pokynu pro zpracovn. Mus to bt hodnota %2 jakou je napYklad %3.Z%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. QtXmlPatternsB%1 nen platnou hodnotou typu %2.#%1 is not a valid value of type %2. QtXmlPatternsN%1 nen celo selnm dajem o minutch.$%1 is not a whole number of minutes. QtXmlPatterns%1 nen dovoleno odvodit z %2 pomoc rozaYen, neboe posledn uveden ji ur uje jako kone nou.S%1 is not allowed to derive from %2 by extension as the latter defines it as final. QtXmlPatterns%1 nen dovoleno odvodit z %2 pomoc seznamu, neboe posledn uveden ji ur uje jako kone nou.N%1 is not allowed to derive from %2 by list as the latter defines it as final. QtXmlPatterns%1 nen dovoleno odvodit z %2 pomoc omezen, neboe posledn uveden ji ur uje jako kone nou.U%1 is not allowed to derive from %2 by restriction as the latter defines it as final. QtXmlPatterns%1 nen dovoleno odvodit z %2 pomoc sjednocen, neboe posledn uveden ji ur uje jako kone nou.O%1 is not allowed to derive from %2 by union as the latter defines it as final. QtXmlPatternsp%1 nesm mt  lensk typ se stejnm nzvem, jak m sm.E%1 is not allowed to have a member type with the same name as itself. QtXmlPatternsP%1 nesm mt ~dn omezujc vlastnosti.%%1 is not allowed to have any facets. QtXmlPatterns%1 nen atomickm typem. PYetypovn se d provdt pouze s atomickmi typy.C%1 is not an atomic type. Casting is only possible to atomic types. QtXmlPatterns%1 se nenachz v oblasti pod prohlaenm vlastnost. Vaimnte si, ~e funkce zaveden schmatu nen podporovna.g%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. QtXmlPatterns0%1 je podle %2 neplatn. %1 is not valid according to %2. QtXmlPatternsH%1 nen platn jako hodnota typu %2.&%1 is not valid as a value of type %2. QtXmlPatternsRVraz '%1' odpovd znakom pro nov Ydek%1 matches newline characters QtXmlPatternsPo %1 mus nsledovat %2 nebo %3; nesm se objevit na konci nahrazovacho Yetzce.J%1 must be followed by %2 or %3, not at the end of the replacement string. QtXmlPatternsVlastnost %1 odvozenho zstupnho symbolu (vzoru hledn) nen platnm omezenm %2 zkladnho zstupnho symbolu (vzoru hledn)H%1 of derived wildcard is not a valid restriction of %2 of base wildcard QtXmlPatternsVlastnost %1 nebo %2 odkazu %3 neodpovd prohlaen vlastnosti %4.T%1 or %2 attribute of reference %3 does not match with the attribute declaration %4. QtXmlPatterns%1 odkazuje na omezen toto~nosti %2, kter nen ani prvek '%3' ani '%4'.A%1 references identity constraint %2 that is no %3 or %4 element. QtXmlPatternsZ%1 odkazuje na neznm prvek %4 (%2 nebo %3).*%1 references unknown %2 or %3 element %4. QtXmlPatterns%1 vy~aduje alespoH %n argument; daj %2 je z toho dovodu neplatn.%1 vy~aduje alespoH %n argumenty; daj %2 je z toho dovodu neplatn.%1 vy~aduje alespoH %n argumenty; daj %2 je z toho dovodu neplatn.=%1 requires at least %n argument(s). %2 is therefore invalid. QtXmlPatternsp%1 m jen %n argument; daj %2 z tohoto dovodu neplatn.r%1 m jen %n argumenty; daj %2 z tohoto dovodu neplatn.r%1 m jen %n argumenty; daj %2 z tohoto dovodu neplatn.9%1 takes at most %n argument(s). %2 is therefore invalid. QtXmlPatterns%1 byl voln.%1 was called. QtXmlPatternsOmezujc vlastnosti %1, %2, %3, %4, %5 a %6 nejsou pYi odvozen (ddi nosti) pomoc seznamu dovoleny.F%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list. QtXmlPatternsfVlastnost %1 obsahuje neplatn zposobil nzev: %2.2'%1' attribute contains invalid QName content: %2. QtXmlPatterns6Poznmka nesm obsahovat %1A comment cannot contain %1 QtXmlPatterns8Poznmka nesm kon it na %1.A comment cannot end with a %1. QtXmlPatternsNarazilo se na vtvor, kter v nynjam jazyce nen povolen (%1).LA construct was encountered which is disallowed in the current language(%1). QtXmlPatternsDeklarace vchozch jmennch prostoro mus stt pYed deklaracemi funkc-, promnnch- nebo deklaracemi voleb.^A default namespace declaration must occur before function, variable, and option declarations. QtXmlPatternsnByl nalezen chybn stavitel pYmho prvku. %1 kon %2.EA direct element constructor is not well-formed. %1 is ended with %2. QtXmlPatternsDJi~ existuje funkce s podpisem %1.0A function already exists with the signature %1. QtXmlPatternsKnihovn modul nemo~e bt posouzen pYmo, mus bt zaveden z hlavnho modulu.VA library module cannot be evaluated directly. It must be imported from a main module. QtXmlPatternsTParameter funkce nelze prohlsit za tunel.Vlastnost %1 m neplatn obsah.&Attribute %1 contains invalid content. QtXmlPatternsNVlastnost %1 obsahuje neplatn data: %2&Attribute %1 contains invalid data: %2 QtXmlPatternsVlastnost %1 neodpovd zstupnmu symbolu (vzoru hledn) vlastnosti.3Attribute %1 does not match the attribute wildcard. QtXmlPatternshVlastnost %1 zkladnho typu chyb v odvozenm typu.7Attribute %1 from base type is missing in derived type. QtXmlPatternszVlastnost %1 m mezen hodnoty, ale jej typ je odvozen z %2.?Attribute %1 has value constraint but has type derived from %2. QtXmlPatternsVlastnost %1 v odvozenm slo~itm typu mus mt omezen hodnoty jako v zkladnm typu %2.UAttribute %1 in derived complex type must have %2 value constraint like in base type. QtXmlPatterns~Vlastnost %1 v odvozenm slo~itm typu mus omezen hodnoty %2.CAttribute %1 in derived complex type must have %2 value constraint. QtXmlPatternsVlastnost %1 v odvozenm slo~itm typu mus mt stejn omezen hodnoty %2 jako v zkladnm typu.^Attribute %1 in derived complex type must have the same %2 value constraint like in base type. QtXmlPatternsNSkupina vlastnost %1 je ji~ stanovena.#Attribute group %1 already defined. QtXmlPatternsSkupina vlastnost %1 obsahuje vlastnost %2 s omezenm hodnoty, typ je ale odvozen z %3.bAttribute group %1 contains attribute %2 that has value constraint but type that inherits from %3. QtXmlPatternshSkupina vlastnost %1 obsahuje vlastnost %2 dvakrt./Attribute group %1 contains attribute %2 twice. QtXmlPatternsSkupina vlastnost %1 obsahuje dv rozdln vlastnosti, ob s typy, kter jsou odvozeny z %2.ZAttribute group %1 contains two different attributes that both have types derived from %2. QtXmlPatternsPSkupina vlastnosti %1 m cyklick odkaz.*Attribute group %1 has circular reference. QtXmlPatternsZstupn symbol vlastnosti (vzor hledn) %1nen platnm omezenm zstupnho symbolu vlastnosti (vzoru hledn) zkladnho typu %2.ZAttribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2. QtXmlPatternsVlastnosti slo~itho typu %1 nejsou ~dnm platnm rozaYenm vlastnost zkladnho typu %2: %3.^Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3. QtXmlPatternsVlastnosti slo~itho typu %1 nejsou ~dnm platnm omezenm vlastnost zkladnho typu %2: %3.bAttributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3. QtXmlPatternsZkladn vlastnost %1 je vy~adovna, ale odvozen vlastnost nen.;Base attribute %1 is required but derived attribute is not. QtXmlPatternsZkladn vlastnost %1 je vy~adovna, ale chyb v odvozen definici.@Base attribute %1 is required but missing in derived definition. QtXmlPatternsZkladn definice obsahuje prvek %1, kter v odvozen definici chybPBase definition contains an %1 element that is missing in the derived definition QtXmlPatternsXZkladn typ %1 prvku %2 nemo~e bt vyYeaen..Base type %1 of %2 element cannot be resolved. QtXmlPatternsdZkladn typ %1 slo~itho typu nemo~e bt vyYeaen.0Base type %1 of complex type cannot be resolved. QtXmlPatternsZkladn typ %1 jednoduchho typu %2 nesm mt ~dn omezen vlastnosti %3.RBase type %1 of simple type %2 is not allowed to have restriction in %3 attribute. QtXmlPatterns~Zkladn typ %1 jednoduchho typu %2 mus bt druhu sjednocen.:Base type %1 of simple type %2 must have variety of union. QtXmlPatterns~Slo~it typ %2 nemo~e bt zkladnm typem jednoduchho typu %1.6Base type of simple type %1 cannot be complex type %2. QtXmlPatternsZkladn typ jednoduchho typu %1 ur uje sjednocen pomoc omezen jako kone n.KBase type of simple type %1 has defined derivation by restriction as final. QtXmlPatterns|Zkladn typ jednoduchho typu %1 mus bt druhu seznamu typo.;Base type of simple type %1 must have variety of type list. QtXmlPatternshBinrn obsah neodpovd omezujc vlastnosti dlky./Binary content does not match the length facet. QtXmlPatternstBinrn obsah neodpovd omezujc vlastnosti 'maxLength'.2Binary content does not match the maxLength facet. QtXmlPatternstBinrn obsah neodpovd omezujc vlastnosti 'minLength'.2Binary content does not match the minLength facet. QtXmlPatternsvBinrn obsah nen obsa~en ve v tov omezujc vlastnosti.6Binary content is not listed in the enumeration facet. QtXmlPatternsOmezen bloku odvozenho prvku %1 nesm bt slaba ne~ v zkladnm prvku.YBlock constraints of derived element %1 must not be more weaker than in the base element. QtXmlPatternsBoolensk hodnota neodpovd omezujc vlastnosti vzoru pro hledn.-Boolean content does not match pattern facet. QtXmlPatternszNelze zpracovat neznm prvek %1, o ekvanmi prvky jsou: %2.>Can not process unknown element %1, expected elements are: %2. QtXmlPatternshPodprvek v oblasti chyb; mo~nmi podprvky jsou: %1.HChild element is missing in that scope, possible child elements are: %1. QtXmlPatternsVV kruzch provdn skupinov odkaz pro %1. Circular group reference for %1. QtXmlPatternsdV kruzch provdn ddi nost v zkladnm typu %1.%Circular inheritance of base type %1. QtXmlPatterns`V kruzch provdn ddi nost pYi sjednocen %1.!Circular inheritance of union %1. QtXmlPatternsSlo~it typ %1 nemo~e bt odvozen pomoc rozaYen z %2, neboe posledn obsahuje prvek '%3' ve svm modelu obsahu.nComplex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model. QtXmlPatternstSlo~it typ %2 nemo~e bt odvozen ze zkladnho typu %2%3.6Complex type %1 cannot be derived from base type %2%3. QtXmlPatternsSlo~it typ %1 obsahuje vlastnost %2 s omezenm hodnoty, typ je ale odvozen z %3._Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3. QtXmlPatternsZSlo~it typ %1 obsahuje vlastnost %2 dvakrt.,Complex type %1 contains attribute %2 twice. QtXmlPatternsSlo~it typ %1 obsahuje dv rozdln vlastnosti, ob s typy, kter jsou odvozeny z %2.WComplex type %1 contains two different attributes that both have types derived from %2. QtXmlPatternstSlo~it typ %1 m zdvojen prvek %2 ve svm modelu obsahu.?Complex type %1 has duplicated element %2 in its content model. QtXmlPatternsTSlo~it typ %1 nem deterministick obsah..Complex type %1 has non-deterministic content. QtXmlPatternsJSlo~it typ %1 nemo~e bt abstraktn..Complex type %1 is not allowed to be abstract. QtXmlPatternsRSlo~it typ %1 mus mt jednoduch obsah.)Complex type %1 must have simple content. QtXmlPatternsRSlo~it typ %1 mus mt jednoduch obsah.DComplex type %1 must have the same simple type as its base class %2. QtXmlPatternsSlo~it typ %1 s jednoduchm obsahem nemo~e bt odvozen ze slo~itho zkladnho typu %2.PComplex type %1 with simple content cannot be derived from complex base type %2. QtXmlPatternsSlo~it typ odvozenho prvku %1 nemo~e bt platn odvozen ze zkladnho prvku.OComplex type of derived element %1 cannot be validly derived from base element. QtXmlPatternsBSou st s ID %1 je ji~ stanovena.1Component with ID %1 has been defined previously. QtXmlPatternsModel obsahu slo~itho typu %1 obsahuje prvek %2; nelze jej proto odvodit pomoc rozaYen z neprzdnho typu.qContent model of complex type %1 contains %2 element, so it cannot be derived by extension from a non-empty type. QtXmlPatternsModel obsahu slo~itho typu %1 nen ~dnm platnm rozaYenm modelu obsahu %2.QContent model of complex type %1 is not a valid extension of content model of %2. QtXmlPatternsObsah vlastnosti %1 prvku %2 nemo~e pochzet ze jmennho prostoru %3.DContent of %1 attribute of %2 element must not be from namespace %3. QtXmlPatternsvObsah vlastnosti %1 neodpovd stanovenmu omezen hodnoty.@Content of attribute %1 does not match defined value constraint. QtXmlPatternsnObsah vlastnosti %1 neodpovd definici svho typu: %2.?Content of attribute %1 does not match its type definition: %2. QtXmlPatternslObsah prvku %1 neodpovd stanovenmu omezen hodnoty.>Content of element %1 does not match defined value constraint. QtXmlPatternsdObsah prvku %1 neodpovd definici svho typu: %2.=Content of element %1 does not match its type definition: %2. QtXmlPatternsBData typu %1 nemohou bt przdn.,Data of type %1 are not allowed to be empty. QtXmlPatterns|daj o datu neodpovd omezujc vlastnosti vzoru pro hledn./Date time content does not match pattern facet. QtXmlPatternsvdaj o datu neodpovd omezujc vlastnosti 'maxExclusive'.8Date time content does not match the maxExclusive facet. QtXmlPatternsvdaj o datu neodpovd omezujc vlastnosti 'maxInclusive'.8Date time content does not match the maxInclusive facet. QtXmlPatternsvdaj o datu neodpovd omezujc vlastnosti 'minExclusive'.8Date time content does not match the minExclusive facet. QtXmlPatternsvdaj o datu neodpovd omezujc vlastnosti 'minInclusive'.8Date time content does not match the minInclusive facet. QtXmlPatternsrdaj o datu nen obsa~en ve v tov omezujc vlastnosti.9Date time content is not listed in the enumeration facet. QtXmlPatternsPdaj o dni %1 je neplatnm pro msc %2.Day %1 is invalid for month %2. QtXmlPatternsDdaj dne %1 je mimo rozsah %2..%3.#Day %1 is outside the range %2..%3. QtXmlPatternsDesetinn  slo neodpovd omezujc vlastnosti 'fractionDigits'.;Decimal content does not match in the fractionDigits facet. QtXmlPatterns|Desetinn  slo neodpovd omezujc vlastnosti 'totalDigits'.8Decimal content does not match in the totalDigits facet. QtXmlPatterns^Pro vlastnost %1 nen dostupn ~dn deklarace.,Declaration for attribute %1 does not exist. QtXmlPatternsVPro prvek %1 nen dostupn ~dn deklarace.*Declaration for element %1 does not exist. QtXmlPatternsRozaYen mus pou~vat jako zposob ddi nosti (odvozen) pro %1, neboe zkladn typ %2 je jednoduchm typem.TDerivation method of %1 must be extension because the base type %2 is a simple type. QtXmlPatternsjOdvozen vlastnost %1 neexistuje v zkladn definici.;Derived attribute %1 does not exist in the base definition. QtXmlPatternsOdvozen vlastnost %1 neodpovd zstupnmu symbolu (vzoru hledn) v zkladn definici.HDerived attribute %1 does not match the wildcard in the base definition. QtXmlPatternsOdvozen definice obsahuje prvek %1, kter v zkladn definici neexistujeUDerived definition contains an %1 element that does not exists in the base definition QtXmlPatternsOdvozen prvek %1 nemo~e mt ~dnou vlastnost 'nillable', neboe zkladn prvek ~dnou nestanovuje.FDerived element %1 cannot be nillable as base element is not nillable. QtXmlPatternsOdvozen prvek %1 m slaba omezen hodnoty ne~ m zkladn  stice.BDerived element %1 has weaker value constraint than base particle. QtXmlPatternsV odvozenm prvku %1 chyb omezen hodnoty, jak je to stanoveno v zkladn  stici.KDerived element %1 is missing value constraint as defined in base particle. QtXmlPatternsOdvozen  stice dovoluje obsah, kter nen pYpustn pro zkladn  stici.IDerived particle allows content that is not allowed in the base particle. QtXmlPatternsDV odvozen  stici chyb prvek %1.'Derived particle is missing element %1. QtXmlPatternsOdvozen zstupn symbol (vzor hledn) nen ~dnou dl mno~inou zkladnho zstupnho symbolu (vzoru hledn).6Derived wildcard is not a subset of the base wildcard. QtXmlPatternsDlen hodnoty typu %1 prostYednictvm %2 (nen  selnou hodnotou) nen pYpustn.@Dividing a value of type %1 by %2 (not-a-number) is not allowed. QtXmlPatternsDlen hodnoty typu %1 prostYednictvm %2 nebo %3 (kladn nebo zporn nula) nen pYpustn.LDividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. QtXmlPatternsLDlen (%1) nulou (%2) nen stanoveno.(Division (%1) by zero (%2) is undefined. QtXmlPatterns8Dokument nen schmatem XML.Document is not a XML schema. QtXmlPatterns slo s pohyblivou  rkou neodpovd omezujc vlastnosti vzoru pro hledn.,Double content does not match pattern facet. QtXmlPatterns slo s pohyblivou  rkou neodpovd omezujc vlastnosti 'maxExclusive'.5Double content does not match the maxExclusive facet. QtXmlPatterns slo s pohyblivou  rkou neodpovd omezujc vlastnosti 'maxInclusive'.5Double content does not match the maxInclusive facet. QtXmlPatterns slo s pohyblivou  rkou neodpovd omezujc vlastnosti 'minExclusive'.5Double content does not match the minExclusive facet. QtXmlPatterns slo s pohyblivou  rkou neodpovd omezujc vlastnosti 'minInclusive'.5Double content does not match the minInclusive facet. QtXmlPatterns slo s pohyblivou  rkou nen obsa~eno ve v tov omezujc vlastnosti.6Double content is not listed in the enumeration facet. QtXmlPatterns`Nzev prvku %1 se vyskytuje v prvku %2 vcekrt.*Duplicated element names %1 in %2 element. QtXmlPatternshZdvojen omezujc vlastnosti v jednoduchm typu %1.$Duplicated facets in simple type %1. QtXmlPatternsdaj o dob trvn neodpovd omezujc vlastnosti vzoru pro hledn..Duration content does not match pattern facet. QtXmlPatternsdaj o dob trvn neodpovd omezujc vlastnosti 'maxExclusive'.7Duration content does not match the maxExclusive facet. QtXmlPatternsdaj o dob trvn neodpovd omezujc vlastnosti 'maxInclusive'.7Duration content does not match the maxInclusive facet. QtXmlPatternsdaj o dob trvn neodpovd omezujc vlastnosti 'minExclusive'.7Duration content does not match the minExclusive facet. QtXmlPatternsdaj o dob trvn neodpovd omezujc vlastnosti 'minInclusive'.7Duration content does not match the minInclusive facet. QtXmlPatternsdaj o dob trvn nen obsa~en ve v tov omezujc vlastnosti.8Duration content is not listed in the enumeration facet. QtXmlPatterns|Nzvy parametro pYedloh mus bt jednozna n, %1 ji~ existuje.CEach name of a template parameter must be unique; %1 is duplicated. QtXmlPatternsSkute n booleansk hodnota nemo~e bt vypo tna pro posloupnost ze dvou nebo vce atomickch hodnot.aEffective Boolean Value cannot be calculated for a sequence containing two or more atomic values. QtXmlPatterns2Prvek %1 je ji~ stanoven.Element %1 already defined. QtXmlPatternsPrvek %1 nemo~e bt vydvn na pokra ovn, proto~e se objevuje mimo prvky dokumentu.OElement %1 can't be serialized because it appears outside the document element. QtXmlPatternsPrvek %1 nesm obsahovat ~dn jin prvky, proto~e m pevn obsah.BElement %1 cannot contain other elements, as it has fixed content. QtXmlPatternsVPrvek %1 nemo~e mt stavitele posloupnosti..Element %1 cannot have a sequence constructor. QtXmlPatterns:Prvek %1 nemo~e mt podprvky. Element %1 cannot have children. QtXmlPatternsBPrvek %1 obsahuje neplatn obsah.$Element %1 contains invalid content. QtXmlPatternsRPrvek %1 obsahuje nepYpustn vlastnosti.+Element %1 contains not allowed attributes. QtXmlPatternsNPrvek %1 obsahuje nepYpustn podobsah..Element %1 contains not allowed child content. QtXmlPatternsNPrvek %1 obsahuje nepYpustn podprvek..Element %1 contains not allowed child element. QtXmlPatternsXPrvek %1 obsahuje nepYpustn textov obsah.-Element %1 contains not allowed text content. QtXmlPatternsRPrvek %1 obsahuje dv vlastnosti typu %2..Element %1 contains two attributes of type %2. QtXmlPatternsPPrvek %1 obsahuje neznmou vlastnost %2.)Element %1 contains unknown attribute %2. QtXmlPatternsPrvek %1 neodpovd omezen jmennho prostoru zstupnho symbolu (vzor hledn) v zkladn  stici.LElement %1 does not match namespace constraint of wildcard in base particle. QtXmlPatternsXPrvek %1 existuje dvakrt s rozdlnmi typy.-Element %1 exists twice with different types. QtXmlPatternsLPrvek %1 je prohlaen jako abstraktn.#Element %1 is declared as abstract. QtXmlPatterns4U prvku %1 chyb podprvek.$Element %1 is missing child element. QtXmlPatternsDPrvek %1 chyb v odvozen  stici.*Element %1 is missing in derived particle. QtXmlPatternsRU prvku %1 chyb vy~adovan vlastnost %2.,Element %1 is missing required attribute %2. QtXmlPatternsFPrvek %1 nesm stt na tomto mst.+Element %1 is not allowed at this location. QtXmlPatternszPrvek %1 nen v tto oblasti dovolen; mo~nmi prvky jsou: %2.CElement %1 is not allowed in this scope, possible elements are: %2. QtXmlPatternsPrvek %1 nesm mt omezen hodnoty, kdy~ je zkladn typ slo~it.QElement %1 is not allowed to have a value constraint if its base type is complex. QtXmlPatternsPrvek %1 nesm mt omezen hodnoty, kdy~ je jeho typ odvozen z %2.TElement %1 is not allowed to have a value constraint if its type is derived from %2. QtXmlPatternsPrvek %1 nesm patYit k skupin nahrazen, neboe nen celkovm prvkem.\Element %1 is not allowed to have substitution group affiliation as it is no global element. QtXmlPatternsLPrvek %1 nen v tto oblasti stanoven.(Element %1 is not defined in this scope. QtXmlPatternsTPrvek %1 nem zadnu vlastnost 'nillable'.Element %1 is not nillable. QtXmlPatternsBPrvek %1 mus stt jako posledn.Element %1 must come last. QtXmlPatternspPrvek %1 mus mt alespoH jednu z vlastnost %2 nebo %3.=Element %1 must have at least one of the attributes %2 or %3. QtXmlPatternsPrvek %1 mus mt bu jednu %2-vlastnost nebo se mus pou~vat stavitel posloupnosti.EElement %1 must have either a %2-attribute or a sequence constructor. QtXmlPatternsJPrvek m obsah, a koli je 'nillable'.1Element contains content although it is nillable. QtXmlPatternsDSkupina prvko %1 je ji~ stanovena.!Element group %1 already defined. QtXmlPatternszPrzdnou  stici nelze odvodit z  stice, kter nen przdn.9Empty particle cannot be derived from non-empty particle. QtXmlPatternsV tov omezujc vlastnost obsahuje neplatn obsah: {%1} nen hodnotou typu %2.KEnumeration facet contains invalid content: {%1} is not a value of type %2. QtXmlPatternsDPole %1 nem ~dn jednoduch typ.Field %1 has no simple type. QtXmlPatterns~Pevn omezen hodnoty nen dovoleno, pokud je prvek 'nillable'.:Fixed value constraint not allowed if element is nillable. QtXmlPatternsPevn omezen hodnoty prvku %1 se lia od omezen hodnoty zkladn  stici.TFixed value constraint of element %1 differs from value constraint in base particle. QtXmlPatterns>Hodnota ID %1 nen jednozna n.ID value '%1' is not unique. QtXmlPatternsNOmezen toto~nosti %1 je ji~ stanoveno.'Identity constraint %1 already defined. QtXmlPatternsKdy~ jsou zadny ob hodnoty s  asovmi znami, mus mt ten sam rozdl v  asov zn. %1 a %2 nejsou to sam a jsou tm pdem nepYpustn.bIf both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. QtXmlPatternsPrvek %1 nesm mt vlastnost %3 nebo %4, pokud nem vlastnost %2.EIf element %1 has no attribute %2, it cannot have attribute %3 or %4. QtXmlPatternsNelze zadat ~dnou pYedponu, jestli~e je prvn argument przdn nebo je przdn Yetzec znako (~dn jmenn prostor). Byla zadna pYedpona %1.If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. QtXmlPatternsVe staviteli jmennho prostoru nesm mt hodnota jmennho prostoru przdnm Yetzcem.PIn a namespace constructor, the value for a namespace cannot be an empty string. QtXmlPatternsVe zjednoduaenm modulu stylovho listu mus bt pYtomna vlastnost %1.@In a simplified stylesheet module, attribute %1 must be present. QtXmlPatternsV XSL-T vyhledvacm vzoru se smj pou~vat jen osy %2 nebo %3, ne vaak %1.DIn an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can. QtXmlPatterns|V XSL-T vyhledvacm vzoru nesm mt funkce %1 tYet argument.>In an XSL-T pattern, function %1 cannot have a third argument. QtXmlPatternsV XSL-T vyhledvacm vzoru se smj pro srovnvn pou~vat jen funkce %1 a %2, ne vaak %3.OIn an XSL-T pattern, only function %1 and %2, not %3, can be used for matching. QtXmlPatternsV XSL-T vyhledvacm vzoru mus bt prvn argument k funkci %1 pYi pou~it k hledn odkaz tvoYen psmeny nebo promnn.yIn an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching. QtXmlPatternsV XSL-T vyhledvacm vzoru mus bt prvn argument k funkci %1 pYi pou~it k hledn Yetzec tvoYen psmeny.hIn an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching. QtXmlPatternsV nahrazen mo~e bt pou~it pouze %1, aby se chrnil sm, nebo %2, ne vaak pro %3MIn the replacement string, %1 can only be used to escape itself or %2, not %3 QtXmlPatternsV nahrazovacm Yetzci mus po %1 nsledovat alespoH jedna  slice, kdy~ nen chrnn znakem Escape.VIn the replacement string, %1 must be followed by at least one digit when not escaped. QtXmlPatternsdCelo seln dlen (%1) nulou (%2) nen stanoveno.0Integer division (%1) by zero (%2) is undefined. QtXmlPatternsdObsah zposobilho nzvu ('QName') je neplatn: %1.Invalid QName content: %1. QtXmlPatterns0PYedponu %1 nelze spojit+It is not possible to bind to the prefix %1 QtXmlPatterns8PYedponu %1 nelze prohlsit.*It is not possible to redeclare prefix %1. QtXmlPatterns%1 nelze ur it.'It will not be possible to retrieve %1. QtXmlPatternsbVlastnosti nesm nsledovat za jinmi druhy uzlo.AIt's not possible to add attributes after any other kind of node. QtXmlPatternsXSlo~kov typ %1 prvku %2 nemo~e bt vyYeaen..Item type %1 of %2 element cannot be resolved. QtXmlPatternsvSlo~kov typ zkladnho typu neodpovd slo~kovmu typu %1.6Item type of base type does not match item type of %1. QtXmlPatternsxSlo~kov typ jednoduchho typu %1 nemo~e bt slo~itm typem.5Item type of simple type %1 cannot be a complex type. QtXmlPatternsTOmezen kl e %1 obsahuje nepYtomn pole.)Key constraint %1 contains absent fields. QtXmlPatternsOmezen kl e %1 obsahuje odkazy na prvek %2, kter je 'nillable'.:Key constraint %1 contains references nillable element %2. QtXmlPatternshObsah seznamu neodpovd omezujc vlastnosti dlky.)List content does not match length facet. QtXmlPatternstObsah seznamu neodpovd omezujc vlastnosti 'maxLength'.,List content does not match maxLength facet. QtXmlPatternstObsah seznamu neodpovd omezujc vlastnosti 'minLength'.,List content does not match minLength facet. QtXmlPatternsObsah seznamu neodpovd omezujc vlastnosti vzoru pro hledn.*List content does not match pattern facet. QtXmlPatternsvObsah seznamu nen obsa~en ve v tov omezujc vlastnosti.4List content is not listed in the enumeration facet. QtXmlPatternsPNahran soubor se schmatem je neplatn.Loaded schema file is invalid. QtXmlPatterns^Na psan velkch/malch psmen nen brn zYetelMatches are case insensitive QtXmlPatterns lensk typ %1 nemo~e bt odvozen z  lenskho typu %2 ze zkladnho typu %4 %3.JMember type %1 cannot be derived from member type %2 of %3's base type %4. QtXmlPatternsV lensk typ %1 prvku %2 nemo~e bt vyYeaen.0Member type %1 of %2 element cannot be resolved. QtXmlPatternsv lensk typ jednoduchho typu %1 nemo~e bt slo~itm typem.7Member type of simple type %1 cannot be a complex type. QtXmlPatternsZaveden modulo mus nastat pYed deklaracemi funkc, promnnch a voleb.MModule imports must occur before function, variable, and option declarations. QtXmlPatternsnDlen absolutn hodnoty (%1) nulou(%2) nen stanoveno.0Modulus division (%1) by zero (%2) is undefined. QtXmlPatternsNdaj o msci %1 je mimo rozsah %2..%3.%Month %1 is outside the range %2..%3. QtXmlPatternsLPro pole %1 bylo nalezeno vce hodnot.'More than one value found for field %1. QtXmlPatternsNsoben hodnoty typu %1 s %2 nebo %3 (kladn nebo zporn nekone no) nen pYpustn.YMultiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. QtXmlPatternsJmenn prostor %1 lze spojit pouze s %2. Toto je stanoveno ji~ dopYedu.ONamespace %1 can only be bound to %2 (and it is, in either case, pre-declared). QtXmlPatternsDeklarace jmennch prostoro mus stt pYed prohlaenmi funkc, promnnch nebo prohlaenmi voleb.UNamespace declarations must occur before function, variable, and option declarations. QtXmlPatterns~PYedpona jmennho prostoru zposobilho nzvu %1 nen stanovena.5Namespace prefix of qualified name %1 is not defined. QtXmlPatternsT asov limit seov operace byl pYekro en.Network timeout. QtXmlPatternsTPro prvek %1 nen dostupn ~dn definice.'No definition for element %1 available. QtXmlPatterns Nejsou podporovny vnja funkce. Vaechny podporovan funkce se daj pou~vat pYmo, bez toho, ~e by byly nejprve prohlaeny za vnja{No external functions are supported. All supported functions can be used directly, without first declaring them as external QtXmlPatternsHNeexistuje ~dn funkce s nzvem %1.&No function with name %1 is available. QtXmlPatternsJNeexistuje ~dn funkce s podpisem %1*No function with signature %1 is available QtXmlPatternstNeexistuje ~dn svzn jmennho prostoru pro pYedponu %1-No namespace binding exists for the prefix %1 QtXmlPatterns~Neexistuje ~dn svzn jmennho prostoru pro pYedponu %1 v %23No namespace binding exists for the prefix %1 in %2 QtXmlPatternstOdkazovanou hodnotu odkazu na kl %1 se nepodaYilo najt./No referenced value found for key reference %1. QtXmlPatternsTPro schvlen nen stanoveno ~dn schma.!No schema defined for validation. QtXmlPatternsLNeexistuje ~dn pYedloha s nzvem %1.No template by name %1 exists. QtXmlPatternszPro vnja promnnou s nzvem %1 nen dostupn ~dn hodnota.=No value is available for the external variable with name %1. QtXmlPatternsJNeexistuje ~dn promnn s nzvem %1No variable with name %1 exists QtXmlPatterns|Pro omezen %1 byla nalezena ne jednozna n stanoven hodnota.)Non-unique value found for constraint %1. QtXmlPatternsMus bt pYtomen zlo~n vraz, neboe nejsou podporovny ~dn vcn vrazy^None of the pragma expressions are supported. Therefore, a fallback expression must be present QtXmlPatterns2Zpis %1 je ji~ stanoven.Notation %1 already defined. QtXmlPatternstObsah zpisu nen obsa~en ve v tov omezujc vlastnosti.8Notation content is not listed in the enumeration facet. QtXmlPatternsPYi odvozen (ddi nosti) pomoc sjednocen jsou dovoleny pouze omezujc vlastnosti %1 a %2.8Only %1 and %2 facets are allowed when derived by union. QtXmlPatternsnProlog k dotazu sm obsahovat pouze jednu %1 deklaraci.6Only one %1 declaration can occur in the query prolog. QtXmlPatternsFMo~e bt jen jeden jedin %1-prvek.Only one %1-element can appear. QtXmlPatternsJe podporovn pouze Unicode Codepoint Collation (%1). %2 nen podporovn.IOnly the Unicode Codepoint Collation is supported(%1). %2 is unsupported. QtXmlPatternsjS %2 mo~e bt spojena pouze pYedpona %1 (a obrcen).5Only the prefix %1 can be bound to %2 and vice versa. QtXmlPatternsOpertor %1 se nemo~e pou~vat u atomickch hodnot typo %2 a %3.>Operator %1 cannot be used on atomic values of type %2 and %3. QtXmlPatternsFOpertor %1 nelze pou~t na typ %2.&Operator %1 cannot be used on type %2. QtXmlPatternsLNelze pYedstavit datum %1 (PYete en)."Overflow: Can't represent date %1. QtXmlPatternsFNelze pYedstavit datum (PYete en).$Overflow: Date can't be represented. QtXmlPatterns*Chyba vyhodnocen: %1Parse error: %1 QtXmlPatterns| stice m nedeterministick zstupn symboly (vzory hledn)..Particle contains non-deterministic wildcards. QtXmlPatternsPYedponu %1 lze spojit pouze s %2. Toto je prohlaeno ji~ dopYedu..LPrefix %1 can only be bound to %2 (and it is, in either case, pre-declared). QtXmlPatternslPYedpona %1 byla prohlaena ji~ v pYedmluv (prologu).,Prefix %1 is already declared in the prolog. QtXmlPatternsZPYedpona zposobilho nzvu %1 nen stanovena.+Prefix of qualified name %1 is not defined. QtXmlPatternshPostoupen od %1 k %2 mo~e vst ke ztrt pYesnosti./Promoting %1 to %2 may cause loss of precision. QtXmlPatternsObsah zposobilho nzvu ('QName') neodpovd omezujc vlastnosti vzoru pro hledn.+QName content does not match pattern facet. QtXmlPatternsObsah zposobilho nzvu ('QName') nen obsa~en ve v tov omezujc vlastnosti.5QName content is not listed in the enumeration facet. QtXmlPatternsJOdkaz %1 prvku %2 nemo~e bt vyYeaen..Reference %1 of %2 element cannot be resolved. QtXmlPatternsPo~adovan kardinln  slo (mohutnost mno~iny) je %1 (v sou asnosti %2)./Required cardinality is %1; got cardinality %2. QtXmlPatternsNPo~adovan typ je %1, byl ale zadn %2.&Required type is %1, but %2 was found. QtXmlPatternsJe zpracovvn jeden XSL-T 1.0 stylov list jednm procesorem verze 2.0.5Running an XSL-T 1.0 stylesheet with a 2.0 processor. QtXmlPatternsCelo seln hodnota ozna en znamnkem neodpovd omezujc vlastnosti 'totalDigits'.?Signed integer content does not match in the totalDigits facet. QtXmlPatternsCelo seln hodnota ozna en znamnkem neodpovd omezujc vlastnosti vzoru pro hledn.4Signed integer content does not match pattern facet. QtXmlPatternsCelo seln hodnota ozna en znamnkem neodpovd omezujc vlastnosti 'maxExclusive'.=Signed integer content does not match the maxExclusive facet. QtXmlPatternsCelo seln hodnota ozna en znamnkem neodpovd omezujc vlastnosti 'maxInclusive'.=Signed integer content does not match the maxInclusive facet. QtXmlPatternsCelo seln hodnota ozna en znamnkem neodpovd omezujc vlastnosti 'minExclusive'.=Signed integer content does not match the minExclusive facet. QtXmlPatternsCelo seln hodnota ozna en znamnkem neodpovd omezujc vlastnosti 'minInclusive'.=Signed integer content does not match the minInclusive facet. QtXmlPatternsCelo seln hodnota ozna en znamnkem nen obsa~ena ve v tov omezujc vlastnosti.>Signed integer content is not listed in the enumeration facet. QtXmlPatternsJednoduch typ %1 mo~e mt jen jednoduch atomick zkladn typ.=Simple type %1 can only have simple atomic type as base type. QtXmlPatternsJednoduch typ %1 nesm bt odvozen z %2 , kter~to ur uje omezen jako kone n.PSimple type %1 cannot derive from %2 as the latter defines restriction as final. QtXmlPatternsfJednoduch typ %1 nemo~e mt pYm zkladn typ %2./Simple type %1 cannot have direct base type %2. QtXmlPatternsJednoduch typ %1 obsahuje nedovolen typ omezujc vlastnosti %2.2Simple type %1 contains not allowed facet type %2. QtXmlPatternsXJednoduch typ %1 nesm mt zkladn typ %2.3Simple type %1 is not allowed to have base type %2. QtXmlPatternsnJednoduch typ %1 mo~e mt jen omezujc vlastnosti %2.0Simple type %1 is only allowed to have %2 facet. QtXmlPatternsvJednoduch typ obsahuje nedovolenou omezujc vlastnost %1.*Simple type contains not allowed facet %1. QtXmlPatternsJednoduch typ odvozenho prvku %1 nemo~e bt platn odvozen ze zkladnho prvku.NSimple type of derived element %1 cannot be validly derived from base element. QtXmlPatternsPZadan typ %1 nen ve schmatu stanoven.-Specified type %1 is not known to the schema. QtXmlPatternslZadan typ %1 nen platn nahraditeln typem prvku %2.DSpecified type %1 is not validly substitutable with element type %2. QtXmlPatternsZadn use='prohibited' ve skupin vlastnost nem naprosto ~dn  inek.DSpecifying use='prohibited' inside an attribute group has no effect. QtXmlPatternsObsah Yetzce znako neodpovd omezujc vlastnosti vzoru pro hledn.,String content does not match pattern facet. QtXmlPatternstObsah Yetzce znako neodpovd omezujc vlastnosti dlky./String content does not match the length facet. QtXmlPatternsObsah Yetzce znako neodpovd omezujc vlastnosti dlky (nejvta; 'maxLength').2String content does not match the maxLength facet. QtXmlPatternsObsah Yetzce znako neodpovd omezujc vlastnosti dlky (nejmena; 'minLength').2String content does not match the minLength facet. QtXmlPatternsObsah Yetzce znako nen obsa~en ve v tov omezujc vlastnosti.6String content is not listed in the enumeration facet. QtXmlPatterns\Skupina nahrazen %1 m m cyklickou definici..Substitution group %1 has circular definition. QtXmlPatternsdSkupina nahrazen %1 prvku %2 nemo~e bt vyYeaena.7Substitution group %1 of %2 element cannot be resolved. QtXmlPatternsClov jmenn prostor %1 zavedenho schmatu se lia od jm vymezenho clovho jmennho prostoru %2.tTarget namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema. QtXmlPatternsClov jmenn prostor %1 zahrnutho schmatu se lia od jm vymezenho clovho jmennho prostoru %2.tTarget namespace %1 of included schema is different from the target namespace %2 as defined by the including schema. QtXmlPatternsZNa tomto mst nesm stt ~dn textov uzly.,Text nodes are not allowed at this location. QtXmlPatternsjText nebo odkazy na entitu nejsou v prvku %1 dovoleny7Text or entity references not allowed inside %1 element QtXmlPatterns@Osa %1 nen v XQuery podporovna$The %1-axis is unsupported in XQuery QtXmlPatternsDeklarace %1 je nepYpustn, proto~e nen podporovno zaveden schmat.WThe Schema Import feature is not supported, and therefore %1 declarations cannot occur. QtXmlPatterns%1-vrazy se nemohou pou~vat, proto~e funkce ovYovn platnosti schmatu nen podporovna.VThe Schema Validation Feature is not supported. Hence, %1-expressions may not be used. QtXmlPatterns4URI nesm obsahovat kousekThe URI cannot have a fragment QtXmlPatternsTPouze prvn %2-prvek sm mt vlastnost %1.9The attribute %1 can only appear on the first %2 element. QtXmlPatternsn%2 nesm mt vlastnost %1 v pYpad, ~e je potomkem %3.?The attribute %1 cannot appear on %2, when it is a child of %3. QtXmlPatternsxKdovac bod %1 z %2 s kdovnm %3 nen platnm znakem XML.QThe codepoint %1, occurring in %2 using encoding %3, is an invalid XML character. QtXmlPatternsvData pokynu pro zpracovn nesm obsahovat Yetzec znako %1AThe data of a processing instruction cannot contain the string %1 QtXmlPatternsPPro sbrku nen stanovena ~dn pYedloha#The default collection is undefined QtXmlPatternsKdovn %1 je neplatn; sm sestvat pouze z latinskch psmen a mus odpovdat pravidelnu vrazu %2.The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. QtXmlPatternsPrvn argument k %1 nesm bt typu %2; mus to bt  seln typ, xs:yearMonthDuration nebo xs:dayTimeDuration.uThe first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. QtXmlPatternsPrvn argument %1 nemo~e bt typu %2. Mus to bt typ %3, %4 nebo %5.PThe first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. QtXmlPatterns.Nen stanoveno ohnisko.The focus is undefined. QtXmlPatternsvInicializace promnn %1 je zvisl na jej vlastn hodnot3The initialization of variable %1 depends on itself QtXmlPatternsRPrvek %1 neodpovd po~adovanmu typu %2./The item %1 did not match the required type %2. QtXmlPatternsKl ov slovo %1 se nemo~e pou~vat dohromady s jinm nzvem zposobu.5The keyword %1 cannot occur with any other mode name. QtXmlPatternsPosledn krok cesty mus obsahovat bu jen uzly nebo jen atomick hodnoty. Nesm se vyskytovat spole n.kThe last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. QtXmlPatternsNFunkce zaveden modulu nen podporovna*The module import feature is not supported QtXmlPatternstNzev %1 nem ~dnou spojitost s jakmkoli typem schmatu..The name %1 does not refer to any schema type. QtXmlPatternsNzev po tan vlastnosti nesm mt jmenn prostor-URI %1 s mstnm nzvem %2.ZThe name for a computed attribute cannot have the namespace URI %1 with the local name %2. QtXmlPatternsNzev promnn zce spojen s pro-vrazem se mus liait od pozi n promnn. Dv promnn s nzvem %1 se z tohoto dovodu stYetvaj.The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. QtXmlPatternsxNzev vrazu rozaYen se mus nachzet ve jmennm prostoru.;The name of an extension expression must be in a namespace. QtXmlPatternsNzev volby mus mt pYedponu. Pro volby nen ~dn pYedloha pro jmenn prostor.TThe name of an option must have a prefix. There is no default namespace for options. QtXmlPatterns Jmenn prostor %1 je vyhrazen a z toho dovodu jej nemohou pou~vat u~ivatelem stanoven funkce (pro tento  el je tu pYedstanoven pYedpona %2).The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. QtXmlPatternsJmenn prostor-URI nesm bt przdn, kdy~ je spojen s prefixem %1.JThe namespace URI cannot be the empty string when binding to a prefix, %1. QtXmlPatternsURI jmennho prostoru v nzvu vypo tan vlastnosti nesm bt %1.DThe namespace URI in the name for a computed attribute cannot be %1. QtXmlPatternsJmenn prostor-URI mus bt konstantou a nesm pou~vat vlo~en vrazy.IThe namespace URI must be a constant and cannot use enclosed expressions. QtXmlPatternsJmenn prostor u~ivatelem stanoven funkce nesm bt przdn (pro tento  el je pYednastavena pYedpona (prefix) %1)zThe namespace for a user defined function cannot be empty (try the predefined prefix %1, which exists for cases like this) QtXmlPatternsJmenn prostor u~ivatelem stanoven funkce v modulu knihovny mus odpovdat jmennmu prostoru modulu (Jinmi slovy by ml bt %1 namsto %2) The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 QtXmlPatternsXTato forma normalizovn %1 nen podporovna. Podporovanmi formami normalizovn jsou %2, %3, %4 a %5, a "~dn" (przdn znakov Yetzec zastupuje "~dn normalizovn").The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). QtXmlPatternstNeexistuje ~dn odpovdajc %2 pro pYedan parameter %1.;The parameter %1 is passed, but no corresponding %2 exists. QtXmlPatternsnPro vy~adovan parametr %1 nebyl zadn odpovdajc %2.BThe parameter %1 is required, but no corresponding %2 is supplied. QtXmlPatterns2PYedponu %1 nelze spojit.The prefix %1 cannot be bound. QtXmlPatternsPYedpona %1 nemo~e bt spojena. Ve vchozm nastaven je ji~ spojena se jmennm prostorem %2.SThe prefix %1 cannot be bound. By default, it is already bound to the namespace %2. QtXmlPatterns`PYedpona mus bt platn %1, co~ nen pYpad %2./The prefix must be a valid %1, which %2 is not. QtXmlPatternsNadYzen uzel druhho agumentu funkce %1 mus bt uzlem dokumentu, co~ nen pYpad %2.gThe root node of the second argument to function %1 must be a document node. %2 is not a document node. QtXmlPatternsDruh argument %1 nemo~e bt typ %2. Mus to bt typ %3, %4 nebo %5.QThe second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. QtXmlPatternsClov nzev pYkazu pro zpracovn nemo~e bt %1 (nezvisle na psan velkch/malch psmen). %2 je z toho dovodu neplatn.~The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid. QtXmlPatternsVClov jmenn prostor %1 nesm bt przdn.-The target namespace of a %1 cannot be empty. QtXmlPatternsHodnota vlastnosti %1 prvku %2 mo~e bt jen %3 nebo %4, ne vaak %5.IThe value for attribute %1 on element %2 must either be %3 or %4, not %5. QtXmlPatternsHodnota vlastnosti %1 mus bt typu %2. %3 nen platnou hodnotou.=The value of attribute %1 must be of type %2, which %3 isn't. QtXmlPatternsHodnota XSL-T vlastnosti verze mus bt hodnotou typu %1, co~ nen pYpad %2.TThe value of the XSL-T version attribute must be a value of type %1, which %2 isn't. QtXmlPatterns0Promnn %1 se nepou~vThe variable %1 is unused QtXmlPatterns~Existuje hodnota IDREF, pro kterou neexistuje pYsluan ID: %1.6There is one IDREF value with no corresponding ID: %1. QtXmlPatterns%1 se nemo~e pou~vat, proto~e tento procesor nepodporuje ~dn schma.CThis processor is not Schema-aware and therefore %1 cannot be used. QtXmlPatternsH asov daj %1:%2:%3.%4 je neplatn.Time %1:%2:%3.%4 is invalid. QtXmlPatterns asov daj 24:%1:%2.%3 je neplatn. U hodinovho daje je 24, ale minuty, sekundy a milisekundy mus bt vaechny 0; _Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0;  QtXmlPatternspln nahoYe stojc prvky provdcho listu se nesm nachzet v nulovm jmennm prostoru, co~ je pYpad %1.NTop level stylesheet elements must be in a non-null namespace, which %1 isn't. QtXmlPatternsByly nalezeny dv vlastnosti deklarace jmennho prostoru se stejnm nzvem (%1).qx<)fڄ6%ڄ J-c\Ynh)RM]1K%יQc+O}kOp{"t@'x?ZE^iNij-.KU?l]ǭ+4+k.Ȗ$Q>1$.=>y>,uf>5!y@gfM/6 #6@d6?ޅ~s:g~ zm #TD%'^!8ĄEnXFɮeUNu\se@EHpAMqY)l.Pzbt 5# uJ}VK4||qv=. C5* C!@#Gl#GšB~ M%0M%ƢN'Vnkfiq|qNTs'@r9. BA0<NIp%n'7P%cyZrvNƒpլjCJ/؃ĘUoXxܓ~釥p[:8?.4$ v*15^$;^/Se[7݈l 2 l 2vK{.*43*f!X3jVn5IG*ln _T ''GIٙPYoZ-]h`^qlVHLʾP_ln֣|S֣rF-܄!. \ GZJ, ֑BnVjz\ {2NY@/^z~SEl~td#H#)X {JI+[6pN:3PO\!]fg!oc'nz@{^ϛ}dˍ2_Q*=eW/ӏ`9 Q! ! 1  ) U .8{ 5t/ 5q Ehs} Pox [‚Ac h> h>>A h>sY h> lao$ qT zl  tM C6m  @j( Ƚ, ȽLo p I- .  q"] *6 5/\ [5 eeo ee h} h h& s( sa xj ^ s` sa !  I R v- vM n[ ۰ 1   f ;  b`, fۨ pP~Z yN- |>j ~ B#  ^ E ^ <6 ͷ){ >7 5   >O Ч0 /~C -du~ 0 Gj Gj KCج N0qI ]: ]* ]H gә k}F oQk oSy +!2 }} 0 W Ybn D9 1a3 v$ I*l II9 Fc 5 z ߚܻ 4N 4; Ps+ bq3 ڠ C ,y8] ?N Mԇ W%u `jI i$@ w P- P\  P, PL N D y+~ yKSOJzvGc LN$~Cs ^Z&mY<. 0M6;SHVȑ0kv>dw5r)o\%4t,\tzWOp| G.OYT,b`h#8c͟kk uȺ2ODu9~ ÓAy)+y)L$)ޡ4]@Ei&Om&About AboutDialog&Licensaftale&Licence Agreement AboutDialog&System Info &System Info AboutDialog&Tak til &Thanks To AboutDialogF&orfattereA&uthors AboutDialogOmAbout AboutDialog Build tid: %1 %2Build time: %1 %2 AboutDialogBidragydere Contributors AboutDialogTjekkiskCzech AboutDialog DanskDanish AboutDialog FranskFrench AboutDialogTyskGerman AboutDialog"Primre udviklereMain developers AboutDialogOKOK AboutDialog6Operativsystem og version: #Operating system name and version:  AboutDialog(Qt runtime version: Qt runtime version:  AboutDialog SvenskSwedish AboutDialogDette er qStopMotion programmet, til at lave stopmotion animationer.HThis is the qStopMotion application for creating stop motion animations. AboutDialogpDette program er distribueret under reglerne for GPL v2.:This program is distributed under the terms of the GPL v2. AboutDialogOversttelse Translation AboutDialogUkendt Mac OSUnknown Mac OS AboutDialog"Ukendt Windows OSUnknown Windows OS AboutDialogVersion:  Version:  AboutDialogogand AboutDialog^qStopMotion er en fork af stopmotion for linux..qStopMotion is a fork of stopmotion for linux. AboutDialogTilfj lyd Add SoundAnimationProject.Kan ikke bne den valgte lydfil til lsning. Check at du har sat de rigtige rettigheder. Animationen vil blive spillet uden lyd, hvis du vlger afspil.Cannot open the selected audio file for reading. Check that you have the right permissions set. The animation will be run without sound if you choose to play.AnimationProject4Gemmer scener til disk ...Saving scenes to disk ...AnimationProjectDen valgte audio fil er ugyldig indenfor det valgte lyd format. Animationen vil blivet spillet uden lyd hvis du vlger afspil.The selected audio file is not valid within the given audio format. The animation will be run without sound if you choose to play.AnimationProject&Luk&CloseCameraControllerDialog*&Nulstil til standard&Reset to DefaultCameraControllerDialogFortryd Nukstil Abort ResetCameraControllerDialogBAutomatisk Backlight Kompensation Automatic Backlight CompensationCameraControllerDialog(Automatisk LysstyrkeAutomatic BrightnessCameraControllerDialog6Automatisk Farve AktiveringAutomatic Color EnableCameraControllerDialog&Automatisk KontrastAutomatic ContrastCameraControllerDialog,Automatisk EksponeringAutomatic ExposureCameraControllerDialogAutomatic FokusAutomatic FocusCameraControllerDialog.AutomatiskForstrkning Automatic GainCameraControllerDialog Automatisk GammaAutomatic GammaCameraControllerDialog(Automatisk Farvetone Automatic HueCameraControllerDialog"Automatisk BlndeAutomatic IrisCameraControllerDialogAutomatisk Pan Automatic PanCameraControllerDialogAutomatic RollAutomatic RollCameraControllerDialog$Automatisk MtningAutomatic SaturationCameraControllerDialog&Automatisk SkarphedAutomatic SharpnessCameraControllerDialogAutomatisk TiltAutomatic TiltCameraControllerDialog,Automatisk HvidbalanceAutomatic White BalanceCameraControllerDialogAutomatisk ZoomAutomatic ZoomCameraControllerDialog.Backlight Kompensation:Backlight Compensation:CameraControllerDialogLysstyrke: Brightness:CameraControllerDialogKamera KontrolCamera ControlCameraControllerDialog"Farve Aktivering: Color Enable:CameraControllerDialogKontrast: Contrast:CameraControllerDialogEksponering: Exposure:CameraControllerDialog Fokus:Focus:CameraControllerDialogForstrkning:Gain:CameraControllerDialog Gamma:Gamma:CameraControllerDialogFarvetone:Hue:CameraControllerDialogBlnde:Iris:CameraControllerDialogPan:Pan:CameraControllerDialog>Nulstil Kamera Indstillinger...Reset Camera Settings...CameraControllerDialog<Gendan Kamera Indstillinger...Restore Camera Settings...CameraControllerDialog Roll:Roll:CameraControllerDialogMtning: Saturation:CameraControllerDialogSkarphed: Sharpness:CameraControllerDialog Tilt:Tilt:CameraControllerDialogVideo Kvalitet Video QualityCameraControllerDialogHvidbalance:White Balance:CameraControllerDialog Zoom:Zoom:CameraControllerDialog:qStopMotion Kamera ControllerqStopMotion Camera ControllerCameraControllerDialog&Annuler&CancelDescriptionDialog&OK&OKDescriptionDialog*&Projekt Beskrivelse:&Project Description:DescriptionDialog&&Scene Beskrivelse:&Scene Description:DescriptionDialog$&Take Beskrivelse:&Take Description:DescriptionDialogInformation InformationDescriptionDialog&Projekt BeskrivelseProject DescriptionDescriptionDialog"Scene BeskrivelseScene DescriptionDescriptionDialog Take BeskrivelseTake DescriptionDescriptionDialoglKarakteren '|' er ikke tilladt i projekt beskrivelsen.BPS vlger</h4> <p>Ved at ndre vrdien i dette felt, vlger du hastigheden som animationen i <b>Fremviseren</b> vil kre med.</p> <p>Start animationen ved at presse <b>Kr Animation</b> knappen.</p>

FPS chooser

By changing the value in this chooser you set which speed the animation in the FrameView should run at.

To start an animation press the Run Animation button.

 ExportWidgetAVIAVI ExportWidgetHerunder kan du vlge hvilket program der skal bruges for at lave dit nye projekt til en video fil.ZBelow you can set which program should be used for encoding a new project to a video file. ExportWidgetHerunder kan du vlge hvilket program der skal bruges for at lave dit aktive projekt om til en video fil.iBelow you can set which program should be used for encoding the currently active project to a video file. ExportWidgetGennemseBrowse ExportWidgetVlg output filChoose output file ExportWidgetVil du sprges om output fil hver gang du vlger at eksportere en fil?JDo you want to be asked for an output file everytime you choose to export? ExportWidget(Encoder Applikation:Encoder Application: ExportWidget(Encoder instillingerEncoder settings ExportWidget Billed strrelse Frame Size ExportWidget(Billeder per sekund:Frames per Second: ExportWidget&Fuld HD (1900x1080)Full HD (1900x1080) ExportWidget&HD Ready (1280x720)HD Ready (1280x720) ExportWidgetMP4MP4 ExportWidgetNejNo ExportWidget0Output fil indstillingerOutput file settings ExportWidgetPAL D (704x576)PAL D (704x576) ExportWidgetQVGA (320x240)QVGA (320x240) ExportWidgetSVGA (800x600)SVGA (800x600) ExportWidget8Indstil standard output fil:Set default output file: ExportWidgetVGA (640x480) VGA (640x480) ExportWidgetVideo Format: Video Format: ExportWidget Video Strrelse: Video Size: ExportWidgetJaYes ExportWidget ffmpegffmpeg ExportWidgetZKan ikke kopiere billedet til projekt mappen!.Can't copy the image to the project directory!Exposure`Kan ikke kopiere billedet til midlertidig mappe!0Can't copy the image to the temporary directory!ExposureVKan ikke fjerne billedet fra projekt mappe!2Can't remove the image from the project directory!ExposuredKan ikke fjerne billedet i den midlertidige mappe!2Can't remove the image in the temporary directory!ExposureKan ikke gemme billedet i det nye fil format til midlertidig mappe!GCan't save the image in the new file format to the temporary directory!ExposureKritiskCriticalExposureLukCloseExternalCommandDialogMislykkedes!Failed!ExternalCommandDialog$Input til program:Input to program:ExternalCommandDialog6Output fra ekstern kommandoOutput from external commandExternalCommandDialogResultatResultExternalCommandDialogIndsendSubmitExternalCommandDialogSucces! Successful!ExternalCommandDialog AnvendApply GeneralDialogLukClose GeneralDialog.Generelle indstillingerGeneral Settings GeneralDialogGrabberGrabber GeneralDialogBilled import Image Import GeneralDialog*Billed TransformeringImage Transformation GeneralDialog&Nyt projekt VrdierNew Project Values GeneralDialogForetrukne Preferences GeneralDialogVideo Eksport Video Export GeneralDialog,qStopMotion ForetrukneqStopMotion Preferences GeneralDialogZTilfj nyt billede i slutningen af optagelsen'Append new frame at the end of the take GeneralWidget2Optageknap FunktionalitetCapture Button Functionality GeneralWidget FarveColor GeneralWidgetGitter farve: Grid Color: GeneralWidget*Gitter funktionalitetGrid Functionality GeneralWidget Vandrette LinjerHorizontal Lines GeneralWidgetNIndst nyt billede efter valgte billede%Insert new frame after selected frame GeneralWidgetJIndst nyt billede fr valgte billede%Insert new frame bevor selected frame GeneralWidget SprogLanguage GeneralWidgetLodrette linjerVertical Lines GeneralWidgetVNedenfor kan du vlge hvilken billedgrabber kameraet skal bruge. Hvis der er en controller tilgngelig, kan den bruges til at regulere fokus, zoom og anden funktionalitet.Below you can select which image grabber should be used for grabbing images from the camera. If available the controller can be used to control focus, zoom and other functionality. GrabberWidgetBKamera Controller (Eksperimentel) Camera Controller (Experimental) GrabberWidget:Gphoto2 Kilde (Eksperimentel)Gphoto2 Source (Experimental) GrabberWidget,Grabber FunktionalitetGrabber Functionality GrabberWidgetInformation Information GrabberWidget@Microsoft Media Foundation Kilde!Microsoft Media Foundation Source GrabberWidgetpGenstart venligst qStopMotion for at aktive ndringerne!4Pease restart qStopMotion to activate the changings! GrabberWidget*Video 4 Linux 2 KildeVideo 4 Linux 2 Source GrabberWidget &Bagud &Backward HelpBrowser&Luk&Close HelpBrowser&Fremad&Forward HelpBrowser &Hjem&Home HelpBrowser4qStopMotion Hjlpe BrowserqStopMotion Help Browser HelpBrowser(Tjek billede grabberCheck image grabberImageGrabberFacade$Tjek billed kilderCheck image sourcesImageGrabberFacadeBilledgrabber initiering mislykkedes. Det sker hvis du prver at grabbe fra en ugyldig enhed. Vlg venligst en anden enhed.Image grabber initialization failed. This may happen if you try to grab from an invalid device. Please select another device on the recording tool tab.ImageGrabberFacadeIngen brugbar videokilde fundet. Tilslut venligst til computerens videoenhed.SNo usable video image source found. Please connect on video device on the computer.ImageGrabberFacade0.10.1 ImportWidget5.05.0 ImportWidgetBMPBMP ImportWidgetHerunder kan du vlge hvilke billed kilder der skal bruges for at importere billeder til et nyt projekt.[Below you can set which image sources should be used for importing images to a new project. ImportWidgetHerunder kan du vlge hvilke billed kilder der skal bruges for at importere billeder til det aktive projekt.jBelow you can set which image sources should be used for importing images to the currently active project. ImportWidget4Standard Grabber StrrelseDefault Grabber Size ImportWidget(Billeder per sekund:Frames per second: ImportWidget&Fuld HD (1900x1080)Full HD (1900x1080) ImportWidget&HD Ready (1280x720)HD Ready (1280x720) ImportWidgetBilled Format: Image Format: ImportWidget Billed Kvalitet:Image Quality: ImportWidget"Billed Strrelse: Image Size: ImportWidget6Billed import indstillingerImage import settings ImportWidgetJPEGJPEG ImportWidget<Live afspilnings indstillingerLive view settings ImportWidgetMaxMax ImportWidgetMinMin ImportWidgetPAL D (704x576)PAL D (704x576) ImportWidgetQVGA (320x240)QVGA (320x240) ImportWidgetSVGA (800x600)SVGA (800x600) ImportWidgetTIFFTIFF ImportWidgetVGA (640x480) VGA (640x480) ImportWidget&Om&About MainWindowGUI$Kamera &Controller&Camera Controller MainWindowGUI&Rediger&Edit MainWindowGUI&Eksport&Export MainWindowGUI&Fil&File MainWindowGUI &Hjlp&Help MainWindowGUI&Ny&New MainWindowGUI&bn&Open MainWindowGUI&Afslut&Quit MainWindowGUI&Gem&Save MainWindowGUIFortr&yd&Undo MainWindowGUI&Undo stack &Undo stack MainWindowGUI&Windows&Windows MainWindowGUI<h4>Om Qt</h4> <p>Dette vil give dig en lille informations boks, hvor du kan lse om Qt biblioteket.</p>

About Qt

This will display a small information box where you can read general information about the Qt library.

 MainWindowGUI6<h4>Om</h4> <p>Dette vil give di en informations boks, hvor du kan lse generel information og finde oplysninger om udviklerne bag denne gode software.</p>

About

This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.

 MainWindowGUI<h4>Cinelerra</h4> <p>Eksporterer den nuvrende animation som <em>cinelerra</em> projekt.</p>Du hjlpes af en guide.

Cinelerra

Exports the current animation as a cinelerra-cv project.

You will be given a wizard to guide you. MainWindowGUI<h4>Eksponerings ID</h4><p>Dette omrde viser din nuvrende eksponerings ID</p>W

Exposure ID

This area displays the id of the currently selected exposure

 MainWindowGUI><h4>Fremviser</h4><p> I dette omrde kan du se det valgte billede. Du kan ogs afspille animationer i dette vindue, ved at trykke p <b>Afspil</b> knappen.</p>

FrameView

In this area you can see the selected frame. You can also play animations in this window by pressing the Play button.

 MainWindowGUI<h4>Hjlp</h4> <p>Denne knap frembringer qStopMotion manualen</p>S

Help

This button will bring up a dialog with the qStopMotion manual

 MainWindowGUIh<h4>Ny</h4> <p>Opretter et <em>nyt</em> projekt.</p>3

New

Creates a new project.

 MainWindowGUI|<h4>bn</h4> <p><em>bner</em> en qStopMotion projekt fil.</p>?

Open

Opens a qStopMotion project file.

 MainWindowGUI<h4>Program Egenskaber</h4> <p>Vil bne et vindue hvor du kan <em>ndre</em> egenskaberne i programmet.</p>

Preferences of the application

This will opens a window where you can change the preferences of the application.

 MainWindowGUI<h4>Projekt ID</h4><p>Dette omrde giver et ID fra dit nuvrende aktive projekt</p>S

Project ID

This area displays the id of the currently active project

 MainWindowGUI<h4>Projekt Egenskaber</h4> <p>Vil bne et vindue hvor du kan <em>ndre</em> egenskaberne i dit animations projekt.</p>

Properties of the project

This will opens a window where you can change properties of the animation project.

 MainWindowGUIj<h4>Afslut</h4> <p><em>Afslutter</em> programmet.</p>0

Quit

Quits the program.

 MainWindowGUI <h4>Gendan</h4> <p><em>Gendanner</em> din sidste handling. Du kan presse gendan flere gange for at gendanne tidligere handlinger.</p>v

Redo

Redoes your last operation. You can press redo several times to redo several operations.

 MainWindowGUI<h4>Gem som</h4> <p><em>Gemmer</em> den nuvrende animation som en qStopMotion projekt fil.</p>[

Save As

Saves the current animation as a qStopMotion project file.

 MainWindowGUIh<h4>Gem</h4> <p><em>Gemmer</em> den aktive animation som en qStopMotion projekt fil. <BR>Er projektet tidligere gemt, vil det automatisk blive gemt som den tidligere gemte fil.</p>

Save

Saves the current animation as a qStopMotion project file.
If this project has been saved before it will automatically be saved to the previously selected file.

 MainWindowGUI<h4>Scene ID</h4><p>Dette omrde viser din nuvrende valgte scenes ID</p>Q

Scene ID

This area displays the id of the currently selected scene

 MainWindowGUI<h4>Take ID</h4><p>Dette omrde viser dit nuvrende takes ID</p>O

Take ID

This area displays the id of the currently selected take

 MainWindowGUI<h4>Tidslinje</h4> <p>I dette omrde kan du se billeder og scener i animationen og bygge animationen ved at flytte dem rundt.</p><p>Du kan skifte mellem foregende og kommende billede ved at bruge <b>pile-tasterne</b> eller <b>x</b> og <b>z</b></p> 

TimeLine

In this area you can see the frames and scenes in the animations and build the animation by moving the them around.

You can switch to the next and the previous frame using the arrow buttons or x and z

 MainWindowGUI<h4>Fortryd</h4> <p><em>Fortryder</em> din sidste handling. Du kan presse fortryd flere gange for at fortryde tidligere handlinger.</p>u

Undo

Undoes your last operation. You can press undo several time to undo earlier operations.

 MainWindowGUI<h4>Video</h4> <p>Eksporterer det nuvrende projekt som <em>video</em>.</p>Du hjlpes af en guide.l

Video

Exports the current project as video.

You will be given a wizard to guide you. MainWindowGUI <h4>Hvad er dette</h4> <p>Dette vil give dig en HvadErDette-musecursor, som kan bruges til at vise brugbar information som denne.</p>

What's This

This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.

 MainWindowGUI&AVI Videoer (*.avi)AVI Videos (*.avi) MainWindowGUIOmAbout MainWindowGUI Om &Qt About &Qt MainWindowGUI Om QtAbout Qt MainWindowGUITilfj billeder Add Frames MainWindowGUITilfj Scene Add Scene MainWindowGUITilfj TakeAdd Take MainWindowGUIAnnulerCancel MainWindowGUI Vlg projekt filChoose project file MainWindowGUICinelerra Cinelerra MainWindowGUI&Forbinder kamera...Connecting camera... MainWindowGUI DanskEnglish MainWindowGUI*Eksisterende billederExisting Images MainWindowGUI"Eksporter til filExport to file MainWindowGUI.Eksporter til video filExport to video file MainWindowGUIEksporterer ... Exporting ... MainWindowGUI Eksponering ID:  Exposure ID:  MainWindowGUI HjlpHelp MainWindowGUIInformation Information MainWindowGUIIndst Billeder Insert Frames MainWindowGUIIndst Scene Insert Scene MainWindowGUIIndst Take Insert Take MainWindowGUI&MP4 Videoer (*.mp4)MP4 Videos (*.mp4) MainWindowGUINyt projekt New project MainWindowGUIStandard output filnavn er ikke defineret Kontroller dine indstillinger for projektet!`No default output file name defined. Check your settings in the properties dialo of the project! MainWindowGUI0Ingen encoder er valgt til video eksport. Denne kan vlges i projektets indstillingsdialog. Eksport til video er ikke mulig fr du har valgt en encoder!No encoder selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an encoder to use! MainWindowGUIBVideo format er ikke valgt til video eksport. Denne kan vlges i projektets indstillingsdialog. Eksport til video er ikke mulig fr du har valgt et video format!No video format selected for the video export. This can be set in the properties dialog of the project. Export to video will not be possible until you have set an video format to use! MainWindowGUIbn &Seneste Open &Recent MainWindowGUIbn projekt Open project MainWindowGUIForetrukne Preferences MainWindowGUI,qStopMotion EgenskaberPreferences of qStopMotion MainWindowGUIProjektProject MainWindowGUIProjekt (*.%1)Project (*.%1) MainWindowGUIProjekt ID:  Project ID:  MainWindowGUIEgenskaber Properties MainWindowGUI>Egenskaber i animations projekt#Properties of the animation project MainWindowGUI AfslutQuit MainWindowGUIG&endanRe&do MainWindowGUI"Klar til kamp ;-)Ready to rumble ;-) MainWindowGUIOptagelse Recording MainWindowGUI GendanRedo MainWindowGUIFjern Billeder Remove Frames MainWindowGUIFjern Scene Remove Scene MainWindowGUIFjern Take Remove Take MainWindowGUIGe&m somSave &As MainWindowGUIGem somSave As MainWindowGUIGem projekt Save project MainWindowGUIGem projekt SomSave project As MainWindowGUIScene_001 Scene 001 MainWindowGUIScene ID:  Scene ID:  MainWindowGUI&Vlg billed grabberSelect image grabber MainWindowGUITake_01Take 01 MainWindowGUITake ID:  Take ID:  MainWindowGUIProjektet The Project MainWindowGUIKarakteren '|' er ikke tilladt i projekt navnet og bliver fjernet.NThe character '|' is not allowed in the project file name and will be removed. MainWindowGUIpProjektmappen m ikke indeholde mere end en projekt fil.BThe project directory must not contain more than one project file. MainWindowGUIDer findes billeder i det bne projekt. nsker du at konvertere dem til det nye filformat eller kvalitet?oThere are some images in the open project. Do you want to convert the images to the new file format or quality? MainWindowGUIXDer er ugemte ndringer. nsker du at gemme?/There are unsaved changes. Do you want to save? MainWindowGUIFortrydUndo MainWindowGUI Ugemte ndringerUnsaved changes MainWindowGUI VideoVideo MainWindowGUIAdvarselWarning MainWindowGUI&Hvad er Dette What's &This MainWindowGUIHvad er Dette What's This MainWindowGUIDu skal vlge en billede grabber at bruge. Dette vlges i foretrukne menuen.TYou have to define an image grabber to use. This can be set in the preferences menu. MainWindowGUIDu m definere hvilken billed grabber der skal bruges. Dette kan ske i optage-fanen.VYou have to define an image grabber to use. This can be set on the recording tool tab. MainWindowGUIHqStopMotion - Nyt Animations Projekt#qStopMotion - New Animation Project MainWindowGUI0qStopMotion - Undo stackqStopMotion - Undo stack MainWindowGUI^Kan ikke kopiere foretrukne fil til backup fil!+Can't copy preferences file to backup file!PreferencesToolLKan ikke flytte foretrukne backup fil!%Can't remove preferences backup file!PreferencesTool6Kunne ikke bne XML fil: %1Couldn't open XML file: %1PreferencesToolKritiskCriticalPreferencesToolDOM Parser DOM ParserPreferencesToolZFortolkerfejl ved linje %1, kolonne %2: %3 %4(Parse error at line %1, column %2: %3 %4PreferencesTool8Animation Projekt EgenskaberAnimation Project Properties ProjectDialog AnvendApply ProjectDialogLukClose ProjectDialogBilled import Image Import ProjectDialog*Billed TransformeringImage Transformation ProjectDialogEgenskaber Properties ProjectDialogVideo Eksport Video Export ProjectDialogXKan ikke ndre rettigheder p billed mappen!0Can't change permissions of the image directory!ProjectSerializerZKan ikke ndre rettigheder p projekt mappen!2Can't change permissions of the project directory!ProjectSerializerRKan ikke ndre rettigheder p lyd mappen!0Can't change permissions of the sound directory!ProjectSerializerPKan ikke kopiere projekt fil til backup!&Can't copy the project file to backup!ProjectSerializer<Kan ikke oprette billed mappe!Can't create image directory!ProjectSerializer.Kan ikke projekt mappe!Can't create project directory!ProjectSerializer6Kan ikke oprette lyd mappe!Can't create sound directory!ProjectSerializerZKan ikke fjerne gammel backup af projekt fil!(Can't remove old backup of project file!ProjectSerializerLKan ikke fjerne den gamle projekt fil!"Can't remove the old project file!ProjectSerializer6Kunne ikke bne XML fil: %1Couldn't open XML file: %1ProjectSerializerKritiskCriticalProjectSerializerDOM Parser DOM ParserProjectSerializerZFortolkerfejl ved linje %1, kolonne %2: %3 %4(Parse error at line %1, column %2: %3 %4ProjectSerializer<h4>Vedhft Billeder (CTRL+F)</h4> <p>Klik her for at <em>vedhfte billeder</em> i slutningen ag dit take.</p>m

Append Frames (CTRL+F)

Click on this button to append frames at the end of the take.

 ProjectTab<h4>Vedhft ny Scene (CTRL+E)</h4> <p>Klik her for at oprette en ny <em>scene</em> og <em>vedhfte</em> den i slutningen af animationen.</p>

Append new Scene (CTRL+E)

Click this button to create a new scene and append it at the end of the animation.

 ProjectTab<h4>Vedhft nyt Take (CTRL+E)</h4> <p>Klik her for at oprette et nyt <em>take</em> og <em>vedhfte</em> det i slutningen af scenen.</p>

Append new Take (CTRL+E)

Click this button to create a new take and append it to the end of the scene.

 ProjectTab<h4>Indst billeder (CTRL+F)</h4> <p>Klik her for at <em>indstte billeder</em> foran det valgte billede.</p>o

Insert Frames (CTRL+F)

Click on this button to insert frames bevor the selected frame.

 ProjectTab<h4>Indst ny Scene (CTRL+E)</h4> <p>Klik her for at oprette en ny <em>scene</em> og <em>indstte</em> den fr den valgte scene.</p>

Insert new Scene (CTRL+E)

Click this button to create a new scene and insert it bevor the selected scene.

 ProjectTab<h4>Indst ny Take (CTRL+E)</h4> <p>Klik her for at oprette et nyt <em>take</em> og <em>indstte</em> det foran det valgte take.</p>

Insert new Take (CTRL+E)

Click this button to create a new take and insert it bevor the selected take.

 ProjectTab<h4>Start Foto redigering</h4> <p>Klik her for at bne det aktive billede i Foto redigeringen</p> <p>Bemrk at du ogs kan trkke billeder fra billedrkken og lgge dem over i foto redigeringen</p>

Launch Photo Editor

Click this button to open the active frame in the photo editor

Note that you can also drag images from the frame bar and drop them on the photo editor

 ProjectTab<h4>Fjern billede (Delete)</h4> <p>Klik her for at <em>fjerne</em> det valgte <em>billede</em> fra dit take.</p>u

Remove Frame (Delete)

Click this button to remove the selected frame from the take.

 ProjectTab<h4>Fjern Scene (SHIFT+Delete)</h4> <p>Klik her for at <em>fjerne</em> den valgte <em>scene</em> fra animationen.</p>

Remove Scene (SHIFT+Delete)

Click this button to remove the selected scene from the animation.

 ProjectTab<h4>Fjern Take (SHIFT+Delete)</h4> <p>Klik her for at <em>fjerne</em> det valgte <em>take</em> fra animationen.</p>~

Remove Take (SHIFT+Delete)

Click this button to remove the selected take from the animation.

 ProjectTabTilfj billeder Add Frames ProjectTabTilfj TakeAdd Take ProjectTab0Vlg billeder at tilfjeChoose frames to add ProjectTabRedigerEdit ProjectTab.Kunne ikke starte GIMP!Failed to start Gimp! ProjectTabBillederFrames ProjectTabIndst Billeder Insert Frames ProjectTabIndst Take Insert Take ProjectTabvIngen scene valgt. Vlgt venligst en scene i projekt tret.=No scene selected. Please select a scene in the project tree. ProjectTabrIngen take valgt. Vlgt venligst et take i projekt tret.;No take selected. Please select a take in the project tree. ProjectTabProjekt Tr Project Tree ProjectTabScene_000 Scene 000 ProjectTab ScenerScenes ProjectTabTake_00Take 00 ProjectTab TakesTakes ProjectTab@Det aktive billede er beskadigetThe active frame is corrupt ProjectTabFDer er intet aktivt billede at bne There is no active frame to open ProjectTabAdvarselWarning ProjectTabRDu har ikke GIMP installeret i dit system-You do not have Gimp installed on your system ProjectTab$<h4>Antal billeder</h4> <p>Ved at ndre p vrdien her, kan du vlge hvor mange billeder bagud i animationen de skal vises, eller, hvis du er i Afspil mode: hvor mange billeder der skal afspilles. </p> <p>Ved at mikse de forudgende billeder med det kameraet ser nu, kan du lettere se hvordan det nste billede bliver i relation til det forudgende, og derme lave noget bedre stop motion animation!</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 ProjectWidget OptagCapture ProjectWidgetDifferenceDiff ProjectWidget8Billed grabber indstillingerImage grabber settings ProjectWidget Media FoundationMedia Foundation ProjectWidgetMiksMix ProjectWidgetAntal billeder:Number of images: ProjectWidget AfspilPlayback ProjectWidgetOptagelse Recording ProjectWidget0Enkelt billede optagelseSingle frame capture ProjectWidget6gphoto (USB Compact Kamera)gphoto (USB Compact Camera) ProjectWidget&Nej&No QtFrontend&OK&OK QtFrontend&Ja&Yes QtFrontend Tjek rettighederCheck Permissions QtFrontendOpret mappeCreate directory QtFrontendGenopretningRecovery QtFrontendNoget fik qStopmotion til at stoppe uregelmssigt sidst. nsker du at genoprette?]Something caused qStopmotion to exit abnormally last time it was run. Do you want to recover? QtFrontend Du har ikke de forndne rettigheder for at kre qStopMotion. Du behver ret til at oprette .qstopmotion mappen i dit hjemmebibliotek.You do not have the necessary permissions to run qStopMotion. You need permission to create the .qstopmotion directory in your home directory. QtFrontendDu har ikke de forndne rettigheder for at kre qStopMotion. Du behver ret til at lse, skrive og eksekvere i .qstopmotion mappen.You do not have the necessary permissions to run qStopMotion. You need permission to read, write and execute on the .qstopmotion directory. QtFrontend<qStopMotion - Genopret ProjektqStopMotion - Recovered Project QtFrontend$<h4>Antal billeder</h4> <p>Ved at ndre p vrdien her, kan du vlge hvor mange billeder bagud i animationen de skal vises, eller, hvis du er i Afspil mode: hvor mange billeder der skal afspilles. </p> <p>Ved at mikse de forudgende billeder med det kameraet ser nu, kan du lettere se hvordan det nste billede bliver i relation til det forudgende, og derme lave noget bedre stop motion animation!</p>

Number of images

By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play.

By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!

 RecordingTab<h4>Tnd/Sluk Kamera (C)</h4> <p>Klik her for at tnde og slukke kameraet</p> [

Toggle camera on/off (C)

Click this button to toggle the camera on and off

 RecordingTab KameraCamera RecordingTab OptagCapture RecordingTabDifferenceDiff RecordingTabInformation Information RecordingTabMiksMix RecordingTabIntet aktivt projekt. Opret venligst et projekt eller bn et eksisterende projekt.KNo active project. Please create a new project or open an existing project. RecordingTabIngen scene og ingen take valgt. Vlg venligst en scene og et take i projekt-fanen.SNo scene and no take selected. Please select a scene and a take on the project tab. RecordingTabrIngen take valgt. Vlgt venligst et take i projekt-fanen.:No take selected. Please select a take on the project tab. RecordingTab"Ikke Understttet Not Supported RecordingTabAntal billeder:Number of images: RecordingTab AfspilPlayback RecordingTabOptagelse Recording RecordingTabOplsning: Resolution: RecordingTab0Enkelt billede optagelseSingle frame capture RecordingTabVideo kilde: Video Source: RecordingTab0Kan ikke kopiere lydfil!Can't copy sound file!Scene0Kan ikke fjerne lyd fil!Can't remove sound file!SceneKritiskCriticalScene&Luk&Close StartDialog&OK&OK StartDialog4<h2>Opret nyt Projekt</h2>

Create a new Project

 StartDialog8<h2>bn seneste Projekt</h2>

Open last Project

 StartDialog0<h2>bn projekt fil</h2>

Open project file

 StartDialogNbn og fortst et eksisterende projekt.%Open and continue a existing project. StartDialogProjekt sti: Project path:  StartDialog*Start et nyt Projekt.Start a new Project. StartDialog<Indls billeder til tidslinjenLoad images to time lineTimeLinev<h4>Optag billede (Space)</h4> <p>Klik her for at <em>optage</em> et billede fra kameraet og indstte det i animationen</p> <p> Det kan ogs gres ved at trykke <b>Mellemrums tast</b></p>

Capture Frame (Space)

Click on this button to capture a frame from the camera an put it in the animation

This can also be done by pressing the Space key

ToolBarZ<h4>Frste billede af dit take (J, Left)</h4>*

First frame of the take (J, Left)

ToolBarZ<h4>Sidste billede i dit take (L, Right)</h4>*

Last frame of the take (L, Right)

ToolBarB<h4>Nste billede (L, Right)</h4>

Next frame (L, Right)

ToolBar@<h4>Afspil animation (K, P)</h4>

Play animation (K, P)

ToolBarL<h4>Forudgende billede (J, Left)</h4>!

Previous frame (J, Left)

ToolBarKrer animationRunning animationToolBar0%0%TransformWidget100%100%TransformWidgetHerunder kan du vlge hvilken billed transformering der skal bruges til import af billeder i et nyt projekt. Hvis du vlger at klippe en del af billedet, skal justering for klipning ogs sttes.Below you can set which image transformation should be used for importing images to a new project. If you select clip a part of the image set also the adjustment for cliping.TransformWidgetHerunder kan du vlge hvilken billed transformering der skal bruges til import af billeder i det aktive projekt. Hvis du vlger at klippe en del af billedet, skal justering for klipning ogs sttes.Below you can set which image transformation should be used for importing images to the currently active project. If you select clip a part of the image set also the adjustment for cliping.TransformWidget.Klip en del af billedetClip a part of the imageTransformWidget(Skaler hele billedetScale the whole imageTransformWidget8Transformering IndstillingerTransformation settingsTransformWidget$Zoom indstillinger Zoom settingsTransformWidget Zoom p billedetZoom the imageTransformWidgetZoom vrdi: Zoom value:TransformWidget<Tilfj billede (%1,%2,%3) '%4'Add exposure (%1,%2,%3) '%4'UndoExposureAdd<Indst billede (%1,%2,%3) '%4'Insert exposure (%1,%2,%3) '%4'UndoExposureInsert.Flyt billede (%1,%2,%3)Move exposure (%1,%2,%3)UndoExposureMove0Fjern billede (%1,%2,%3)Remove exposure (%1,%2,%3)UndoExposureRemoveHVlg billede (%1,%2,%3)-->(%4,%5,%6)'Select exposure (%1,%2,%3)-->(%4,%5,%6)UndoExposureSelect Nyt projekt '%1'New project '%1'UndoProjectNew bn projekt '%1'Open project '%1'UndoProjectOpen,Tilfj scene (%1) '%2'Add scene (%1) '%2' UndoSceneAdd,Indst scene (%1) '%2'Insert scene (%1) '%2'UndoSceneInsert$Flyt scene (%1,%2)Move scene (%1,%2) UndoSceneMove Fjern scene (%1)Remove scene (%1)UndoSceneRemove,Vlg scene (%1)-->(%2)Select scene (%1)-->(%2)UndoSceneSelect0Tilfj take (%1,%2) '%3'Add take (%1,%2) '%3' UndoTakeAdd0Indst take (%1,%2) '%3'Insert take (%1,%2) '%3'UndoTakeInsert"Flyt take (%1,%2)Move take (%1,%2) UndoTakeMove$Fjern take (%1,%2)Remove take (%1,%2)UndoTakeRemove6Vlg take (%1,%2)-->(%3,%4)Select take (%1,%2)-->(%3,%4)UndoTakeSelectqstopmotion-2.3.2-Source/rpm/qstopmotion.png000644 000000 000000 00000001743 12536560627 021247 0ustar00rootroot000000 000000 PNG  IHDR$$sBIT|d pHYs3L tEXtSoftwarewww.inkscape.org<`IDATX[hg?nlhi  m#`Z_""~A> hLR.`IENDB`qstopmotion-2.3.2-Source/qstopmotion.cppcheck000644 000000 000000 00000000312 12536560627 021434 0ustar00rootroot000000 000000
qstopmotion-2.3.2-Source/manual/_template.html000644 000000 000000 00000003275 12536560627 021466 0ustar00rootroot000000 000000 Getting access to the image files in your animation.

xx. ???.

???.

qstopmotion-2.3.2-Source/manual/adding_sound.html000644 000000 000000 00000005126 13011043104 022116 0ustar00rootroot000000 000000 Adding sound

X. Adding sound

You also can add sound to your animations. Before you can do this however you need to have a frame to attach the sound to. Therefore you should add some frames from the harddrive or webcamera first.

When you have one or more frames you can add a sound by double clicking with the mouse on the frame to attach the sound to. You will then get a menu where you can add sounds. When running the animation the sound will be played from this frame and until the sound is completed or the animation is at an end.

Note The only currently supported sound format is ogg.
qstopmotion-2.3.2-Source/manual/exporting_video.html000644 000000 000000 00000006407 12536560627 022721 0ustar00rootroot000000 000000 Exporting to video

8. Exporting to video

By now you should have a nice animation of your own. It's time to make a video file of it. The first thing you need to do is to install a video encoder. If you have mplayer installed, you should already have one you can use.

Go to the Preferences menu (Settings->Configure qStopMotion (Ctrl-P)) and press the Video Export tab. You should now get a list of video export settings:

Figure 8.1 The video export preferences

Change the video export setting to the format, size and frame rate you like. When you have set up a video export setting you can close the Configure menu by pressing the OK button.

To export your animation to a video file just press File->Export->Video (Ctrl-Alt-V) and you should have a video file of your excellent animation. Tell your friends!

qstopmotion-2.3.2-Source/manual/getting_started.html000644 000000 000000 00000017343 12536560627 022704 0ustar00rootroot000000 000000 Getting started

2. Getting started

Once you have installed qStopMotion you can start it by typing qstopmotion in a console or from menues:

  • In the Fedora menues you can qStopMotion it by going to Applications->Multimedia->qStopMotion
  • In the Debian menues qStopMotion lies under Apps->Graphics and Video->qStopMotion
  • In the Windows menues qStopMotion lies under All Programs->qStopMotion->qStopMotion

When the program is started you will se the following:

Figure 2.1 qStopMotion at startup

Now you have three possibilities of starting the using of qStopMotion:

  • Start with a new animation project.
  • Open the last used animation project. This possibility lacks at the first start of qStopMotion.
  • Open an existing Project on the hard disk.

If you select the new project possibility then the following dialog will open:

Figure 2.2 New project dialog

You can change the description for the animation project, the first scene of the project and the first take of the scene.

An animation project is organized in qStopMotion in the following way:

Figure 2.3 Animation project overview

The animation project is the head of the structure. Each animation is segmented in scenes and each scene is segmented in takes. The take contain the single frames.

When the program is started you will se the following:

Figure 2.4 qStopMotion user interface

At the bottom you have the Timeline where you will see all the pictures in the animation.

The center area is the Imageview where you will get a closer look at your pictures, see the webcamera and preview your animation. At the bottom of the Imageview you have the Toolbar to navigate in the Timeline, take pictures and play the animation.

The right area are the Tooltabs. To switch between the different Tooltabs use the flags at the bottom of the Tooltabs.

qStopMotion starts with the selected Recording Tooltab.

Figure 2.5 The Recording Tooltab

On the top of this tooltab you can select the recording method. All connected video devices contain the next listbox. At first you have to select one of these video devices. Now you can also start the video device with the camera button .

The second Tooltab is the Project Tooltab.

Figure 2.6 The Project Tooltab

On the top of this tooltab you have the project tree containing all scenes, takes and frames of your animation. Then you can see a line of buttons for inserting new scenes , adding new scenes as well as deleting scenes . The following line of buttons is for inserting new takes , adding new takes as well as deleting takes . With the buttons in the last line you can insert or add pictures from the harddrive as well as delete frames and scenes .

Go back and select the recording tooltab. Now you can also start the video device with the camera button .

Figure 2.7 Capture frames

By pressing the capture button () on the toolbar you will take a frame from the video stream displayed on the image view. If you have taken some frames of your first animation, switch the camera off with the button.

Now save the animation project to the hard disk using the save entry in the file menu. This will open the following dialog.

Figure 2.8 Save new project

Navigate to an empty directory for your animation projects and create a new folder for the new project. Move to the new folder and type in the name for the project file. Then press the save button.

qstopmotion-2.3.2-Source/manual/using_camera.html000644 000000 000000 00000012371 12536560630 022140 0ustar00rootroot000000 000000 Using qStopMotion with your webcamera

5. Using your camera

The real value of using qStopMotion lies in working directly against a camera.

If you have selected a video device, you can start the camera by pressing the (C) button.

Figure 5.1 The Camera menu

Note In order to do that you have to turn off all other programs using the camera.

When the camera is on you have three modes for viewing the video. These modes have different purposes and are there to assist you in creating your animations.

Image mixing/Onionskinning (Shortcut: 1)

The image mixing is probably the view mode you will be using most of all. This mode allows you to view previous pictures (up to five) on top of the camera. This way you can position the figure in relation to the previous frames so that you can create smooth motions.

Figure 5.2 The onionskinning/mixing mode

You can change the number of pictures to view on top of the camera with the "Number of mixes'' slider on the camera panel.

Image differentiation (Shortcut: 2)

The image differentiation mode is primarily meant as a tool for moving the figure back to a previous position.

It displays the difference between the selected frame and the camera. This way, if an object in front the camera has been involuntairly moved (fallen, etc) you can use the differentiation mode, together with the image mixing, to move the object back to its previous position.

This can be done by moving the figure until the picture is black, which means the selected frame and the camera are "equal''.

Figure 5.3 The differentiation mode

Playback (Shortcut: 3)

The playback mode will continously run the the already recorded frames as an animation with the input from the camera as the final frame.

This way you can see the camera input, which will become the next frame, together with the previous frames as an animation.

Figure 5.4 The playback mode

You can specify how many frame backwards should be played (up to 50) with the "Number of images'' slider on the camera panel, and you can set how fast they should played with the FPS chooser on the preview panel.

qstopmotion-2.3.2-Source/manual/screenshots/mode_differentiation.png000644 000000 000000 00000717403 12536560630 026051 0ustar00rootroot000000 000000 PNG  IHDR5-x)sRGBbKGD pHYs  tIME#cX IDATxw=^t H;`7`/&j)5Qc4VhLb Ē(hD,RKv={)&<|}ߙ\rIѣ~{p8MAXݧӴiS.I\r%C yyذa[ 4 !+vp8ߟ&U ` .͝ZWW7f?nѷo_[(q8ñB!ZJzKsXEN|[o-4h58Ap8k6`^OPtΟ7o'DJ)z09p|!YCD78Qp8k3qȮczMp8oLYߖ)W69ap8뢵0ʲC5kae1V#W` Kp8F fUeba)1(Oِyon>=i}Ƿ)QOf$(RJ/Y5jPJEۅ:v~x)% HRkYoRʊiu" u 0*СfE4p۴ۈgq8{AO'zdgݶ}v^%sg+rpx/.iM7\fC1ExO@A6#pP(t8%)A9(OK/[3hРȥ$sN̘1zzP[AJ86DT4̜5{'nzCXcB)ĿM}8`ARDGIAT2Yk h24C[tڵkG*t|G)1R&C=LJ<T}*{iBIZ#,O ؕA zSbaXk>}:.=zD`Y5cZsc1d}G#$Iӽ[7{yB~q|g:(xi$L'Gs?W]s--bƯS ~}og8K@~Q2x/w_z]尗?ZjkkfUU֮kQcƌt_ڴp8_$]u5]:wSѹSG>x&'w,T7JK.O=>GcC6fCkӿo_b‚ ť1?z4O,XnF2ŗ0+/}y= )}7ޘǟ|=8p 7b)';>jjPSÏO!Ι}=L„ob䮻{lNx7OΦ}?thߞ{t#wٙz(ayad>gq8 Vf,]:Cϒ%K0`L%KB<5pl9q ׏e˖UFc߯ʜs9ѱcG<$|j ڄ>lRx"RWO^{(-kfb0m2?? ӧ`םw CF ?$<:r\xo`A`!T>{f!466zW{;]vxG%vݕMZ˯B" ˹pG?ÆQSSÌ3;ӿ62~{s15w:2mڻtЁ斊Khɒt6)XtT* ,ZK6EkoIt\oilƌޗ}=@.Rҩ(g5)%-Xǝ@KK '{;r|hMKl)iniFkSNw}<r,[CMKKKE8o^x:.}^yt큧}zW_EAϞVF;Gyq86`1E[ne3OS__O @Id!5BD"A*SJA[6_te-ZBT*4ZV_O< m֒| (L%I&EyRO6at 0 út 0P|9=KtڕFgq8a.]G3gNkJ)֊e\Мña'+s$+1KFW_>aCR@2-$P,ڤӾ]HZvܼ"hM>_e;@.CŊ0I&[׾UbCC8+Of}QQUU%ձRIzNw/I6Su?}5Q"TƆ; 6[o&[O}Xb)'S]UEPpñZtz5-Ul%(YPǚG9VԸOwwñ:ֲpB/o]_=]<1qp8@JIϞ=h[(H0mXCWp8D2RX*p8ۋbjp|k4Ep8ñ!p8Ƿt8m3W醶U0.:" C<# ï`\NoskWIP(L&yEW%&ׅRjutkFJ[/%!V=5{6^x7x-]o=L|0 y٨W/-Z3>Ç f26 Z$W]uC7J6YmycM7N;Tñ^:yo:b„ mLBvnמg+~"jkkf̜9п@-]BccDب~ۭtc UUqվ}{ڵᣏ>O>aȐ!J%ƍ;?mV ?ݺu%ɰ馛qq-k-{/{'m )%MMMyxzAZZZhnn={~lr2rH0d{$>Q__O^tЁd*'"Jc7#}V& !ކ?APpOp8Dyv|0D&`m(7RJ-ZDcc#L=zScjm$n=wֺXd ˗/'Fn:` ̜9!ݻw_+#H?Ϥӿ?6m,0b:0k׮TUW|rW%JՋ>I/\Y+L"dY)[HSt޽Yt) XkSNASkjڷCk֒N9ù{BϲfѱcGZZZH&c.\H.]t֕FѣB̙CMM UUUh[ݻRmJQZ)ŢEihXN*gJ)?>H6YpYm|>9眃L&gEXd;Plie?o/. 6<=:k3Na;!Ap 7駟d1ZsW1k,>#8wcI{e=T >;o6ǟϋ/mNMM{~mFl7+\>O6e9WnLXG?<[lI]]=z/BMOk~֚C;Of͢X*ˮ#9S9?nv= Jzsyh {̙3EJԩS_0h&L1SN>1Ghz?R_3N?1cFEVñN|n0D+^}$>J),RjʫE e?AorrЁZ3!v]t& C6h#|3sogĈR)vBP]]R(:l 0W^}GyxpGq1G`'c {fvdvn9s}tt:9&M[n <>}! NQ]]vmDŽ ,YB>gfE2 |˖%k<#~̙27Y?ɓ93ϻSuy2Ub tЁ={r 7{hnnP(0jH~4}a6k#ǒL&r|Z/[חt*E9c)'#|>1%KбcG446H$[q v8:#[7J|>_B?ZZZdrlͶK?2q$Ȉwʫ&J#`gً;!NL ArqӹKt҂D"q?fsP*z>)%o6{,;#Wj:,zNN8cgt!y_nҥKiߞMOcP,TĆ10P,Вk穧baHI{rgrUW˵:eH$Ա7HxXU(Qos/x $ ,3baÆ裏rg1zVZZ<~m f;.":tĶۍo'Ӿ} /^CsRtqqYvQL0rAmk׎, hhh NH$rhIӕ0a˶R]]] Se+O&!AsK KF2$JR*44ZK:Gt$uJB`!a<2eJ]d\+.D'W'JOSOqM*įX'RRJ8o7)e|oZJR !" UjJR%n=_Ƙ6[>uu5---cBJ}"ZZZHR$c_~7KX /s}C˂FJI۸TijjBJIXl3sŬ)7+g,J/rTI@d\1SI ÐUCkMSB B!U^\"iӦqWpWNh%It555+ZJ9ϑ*7ԴNyXQOB'eڵkGT"˭RVRJRl6f+qXN8㋲ʐjjk͟f|>^zp\{um5qquhv܉Yf[>~ՊRMW\gɘ1 !6'ϳt}Rl6{ͻᄏ}?0T]]p|ڸ>Jó:P1-W"Qjߊ"Bat]k[|f(qFBK_yM\K|TUUbikMTZru*p8ǟX{e7.5)ڮA˞omu_K]u_6/8t!v?ʲp8Ƿ ÐOf\+o!( nT:T2P(v5 C<2tUgq8]w̝)]t|WP hn#V ZٞH$xk껑I%5Tt*Jg?`;H$%Wܛܱ ܒ1O'ݛ eŚK"l\e|P*}TSڷgq<Jp86ެEؐż`W#؝q8eDp8 plXCh/;E)E&[EScCׁ8F"d]GұcG:t@Νm:ӱcG<С* ;N8cדH$8s=yo{褓+˵!PJr[m[H)<4.qZuR)_9_9e䯜@;֊s?9ʀ5pDŽ ?,1H)x({ B)ESS=~1]t搃f7fѢE<̛;cƌZ#>ʿoJA|.GϞ=_7^gXo׎=sGsN|LwI'D2}f > uuuoαzGkp86Pޞ:vډ>}zsiqy}1{/ ,dٲzs/ijnNgR)s?/_G;$¤;Yp!---tܙnN8E`BdlgkEqes%ꫯrqdu]2gnV}9|͐pN/fΜ.tMx7 :\.Nj/nĉy{ 45BS_d֬h#8b,W]K:'Xk޽;O>aPBkW^uO;7|3vnٓ4oRc<^x,YR1'rK8 gq8 mٚ?;_3f EgaΏO9-؂|@"<0^ PG(Jb+RD"!>ijj"J$IJk#kN8C!7jkk9砵f=v'3{, B>cm{ET x IDATnחmێ3ϹOXd^߯; s,w{.0zsj99pYgqɥTׄ`k1c(Jlv7"'j;OcPJqw3s,~"i'}a>[ /1أQ,\={0l0M}뮽O;|@=߯6^9 Cn?8&N̙:dRJRF?+]XF'k>(eOu@qv?X%0G*%t ]2{3!---xG&%DD"Q*҂T )%|$W^o&ᷪ~8#h rY.)%&LkAA:NXܾ@9:Qp8>SgM*Z1cLrQ, =zЩS'E͛WYraذamf5hsbO>d6`ԩk׎E`,Z^zѱcG͛G}}=ӯ_?уnݺ)S7o bРASSSC&Ì3|͙7o/Ν;O>!ѵkWw #kW,\;c1{l1~l }?_|~q1rHJs'Dk%\’%K<,_99s*֡l6˵^[q(xW={6'N碋.K׮!Ž;W_͒%K={6/j1wf̘N;Dcc#uuuL<3fp3x`fΜѣ9* ӦM/f뭷sۗ \ver9fϞW\~ǰa/ŋ6mwua&z)N=T9N9FEÇc/&ɐJoFw3>xw[8`^!*;O$}GUUW5L&e<|m[ϕb5V]mTӼKEu{XE "19iuvvիZq^s:_CVWS5/W|<^kS&V>u~.W.XMq{b ׶}`ix.^|}j"b7Sn;4T,Dt[nq-[9IS"AȞ{_N>47 )%'( ޙ6T2E]HTOb)ᘣ'ggH$J%?vqG1ZבNg-ϣX,믣X,RUݎ'x޽{dYl)_kN?tF ~:1iVv^{-w.[neŪС};cdg{I&1fر#?>d$nzA>,=f~A@Caj$Q(4I ?tf7a PCZcoA?[Ve[[>Wj?~|JJy+`=5Fa" ^FekA( /1ID)K To 8-D'LkXT[ҀnV`r\~"گrfi{?>VZeA J ǩU׊bh!4l(sR9.R)[n:6ӢU W*nu&K'DO L\;Ut}Wb%BjH$VZ$ iaUPeA) /SWWqMm3+Au~cl%0Rx6gl̙λ삱%Ek#uVuO>eʔ){^FE^=WƋWJ|++H h+b0I $JS,-B5ϢG@!Sh)Q5ψH!c%FHI(kUV"!0i"lD,QQQ%4E>J<[@42]¯OeUl&APPE"P6jm%ZiV0` Bh%BI+hizR !A ,(| O`ňCwʣSJ6HJ)x^TVBE4H`h!@H RJ<jب",0dHk "DFD*LY!t,Ndl ƢJ0VaBX,&بQc(Lc52)"EQ#+ "BZQa@I͆X4!hdZFkQZb BXBc0qoCBbxB@Q$D 61V"EVT>Xb@"1B cA(!GXA`HD][R5p@T5XJ,BE6SA  - FIxd|CkP+BaBY-HRh+_HJx8BJ$l"VZ!RI|+ADKaVDFHDTߢE$E0٨s>&΁}P  \Y1{…gm'# U[ڵ >h.i͛GSScX0?]z\+tB>g!L{s++uߘHڧ̙)R 0$+#6mZUrRN۷/wyFbrPL&?ϻテֆŋq]W>w=-B= $ᡭ!5n04h2@iQK$$ 1$R[KZ"@HY]4X-Vis@_k2D[kF m$OyZ$$)#H #)% $ I"l.<Ģ%#jxF ŷ@孈X 5HaQB >Ih5"x-4z:*^"&A"QD0zP%$%)yiHaR#%eUԨ ] B|mIAtoU`F:hMHIB(Y0* E9@JHL6tFaMc$%+ DZAk`=U(D2Y6"/la @D)QXAh Ha m)yh %Q":NFUz,֊2d"?xAt?4x:ʓы@@,$R+m+ Uj: &FV G lhAzxBI(Ezmm%xګXF% &a|/ cAG@EK "DaFyaq'$!$) F!0XY#AR(tžeH`0X2HĴħ0y$4EǨ"Vlh*4hY:tE$5RXi PAHJYtQk6V#)KXϨ R)Owޅv ,{|10 )Kqcl+ۇ'cDz;caw /be=vgԨܹtBnX,u=6l3rK܄{wΝ;MCX*S=B.|/gۗN:t:!^z)A0lpF؞c^{5݌)S^%bawabph6lS~Gs裏ңG-\sm%b0ԕJ%n=dRV1oZ(F ]Z%?\&Fs g+. JȄ-B9 ` I %Q (顽E)V[ Qy6٪H ϋ#U#+QkZV`@DtE*4F`Fb@%֏DKRFo9"d+^/a%6Di@c-j#Mpt߬4j#U`VDub(KHS F[KZtnc}0ad*QHϣ:% e J:@ LXl!0t62~ |3W^f}G>7ýqIssS$F$TnJ訮TeO^TvJ$iJ{7R ʹoߞz:t@CCƘwk-tD"ǴD^54'0܌*A1$zf޼xGPX,V0n&"|ߧl6KTjs]J)2 J) 6m4\@>oS/13Bj#_{n׿U3-b𐡱gOI?&r+0zeHQ 0 ^F`" |Fa"65^L c@BaQ2jё@X[z8TUl:5BC 4(c:O ZD"mB"Md⎛J/X0i#_}(#ahtqFbĀ~b0<"Wk FZ %$h X{AA O$ k"a&‚(ő lQ:v_DЀ+V^ V 4R+B}Ҫ(E|^2}5ad-ƈk0"ĽQ#1bUC>R12:@"2#QD>wHnlք)Ȓ%L0q BDF%len+Xad DG0>D Xk0D 4b Hsdl kAqFBE4 z'#T([cҢE~/v9iƒgxgYa12Ed HE-.FIE I""I >;6r ֚XqnhW_(XlO<$֚JzTXAW'{.#vUh+x8e<-l pnHEK٭p]̶mV[8w>>AFӈiu&m)n`whn!v46U6 ml)M,at>R& 3}_y_caϝx羮:O`H5&&#o]RXi.\nCBӼP&j%5Xxyk'4iWf+2Ќ^5!TC p_6QҙTCYz!.iʣE;tA d­XKŜ5N^XNw{9L_rl9Q~ɱ}=$q6eCtѤUM_O 8i ̅Yw|{jDv@42cȋû际 !@H7Sجzv=C2ak@†Ω#ry$o0֎K;QQEl6zyG1rȼ ϡgÍyH4. ů})r˿QgXvӿx3|o'>qw>}ϿM;l /=h;+9{r,XJ8?-G1C4Zb\]1%:Tbb _H;ݛa*t҂4]ywK8ZvdE2<9V]9PJFGʤ {nņDb=jwBmlRwQfcDn,/Qi'0m3{1當aJ񑎤+ZT-M:~ b"ErHg%΍!:;2sgd$o֎4P,u5DX%uZSRSLMܒGҽ+[X9^8(J,z!sht'Gsaf[[C&n 3kι;iuC㳛{Py0:VK͓v˩֪ƴ9T]]BrʇKJH<Q-A_p1ҎsX? žv}\͜;[sgv%p,O|[?kx>Yon4a>|m04? ?9HaqŢ ws+|9BJ(3 \ |tBzgsG+WhZ?3G(H Bv]uZi;p->[6/P: 8rO2 ٘)?b4iX6QerId{7[wwYD)$ӼNԀ8ܖq:(5]+pdRYLn);ljz4m6!y$9VU=L?6kW_9L7se&)!٫Lن2Grxt`p6trR];_Lิ!_ >%F1l8\C = )1)F9s]?c{ıE LQز:7a)Z rUn,p#'9c_iMQMUU\WSMGЁr{0I` _=ɕUyF^ٶS%gXlQsc6XJ ՋR~zs捜!P@&\LF6lji0{q;̈%is`C]YZU 6߸{H,J:1!-I#峇"`yu`4Ut2#JTȾ/H K=ʁזj$&advim:X-lF!bsi`BQTc螊fM!/"8 vI-T]j`%mp+o~r5)7^ U? ;6XrcYO§Wx>OG`+>ڍy](%q v-{N1`vqp)̋RpX`z XV)_=heϥ%iO A9T2nظCiU9p,br&Nm\1|/Ǝ 8L5S-7!8X%Ô`|zr˒kBDɭ]ţ'%xJz%\;HP?B?oAcѳ6Bu!\V91[;Ra;)p%c(ձPU0EyHD'REFg^%Z L \:ESdN֙yt]TrOR݊)=VJ#BCLfƈXuڰ\ Yyh;+$zPuo1ʁjquQp'iR΍SNu5ұ86diҠxcj.d]hq+4M\CtXwMjBf6׃\,ٛrJit,EAWFeJχ+b^c#O Oa8M#m.`⤉Ǻg9 ٶzb>?k*고kKLh5;̛&ASBJ %-5q*ѻom`쟀cS`%r>HؙU7-pܷF#l~m^VS!u{7S0}`rk\¥Gf AeL%,g'XCn7a¨{fn ȸ7J!h/%\mV2&G!hx͡sbOUK c /ܩ4%gP.j,I7[ipǫSdkB/*jשQ, YFfgä-H3& MErzrK͢u_u0^MuoιՐR~]VM |Af<R,k͍cwƓbM?~\IQuyhռe0f3t{Qf`Dv=-Fr0kZ0&G %W;4tTЍ 8^57s߃e*F]({6 l>:Z'FtLC&[?VK^6wѵ1D0 O!ŲQiD, ™ &z"Fʑfywוm\ϔ||Ccw2̃5R5"JiI,l3+B!vSLMaO,6 20[D!̭ΕJuvfJ{s7[#oreʕkb=hqx玅Q(fr!DA0cܭ])Ȱw|pjch;iH=l "DaT>G)ݤĐZ'3}t~\K^ fg%seeWEKyv(}y瀄bQSu&7ylNC(WeSD,ChC\ڜWn$z VFJ@M׶% lkנoIW=:NcSș0s ʥVSdmH]l6}f&ZQiQ>މzWtwL(S Us??l̞{a$ͳ[}-ԒuݬLU!&ڨNcܨʥ_9QqSZ=rFG<>ܕdm 3`]j}AvXu I ښ(w$]9BLof^<5k !=3e|<PSqs22XC/)K륬/;d߇lu> x;1ԡn8`OB D[RK@ o^x=wFXrm81Lc &ο;m^UXsfXs{,#/[j)$qKtag,1jŸ΍|DHPП)WoմPhra o=Euv#^ (HĤJkλa`!`d3g{f$eY&Mʶ6VPgBʝkzΐ~"0.C -̍:eo9p HZBRr!Ϙ\ZՉ԰%q`̔f ð#Q̼1r# W3SKByVۍKkw&MwП1zj*Ùv!h4jXb~j3#V8a.TlltAR[<,GWѤX#EY(c2]Z_0Ca#[؛R}utm>`9,Ԝ28$`#}(rjcu6u^dn`$m}N;'-5X)(H͑±DKh 9sH;:DXvI _ǹ*6;xj5psCmʮ@T[  ?zvld9,[Hz󗪇Aq2EU@,dw"5܅tMY-<ߥ(aGPq;ԕtN$Ҝ纑{טG)qZ8(fL*J 3)!B".("mYr#8aDwX(v5b%q5qXvY<>*-v]b'ZrmdnKQR#7v M yi_ ƽGőը+{5I-kz }4lUl^02ӌj,*bl9DCCA͡ VueGؽ{ruɟ(J!sM2`PޘĩzKg-)"y"ɡ#HY]"9\nœ~1Fo,Ki 3RoE,ݰkG'Io5'Q͔bLaG䄂 Iq%̺)rTf3ӌ)Q0]( 'KSJ6 lϐ+Z4Ui:(_nB e5%N^-Q{1.$.}o38ޠP#^8Wedk\;LPH\yq,arlv9x>>FGn c[wWnZ<+]pwݞmj v-FH} dtAbS+Pa!s)BAMe&%v *ùzr;$ 黥O_#$Τ_/uz!e( 3BaeyŚ;u3Fe:RwjjAjwNۏoThr 5 Tl-6̥6,J -@[Dj7rl2ǵEmӉ0|=viʢ$=-M)潫)ZM,3 IDATJTڹv`Q\˙Ulӹ+}#`.jn0 'ַ ~,Tۍkd},SqrDՑe9uI5zh3cL9]Xt/x<EC~%r8N,rٞJ-tق0GDwxYLŪ\3 ijy*3Iʭf!ܘES(H+V.̍Y-#i2 Q( j@%< dSj:4ncl:XT 5E(|m=A&-QչJ%ܦutf@v\Xixҵg$l;Hr~g;L@H %1"Y4I_^qK]NCj@0UD*郺˽76%Di++I]PG2)ї#ah/Maz[;0c + υ ;U0&iw3KjN_9n{>j6OVgHt8ނ3-W{\GiC=p%NM;+V[`qx= )8S/͢ fgŐQ Ywp5fUdJ m͜)T\ Vn:6;Yd;(#]a85}lQj R/ѵ ywa!O c(c*qzT{ƽL>k ~\p/;64h u#܈ 1HgD4'"IH8Z4佣:txe6U֢!qiVk= ?3p4$a;>ɂyV|pk 1 n=TŔ˥wr9I?st:߫) 1qNj:S8-i[ 1! `-(ﯹ)s(yoA@׹tg(pϡ/Ӛu ANq4Eh3ww*W.ӁӉǥ:#';RAyHTߛ{n[l,6;[O50FUx[jZuNU8;4oM!%QA:nʯ2yᅆ !q[.Eρ2Z<:ӝMw+뻅RqF9gY`fʛޕ0!g}?YK=o(gl]q 5:Od#U{670\9`n2C .~@].w2S05 3nKxƽG03斷W RvccB:,s#&*6j "w8l]ɩC=J~-h~7 KOZdԵM}*|NV~ 6םn&F!zSE'8LQ^8chg:BD9Zhs l`Ҵ/\Zv&yABX{8 i[ "5/&ireZEN=Dm`! L α[v 5۸] O 2iRjJ&+j.{Fj]3E)\q6'PW!DYG~>7=6I{M S؛wK`pȱ4~3J@jh—ĨYg'(!YHXnTaK ƥEi5nv+b3tv5S(3yÓ-"HR6k(P' IF%Yęxdt>Mvh.94o撍U'I*de0&`0ssF=Ht+$ 9Os|}_Kw_UC[o9L(oX֞7Z'솱é`\}G^®/ٮo% z!<+e4#E+)빑 Su4&:Zfzє"A1y哔v,$m[缍'd`flbz5Jb@ ٓI`Vqɮ=%l6S6{~Zh,C)Љ-!nj] OSs5b`EeMUuw^:YKSmv>DcpV2H42mI`Cvg*bR ]CSbCec mqgоlWP9j2uvH7y5|fd"j}?Xd8ȭ#1U "m6aBF}7{!bk,+nR~mW`adKʓ+L}#`H#&,$dB0v+m-^TctFQS^P]IFkH/qh kv!i"pJ5<6ёL,ӣIkT=vcر2YxrZ 7 sfU(-FU7>U67~~?w}η7 |~C1/bwo~9OOW_y//Y G>.}K|W|/_Y|_w>h>CM;ɅAĔb8kf5ms6@-k(, 0o͸CFulQ BcDmÆjֻd`2F(qq #lȭ(Z;lS"Z^2" Ֆ!w f hiQafssVRtp]3v\4NtSEpL( n8RdAdi`Txu+U]5x%Y}P^} %}_eX[Thj(0wccsnySIt4g2X[3RHNMMM. ~С4fGfJBR]Ԟ9 i9Q,26yRG~5|C G>"Ą"wIB^ut {jB&u#ƼW%D)}5%IFu)hCGu"r5RF`n]Dn):BCzÍrZHJc,юs{7>L:1;o7LSAe)CсJ$s\>5Rc~_+|73/_~C|۟6^<l'yy|c+|_Ko[Ŀ%_?!뿞k;˾ˈogLV/{?}}>H6^{.\JT(TQggޚޙʃa2 Wjͫ!bޕܘ㠖Pŗ*S ZZ ^Zti$ӶNHmhNfIQqnr`dW UG2۪=`O .l~&¾c(BL(ZdZv3hԆDZ0PٴՃ),jlJ VGkt E5pJX+1993=41j3*jY v?Xs_^W.PPZM9hZн$3˜ɿJ,~&sЕ1lxK;" ;V[(߹LĉhȎqN298ae0D[(ʺq*9;V7n0ʦ KL["p!Ez,D5eд M/U/N sM:cIL)# *(z)Zu@%x{29|ozҁy ჇrQ7nrߩ)J$=MqC)o 8mTh vvVB^ȳj8FQ!JTɯ}K.EUŻ7?l?ٟ>6u?S?S[ßŋ|7 W[ {x{[o/^KK?U}g6|7|Pj$`Sk/H t9bs/<-y-j+6eRRq[^e ͳviQШa3nc߭v_,ѭ53\TMBā)ǚDZ";퐎&v +rw./,,2L˶-ifW;Td3jF4'O, <AꑃF` ӉpV e)ߢ1%6+ԕ=կc]9(5ӥ[qaC.)Ga]š\m2}0 nMΕS/t`Bf߂'3NmP lR4V8 !-14 疝ܨ0#q)Wa u3zY*ɡ2 ܙ75"V oZmdA[Uڶla!pKF{ _ rvCTmRQTި0/ `.G`Ln?+zWE\%O ܮE͍+e;]%fT n+rɧп??'H~g~o//o||owϽ<>>}w]=6R/^pOO{c?^?oFm):`HhgA\V\)ʑ&U$:3].7  .P7О^{'˝6z QOH}Eӽߤ +#Qrhծ0  |+ZFp[`ŠQ5սDEraoh%:33#r /frΠPx!뱻H9RVDkz4DjT>U^%Z̭5!|HvT lFx8Dv`pddrtH$[!KY2Qy0A*bWYkz-uYm{$yr]IYC8|d0kܝJc)Q Z~: KBu9\ ϪX625$HR3e4Pt0q='ݾmٹ7Z]HldIyFR%G88/H#Yɞ%<5gkSp pM!.JS\b K ?ηW4" Q争6 WIiM,9ŞXU7k0wuQ\AXO?pKwO?yOO0' >IP"ַw]<y;>ȿoW>IwO?C|_ uoF鵞PE4LZT&ɴͳQP+UͿ1aP9||,k8vUV rDkd~6}q;]I9ծ͒L*^ cMzFm2:^͂Lcge;Ddi}羝yc̼ZDer r^]kU7CA{\th_.o#9BӲ wnlAS!抎t%wt0̥ao_8,+vi<$,FT6$-ıUf/~q9(q0^ƹ89Ǯjy8s9Qv!xn8ϳ6$onUcε޽Ϲ6R6%P&HJ ai8RRI[!#( 6j RLE#5q!Ie+ZQDs]k1=ǘ^|u+sYk1x 8'ô g ϷZ YQ6'F-YH>yM]F ꥑZhM:J2GOsiIEGeB٥Ʀm߰V#:hNN.V)ҡe&5bT݄U!zѯ-PNZ!po0ΙDd[htl []aHO:*2u]_  ʯ˼/m߸CouMg^᫾kط[=f_ 7 |wdSP x 5Vvkݔo4Y 1rz<'3+ N<+VŽfiE4n@cU&c4iחg/mcFAFUD}}J s9ТB{S\dH2:^]={I f _~8 tb9CrXWfG( f`%m/$h*&,4d6@COFV.ו5{OrVfwm8,Q"V,%Wa.iCO ;Qoh,0ٮ]MΩΆ9b۽* F^&qvQyS23j;O391oxkDZUlVHƄQ}SWK5w9]7QQ@4z(\nMc::Ѵ!y"+LI4ʎӵsXcg ck[#R;6i3:]l.Y#&1.yj,iR6<ys6;`9^Dqԓ.#{y//|zi'>?#} #+o{.XxG>*j^/i{=d%MW 2r4 3\%3Y ݦ I6gXnHB7hk dsZN3F~NS`^\#7PVی  wʟa}|;xܹ J=zE"1n"#!n=I4x)#j'`KPXb`/YELÄ)n:d,'ESΉRl6cpLһr5YQm-WK7t0 c7~xǾ*i1*˒().2]꼩P K֝͸jk9%+;PG" nLv *Z[9R}LݯԐъ{d.fA|_CK 0eNuHQO穸w+D j3Le!ts^g^ܕ܋ƙQBP's/4L+a]U vnVdV%˃,)ytiaM &rNE:yӢ̚ 5O249 L税CyF q}ؔ'ӊd^?S)^pI;$8pG1tiJl.mSdPxzl VhAK[ ƐP*̒F.:-Q<38V= J:x.u?uH|گX?*=KDE_F;37njjǰܰ ghd5n97.WdiWEgs>] q"˹f(VnXFz$1٬ \,zW.R/H1烈ǭA_$ҕJ,-Tφtj\f`r؆.X!1*ZkBб웖^]I98(8^ L1[\+dU\=sz*"E\@ iTb.lAVj#M;nHBG"BΔpz>{ٛfâĺ+MLWd9vQ͓Opf:߻'FI-W}|;YM;[KB-JTP2g[u걇>,2 )pqzIbY!Prh5".ԭ@)x&z\Z}-p96 [ 72({wX*KI5v.fv9gf5J[i$#R%א)uΊcMhij\BnLlYi."vcl;UBhÊy/BruS #fBgx"c ˤ7 q'\if |xWWkvL7F슦(E=%U -(kq_PSL6vu5jSC]^N,6*"V )s!Z:ӽFvGu5Rlfxy#U4#+`"ek(̴eTG/NJ5~k]M#wzgz|~0}sk^-ܸ|YcȣӎNI&xeF5Q:SEvY)Ck&*ۨ;S6IQ%øf$/jl#qi]tˁ0Y ڮ MpIQp=[t+=ͪxbJg)u `JQˏ@ n:flbm}Ǿ@=:>I(ȬH-En {8NeϡtLr;8]ig=nvw*3&+^ ӧgqG* 7UB},x ~d'BO FubsT*wӺRx؟g֩T}f`']Vs>}2&@R L7YX,Ycυ%!lRJO'lnt:&Js.#@sI-JR i[9`F^$ﮌ #=J܋kˢQx?F K1:3Z|\qV(OYΛ=Z 즢b 8cnY٩BI{ANVZJM6-a>{YPzYt"6ryugeT XfV֎ Hfz:y) 6;kK6k kbJt?&Gb{.Hm okUQޯ$h,t$VtfbJb.`s#Ɯ[,yKZ/Tf]Og:ݫ3 *"۳GK#O@D.`ɽ d3 3)@N#{2jpsSSoڢ17*ZueѪiycK-vl)bp = 0uEbӈd&p^*OU삲:<:*PE\rINwne)ܚn*r.Q m[ɑf}`Whx=6I ٓ6j!x(d2LvFnMf1i {h#LUtb> ~4"ӱYP)ā(aExwv~4b)idCǤJ!:FMLk4ɞMDrgd6K%>\_-&t2M0E SON=ɐPS'=r4RMn]cxn=*H~,GA0ܮW@7Fү! [wu"n3L:'RInc%Lue0&KsHHM\;;ӑ%ߜf )SFMUEaָ/+%A|dwr, \dmFb7Za!5Mv M.+Y;Y_`f SG^i 0 i+Uy@ {(KVw9fxeC/]o+4 mlŠVok òJB Hscixi %s ƠQ Vy &΍вsVQnbadZ#:m=Y\c@-Xl&ȩ?@V^, XuF<:2%̩jXM fhȢn T 3cWa:jsSڢ"QiDꡎ{ʼeq ̀qU`vkb6*3!Q]sK7 whADcsuP̂ɘE,ΐ*<;6*k+ eq @Zb[0Nd>9S琉,Z;?e&]yы^g~g2xF9'y{xի^q!u=>{?qGGGk=/7~U` HWeW5mÂn!aA۴Ths}d0o[@h4Nt3F~b Y/95Lq ֘rɅnbleOh B׽s3w܃CT};o}&D9X.m{YPTP;:10<+$˸CYV'e=Rp-i22*84z4)@Uŷ1Nr$eY}Cᇸb(b]Vw׵vX*U$h(Hl"Qg -d2\SQ޷+Lq Hx"*ڢRӫR7iŰ [-V:y#G4fS3X8CFD: n;~fe#dV]T[TyEWi 87Bׅ̈́<7:+9iu^*\,ˣJS:Zk/yk03Wc gp

_e_+^ ^jKqeޏCEdky9^>>9y/~>N|9ff://35y ??~~}NJq [:8wfAfAdY&o6ҧHMm',Vl]h?IAb.UAe9pΝ1Yn*. !⍹)YOΓTS);kl'wVbǸ;9 v"c%<3L,-B.`'-lceDҐ\TB2ghtAvNtFe"B;)Ǚɦ"ԺRvl[gNiH8smFl9?3} -Dш ɘx1}:6%aGeÛ8#X}6TrFh'Oi1)}!5>m 4 -oq}N 9-q?a~MFF5,x$C01`?Җ9c u0Z|P  Ke?E-Ӆ פFpՒŝWt&[9SwAv>ܹsi_eGg/| >s>e8?qibtӮhvbe5B4 s~6>(n,ln=;3VgܰdduacyaxJ1 IɂV '6eA.AXGr212G Pm) !=2!emW{JRst7 xd  9lK49؄"\x,3^,قV4VP)6^Z\FESTn&iM/MEjК9"9^ IxJrlJ &}' ux7%̪/q1h]VDas,LsTE2c2ا* :%b1_lHt,~_./~1Ї0G?g/x;~7ѷm~]nnnx˿(o ^W?c9կKD൯{_ܹsc1v>O!1?η&l IDAT pS(28EHGxZc~.2lJrfr ^L̝ٔea3{(g* kfxJܵx@-usIf) \\,L5I# S]--.sY-NMYsYL`Lݜl5e+F_`v2^᜙qӫRYaST1XINsTBFAyKg`7YcKF3qSXN0aCObsG @*0M:i0-`KChu{|NDx[Wd36W/~0uc,U"냺+E )?X߿__~| >?w^` U_U1|q~~cYD}sF;ۏY~sGǧP8gf<=o73g}}菾3 o}n]gr꺸505{m˕ޛ&g4ZzZP.Y0&i/uS r)ZuevwYFx 3`p&EHs)fV0&4}&,3 4Z ZT^f=4/)Zkmz]t|u"Yβq9Z^BNt{7*BqHu_VS7p }G)}_q<3%nQ5ܥ=amBZ.ѝp<7uLahrOH;JoO9Y@o'FZt/rr\iayrfApI͘@GP,3g3gSiGt'4%9wB1f :}{e{#iP@QEl%rcpD",-%vNdYy_ cm+kl5fKQOc RgɨXe,:4X@?ҮPE_zWt"3ycY|INo~C/|Y|>טN.ՉbyYu|>?> ">9G/zы@NM>[Ȇ`OLr1ű(lci1cD.Y^OF2,Ӽ%ĬdM!Iq^j]xH62:x418cq.jRF_kv;iW3 8qƧ޸7;wύ70}mTXFfDdDٳ'ׅ<ځ8FH K;ҾڒS/ ,sVRMzG֯H B]v!>h`B۔vds+ݏ1 q~kF1^]`Ib#!ٱm(@:njI8T$͉qn_,kAIdq-ƙ* L][2K2&N*#qVֳ,lGIQYYVgFH+̉neFVlD7z&O<u Zۙ.SUE:\2GV} \ڑ{9 u_K\ޑ ܃%OLc6#-eNh[;WncƤ 0ٌdrkEgv[,R7I΍NwgҥՉThgBhI{ټ`,! ,jx!nYbTX8Ni=%<ǟ[a>lswv > ? _B?gƳNAMTxҁ z0"Ӏ =\,fXp1i=i,[|gMх+Q0! /n8EC9ujɈf|Mz9%#Νk>r{DFcZ< 4lFjTNo**W {:ZV&Ӯ]B8jO3Z&CbAc`l*<_KEmEJSZȜ6$O9z:CQW{6|C!IYEF~!5,D[65ўvtZJM((Pl8h,'Qi#C rlx.NO]Qc΃Y;˔.IB*! +p$R0B\EȍFti~ul,1I}*+*3U za* 9 , Vp$T@f`L&h kbJʼn 81N;'}J0QeoƳΰ4Q8b<)i)֬ (GDC?W&!E9\㍨e>0bW-lIcAۭø?i+fzugQx]ĻQ E~P1z Qb [6ؙK#Cİ$[/#+ a4/Q}eeSJWDyEg9iFx1┣.fZEVf7cd$$1YQE3/ HvԈ*&174Y=9t\r &]NU6RӘl/07vk'֨ ;G'Ҧ,橎!f A-jǦN>Ě(vOXj[A-GwJA%Wb@kLQ/Lϼ{11!j]jѡ^Z̤8#\KyX]l nXrbsu*{4]DwM甠֬hYhzH yQr/U~U2) 54.J)+zxrwbShҖFN1]aI%DoD<8?=EZ)MB_hrdR:q0笂Ur*\Z$+$@5p{9j\XFW5 C!aҒȆnCh?&DPcZPZ*LfT_GlcLQ;8WwV:jfel.,UU"'T3j O];G|}xh:Wf}՝Nj?O'>\ڨx5>>!E*0FjG*2r xZxVYF*#̧/d)% 5YV4S`bs%hR/,r^XMvغmg J8H/;юsб!!aRcAUlBZ HWȑ eXIpˠ+8.C^sWG 6\1xlFZ?W˩ω0'9)%vu0D$  (Yߍ4DY993q{oB-BhNΤN-UVɎ 3ZSAYh;sm')v(nΓ{u ='[4 /ݸҁ;NJ=˚F.YzF b3o:]qS<2WW0JJ?JC^;̬!YJ-^1"9IW?'{sۖs[USv0n`!"@JaM+29N"h:D7%B/D! *K 1UTo{λךs4^U{>{c̓Zڗns_6,}XU}T+wG#\deY;IO4h1fHv'=ȹs9v%Ze?;)'3RW+D6|Ψ+NĨR xx/cMui{]RKm0Op&QJ hWR\"WUi\+,@IxB,013Zsghέت*,`qRǥ9mxh]ln0k>0:(|1ԟ_;|u_׿Ο??;55pZxVsIxm2tJRLNsbU2.>YB'-n>07f:5^11c9M\ Ywrn%G*i'w-l%oཱ&p秷<8 VRcc;5 `j?Iڙ@ }6ʌ{YGo˻F 5$h\p0 i[sG0oLXz޷)Xu;Du$D4nY a:QNVb(%dt'j1;~'?1x`LE̪CϮIO*vY#I`%|R;&IG8\Uo,r>ӗW%Ki5 c6<Ҷ/- |F0ƚnG*I#*2.쁥b1xax -9IN=>'eLђb+[ۙ=珳AfF`qR fT_'=OV &ՇAvnwUrS(j >~ 8,OnJE󐞱ߞc<}E/녽kRclLBHR\lͲzw`tn"p<|Oh/m{R4\l?ZlMJB,b %*NQ z.}WҿsΝ};;FN#5N*}l=c:۽!f7KSe/N4'S7HnEy`mv[;5ӂ ^R ij#$V(3lҍH vq6HIqn|f {af=.,/pZ33$ N QX$U2s[m0>Zˣr>+59nyT($i("HKVLSAJFـ~L`KV8ggꖢ j#@}??n-XN/[KgmR5;rjFlvb VnrhGN"W}&HJA,-"(7ō(%e_K#ӇȥB!6գ.l.ZL'3p+JouT4*3 liR%;Z,Qi"K鑶%cH9KH!ͅ0yĺ9!MLswoz6Y[rCeغ LUdtX*ҽ$, <Y04nBZA'gX?/MIwZ%Z\w;ݕ$*.9?J; $9Ě!;ur&|ZlMMzRU+qW=>ڦ@9]X۵+4rZ3 q^O| K*RZ}&7dzjuré8PxgSAcRd^ߩ PK-rXG Dڨ`1 f,XoM^ӢwYqQSW.'@N{Ō^?͙\[  ع岥t3=9&/~OԂbbVw$HFsiX@'jZLd#ҭH-a59@vJ: \n.Km+J&j1k8K\ʋ,kM3-LS^b㘁J21ї{6ay1ayPA0Υ%<2˦:E5,&'u Kب&c&xYebgEnP2uoM8;i(vi`cn''1/F$nbX)RI.~)J W[FSPO" =rJ,WF 1n˴Ϭs2#ɹs{k\]p&Ӧdd@4sI_ֿ{/ܟ@_?}bEEIֲb# ~{V/M̰ +̓Z,C/J#m 3E'QسMWMaäٱKxlE.YQfp(ҘuF0ʫRMBTAqxu ک99^ni!ǚ;uŅ0 H,ŴEm N`QA@[cI44L ޑli 3"[ZJ^,$F'7A/S]jAq^_D di=Og?c5Tr+&*ܨjJ-U-0lqe}kʖl hJ<_ҦDbBF\_-u c` lɢL8m{v7ͽugI 6lt5YDxME*aYۑKoYŻTAc]}K -mrL&YjGZk'f2`kŀo~󯁖^G?#?ɧ_YT iwLBݎFIZ:UxhșYͮ1O|m)E8 909?Gl6d5%c 5!l]N sXC %({lutz6w ΧZ"됀tmbUP~6޾;AV3d*yݵhf;S 3xuAr/%fY*smtQNW;6GapL!PT6K!+eOc~pSqb ,C]t^d*lR!3"jư{贐:c=Zi٪ >Kpt kS$kfC$MEwif 68VLEFhCV]IT~1oy~P wogL~n;5-_> Y++o:z\N,ؒHY5*ǒ"qPHR" g"at#hHT&MZ cщ4*JT'f;I6dX:8<ïn̲ =)z qޔLэlη\ >ynΰ{d7B!#=Gh3/{ym5)mNъu"$Y2%dGq2T\ b#,_E?rƭR07Fj{`;bg[)Ґź蘩UDg,]b k+BwZ.4sdM6,5FlHHJ棻<-VAi.J{(afGpMA&Wi ^d)0"iٟ>a;DO? ‡2DZOtoʭ]NVl P \_[_-l[}.X:;@k2*_עA.l~? [$؞4Yrάaf>qro XR[%<Fo\δɑScwvj̺۳|LL6{; ^ -G6Zg=ҙ}j PTw;7'{RbC)KWPd{Uz`"SlDƍNiȇ|Cr9-,[76~wzgMEnl`qA;M&*ZD)6g2mnr"sw4qYB+ڛ6Z$;9m҄4tc_SӺOl EJuVG7f 0q{bҊ[K*aPqgUk,asTإG[pZDա*=1i_ 4aDkVwZ4ryOz612ߛݴ W„ZV¶}ʈR.R#MVge:,iĶ8m$Rs]F Wiҡ`f` gڡvyܸ&G@8[ [ae՞ xnbb<Ҙ}]L}%*@<ۉ}'~,CL?B&1\3@[2' )ao~ JiCn4JP[RN3`bpŤlJ+|LHN_P{~C7jtLby+圪gnϐkz`T υS"Mwm"nUA'Φ229gLT}jm*2Ӏ;CZB'ѡ}u O` %<7 Eu&2NUﯩ RPX Nj\eb|y-qYԸsBduxrs[&Eu35kPS{/$$c}qQƜOH[߱meNYGٿIa%G޿( fwAv̦G.xn&_pUCږx@JH[^k-uLI/uN/ŋ9<ꖶ"{'0fX ;^5ہHY,Q*7.=NZr-U0[kpll4V4V:aI3d/G45k#Д[hLBRsz`lu3Iś_1RP>cW|ϤMMxYK]ab5P"f jMK\+Gĕ+\ }[p&RO;0[s^de~p#"pm$.!Lv66CD%+ *-M9>S; EvهteXe4^΃7<ݹ S@/b)?jX L/ZZ= c`TI"g'uz cJQ! u.f%U=M6*vY#R&uAcX* ]`k*7b.k2/kk`I"E5덜o Ch|Y"^KOQl@gE=QI#Z^ IDATӽOܘ:pO}W"^L;mPҧ/5 RR{}?FSP/^;5MR c <==c?c?'ַůʯ{~_|Fy}Fە땜qXL::IYE7:AvvDokoRJƇ<։$O5yկA?H*Q@ l6$-L WؒV!'6Bj?Gk0%V[GfV² p=80u:c&Nh,rئVݘI| r Oll3J 抾iq:loUdAx8 ]1H>Zg揑Ӳ%5d wĂZ Ζ8Gw]Le7ٝ[U9X~1hpUeKZi\T3g 3Y07}3 AcXEJGKbvWv&e#,}#ĭt%a!3zf>']dOq/I*~7dd2U_//?W_Xz2[_zmg-2%_|m8^o'xN^R܊;wZz"x9t,K?7l{{;dgI \wnr =™g-L+;#g*|1F'sB Ŝ'W y++ſe|OOկ~3]{e5!J7ÜlH&^;EfgYvgѹFGޤPFez? aG_'707 e-q~}{|ߐ tjA`Qʀ+<ĖQ%Út*Dy%ui#.KoWbaS@|fo9m##,|brf;DuK'鼝EuUVtk)aeƪxx+ p֟m'Iwǟr{[ǝ5)?-eb|x`gQLn9<:Q^=+v]&RA`4raPP|prv\`:; 鑮uqRJ<;|Tl{0V)`J!Gg]rȎ>6fEuƪ<'9)ONweTcVf*ub; ,֝qgD>MZsna2fX+*(g* $B7.Zc .t.V5^RF5:_L؆[ &/氹OejxYn6lC:vIRYt4)NU=3&:Lc4E1~?Eq?;cg{xyy۷d&sN"`Z|^Bn/& &mDNfE>$NuUCb͐_Й+ x mV;EP k2əϜYTL[;dj0grpz+CTiDFWXnZCՇŝ(U||Go3~7~NUmۍ?'f^OKtj6Uˢ}_7~KF[^EՏ f8,+efdYdZ'kg˸VS\8:Z띇Ԩ*7_gSvf x͔I'?j뤵q($ًc-4W%K6ؕp'lO_+_{~ Zޘ(tSZ;#BU,Թ. џR|h"lۣ%XU>TBNy>fgLN7. 6.t*C}WdElg"u1NN-H*F"X\4tPN\Mai4M5HVBaF tYN=u]C^F-u}'DݷSg5Sas(rqY+KN1: QYPkzs u!peuV>4/uAI3i$l2#<«8~: m98; urAC/Ui*_Z~Ӟ'pHu/m59YVxtOz`,V U|\mL,W;.'hzÌ&7׊ Luu A$btRd‚4NLq%/o2o}_Ue&[۷}|?Ǚs?N\#^x52bвvm`Bm:bVo} \ \DxWcOk{[9M^ۖyx4^LjbrY{N6:'+5EsZ8IUNg曘J)X^f!2-Ezo]Pת]@i.:4eZ)1V().4)K$e]j ei3\k?֥K=LH5VR e֧}Ѥ z29`ͯsZ?πTk iLQW>[d藎#>D (i )@hC㟕1QCFP-R aKcqٖ~Ʈe6PR5tf-ǀ7̮[or5{a& kÞK]5L%@ՋuKFBf3L%_~/bqWaH1{4ڔ$ևtbe)*$6FΪO = v z)CS}pٹ Et3Sv+_*q~~?G+߽{D5_RhqliteQ+{-\T[}J^0l`\򼋉rX1 v/ͻj6員qN*8>D"=^0 g~twf jAK[9i= {#xw~7`e|H-KSg2fJi"j$L+JO,OsȚS!?ʣc&Oy cV2#yʱGbU t>b#ybЩ%ЩxMƒ1'ہY\cz맯QغJۙ>&ٸr7 虴|:l VjʓPN I.,'kZl[=+,_:,n.6L L :W$G80 K3oϸ<`%z8+j6U#UwYJh,nvZ?m\3Fj~\a(lu-Z6*1[ ٔo*F ̉RF[C.]õJL%Lʢ\ZեD/9IkX.~tӭkɝl[y`Y& ެk(6cjyfwM cV{zcÿfQaez hHf+[gd٭s!"9LT"ldS')iSLqj%{#x^Ӧ׷7o)"3kOZE kg7 _Ԧ]{{Jם*a {r^ Y_`f0ڀС>}>p?^etN1ăztL܈çC=+3| 0`]% JE$?\@KEMNairoutVY(NK0ڽbӹ{z)6~ܙޙ69nR^&eBU{;먪U6(R ZFh MQbMqEFCrᙓήEk$ &sS2{unz]I2=%e5I۔ƅ^GS%AJ/*^t${ QP)` hJ:[q{𜜖 `IH쎣PQ1cM bq)HI8 ]ĎʤUjBB2k<ܱRPVf{K, UGSRו ׍z"1E[fĘRb'P%S3އ٢j<yO7UA/ߚCb3zφ/ɴ>R-Sщ(RAU#loIe5t`h mD-NW4Z4 UA8*9s3lƜ~ԩuLŪ *X%|g7չx:nGwZ^a {>ei>0>ֿz@_# ;|yZtt#t|^GE!a6i]0d)˕E'V=$r n0^20,y;m]Y3md XgZ e-:K^IiɴV؀V~( }g7XUf0w8qfϯ_]>|\ ~:oM=o΍so,clj&MkLe9 ߰bAowsʓ yqv*b`oS=X65춳dS @s|*f=j,vQhLF) 4rEmV՚Ǽi qyHf&Pe3TJ$vU5F*>6y l<_&Dz~fޯVRKʙdA;liVjޏ: ̂fU1.,(CCVEa;>O2'ޞX^ihU5JC`U ^!oߙ=5 %]R]!J.@Dv˻3M*˾- ~1fTbF ^*Ħ6wS"^⡯BkRܠӏ@/F>]|3R*Aڕ_L؃F.bRLzT7P%+Ґ9_u!åcYibոV@]<VWfx&Ԫ\p-l1ؾe$řěnnFS1ywj?sW5wY9B:ŒWka05ې9;Q$ޙ-ZV*9kڮ5Z;z> nZ[T58ifEla5IsEלD4>=o#Nos_wܗnC7TU"G|j;7'LxoB?Wi,;aZmԲM?$iU>is_FZ,ء2, (44/Rze-floO8;}zȜ̥c~s !Y4d`V`,%R<'+ ?tjΘ݀-*^[ cO+§/̢K9Vd p{m2^TS(ي\4UTy_9&4G5:XېBjdgE<)dpZk[BhjS6{8WM '6^ 0+ﱍ{z^^ mG-Kbat}?ج}!jsL2PaӕNcֺoͪz|}Ƣldꠊ&nN\̝icA8~>*&lAT`xׁRn+JU Iz8,30?3(VBeTJPU1CVpAsakvDHhc=$gG?!)yZν'6:n:.ZH)d\zg븞Zd4c*8nqKZ$*o:Y, < ^ʆM. #C 0mn= Tx7ZS^×VlWJPwuwW3xN!ӂ%D>|>n.n֝:=zwVl`VZRt0\mٕZ"ĉ@9Dk|۷~DeC~Ig/-htUʸ,RdFf~tIPUj1jknyG; Qv96RWS5Sߏ4KC[2oFk2͇V,L~b ;ӽ~`Ium+][tb['SVDma- I>֙jP\"D V>MdvZ"0SJLH| f]l>`j8ۉn-q/5u;!2*cIS #IvZ'd4-SoZ1 N+s]۔ݠOBͿdzd4gVozÛzz۫ޤo;{bRL_OZT"Dx͕ZÇ6cҠ=aUj@dpfY9jHNkꩪa$u#DI*e@+`\zKt.4/23-UU tʬ>gŇ ˿dug%c,ت#X ,mjY~=6u:F@9d5&P3\1k925·Y vb4noa]Cbcۘx#Tz47o!E1|9$1F$E^;qu8!kg9aAJJKȣD^eoDMczZ)Y[! ='g -XoDh-},<'q\XetlRqY w4{_S2lkHbJi@,<0 PgEuaXc$|Ym0N+r[';y\l, 6Mϸ|{|+x|K_iJ`atnR`ܜ̕2vDӈi]Ugw&|> !34RF[IБZ+"ID:G`=A5lɨ6z-J"D' ܢsS׊CdT!$ftOFjHicӤjzunɈV̗3+jp82 7rj3W1wRjW9,@yrӚ¤|vE"̊Eͼ0X+r,I%8]ўN;䷒_UUYY+`(,xb5,NZcҫ"zm')'RNg`n;O矿Mљ<U1RQE]3.4+:P'u%Z uWje5Y×5&æXHZzstS<yHҸ¸oean;4r9q:lOX,1b^]u?uuFHkTs3uܽ~ *x5H`Lˌ5wjbDodJ]']e+Ju? 5+yQLz|&JM}9דpFo'b-k5T`PRn-yg6S~1Ti'r(F[ pumãn>YRpwkzW5* 1%6ci;aZjH[]VٵOUȅ}l>exzzF w$jp,Lj}տS"axf!fCٌgK?eOR]v];T3ėtei3mJzˆ6]hMJ$j5F{0Ec^bxkԴeW|ּ> M 5 cdaݪ}UuЏ487IY6f<|:ݽ` N' /vE{b} ~],"G4jRˁ2gҙSCd_J݊R̎&Ef_T1em뤝o3uH5ATԋ<ޫl`jSEmW/ZW2AgQF\mybcҬ r!!δIͧ_{R0yܜ2VM:OUvLW^lUDN j$WX(g`z|}@!)^݉N 3xқ6wd16j%5_8 fo31|;mIÄ}yk$'W\=$F1'$vl\aIs#uMsF;D-BE7lbRG|0wɹ;P1"vEicugc'.bp&z=R`dZg'giU``sRXNO<W򐼛xj q%.'ĺJ(^2 C;Nk>^z kʙռ -ZM0X3q٭9wZaHZUM1+bUs/$ [\hcWwa̓%C=Ha7eh*rRo)Aل`HUFA'%S lmYtYf+IOu|'=ZJ%տeUE!d3PnhW =w%Gݍ-#ط6OJEQ'|m[97LlZS*Eu=72XBoxRAN_tFN*ծW$8ƔۿƞpIp`1?;1K*_ʾ>_[~\̠7%-f2RxE<6y"$SE $I4+j]7Ոd B`/ .huu9fbA4b$|Tx`DSr(%ۻ<*$z`۴t,:6bJ't;On"K7|$bWzpYs*%%O+Z>2;lkol|5عs~~,_&NN#[*T.qyfK QoGYqiv=zd(z7QB*X!Ž)NEaVa Ș)UGQVZ+>4Ec;-dBR\ꐑ!FUxp9;mD\i% :w_tNM5 h8䋒C먨u)$ȸ@*hPu&%Ol>f7km4i]uQ$@)B9<. Ct:׬5fC;զљ1٪ 7lqMų |tT'Ok>䫯Zt<] fimꄬ? a\/7<{z)ɼ/;uuTT`l'zv>_dlt\n3_}'cC+²<*GUSۑ۾u,U|Jcf429M\(BI="%R2 *ݲnS{[}!(raf/ [X!tSrNvU,+ʴЍ|87gF/ ]Z3Vx9{Jwz*mh3CWlsd-h>Uzr/̑7~x›0Ҙm04MEy@dͰeJ=-NlqZo4wfs|4V-ԋs;/[E5W.XӁ?k^>[x˶YrgXurL}?]ݐ> 'ݥG:@%{3wX'̍=tR^hZnY^p>_2ԐIZcrfj]]kASEKGcbM쌦Ć m0r.0Ayg$x3V;l?eJsrI| ,csX2 fpPZn -/m5Sf>ø+N8W6%o0nO{WSеcY2t 뇓LrAϚ*\Q(nܴE ;XWzgRFx*[9n'⾗jv=>2;  SGTTGO1v2AҾDfqÚ@S2:/Wk%Vb)m$Yb0_+5w~ovYxk*5bs|ϼUCFU3cqlV!g;W5x,eO#gC 4M?-#{N@kRV* oZs2z5W\?9ոl3XtCd*d}e$ߜaϟ_| >D?oZ7&s<gϞ;W?iğN$_owG^|xz>ej (؛JXӣM]DحJ6Fsm4x8D6ʧӊn:X83ǻ}r6h;*~G{-:+I[m^G-wfC8 2 OU1]Hat)OM4f G6 8~KW\È9**m0M -z\^YiN: kN/@W[ѯQyǓ'5::_h ^ȁONMUAZ=g)99hy@ Fy/V!˫n,$44H񣛫mC,>Ơcts0#=t?ieOZg(NQk.En{(]fYZ5;} ~n7s3 U/ BdJ"^>5S ;݂{kέP仧3*v _9·>9_*ԡ;A+̓F9{[i̵+7|z2+5,iURCaN aU-Bw/?G1*[gU_^]ӂ[%3w!kְZ-gZk {?w3˲0ƠvQ\"4KykZc!/>̜s~냾7'C7M16*t Nppvg :WB-V<ܣ fbPMcN w'rV)>͡9I䭬-Xي۴>8}^QIV-Tbcvy:F^u椳oq = LOW,}{'||NT+(-RmҊ3|kLN${&50,.w|;:#-g1]ȠUiߑڰV[ :Z@[t/R*< v2` |UH5T11 2;@8ERj.4Ƈ92cDWpت6$m2; _'iOVy=藈gOדd]c#_yڥj-޽/-w)6ˏUR̖*\ 6UMbqt`5oCXQp1ulꝥ*wA Z-eAg[4dy~?_MgsuuEk[u|7.?gc?\rsgο8_ >uQs}s[3G~G}?c?v87O~?IC|fO|vScг %XC;Uaߢ)X^OX]ʍ'g+jGi;ff.&'O0Kۥ8^Cr7lߴ>2]7QHu*;&m^զ-N,,u2Y|Xykd51g=V@wSGo:Vf2np{9~g83'0콕[}{|R1Y<:0g,^e7m)t~M HWjjVQ,b-վ=reaS *FNIwA5KXqm>~9sϕ(8*k.DZg{|' E֢MgJ;Nfz`L5z /L}DbVt)S2MyfRؙ]k\g2M<# |À?]u;xa ѝeڮݹN0g]5/!ZxohttK?Ŵ=5:7~[}|cɵ_nqOW̱Rw _Jb֏ HPeǫפ@wPB2^;XUX5m"- pKQ\K o&|0cw}GI?Gϲ, }̧>)S|?}Q]u(g?'|뻿?(A?<{$~|;Ԥlt4'cҐ Dss+ִR t\ow0dVLVZmJU ^qS@=-lRXf" t^id4 p 2QXzRSm)Iֲ_mF8s3xڛ7\],d`ޟ.#fAFz5ZC><+ wc;avFOfk{K޽g*o0#,ןmSd[2iDs 4لfE)_U{L!/D٢Uk@X!g$M܏̷+aN4L>' =wz7ɓMpoƋ^?8c,pӮ7\-I۱9y>{s̳UXhKj  +%*$ԿvdՉzЦ"iM.{κD4=2f vߙ}' 5)b\EjVWSe5&\ -W!+$j֫=bSo' 8{Fw-T]5Іn]hF ։2 y+tEBVG3 4$8ZIj_!_Q.LsI)ш^'J.)w1fƖduUfud#d8xv)ZD9j1SsN6kU{jxƍ[ v´P(dv;}爫se`[kY:0-.rRDXx5I%\2:c6:kf O.q27ޚ=AzS]IMJ>ke¨.=P=!;i0lB-18,ძrHW3 -Mj饘jX %IB]❣qn1O71$$Ⅺk fNMϞğՂt=BV|<v婧_xE%'Z6_ 'UG]FS-PK;Tpxcw)$yUKPl'>7~7A;Zk[Tv~]?9o;?;_G;SSO=IJs.3ڵkkO oƘ|}+W~ ~.SqC2x(*PG{ڈi_mHӆT2.C{5"RSguĞ ,3(Che%gZɻ庀fZE0xϪ_++\4z zrlЫ-A*?GՕ*!SWyԭmĖ=Z <<;gV̋DIHG:Q?Ϗshݘ-&#EةM_)7ܔè%q^؏Bd..Pl0g pkCa)!%r#҄Q*)5j2ui$XG MxQ"2+7Uqr+ M=_kxkf i&#gn?amTURRmb;膃2SSі2bY3goN>G?x%su7()k').7kBiBH F_S(Z^DRY, ~7яZzZiw񿊢D=~|qwr|۷}ʣ<|w7?SDv_5"]|,l'wJT޳ NC5~A2lnV23sԫ] а%kxo2̪ 2$NUY(ml3Ģ,Ҙĺy VUCΧD!uX NR.ǩ-Mz$q-) #Ae(Uՙcl6 "+R%HʴވJ ,!:;- ?Zb5jUB#L15w6Bu&-na~-aZAb%odNBKOTz<zQKJhSifnGRTA.w"`I͹ M&r|Kwdb/CqLx?%sfghnUi48>XdT˸S^8c>q!qWq^m7=.Nz̽|% IDATe'F1E6kI 1ko-iQ4*Or*e@7<{>pqhE |n5|7 s#)Mb, vgrgƬF[KZ*dJ55uL9]0ۚ$*;U0$HIhRl|_.%,>&]0t).Wdft9Zh~.ٔ&FI07>pSiEb4eps[8|x_]ovafe5_o+]V؟{y_Z׿ݯK -be* ahX]h㢙ₐ;bRa{}z6C"q_:$I( EcX#^hx Q֞ JV h%ګX89 s4DI:lP#k9Ǿpy~Xp-3/:lh}4.$LxJJlS[ӒIiL\: YH-e!{4.Z3vbՙ-Ww&IF$ֹ>֩Y Ѩ*'QBp:%RѥթVc\}+!F-`G:fyJ82yaiV7څiҎ' \J\qte%2rl{Ǥ¨qV$`Ơ!yJJ,9Ǽ zgk7sr~D|xxmD6p*y(!$87VqVZaJԵ?H -mutiS4&ZTc-nbqc^ fƾEfka| &d^HQ8t | 8?ҥr?%VQ.A(ЀUZ76V,dpU3sՅ_;Fy_A߸79<< q(^ȝZ{ߥASWPfDf#(p^:zxb4[V܉x5;)멙5J#|1G?#)ȵpH{lO8dFukHvV"Th"{#.8-֢L퀼5ܣFy&]o҂nYsY) 17X;4wɍ}3sY.M,(Pc nB'v3(y9IlN/2Y~JP 6Qixo9r4 ҼD(M0_.]l֋sPb,VXHIv svZY<<9E^-ܸvӦJ] K1p~Ny`8~ږvdQrr^#qn!KEgA3lfW<Ƈ|,G QbVĆ:㳅`٨jLy8blQ>sװy˴ٰ;yp Pyjpn)딱r|Hr52TH@ c2c9(ޚz0VE@Nl%T LNĸpՋ3$h6飁40\X#Cҙ!E<-xL[Tw (,TckAhd72|+;u/|>Gwǯ_܌?olLMY(D5FiMh¹X`ô.\3woӦRic'KS%v"سȋՄ4 xh%$z}/OVb*0OO]$- q܅7,< oXݏ_sdT$[Dt fv0`m@KcNL$b9cU*t<9Saw^\aGf5OR5Mv\H br&&ej"޳5OP,hX[W@IZ: $0GLjdhRYnS7FXsy8}q&@ĉH=X*F]Yѭ n=busnf1)v9oWpbREYl0Msa[sQ Ǚj~!͜ 0>;?B׌ t|{vUfV5`i0L==H4Z'rg8'6T8_g4捲lF^I9IAU2RF)z}h8fJseʠMWO:]:JlJC)2pfBhgFzpN1܌ĵkyLhklT,?#]`] 㒐$T)hV$ZgUE$`*!=yŐ'kBN&z^?qП/=-kr=6 ih=#4W a!]]Gl$7Nͽ֋DF2r6dA5!-G΃2$$@iJ^ -c_ FO9AdIR2ڳU;~}gӄyx5pHKl1yN2ő]Ib2h@kL>3 y\X|x-"E4* e/*UTdZSclyFy~Mo5i1(䒰NWsQJO8*:D6iؔ(I#0!3m -ē♉"N/ozr2%"J!^:t^R7 n@(+n9?? y\ \6r\˼ZlwEB]gVGkVY0+΍q~v=21V5%Ҩz8srW3=9`{o!Zjݿ.c^r+v-&ў--09g58GId/d#9nA(k<;J;mAƨ3PHUeu9J)H̖.'KQ:Q4t⁚ fy}47^K$%g`|N.&}-ڰ9 ~<1#6<%jfMYo)9beĪ%E@[촪cFEHSRi;-X]n&P5c͐L\!c0 :_hҟ4.|c괥ܸ2ءa?[w2 Q,QkN#Z`d30Nm1>N쎄TXuJa3w9igs牓'NN]g.d-;N꾮p{K'RTSk4HQ _PdpNq (\V/}"D29>D(NlUTVzB:\pvznE+.>-_5SXr1F6chTְ:Xv(ոq[B|dpE^ a*/ ^Pi9khݳjI@[9s6>zw>9}ᯝ' 304.,BL|F|dCwT:L9\VG݅UU2DjdjL-TV&L(gj+ jdm81i\QUȭfG=F_UkIfW/OiXW(" F|k TGcC2x釺[Bmϸ&f P'tW%|xJҜrt|L)_e}C4&V)rFB#i4|TX@ u 6L|*_H;Nq9;^Zdmv+/}gvfώbʜLY%6fg?tj~' )SGB=qp(̉ym`G')ۃC/iWN$Q IUo?Sxesgev˿7{?Փ;[./yD[RrF!jRX&p0miF.lPpURM`„eڐyxB8TZbE9Ϋa=g#P8c5.7_K(PܹV" &Һ(r LB1M~INl r}`x@:.}B$U?S"><*8cVaXj|vWX W@+K=\roj*էg+O9A';^o^2d(&ʪB%̔VeA`.M '{{:r3aBNJ LBZ,Ňɂ ^Wyb̮v'w.α1f~ bQ؎p릱$&hDÄ:`ut_g^==f_au`,Mo4={d T EBK[ZCK"-xdEhݼ4ECg E㙚@2ovix[[MRh,㆝(cGȈpdKݣ8*][\/$I,d \oZj|w}*)%yӛ7O~O$~9~~G~GЇ>s=<<~/U3 ߋ;w|E/~9ź-񴥂[HRu lj"4¾v!)H$"ȚDxV{a"= >M\zimĮ_ MGjGċxz=3%- G j{\Z۫KE췑ő: UTf1钏cRz(hD-un|ӝ<]X],2p7`\Vfn},z61g!9#LOlO/?w |`˳{j;+ UR㓱d -t ijg#'U40N=8 fZjoȿoo;>h^a3nok%S"2P$huyRVJ9lVVr%3LND'\EZ8=pbnjWY:1^q{,$k|z#ܚB&Ö}2^ι.\$o9ޛ),bH8#xHJxɚ$ +-9u0,!r8BaM\欸}YIP@%^(%Ua-)PVe %np_h.LTlfl2}-/Ӏk&xMZ*C3 %7v[¹.̫$Ç&şU~zY!Պ؏ۿ3<ûn~~^zc /ExyR '> ~'~w]??ίO2~KRk0DI!Mh#%)U xuT6Ko7- V&SI<ȂEO"uKreY\@Sq[ynW@KōV 7}[oC=;E'#/fTR12#tfSܮCl'!:_EW߲+Ϯ{;WY q+_4޻ݦgZ IDAThmBegg0.ގ\^`#fc/3ʹy)lX$G6/|چk+SEj,ؙb</XvﳁJ , ¡c1 #]JEĘZkk$x7]=zn LC(Ís2㽥ԘH#`jsԯRƊQ|{=_ 2lj,c~ Qȥ+(9)sJؘ9 l6s"nJ~7QO'X2m®q#k)Ê;g']mYl2̯7ߢNXfJ☹+7n˞(j:-3/ݧ`{:%M*bCodҝI4, itM3o$Wxj4@%DlcmSIJAԲCrCWۘ^!l&g3Jk31/\ԊO*J9 ׶'4- {n t>XUz u sntR3m90]](7yp2Ӹ->sl-JH*ae`W[%Axf6c"w d)4rqw\8$'$f47?EisW=}˹fӃ06TYX|fNlt0ݷx$`5D)泘,Eh֠Y$%&%D-GP2I*J&JF!y i)6)&f*6Z4Bꓔ#l޲)/sUn熶64?'k;Wi'X䦂D0sPHc}%sDR:h_J瞢࡭9vyӛ+[..._~^{R ˿3<Ë/4M<<~}n#}"kO? OjJYSM%'u)aekts ,kx=8a-^b]%5V Fi4vѦ^0k+xԦqq'''5gsFk&ָI0r<$Oxf$hDv. ?.Q%'}'ؕ#!/TUrH ?V"fk]0%6v*՚&Aߪtt{0QpHjqHVWsY%XzvPu-W@3OSLZ͘XwR\ve`-+/sU0`=,%ZZox<8>,~:GG_0չwbUd-$`_ ͱSqPqDcDi1Q7Zwg]EM '8MuC\BIcУײ:1\k}.u骮n&EJ$ȖCف$b!C#@88 @l$b+("f߻UZs10)JP"I-`Uks|"֜ٔ|g>|>H':'Np;R-VGIbA&x+E`$!|2(K*9S yN/F{HYgeýY&HGZM7UA)1f_.bB]W,|e*G 87&Sʜ)0 Y?YWtߜHtx`%$S3GwmhR"֝#?½7D/Xx8l8-W̺,-KuOo|NyM&+LI$ktH4%v%yHgs.lg8=6Qznl7:[p=dCD3g,NECƐy=1ͷy#n1nQGa-]aF$Dj gY? b%_maQP6(L &VU BtDYNiƠTBVAGд WTI^@*=9|K­6;pw|o#{pc I_xiVq ANӨia2hEVNR]r26'ljPCx2㵷FUW~W8muW׫ߴ\?O{zٿjԕHib+LmFu|h2fULb(*kT"1w ]klsJĺ[,[ d(i 4GJa[L!D\F5C26K%tBer )N`Ș!˨'rb/Hp۹Oh' :]_茊^f!(M _rzd4LoT*2*Y*Z!r4tyF hdA:=ϘֹqOp*%fCqV\:*1$\l+3}NN&Ac㯜#rY?Y8בw5N={yZ![Ɨ5LԆfLoyn'gm}CeK m5a.Vx&FR8ԕyQm0<"I+Mbd|#-ōyp-,ԵGV[FxR7nOϊ׆gZÊ66X;If5pN-hV|>7E<Wy3\x3,h|STΑKO 7'-q7}@9~%2_~Z ?՝Y-\Ez&*`R9fg۔788oytfNuKfn+i {0PLRliF`~g|`!hF]+5\]ϿEJ keB:Z&)ijXCNRiiޛ(%l1k1tYp}kD$ GSH{GI_v'+>~|_co?\]]|[o@P, ??ϯ!8YrzSTo*&/&ᛉX3}kuI%|3qs ^s)T$at_R0y"[ThU& ]$6a֕+1Ahdgn+˜xwo,_7['POA{ޢز/}L:*LXnу/pK78#{7VYm K dNE͐qS'TZ?D8[г _,XbNP)gR*au"eYhDy*Y BQc=:BN-%!yt&OݎgИGΣS1 ^:Nϭ\&6b噚@g2ቺNeE5V`,@y7teԄuFv2XSx Cw!;Ix(нz.?&tܙsZN|: uJGQ\ *n9C .4 hRK>hqntTϸEߢ#mtmj^ #7?:@ )b|m4k㛄U$SFI!|-Vbؑ qDL"r@<)&^\3 羆׭+c;| RURR5D"LT#|~Yt?pmNݢ,77o)ZXhw=手¾N֨]4G f8ya튨p< `Td\!䈪YktJ͹Bᨱz1eLF'Ҝܜ챁!)JR˵')Phdg-${pbzhR6l,>?=tr3te^ ::9ZCh*|]ǫ5bKGJ l1yuJ:9Hg>i`L: k$QNExmMLGj_XձM'La6/ c~OhSj*SA)F9  j|W-+M^ف`)J}vYṵِljm[kCu$'eo;_0_vU->UZHZ1q̦KPY%8FQ\`; zDYi)|HL@[pzr% }U{'-}Jڹ,2C/ĢƋx{a4&'9hB%pፃ* ' yvwo? 9Lis 6>Ƥn)sV9tBlwW޷ITxFYF-3hbkD{"UpȒet;u+[rh1f'2M®('{%Ik@)X"]ˣDQ&=mP`5RDȉx<>;`]jg&;XmUwZ{+z]<͈=3"mxn"'چed/ܽzbd 9XIII6ұ[ULΎ^UjUQ 7(ԇW<=6z\ϸ}kó 3q x"NkpUѐs#5aPK& .'LÑ&7@O0?o:~;pj] 6MSܺu& ѳԍ]ǥRdtxY"<>N֢X2VciP4$,$eH%ffHʀMV}Q%C*44pb( epvH/sb8%FHkLjcyZ{>-H%Зq86COQ{#/; WD'gV\xeMefOPYe|K{EJ;46t"t.x$Iꤔ8#7+6s\ 'n c1Y1:  >l JFHv*ʌ W0+6> lj@ n޺ϱ_14J)qzv4MvI\&uԃ*]," j6IG#}I# Uq@{=7(]T$(5-En6-i-L:l]2Hy5ʈB!b㔋hP:n! M3)D,j2-aFM@=rcb{V2gz5jhR5`hos/7)l AHFҿ?e"Ty[F?zVnk1ZpQ>9}'sm$X;h6sL3SB FkyxI<)+Դ TjP+3 @k#t`w ^9OJ{z 2ZhnWl+Ͽ {x?SdEId?:eԽsGN)klwCIVXʈj#wA6FOTWwԣ<^*G"Sh^ = |M'Usoz`k+ICڔŭL[wD*Sr D>Yxp6 wByïDZ+b4wp-W<%uZU*K&ˊJpk (S蝛N#|S6;\$f.YWҰI{X^6J犚b 8*BU?k$g^-C=_B~h)N؝zz[r~t~JKLAiYӄJ/ 6^X'8,:3 8R%B)i+k6N$PVO$-VfX 5sln !X)`1hʘ5T5"Hqböc. +I[Ղ\x{ew|zHt;ڶAۣr ">#*<8ޝf,[r*lR:9gJ+k@ H *SJG_=Ɇ^Sý" GCV$h$D s 2)n Y=/M$ M{xN XQ-LNÿՍw7oSxYQ.]v)AO;쟿`3eH-L;nmf㧼xr\)ft,T5Fy9ypჳ@'t7Vq%k bSUdݎa)F:FOH#g_´LΕɎ) K{_lfdžhʣ=" $ 3lhB|KUOf̸nIIc ` -H iV:N&{#Id jYn Aħ<]oy !ɩyf}<@mN /hFd6')L1![G`B: !0'I=JoB&!6z"npG*DvA Ns~/gߠJ @'KHOR[2sE17pV.ЦȍA|Je;Q9Jfџ =|`37H 7k:"9d0G)`0+A@Tf:2Fu[ 6} DK;80zt\s/'|m̯M9;qc>4# G\>zL~BڧHL%S 8;mSR|޻ExHY#5kX/Cjt-tu܏Ohl)ԕ˧;ENT4cQw_o_7CnF\;nOv s>]I{'Ov'ܿq|9sH`v!Ot W F rP-eTy9r3y`5wxi73\QHX o"dE$pL$xRɷ ̰>KT:| nGx^]W(?Bш [6c]/DxhɈnu )(FZ#\񌪀0Y}01,SLx/3jLi"XQ;%* A]H&FS'gǙPsU2~^*jn"~!Q~XlL3Ъӹ!dJ2);LQ{?~uR`IJ&Ȉw* ѵ:CN톻*gZ味햭ؔ6+yl;؆**d"XZeWJx=zc¹T"W%[޼9t,Hn8*k "mRgKuA!fԂEH檯ڰ_]L~Gg~Fh$!i!I"傦 KKA3 X،2ogJGW*SO?~o?:+-QHwiA5AO4.}[<+͔ ڂɳL,"IϜ5TYq dAj؈}c>=g[&I9GB*7~~ <Xڞ~>BDZ9c"ͤ$de 6k5Ϋ`QT%d*6xu~M!_ ppPbPO0| sz%)XڦrFM$*Vג嶤R:#ie$ʄun!U4\\C鍐GF=Dll 뤆mPS B>pi0hNeJ$ =uȐlMn+oPLdFߎgr4(+ D*96+ x Ӊw 5~c9o};VKjun~dGMv w7 StU49΂!6;+\bc"r(Cx~"ADbqyPT2?׻5&́VV27':~aEjYRwEkgܨrthOIQ*5:Pݹ Ӆۏ`9;NCa`+um[XO3BL9C x/!F ;mh6O`-*{Wpy}Q0uF+F$#a{G?}^ndV{*hR&Q(+t,-#g #gan#*`樇G.F݃jlݸ6wWfU6ӵn!R'I#\/Uɤ6phHؕG*OD:G9u0Asgi.\6xkG. @9}iX6ȆJ ."$GrΝKj$q *[ts L?1r=zy4.ĚB2z 2DD7癛Oz5LD%BSv{a-@q޶LjT<`1.jtTCT,l2AydF}"lȟWyc~-vr?^ZǕ:B?aBf)%r.hHQ IDAT BjlcO>ʶ-k.Mۋ@RWDm!W%q^`}7-E13G8cL7&Z˷6[|)) $'+EOܱMSp1 by9ch[o tl]FG85_BKeKt|p.i5PqYw\NQ&'JۍNRh,!T't#φTۚ* z/첑j͊njVsR0m4j@BQJr9lY :)!#KYx%LlX`^h ϽeelIQ4\ Y! k!Kc"$Q2Zʆ˳o zm/$C i+ fBx%E=mj=豨c9R#hxwLJNn܀U!J ϊL,tM2*Z=2 Nj&A4 @VWbܰ9,/}O#5w݂C \[INt3SZRJ($u\ [?⢔?|wyuJ)*O=Cٝ+2y|@GJvSGGtT9*Vp1KYvUu${P3yÙegOZ[ԄI {Tv$y}ʉ#Z8,pv@ȞwI7tdT]qLWtUb#$`Lv+j5v/=ɍ0vI0!PX`cVSxJm,3{+Q3&0O4.UXS {,7㎞܅ʹtē)F/? SbגH=(dqTtĈOvzwZ5Z)<7OB9fD; `/89 !ΎYz/#vWiа1MV̂?^9;;c&Db #"gzZQUkvՊ1)S ,? 13vݗt[ucXU^If}xg *.Z# &t9_?z?6?nel_lg;F_NB]SɵO $#^lLb- B!"91MA{rU3fNġ Z qtr "9 C-FAռ%d$}u$Dɭ @GPw:ļKaNtiI"7A-MҙZ̭rBf , <\zr>bcϼ|s?Gk>O|eYof~aܝ_G>j5M?C;]gPx%Y2]#Г,L.`BK) NZP"Eaag{ѹC6 c`ttQB.!ۛyʰ:XTǩJDh"~/ң.sF}` #D?1Tn5:it}pq=x@7fV3]e5K<37Q4 Ŕc7K| ɵyaTPE9fæ+E9$yF'&M}: -Tu#LւI'JJhRLH%M,\R=Eaߖ7 sD,#(>YZ%pro8w-<.=,BepRAEiR(3PHEHY0@a]W;{[.#}gɫ\J$6-=ŮL9̒(dc=rXx 8ͦ( C|wsHu\@En);+9({1pro@Dl-2+l*R"+m imP" -E?ޠR&`u&Adm?;8:E`0M=5Ͻa8hCkB]ϙ"3ʂ6 #4 3{-edp"&$lf5dAMghOdv/~yOnΗӱܺy׽o?n\{y׻_ 3Moz7s տ<я~{{B [䜿hd4M?//|a{>~={ڇ?jn"<3o6T_:?'Uo}۷K=y{kI)3 o#|#Ỿ;I)?lq}ƻGC\<F4m0% ᜪ%D&M`ӧtd y͑=[΀ȈVLe J +lJ8ɏbf%6$ i2'tV`w^e;eosn4D4H.XEPLiXfv-}16Fd}pFD'  oC%?637?v-K_ܝixᇸz*Lr%~|ۜ "<ЃQܸg?Yb<9<8y׏(|+x_񒗼8߳㧯ަx!'v!EYHc-qPtpIA$S nYw7!X)1F {gׇ{tEsLhTYɇxTА%#"b  h}D?GGuaXI7%k5 *GaݨD'N.f_ڠŨ=03*كb,ParcN1:Q%6q=.h$,nUNahBDzp$S-xOēOp萜3wy'+//qttnkk#>4EoƷޟzy}7Mم}_kq/xm|,;{{{<_=O׽\vۧ<qO?4ȥKug_u]Fəy9/m}3|^E74GX X.FgcŬW-t:|48x} VCKJ2h @]!6ψux-PLn<}qvPD R]E0 jәDAaYKi MKBaRi7\3 USS߳?Kp\}͕CnP9󌮹4+G)sā4bYCHtcIzZe ,h"lUBhe+NՆFNѹ[DM$1z]s 1:  Tm50`hc}AFTkcdnGB7g@h+،=M[J=:f:^Q/\f03;gEdaDP]NJSr{$pzbv({RG9p|YwHz1ǀd$'bMR@ ϋuĄHU<ƣ_>F1o߱ѧ8j/r0#)FAB#Cm#ζV%gL2]-Kmq'pH%4I% ҳW*))_3&̟}Dz4V{reqF]#ά{tv}5D&Yc&DYBid}N}Pj;~=D<>,#3׹;QUܝ;] 5swy<ϔs/_{ʕ+޹>su.{8ptx^2N5>` ?+^rx ^0˗rJq=?tvӟurr|C>r9eχ^R8XPNGJ$] ]BI5.> &_ڀS%&wwv$FPZDNz.N<"EbLD8c̍.Ix'8eM d<ȉKaXWJzh.TQYx z D! ;mLGjb=w;v˂p~jOq/DïhS9g~ϥx`l_}Ͻ{//z>^y:/?/! ZK)<5/|{K~yalk?_R4(eD.ǂht6uE PAXPqjG"?Gmfd-d-@N4SLBB )FD5/] F^7tHjzpw'3H5CcI>:LI9wcepgYO{E8M l;jvYRf܅ɹMV39DGW+b=IUB7Y2cXY-5y]5ܑXDaYQKb)!RQ~FDjk 5,PCD%)bBq0B;+bffA%vmk.>HD1Ѥ3[JaMIЧF ]~z=S]r̙z' #`hkQYfu(&$p;o!vm#Q;ݞHB], I mpshKDYNnI9sk@ )J<:6BcTWUn혖-Gx. "I a-3`XesRU!kD=.x sY3idyLjŌ {U{ v{W^V>iSBtYgm› j>txb d D)cpe&REB˖. (;45#G6q豚ӏ|=L'>{5R ${h::kV!NWb9B[X]P3LBid,fLFAT![i!O!k\z5"-<Ȋ!}E :]" zá@?hl>h ՙ&x h!/1(I3W7'ᷧw\z}Ӝn?tI,|N\*k]`핛픓Yh.t !iU, YNJn˒wd\ڌU4&wiD,BoN1P::RЩϧǬѠvZk>K{c?GkJ$F*M,F{C2 R1p9lDNKMY~s&0tQL=g0[[!1J=Ct#NDCx;r ]TՅ$.]htcTtwz #Ü3i:`ZmwFWSvR8::~?Bb`ODtZRBW#Fq`7sVgҀ9MJMBzہ8uTrfzd:-JuKtDI~m4J*cQ64ggGUCLph^;A HݐVH d4aKkt1 }7T52O!(xC['EUBN E%4e<<ZMº}n˽{oS_1^l!iSztZ(S 2[KIa KF6py >Q59T21$d]ԥ5^FI:`+;DSh2~zh{ϒd%eR%tӀMĒ+z[BsgRUn/I=qs[8yW4ۍ""$ͰPCDL8yBӀ1ԙHa\Sl2a &jF)ҽ!)N’I1䮉<~'}-צcb'JrZ6-Aljp }l6x#$eMHd\W#4tM1kc"'[/BS -Eށܜ2hζm~Ǵ}Aм`K%ibawSCJ%&ݶ[J<~?fXԭD)t(9\vTT&r2#'IE@$m*%kjhC`,QtZ$[*ҕRL0xLB, ePq5z1`i ['ERCvng$n:4܇2.#[ F84N0]ZMpk$S,I HTcC(^5k$nI9I*]K)䘖XFAQlJݪs6J x]ur@2tn.TK!=-TIyf^cBYMxJk~4)o g ?睚JIGUL lNDYO-=UIfs81^Xq4DV$Tk#3m,uX3dwWH.m:X-Epn0UzT'/>)uwєƘ"z !S\ їPT'ܸRQnMl8c 7Dmvoa;y1MǩCsJVc-:JF9ރ 7蘚,bilZ&MuiŕCW9+h^n@Ќun)m[cmAuGJ|G/$utU|D;xv{z5Cp1%Ec h"VX쿜gE8EO@b>%K"!|Vi ӠuF+sz4%nAV t\B])#-\Yp3fE=GL"%A*\}`ݖ8]E y7|YR9aA u: G*, {J]C-yBIz>Bg`ÿMw,LY-$Q4E"{CřzCPܙ͈TCTZrqٝܕCu։Xmbt#IF6Gq^)"mB.150/V1E -mNzDۢ4'`4ȩ$编־ĆuzrĆ#YHɫ]=Crv#b@KTYRS<w(I#4 g%tBt-= V@$t+ nش'QZ{yj-cIc<( o:G/4qQJ׉z苄tUbk-U:KΜ&^qe{UؘOl!c3refhmA3g*[D *tɡ8tu|ذyK_ޭ-;zZks>.Զ$Nb p*\ @(B . .0A9HNle|ki1[k\>W ;;\%kH[%0뭿}רa1u+9ill2lDrT0]}Ժi}'gVj+ ɽdv_ujm¬OnI"ԃIj 0+T>DZ[HQ~R9qTMRi4k!)ƎE IuhdiW/,vVtCɦ$Τb<5ݬTgEK5S ]myO##=3ʏ/~_7)LIH:[]96G2y&<҄o0?#Yì*\\<wfcuLfN$pLFV 2V Mp:VUˌ)BRyWTҮmxsLD{)@1#ezk]ňزVYsVjFԿy pNvZnr`VpOeZ IBk]^g")kgjT ]ɲ8 N6c_ 0U$ʆH[J<$@ڇ"p*(l<&q}CvZ;UFWb8`P&-g$ ܰl+"^ZԃI.rJeJdGeTb$ٱ 4T;nEǎv>Ky0?? fE`Jr_r[ .oY YzypFFJ\Itt&5tXu%x~ZC]В3Y&`29W/tcPBe_@rTrhQʐl. %s&Pgle:. 3G 1RQ&\?IV7jWG=˛a YkRd6T dr$= BQru%! G4+Yd20ۙv43.C%ΧOw^8G;ow{^88[ckV팊nh}]ާDEe(ߕ1 hWM Z2Ϭ$P=Tf6 aa1G O偶էg5E(mVr j^u(AHWB'ͤ fDT$A*LN{` 'l?Z;f11k⭨W{/rqGjMxV/dz) H Euh5jUn夆rdm"V*廙ou|.;-o}s. WM|_Gu-dM\|TNϺUE\ u&.{ mjB/->O25OqUjDqE|2$DlQYa8PfWӯ#_bo=g/9W?m^.d'GV!I1iԂCnÂg>8|1x|z;ƑMQBͩ(L Tvtd\KQCĜU(;5c$MMϺ;iy"bx0}ٵf;U_WF$<4 H4cRH2q݌Ǻ]ku']m l~Cn OH :@Sv0 >n+_zVœNZ{8aZ9cɾmt|\ igDLV=2Y5 TҨbE hZǙqAߘm$tPޝ]xzn} VL#D!UYrdgkR4&O#9Mz`Ѥa%8- 7‰qY[I41ơU钂^qU.Zu,Dmqtep]eWjy7Ej}B+L3vagӪUTvl}-T/r V7R@.U-8J&cTԨJI7$ZUmJn“qpk9NwA_5HJ-HHR&q! \ $%FuR]EGQB*FέLq- Ze|P]R Z)׆Ǥ7]ex*T󍲟;j!Z1M놭9ܫNƗ-r8h++-0Q嗤RV7 ]QINJI#*j(On.ujb^fv ZCHZI(].7ϕz,$fugI1&#&+)lUx qj007N2J'ͽ{OnhHivA]EJ Qh &Zyq=j.Ut~K*\!@3d>lgR&S^q w4.;Fڧw{~o7~݈^O|ɟ7^_&Ir©/)SAKo+2LD-ðҖiWW2W5Z=;!OS-MD(^=SepY jGAê\C CkYIbz7"T)qA):edL9w$חoޟ?pF( _ Ž A& IDATԪ-]!̍V+E)lh/UJ Cj}X79+jNm:2Tl\f]H bKѨؤ1(^NJyUxG9r&VнؤWܼ:Uz!!cҝ@hYo:0j꩒֞Q=>)fw׿)d\hL)Q~QJ%'Λqwqk@j˙88DtF5KRF`0b"kA8[5Z'hR@q諱\>d_nV",E($ojGm'S1,RvӼ|-~2~O.hdMŧVE j9fV_PJ A/|kURPϥߓ1LfKf;M[F"Ru q *A=UK_%K_E 5"o:??'~~v'1)XsFlV2F}%>:K9N$t2lf4:U2(` IN45y`SޡAF#|)Jb݈˚e>j.9N.ogB_Y,3YIH[k5.EIeL 3L!Fk||/?"?jv[a#.Ab=$ FD`:EQ2Hz3 b\ox]SL]++'sVB)Ft]1+'0Ot tJ(9 MQ يu$l5vNt49D[\T>pzf+b_%DFCxoG8GB0֣wa+U&BY s`(gby PjIn>ɜ(R:t*Ep<䘃=:xvG`Ǧܩstx #7)zOb۠mU`(>8ѬB1IC5\˅μbUx&HUxc  <\Xw,?R.cuRv"V:]dMaD!3Z YY" {5*_gԟb[dy>Kw3~dv>>awr{jT mD&eҫ[x)9!Jq5c*B2 gL$Z>^"Rֱm'[ue5kIt5¹uz+|Zu!xtJRz$hSkUս6>\Y[MAX:!)xuU]03HN}w|kW>{ۯb7erqθ8J%U~'hK5y^d.VjcL_}\&謞.4k&"mZ#.uLϦ%_w3'i!1il' 543~e(Ck;WРz\o3U:}C*/I )1ҋ990.PMLx iX5(`hVJ,vJ_:q'M趰ִNj8vB<͘ӥD!o}>?>?_e??z}Ép\CKD[Lo;d?I? v[ | RލCQCE lźwt5Ӈ&ppc;#*Z[l<*rZuؘi  22"xŰER,dZEjY :P7e #"hnS.Lw:B,vd?qI޻N|w3 5a4\ƖJ0V7atΒ11Lu4A3~ZtI+͔7nΞY+ Ƽ7Yfb޲:2Gu)38I1Z+׃?JOEՋm쪒<3K[ˠY_^f?BԹ)䷬u(r։{7#k (H7)X5#֓GOx%Ǭ/u=ȨXз-JqQޯ̼8ʙ`qЬ>b#;R/XØ3IK#lZi# ]ٹ]v+W!,ZΟhrr/N!|}ٹ-ȲHzVWy&Q*KVl<, +Ze 6j&,ՓM4ӏ%"1) *@!0Vɠ<>vr~ү&[x׿?:T>ϟ/__,sWwz7IkP}z?Ϥ*?i~ yTBؒP&hcbRM ;1Fg(G|C}RFӤUsWeXQ$nNX,#I=3kRZf) !G16F/YH-\E˃XXdYQQ9M1a0rs6$6ހ\آ/Ѿ`9>Fpyc_++MKSq24 b2$8T*EOՇ38.^t,¬g 8qZ*7T͛w>S=eE8$,0ꐊ*ݘR*g}Z^k | 9/uH5Jb25ڐ4R,F ^PeQkhnowcgF5w ZL) v=6[JN3eD%Yܙ54FAZڐize+FgTE&Yk(O =B!ZYET쥎J Ǔ@\Hkq󈷴. #/L-IH:=jLw 'D7़ҭ*Uvʋ*#͖[0{E$jkfĺ+']v2d2VOX*YL|"Q |*JFZa5oW:#U?2 wf~!~z!™k`^1##8.+Sr?[oz>} /|g<5"s#NzgV$pI1@,*y<.4k\JB8YrՕsBw #I6T. &Vp\TXLYkM=fx2KRpuy\WA:zdާ5hK400JVcY+^Ո;vx_O_^3^% X,J~].<`=$J{RI_ӏom B^Td *u4īoj˪ VisXuNwYxc=B-LI &ʔV0R@$փrݎT C(^2ڦx\ly2ldJ)!ԑM7T*pd_F S6xys+ϾcqD02R~NjMnܷʅjY-S^Y% XA\BxC]. qd^~t[~?׋W%P_ 88 95@I/Zű7 D240{ϤKjmuT%"4r2Q_'` )Z^1n\p&(G;1Y&U"%JW|ZkY\ت\MW.*XhHkIcrT٩2ڵj@RQ Ȃ鑄b,T.cJY6h33 _}͟n|P |swϿo;|޿ϳ^Z3EZkOO|'\kFQ+#`)'1OjjRR,⨨Q5n.в&`Cؒilh6궯V֐=޼ȦEE5瘓ȠhV8DI3\XYkQ$r+FMuUQCF51 LR$q'yGJlIuZ^٫(4cJLth-F"3*M&Q5ď_;bN׼qMmIkIE-題̞8YFǜI"QKo9G:~|ҺH薴}8Wm9ȕʵ֠L\;?+pP$#&o-p+]tRmŢޥHM.Ly%5!4ߦUW&s;j//nЕdD9PZ(WnVÈDQ7J%Czyb\9o/W+*0}gdtIBs\z ?~Qu!D8"p Ӄ ZkMΌl/؈u ];r޽dVkxVi*m]hibr`FWXy݈Vk6etbG°V*mQ 5DllJ&"PFZ S5 7y^hҙSHywZpasjGUyr0p N'Bvcr0Z"6tP3l3# _<)-9P[u(Q_>D6E1dzV P%Vst<*ur\Sj, 3!+s)E/Xy42L#=e&/I>}wˑeuUgjR+[ '$nR7\AEB`Bٷ3 +i[S\</"e25&o3Iy)T m!Hf3[2a#Dxq"d\hXW5XWEOJ4MJ! DD}! ^剢UhH ]9exϱk<-9=OٌA'r0D(HTOYxWzM3bHtdzV9688|qezh}Ϲ`)[>"69#iWurhsL'8Ɂ[J} q5$6|{sP2OjX* @3eY>;=} m)W $wTbR)eN/ZiM<jQw2DʴI :Cr \QK^|1LVzVDZ)+ygt.4.Rnŭ(Va|Anr܅g7щLHl 2IuN4 ^Ą0j'"8H=,^fn[Ql"] yhg3=1= W!};ª f0B%aHqg%![* sZ@ Rd*4D(,;3y7a84DVk9dXw^߹o!IҧV4WLڐX2xý3#Y_q>ݲ[A< A@Hu]L264`e]dA3r1V)UA:LkJ`ֈ0{ AɩL gb4Nh*UgekaL Wҍ1kT s{3y/ikr{fh^.-Wk1h>+u Fgh+UZQ=|Y[ .u{ќ  m@RМ7Gk &C'`Y]!r' ٹRfŎ鹾efm.c1畓sl8kQbɁk$huR~rEڿPK+}2'G%"%)s"(\ӹdǸ9zQJi\ɈPtzoKM2Χ!wJ+P84J:&ep ;Hwyq IDATW/WC7yS㝷knՇKNS`ޅwoϼZ%]μ޻톛~fNAII pWmkO|}#Z9_B.CqwV#UX5heʐ,H 6fP2 #9\w|z|GD9wef/?3g=*zOt%ݶmߑoiٰt" V+) z(DLO*QIU'K;FȞ`8jZ j- (,\Ԇ:姹b^zjQ i׻~z፷{Z%XkgDZ)۷NbV-ڋScHcZқ/UCUɽ0J}i&tm ~&4ʸܲ8lDe[&=H^ sL"e wWQg2pڊWӷSGо\\ʨ!J rؔyJCb1уk_| ??]W*>V ݿgO~Ͼ}.m?s~8~'sEiNX$ we+P!~ ^JbUK&XS+iTU^+V>/(qN:xN0L*@MiM(*2Jגb$//㓏NܟJqsU^Z̬K^X+˜9QdUyVOs .iëΫu,5kDtL62fAW2zSQ-\9Q u:xɗrk裏 "o~K)mm7s[R~OJxQ4TX90,Tɬ+?f%\lmm"Ftd8+7Ih.QP4̣F-kk.G-/pVLYr'<Ë=YP KQZsVY9aM*I,<=sޕ>|J;m\Opr|f'a8*r=& 297_˿k|umld\welFaZ"5u*sU%0ZI:i찲2|{pd/O;W4*O .7y"qnC1~ȋ/?KԸ;hKl9V7Vrc{$)wJ9e 4K" )xz,|F%|I<0N%1"kYSjjGָnmQTΌl׽OYc8~\6rb˅ 1weIv fP*%8r#܆K 4 F RG'~TPɸ ,b(͈XYjKiA+.=Q#"t/t$uxչ-R[LWZW21 X ѴW(dRYbXH/UBA3^??xx$yT֐$49㟌L[nJt+} VHk:3L^"dAJsSV˙+SLBhO/~|=VoȼrZ=O+\P",Bo[9p{"yϟ@^խp_-]ʿ*]_VYEȎ6!4";*&4-².U/.bC#섗=9k.̓15p?T jɔRVxdٞyD×x@ F?O[fOmiR\&ɓoRnˑtik4W#;l)&/%4[tQHV8,hY%7?BgAUӊ:IEg;!L8|Ck\~˺kpç'oywt+׷+MS\w] a(3eiݣקF;7ƒ(MN1*.j"+MoQjуqљ\ *bMz1XD%I֥MVfDgYTh]4T*)~,EMiFJ.=&+BJ *$V6WgELjMn5-fȨTgv%pl+B&O),l9 CNFgH0rOTQ7kcQeT=ͫ`n}}щS_y5F<n_%+Ȭέґi$NUjYP W1Dk)uH%ZV1ثؖ{Jogfa:fC۬D)Em}:rѴF-6b5ՍnR{'!1lޟ%n.\5Ui `%5d+b5P٘.%ܠU!3+HVY 33VkfmSHI\}]B`=g|?|ܹ04'5i;+M4 k'|[FѢE %_}m&뇟rgުr/P^7ꆂFiz*S+n_ȇLyJO~cAhl *ul:6 OsRҸ-XSZuDizE+ ~_?)V  5U\lr%t'&GGQ,eج (S7DP piHtL+x<&ڨӋ +J0 ,.2'G) t9J[JY.&1vʌ:b4k>s@GG55T; g։ yC|ŏ8hNJU:/e#FWGY/L/cӰj3Mwn"H19o?x<go~RNOѸ$IK7+ct|ֈ`azR˪-YH-w.kw`{O Eˊ,?49!ZY\]=%K3EScBPLSEMVRd'N|piAlWl3o k<Гgo +/R! [7Yx@ο_;+T`dQ3D!8H>j92NEp_" 6KF㮥 4Jm1 t9Q5}O7jޯgԬ|B3AoI5l[kdےi S2U8 =ߣNUű0E ]*4S!ib,ݍ3F.lMHbLsQW6Fs|e2reE(TOQ"X5Ɠ~_lHs:JCv .o\6"ނ&Gp+ez@]Ɂ2L瑨##l[7V IwጳcWQ>|{0W+3W"E b" (ҙ(0G}CީmUFy ūނf=N,t%@ЭM9oMٷakʶ:5}O%LlISE&T6m%/-̂E&(ji6cTnĨaL+ b/= 'H3"M7(pVs`PT2d/{YlVQID!#fƏ.[!TW7ҙb?=q;'xՍgo?k!-ֱָDZdS>{s_?g{1pQ&\儷yggH8@.W7raܲ#e`uG*>,'¥|˲djL gBbd5l0ʠ;A;idnTyޯg?-{eH'dC[G{cvߍIFn715:4UWH\\kH!L"xU9E`f2T4e]wqYqd2(d1H1Z!UM{Yg3po3J~Фa-xؘͥHo=CT'L:3EA2#hx6\]Xt äFE?UEFB hd(g)ʹDž'n|s:|;?PHa յɠdcr;crh+RHY#+bmukcϋ7Jtz;aᤵ ѷCΩm76[SM9t"E١RpL Cga ,Wz -oy7_fgl?/ >@rNz-0^%^WwG"VȀGids.Y\g)Ycb-[G/pLnοG}QyOx~b/y΋۝)/vmΩ 0llLBL'؉ܝgOR#G"+MB4rjW2'N,SNy%ͬy($ 'dѬFU4~l*7 d&PY9JP_Tdz l z}&mN3@s,-Cj#Xԥ-إndRj"C!,j4!@PWoiAX%Qyu!:vݹg O0u˻q3NTwf'%1 P렑 Bx$OoRs@u7A} q;&*%{W4N2h["ᨖb(Tq)D .>`Q"TM?9pre@; ܈n:;*Y7ݬN ѰhGc&U8CYUKK*C+]F9N} hOݢh N7' n¾u Q+%Wf˕H]EвCJ V@C̟=1rW/}~p=5%wYNe8,Tӆd0,{yǂTVn+j;(!$G:c{J7B6 iygl|||pg+|h2pJR gv6u37g=r ťV`*+Q7Eѐ@l潄*̘4^1Wޝ-x/WG&zr(+Q'fޤJfE[׌<v*ceԼ_TyKI`bL6ri ķn~l̨rCT)JjE ƁV7bXfڕГYdo+;'EH/.jg3*PO,JxTŚ1) I hR+45rO< ԶjvĄ;SIWO}?y^K;ɞxq׍ >Ҋ#Gb8>h!H{> IDAT״NxP~ ??ospy>0;{n|?Ōʙ%x=|WSAbq%AE9HJ85JMbL̬BWc> O'~FX.mA+ w_m9(~KR@Z%\;DžѨPi6>~.JJgQZ>)U(VAtRW*VX,G?V[dT.x-I@'4#_."$w-+~c.fNF^yhNRftAqӕsSzXˢ,[r;ضfքט+E7;{|xyk_'B3BZ KfVl'фI>7Oe˕JE͞cD٤^B*$(bqq+ 6"~gd*<m J0Sy`:+b,5Åq}l:qy\18lGrE(h]'̷N<ͨ Mw"DȻN4e&t'P-:P/'XBTHVʹ葦5-OY^Q1Q9g9` $bUuDs%9Ჿ?ޯg? zu<&dnpTp(#R 6^^ӚQT<'p*ѫVO7C,h8cmr=rf< Sb}?:L\S+M;kL%!05Y7+p༵Ӭn:ulf6:vc+Nd49YGtU[&t}_9OR܎M (nMБ,v7~8[^_޼xse}#ʯ"&2%-@2Q}N W" "#Ju_ZI- "-9GiPrv5N]ŤѭB*[a{ғl zK+?Oqf7?AMSk5qm x; 9ۅk>cGec'M!K$:V^fV bYfi+يUB$;Zaf&Y順 [(h+\\eҪ4@W4]=Ɩ@bUb}|<4a6~ř@l gd"DQ-PU,&*E\v,4T 4w4,QF3f0Ah RÊ:j< RիS~_R&i}uG3h歙3!Dm4KRl%!vX`b M$ҍT"cͤuVWE=RhWNMFÅ1bxOX +*kе\U~ ' fFJu/ჩ!BafR:ă!uÅ0csz}}Gu8 ~0VA|)X|o vbkțL?'r;E֎QϤJlcuEV,TyXÒ֊L+HVVP`U'3s NsSM `^B(wk m}F1L "i!/zWr7'#sGw'qJoٖUS$I 亀b2D :xR);`VJqQ^=/ 6+D / QŌb@Jv 2Y$c[=3G߽?ޯ*j2oNө\柎"aCd3 HupUfm,AE@ѹd%͕dD(f)˒)lJZ%J+Yoʦ[v:cxc(Hi&:Z&&D#+Ѣ >FNZE,ySzOA%F߸qd͸jxInlB?u땙}Ei#BI(4M'3-PE5hTI鼺*-_V'$O^7oy2d ~NWWMBk)S>Gk-=AbDe,1X^#*ݴb)ɌSWsp>1/봟D[TKzTLZ"ūX"igpa{.礏C\%wN7ί~/ȏh_M-_orW6! 'M]9/y f|KjU;=f,D][4$NY/<{+5>2M=r +VA*P\rX* Vo帔sɲh7-(y5֖<11<'fr~ڜ>I!~~_V@Xߖ8$&eh堈۟;i2M@ӭc"wotEP)t ;ɔkɜ%N ]6p7ٓ11+Y\NӃCïx:˜9ꪝ:~|j+FW0cқjkj$eӶ=tNq&V)6A:Y|`L:{*Uzi1QmPz3Ɖ<5֌&k顤2Μ[?~{͸_ɭ0VBx`V#!\ Y<%) -O('hij"ʁ&*$Q`cjTZћ3aWrڑ{f&>ߞ|@UVW-9x(XTgפ4r6 (\Gڱ%.1p>NJt+,42d{/R ;@fiBp.3sJJ\lڢvU3j:M*1Ƶ9ao\ٴFH SM~_?CQgR$\mur /թP]{I% Qw(N$.n;}}r@1+ SDq]4E^}[H"h=BJCMkƁyxV4Ɋdr=%LR)#u};>|q? dv-ɱq+^ݧ IzSM.psynuS(ƨVpNV=Pw x"w~淹7e2Jۘ\s+K2X=ժ۬VrE$5@ dXѬ%װ46j3Ok6Kܒz}["viihTaۊF{[(Y:u+ W:*Gu'|U?Lh٩>^q A?խ2BuuӤb.·7_{|qKsCcuLJ8EhSR&HGu%٬pY5VruU+a&{ t%o5gkɐT`l5]ɥ[ L{'6fµ)֢҅%:DEd07duiuiQd.Q(Nu2[kY'4cHd^ʱRwXKWfm[} ȄWg/IYB⸞k|aKOP"s￴^|C>ѧ{:Ƭ<(jKT &";`.\NAXAHK(6dmD-HoĜ_# \DD6w/N-ey=BGLJ;E1he%r[Hk``uWt1Z5-KxuS[1Yl|&?o 9E q3t官,%]<ⴔM5 FrmtF/|__'/f΃98@ý3,bpnn%.GLLd%XVdStiW!vz[X"Wȯ[7[c۶IyĊG:h]VC0l&#fѳ}&Wp!gw| 9yF{q3~-p5]l%ݞ;yT*C29{1\ʙ \(Zc%i|1' O^%K/3&+弸. (3?Ӑ`΂U*wUXHVQlZ~zW9z9EAaYѵEh̀W$A6TKn&AuOLĔҡHT HRvhB<Ә>\=麰)L.r;gr2 Fh$DԦY+KztDΠ,$K T9xNJhyޯ)"n ڑؖ+Jʦۑ$51*ǦF=U0j.klsS@yA{2Б@_db#|%ULC]MD:J9 }Ͷ'0[CIW, :1=L,+(;i,}>ꫯ#Ԭf NlR]&v Ǻ t%9=%-l2&Ү,=Q$b,ܻ3d2</m߄ou<9'`:_/5y](I4#g4 fCh& Tc 2UҬ2ąޔa:46)M7Uf-حkAZ] dV " ƜdÝįNFz Bd|-o𧍏_\C<9+w׹@iXFd2"hu

⇃!O7ڕ?Wx oOxXD HX^TJ\9,^*huR [6(f;ɦö͢RһҭcjNzD0%Dj h#8j ~.Y|_|LeӍ9xхq(*9OpTB/̀(<[lEn ,dTb*h%PQ!k|)*JڤYb\]1Q"IYfpikZ/ޠײ,"bsˬ*6[hRl4$5a3mHAmذ)I7|#ƒoFbyУ|{ωboE%%7%f֪RޗTeҿ_]J}zzm9]2K)~([rcR#~VMx)7⬅LىpFa-SǶ]P١J x N)eK1pX^: k[Kv}?O d9tT͉SngOK*wn=1´GNsuiXNEڙ_u7nUsڑT mQȿ(Vtd; 6̭VFgRuc㆑j]3k)Xe: w4EjԞ6j:΂s=`;/}q'>op?I}SƗx_/Vpgpqق2O;.YgQW[_ z^|=w71^7_%7;oܯJT9}]x$kL6{7JZ]a3]2%:(Wiͭe4[Ā1CFcz*c;qui+o\_M\qn#Cƚ/m񺕏9W9s.׎7U4܃1èٿM8{jUcSd"#{!J勗%,uzpt9˚_ I cRty\:ܤzć<)2>AVΐKnX-rS{k0ۤO]4۪¨>!]I1ԚN K&TXa&VO?w%zN'gF%OƱy!P/./wϋ`݃A;}|h?c~ï*̞:__?ׯsr`a*R&k.R/SnŜ>9)mI]j >9L~)h;&ǡ(b bs*D)HփZIJV|WpT^L27NFKҌ5F#r+Aaco.ލJ\kH]mۼj20{҉eN!ɻ'DlX%sN_M}^-yɺy}A;6wk2 4^Ɍ.%uai( v1j?./)] N^/AYSb<1'a{|C dHeSM흙V!)ݸ$2%2rhʶj2Kf2ΖemXurv%k_[T.C>D̃dA, jG\2`{&umTdj4gI?{݌x?m#6Lg$r#1dl >n:zPc4eldx9'(EC3V֜6 ]@),RC̝ay^j k[q ;}h_3i_۴9.ҚtuA.EbM!k<(δ`&ơM]j^ZjMfUQ={ؐF ܽJI\ Ŵ+حޘn4сs1sG 0U߱:V48R5(׵M׳7>=ܣw&Y\.C*u eDB\V܆ȹ'.ѳaVu*uUpP DRqǗi;Vte%J:FnA y*kը16jxQM]0?Ǔ?ĭ1_?_3i'!k ^Pq&Ceo)LLzۣۘ͜!'&8pPLC1omyiV.҉ 1uru6Rerڰso84)p޹@18\F*d*ӭD%JK7J$` #TX}%ۋ$|X|x=;? N>)Ӎ_ 7S?ھ +A"ug ceRKIrf!TMA}gƌ;:.ON}M%zT/.cI^ 7, #WNs3J7E v,o|*O}LK eCz0#!pҐ6. ^^M.m XP /E""y75B'KjތN.wV3+zXq>uP=Z\Yd2Y-Ą/.,ޞ`oOW ;XTM֥CYP=3(Pd]ft/m?$iJ'͠O179ZɌ91 wX(y}z\w̼tNmr)W9~O|/>1wǐՋbbpҖރ< ӴI̔6WF)ڰ ̵(Cѝwv+.>ÁX^יˀ*A>e߆ma'} I#JܦݝU~PAYJEèC ٘-:}TPfr0/Ku !"Qky]@ BI3zdQxM3}2U_`d墣p?~jh/̀YU"4'1a!D^~v6W1qdn30%r|W]bmQm{ ٔ C N34LE'A:aQkI K"$gN15^=ˉnŧ4fO'z= ߩڡOos$`G?牽¸:: =̅3:w.0쉶%p@ζT&l%sJNn4j=.0^[-VKhɬ՟zE;U&9ٸ0t1bG+sm}JS͔\2A!'LE`u@]H `}2x=,Uu7LUZUflԂGB w`1*8Z-0#Y%v;dƈ].x):&rlOVQ;6oUMaƍ8wSnKK>w4r%111j m?Q>G.Ʊx]I'yqOy9jC+>l+|ᛯn Re|g0 `f'F,yjJ/K@jT=^ _,sM"6ϰKW8]Iۼ!Cu*ay䰍3o=fWFcTM˙!p&O.{}'`06<[I~CdM:=.b߾C5ٛX݌9ҺĵntD4 Ď 2Iq7 44*Ed0$K ^w@*mݮ ،F쵐wzpptTn?M+0"nb55n6QM@tE؅BmUiËI؉!J?q:I {H3+kO}.eԺ}Juj/"gWOg6MףIN|P=v.-+|vv]P@5"OA}qu0ҨV/:mhb ^6|ԝc:{rmrzm]s 4wCv1Mhu{y֍Rk.uC.em 61qݸEU;]2(V6-x)E^w k_/yXbeKţ]A+Ծ.EU.o֒1&}? VcN*>졮.1ګ?Kf8+nR8f5=V+TΑJ18 |Zb,)9jOT6Oӵct oF{`bC]b 5{-RSeQ#$:OHT^Sΰq]q+vQlnE׀OZᬓېIA;d.@h)Kq`V2WhXZ:e, Iу׏څ IDATyF܍ӊpmCޣn[&S@͉EsG;0ո]9S7Il}w3.}YF_w3gT1 >9R:g0t#ۅ备OygMz]nI-L(}8JDzRjHvŹ5x]D|aL3 CmYsqmj :7MJBm+o)>(jq%$+=}zئyx]اkn8[0Û¿[1lsĈ~Ľь8XEMt߁s )_|?_ةu R4MW%IHkLh 3rQyXb%ei.3%0㦅]o5˝F#-J22j_VZLHoKnNMXDʜ˵zYNŭ͑'bt?Q3Y+q*)l"VP bCN K-(א3vv_T0uۏ=/9kq5"LAQvgGDnH9w&_,q_O&d+cbc8ݰLpE^' koc)%yb&J\ FZ06R:֌#4^%˴y}^iqR` |n{\VjȖTT@y=PLCzb3hj:mQ^ʵV wcs"ӶP:ޣWV"C/F;_w:qAR*mj>o BoD=CtHƘsH3_^aRbzb.`Q(95)..ۇwqt0)wjv qw+.Z}g))7aڊ˃r 6hy#{;ᎻS9Q3xy?l2N MdVd*nGPv]FRE^06#W)!P|QvҊ}a:Y^P |-_bU=+'"S}%S$.=4wKv6+czhӥNe3iK8}wȨ >V$ +Ap:NqZ9Pfu3LQHFr 5R LJt>6g9N_|y)f۽8ssKNrrR}r®O N⤝ҙ=ŵ[xBT2z.b~kW5NM镅QĝI|-(>{z45YR0HŏD6Y`.,Ԯ^%ng659/R&eF׹8c^[{ M?kG?=xaPqh}̻&BU$6weAm_ !!/> u>wd_GJIbmwi駫 N[ ޮCwNmɪj j|82޾˸˹Ͱ0emPR"ݹF`׹QW-veR!Aq@́qwR* Hs<1S[A$?J Sč[ ѼNs㉲)Kv㐓SK8eDHwdi˰˸.xaUz_ ~pw^YktfqT:\'+|qL(W':6Q H3btrFA@T7qn7v&bcaBpa} je![CLwW6GVez/FҰ;($ˍս?ߊ{$LSQS}( 'R)m9e݁^AK%l{w*螘mC.6 KXj5lt86JR saNU*5,4ԣ*Nu%V Ď:ZFEC̟փ?[N7ۺ X{×X6y[R3EZ3kaQLRHWsg*Ml+v &|e l8,Y/5J]sNp}&!͝f‹Lwrrl*w7<<քu7_v}?a7n&ĒkG]C.ɲȱy~Ni48+5]TRpF .h^֪t|8!PhXbo4,ju+pf-NFuSLW{wRɃ8zI{R5T)ZیJlS%zԝ^iOa\K_|92#cThE^RēѱJkFnƇAZZo|dJon8uʼɸssЖh3BC /{|$@b\e~4V Y ) s1Έg&:ɨ&RT5Q '>,[xTEzjޮ5s*p{ 9nMM<\ݺnLF}c?3C+'TI'O]>=˒AnYYtmV;Fk4B_FqKehaS{1caSv.4n܈T[2Lp R5TDڣk=[Jnt" j*o~/D6('EVXWJ*WK`21`XsSs6QF塨PlSŔa֦ʾYYȥJF4ٮLp`#:u@َqo(< ''Tu2c7^7l]$2>cS$١S{m(P^UgwN T &@HPphUAAv'Ŷu|ZW<[[چ!`0Ī̩:~Z*SJ:A&NRm-K k*a\SH]j(4w tMQ".$J`;*%'&gY!\6&4#v1fV#]@KBj.5i&L8F%Q(rS#eJbb땜Y@aet-gݜ&մFwd1jڡ*d]`T<;b\+ck[ 5T&ݼIBS!po802r*) ֹr2:^IQU+5 \B^j0uAB#è,0X H #+="5$>3b YU2d2L<BTDVZ8h8-#IKn_2U[ZHTQo*]jj6jjiMca-$MBbc 2g&3nD&xp߱ ց*"c8Z|zFSdyyդ=B?&1^%@pDx$ԫ!dCt\`Z^ MlSM3ao;_GA̕c|LGzHzX!琀f]É1^kR RE a_&`be$P![pJd鄌ȈyihbP7ZqˤZb')\[H]T:fc KPm`Mp-?%@gʰ0Yb~3HU2IaH*v02q $u>ǠBhȪ r2D1",-F.jN2ΔVݦ2r 6yd@iur +ⰁJ.-7ˑH)XF@s.\õkxdPOQ k\!q\2ɕ޺(d G$N;j-&G\v͂J+R4xHFK6rZ) G'EqY.) g~!CN2p>1JYd_ Rva&/vKsq1#e X1"2$]c/]53qNBUʂ;t9/wMr3:G1{pJZ]5JWu=.Ϣ;GnRcAR%%I: (QDѢ-=ۨm BlYb΂71:no2P/Azakxi"um*Iyɩ41-'-u\BqF-0!JI:trXY(EDV8."LR .Pt JbO3a–m`4A}ВEjxvڅGuc *PPcSymmVŃCmhmN*`Ă d–1 cx8I u5z P!.)WcNߟ:!mJݕZ]+r{:St)!b J4(2N -AW5(N]tl[UlvP ٹҁ/'c4^"Ρ(+;^Gǥ:t%C8_hBubA M)qTfK-*VxTjQVR81K lĨ(0\c{d WJ %KhtrxA PaS"hڞ"H@j5t=#xn`t}޻ [BE(P'ϑT#fmwTuYBV,dMBE*u*MEcmގkK؞5G bt@fbJlܴ eĢ ?՚'K-]i2U[hhp̂K2ZҺY \JH]CtRDTJK%BQEx3H^B2nj$ |VPRP`C>:-6":A 喌 '"yxK~0a˝΅v˼L`6e==\<4S 7[θ : FrA$GRp0H8v:cނ(GJi>!!9x j!z#صG{X=bu;n aQ>f1&Q4|\icIJ͠:PnPɲ0#U0X5: Pujo(l5:M ,#׈MbmZ>[=REpANWH&^gC |'!MאfmU y t 0&r79)w$k2 w + F4CHEKQphE_1t44RcB;ӐQh#GyLr)sԖ naofȚMRu1 uP+sLo ZԘiSrī^JGjrP%w!frVuH.oc`h4縁v۰J*,9ՕyH52NpE-%5 %Y{heCҖ®P$tc~/BSk f2DC>u9 Jʖ)MIF22j[j` bn)N9t"DdPcm IDAT|ƪtqQ\0E=(v԰͝Pkt'] +SS9JiPE18g) - bW˛dv_O6tB(Pqb|b2՚3mReg=tq>5 Hn*a $`@-HOňMmq ^<, qB]dRatoz!˒"th͈+  +JQ#5\@q vl:3qJ4c6f6Bqu m 2>IjZ@.| ȱ~d#$^+ӮQMƢ,:j3F , ,P *nuuOeN@UZv$̸aOx P$PKdk''yQKq T\*2*VƖ]WC/TQ gQ]--!1T 9 ,:0Ѱ`gVVuc.H,zB*EG͐1+V4L)zlXD4|bVLxZAl ΡHavM0΍ )I cbY##FQcSjd҇,ryDD-!)ꔈ訮Vr-0aeOR$ t5FUlJG);JS$SuAWAZ^=Be9p*Yo#U4cC$ Xm.A3H[7 $db\s1%7fY{:XU@%HlZPAI#XX%we(. a`ÌRhkJ o`V #69:]pA%b%'k49)BeLPL$ԅEkE!ԖqHɢBvc|ffB,d;}EûɽŪhܗuTH ^\QĆh dTVBiƅ' (eUԄ N^ԨسH )]ʌb=VUml)%LT(>6"{$WgaF#FF [-V)CzJ IY\b 6*)#)$T/YhǻЬEI 39@ZpXZ["I‹ 53#y)dWZc_J .?P#>`ǶR(/ؑzJMhu:_a0pRIjt^eY%%o㖌3c#do)"΄>Ԗ)̘00*=5ׂl1 -q FtFIa '#MH,$)xVR2R5܀ΐ*6@{jnJW\ 8V wCG@B1:TI9U :V]mRa)BkkG}RS5% V$FŇB CX : K($R,\PPЉ"N*M+ɤt1 QԈ9|<εeu n 'q3S\IFeAr7k zgHZD10:kU*#4EEZV$ . >EU2V hIk##5ac%.H>سHV0F\67؄ [l)'@6CkSkf؈,a<{Sx^gdKAjO+ Ψ)wlb,S:i ),Rh]]w$o_$+sIC(}'tӒGy |h Ya|WedP<8 /j h 'd22]GYD` ꚱ=܁%̴ۘ!ς2FWHMZB3"-Ȳщb!MJKju qܽDJF-| :9wB*3g9U`O9J qv':T$eHpz습 2gl\$0a EX //fueM)m+hLRA4h}7nY#E%${e&ƨc7XD@(uJZpa2xI#\LS$DG–Q͑X€қ̭NW:Cя'|Κ o}I uj±?'1v(M0pI.8a„ IRĄ G!0a„ &LË́ &L0aTL0a„ &LË́ &L0aTL0a„ f„ &L0a*j&L0a„ f„ &L0a*j&L0a„ SQ3a„ &L05&L0a„ SQ3a„ &L05&L0a„0a„ &L &L0a„0a„ &L &L0aTL0a„ &LË́ &L0aTL0a„ &LË́ &L0aTL0a„ f„ &L0a*j&L0a„ f„ &L0 w΄ &g [(j&L0a„ kؤTL8cdz_뙮=뙸ADV9feC4aahwDU}̮$a*Wͳx͵M9z$̜qtL7i=S jСֿdmm y+\reg6:ħ>>|]*_z{존<̽PVmO ,l̍ÇqۭrGVVػw/DʡC'CVK{G8tzpɥ\pzǣ25OxY26|ySSmgN;Si8ޟOY;|xӯT6s7knԧ]y{xڵ冀ra/B.G9py;=9!׸kʞ >{7 vbeeunǸ 8w?f]Rke}mO|O} aϞ=+eөN¥7"uuם\seX{KGw~8]i>OIxUZx⓮cX,NGbYgOUOjqǧ.<tQ<{\ ż+\D{+8o[:>gg&[xSFﻇK/9cٜl=;wq3_|\b=.}X9z GYUqc~Ν7ӯƃ}g[3U5s/]xEٻ8sr\9WcZ?rQJm6a8n{|]woy {txw1.+83~g 13DݻwwWG6iy.{;vuc{PU=¶ʶ;a;zp'XMUJaYU;q睿|YDRnITl߱='~6;9|0;w|PA|zj1=묮n!:,̌p9Vٱc'ðʏ8zfYM6sX+wCݹmqUW'[YY /DDX[[^*~eq&kd8/Z+?oe/{O"ַE_E}6~Kٵkx) G~7~碋.<3v'{>dq˛lk_?}֎v?Nox#Mȹ{5*xy泞ɓ$xoF^:{Eu2~׆R筟xH){{l߾$U\lll?oO!=JD6w"7mf3>#|=2ȇyoz|XS[X^[׹馛x ^pƮOPtEϑ_H)(}~4[V_7y+{/îvZqv^w_޽{Okq^׸}] 7mwvn|>* ر犋}н#ޙc點__b}}3o8[O+/??gq/Cc`t 9"??l:W ?a+V3|η?"xL;jgz׿a}m[S~T{oN^3=?B?¼7~v.4)6='?}<^s1<]t*ս-wςN82#0l 0Hs+\gNv[{ 9| IDATw48MgQQR"|ҋjr~ڵmVY,qPg VV}SjN=n;cM)=|}_ܹv/99%z;GG?mqu9==t(ڸDK6rWaKs;U _c#"X-M gD~y_gϞ=\z^17:?K/~[W\<7w+^o6ykvqwctj<~Z}bଳ⢋.BD8sǑn(Nd\~ϸ7o俼.KvTuEp=ʿmƯww5"B"%dN'?Hf2fS}tdmqXpWyyR|Ï˹ ˇx?nGiDr&l6je1 \xᅬ̨c={?׷ƿ]O΁LʙYcm~VWkD׻ [e.ldqbfٳ8@}M7qٻ/])}?};39g0p޽l߾Z9~r=Ӥg=رq<5md){?3?˧>)[. QaeB:nԧ8t0۷{?n'?w;moW&~൯ES"DHZCҾ^kEU}X.m۶)[rf۪s& LQ4ާLv?ba|)Hq޽{{b/ˢHN\vڹyk_>n>_upw>y'xbfwkkJ)R };ySv>xIO|17*B|*|;,^__kk5r7^:.9kXPk4Qa1RqTawSp- É K7_l[F*J:vl΅]<ȶm8NZSdz>snfP=j=^|Y]]?z u\^!*S>0[6+e9=2TUjij͗i_? رʙ۷ lomugO|/~;vn'̎s I++z^Ukŝȃ^{A'7"lYgNڨ53ysM)oxǑ׼\'RO_%'sӞ]wO8p}/z!"=я|w띌c][:X[[a^ʯﺓw7|_䜹;7oaMoe55DpdSH;f⋙f3n> +9,\D›hyf@J'=|W{(/{Ku?8xxY|&?S?́xǏ=\u s>IW>ٌ믻s9gMfn۶;vlitܨfk{J)t]G)Uȿ'n?r *ȳ>`.5N÷3*O";|n@eVWqݬoq=[&ѶrٻY/XxXqT-me8RS,_@[%X^O|W}%siף*߿}qϽ/tѬ| Xk}UvE nkQG$ΠԣۆG|ɗ޽{ٿ?w}.edRqSJ7W]Iʙٟ9;G?S⍿|}/_v9?|7|;//ছn`Ϟ= O3^җbX__[nỿcN{//dx/¯J~uʦLeFgRR(3cmm[ous$t<~LW+۶mˮ ē_}ӛ |K^gM5[}o.<@ty[~[9sٟϸ]ş~惪͔fD_ ^=vT={xO[<ml޽ʾ`8pqY__^,%ne=0з}-3pA2/\If/"s/LyÉ$Dcݒ~ ꧣOwg|ɗmTCس|T{p1ΗYm׏+CvŢf.gOxsN)#l/صctZ(j\1BS{mWucε9\]IW=xģ@\m%eTە26&$c?B!ز!nS66#'1 FFB$}Zs}J^KgRY{7k~*_8>'ZnL4{/o}c<[Ыpw>sGJnf|GkϽ/rrhA>{|sM+_tؽ8*f~k}nD+fӞ4ԧZc;?xы13J(Ij*oU,>m`޽}e]w߽-<~Pf-7o>܌Û|TC=RP66vqaJQD}x˿43j/K2D[kG(/<($UÇ/fvZkVǑq*җ!iϥ^g?~w?}>UJ1%̌q K.f<}:} 3/~1CHqܟs͵5W=~5,3OsIҍl~sW\&Տ>9Z/ dN~̟ .~OW6*f6;&{N=[])a`߾}\|t!GĄ^r)/ N^sϬ k<˹Y"~kj8x`ȧvwOQ`jKg(]2(54eՓv,QCH?=N'8s‹,|!vϹ=܋>w%8^>|^_"\u+M>wͣ} y{} K.{Ha8}|__,f~ڦL+DzkkqX.=S8+f,*{}0o_=s6 @ 6S*0 #=r^w~,nZN<[okx3]>u#z׻q(oggyZ+q ^v _~x߿?W]u%wb:Q#"g?soua>~=ާ*Ȍ>#"lll$ 3UW]~[^, _"Q7~M\? ~'^˿+_7,E+^2+|w|IC PL'X_?u߮uk".DiN?'$YH>0k{ャqw=G9p n=ON9}>{Kٟ}s bf nŮEҨBNq,?aACO9 u]^R'uI{|9{Ω5W>sox>~~?3o/ޗw=; /䕯A}.]8}Og8p 6hafJnSJY.L_0 [[[_گ (d}~ ׿VI3gN/$Hj\~"I>tNfsvo?b\{n6P>ڤIixt6vw S:KI'roE?v|f\ڳnӭ~/n/1nut{?\m1g_9޽{1BS?M#,isԧ:TmOVcc?`Ox-߲}-3'>fg=w}k?,O!pr /| Waf\GsW"ʫ^W]y??rk^Tm4(=*l`'u59*Kj}w6\rɶ@x3ZW߷5P759G>3*hyE~]<C=Lqc-?)2rY,RqJH]K_R*}!d폜x8yc;Y,_]v)?OUy q@xóy48Z۱ʌ\y= #^Kc>Ŭc:zǿ.z_1r{Ws{w/~}K/e}}}sm'x׹A%W?l|Dj-&P83_Oͭ9}Ds9o~"X__#"N-xYXY?څ^b:ӓrpBy\.ٵkשOsm:$,8z@%֯]SO0j;2u-Xaǁ`+)vjؙ/?0iMKxxl;UYY;j#}^^z1;os<9$=v9! a{Gyl̓ݬ/˿,)-A|vd ۷]߰a'&u*6ac.~]G)0.3oēmǣ.;{ܝziO~ʶe=?WiK3nq{\𨋸οsU4p Oݾ_{/׮? Oyvhpxsk؟%7ؽk3(| w@N_Oz* ܯoAMװObS ~&ݽx}PvNiDR 3;3gc쀚vNi_o#؉;}ep}@K총vNi;m};~\iz]w|:?T|TS,ۮFۮ[!Y 'N\UD=pUlclWOՔ ˶UN.x+_GȻ4QT(')v4j>'`#d='Er"VNe9Kr!VN6NcB>f`O><2rl]S eOA3{zz|총v:k\L @ V+V+#kz.Q8b##HRH'J0nP]T J&j,(ZE*>JScF)FpJPJtLULDk=B hm ѱd -l\'|$ NBe8Y%uHHŝM@i1r`bMX 214~%UAJ!4Юc6Ěae B)v@,)*X@c J#(^ (L!UQwD-S@'!P@,6EWVl$fP^ dk 7  IDATD[>5atæJaaxSBM b$2ECbfsϝp]k7=ŻobUdCTXr )HbPۇ u­"PŪ5Efn]&uJ WJ](TOi)۞3;ml8y'JO1AH).cG[uT(LHTJÁ.*QT^R5Y7t)rciMЫhQ @!SadqA}A(W`DAp(V:5 eA56Bqm]߃((DGFQe0F/@F$P*hY]g!7=H (RřkNBhAHVev ÷P 45"? \qk7- B*Dq`A-[J\vB -R("L{<T JxSk-t@Q FE*Az-xEc^,z$xAQIA+ʚbR&v!)JX0j  ">;6<*" мa08j Fb1m â"TUr;AAe!Fa+NCUe.aYajmX0JWr.v-\w6ߝxR4PV5xGƥ" D,hcUT&S\C炊3F&m&$@ @fmH,- 7hD4 )6{8?= &{ mrD,qy0i; NdO*qQjltTmR[@s4(8\ Q *@ӑ *X( *ȇ#M34=S 1)AoR&H(DG#Po31'b aDѼ!qiD `1:VѡLF0y)R]22`Zn>2t(FB RVD_4:-|⓷E)jMi:/LD(1Z9 zQ +gE!uEvspJnTXL7o`3eJ:#͍HD(WzTQ'S"(@/m@&uB>qs`\#EJD7 1 Sm7m8 Fs*\rC LF",=53+`n$cf:oj 7Z"MF$Fidk[0b.x4g-^)aɶYKA'đRU6Ѩ(xAJCȂR5JQz1TRU*5A}.z3OHu s+⁄D!BW*bp]0 ̉ lXo` ԰)_3`> nBhJ3dpZGy(Rz`RshG" JcAGՎ(BwұwN;vRFA]-XN`DϮn67>Hgc V|_C͠ CH wDDzxCbQq9FLNG&QJl"0D*cQupiM',KP8B5gB#>aT)XqVm!]O@ax L`MU:XYgbQ< f#846l{8~NЅjF!ԡ`v΂F i2ѣ`c"hH B5FlvJDI1ͧehXK@*0Đ!"q& ֠L74MYP\< %|&NJqFS|}ߣQљa2b5͝ncO `j4FðIEb e݌ !a[U0\ Q p[ nS2@qu0z[M(&\;Jg#Ꮂ@N"|?SWkf}G,K)]Rr#P!7 /X < N*h(S&gАbde&xn j3(.bPZs bX&ŁiP" Z8*! -QNXj<$'+(k^x1'nDq!PT*!9BTR%}<4W4OJby&b t|,L ǣP˙ OJ1uX5Z)@ HpS`(J-B0гְdcc=-G Pg4}i-<^PqͬKqD B sԑHփL$(oSb"*e$A_ШXcO904|[d IY((永!D(Bh#!ć+T1Px4:ɯ0<gt@!r(H]GxI#!Z Y9hcŃ-TF1u5&xkqnբh: [#\oHjZpl q(L(J'JPj(xvo}\s5nj"{S B!X\Pi $3zGk`e=@fcj\i#nAHh8h&x঳i>1[舨M Zja e*xFj7aei R0MoaƄH1W^y%__r뭷r饗;k d$zfUH!BiCZͳȧ1+EsI.&:ԣ1sH&#1~4<7>yH3!IﴊY>ha^'Y 6G ࢄ$$VL ׌cQR 7nFw )..HqB&G͐SY3sh|^3s˰+Ƌh9-Cpޒyac-ǩ6qi%q:|r`B"澦KdGGvCjdNi6661~7g<'7(j%)UmR  0":ޛ$ `6IMN'L ͩ͡$m3aD0,R1F0M[tq6b rqu3Hn/(-r#Q-&ą-5 ^@9rG\-LQqèZ*i[8z{{<0ٻw;#/͂2t8/ֶ\bFL`DQ*M!4/6& 0rs0]3%u &,F2bې} 6?q 5:/ (6hۢ`&)cTMX$ndAEhְVi􎈂`0^\3wdXZ n1Y>Mc6Ng~gǑ{D6t^ hACR#d֜p Z Ko Kgv`:Lh&d0<g0:`1f Uñ"bi=g+ $Gay ` 2Qgi;,OAu Çy_ ;^h %0cQ)a*1UoH0E F,ltF J yPȄ:>-?@H{3Icd; ]1FHGy=iSh! >r[[ؽ{7(_D)xa I`mΎZJn6vtbnT"h$$-0h3I)F{(f p)sH_Gd"b`J@ׄ0eWX@aL( 39q+')'Y0+f~SS'¾}E j=NR@JY%α>C45?qR;3%(qi63B eXP'͝H!d=j[LRۢuH!n0e2zjEH,7sH,js!1bLf,nKHDp_&ۇ>!7'y3I ҢAdfVXy0SS2^!$HD0gFE83צ}dps_FBXH$# ^ɍ3cBFL!0˰m$1b>2*Y5$1/11R҉3bsTl _2o~]axÁ:WEK^[g+ǚ9DΐOl>yjgēIDxCeںD$os.<OĈDˬ!66^=m$Z ,7\)RVlNY ﴝv֠&^3\]p]Pʈ͙Z12[NM &č.j%O3xH9XMPO3PLLJ#(mal&9ya`;1kzG)l̸g&n-t\Qm>9&@c-U[o{^קqf9,Ԙ*Lp=F'3Ώ4k2!33X@LTԍ63-fc#l',ig:&.ul&DSS]RC% nvv:RN%lHlrY9 4M/[o| D畅zDRQLJ2D,lϬIh8\LgH0XddcL2R|3=PMt8:4 XdZ}K!{YUjw&#2f%L*HOH=95o+6oʁdǮ3 'HיA]Sg$+3И5+1gG!3S8W8ʄGp8&[3 A!pKuI>n<}9m?]/Ɵrws!}j Ƙltxւ:bhl{10 E_#s1R,;xLBp C%UEDzĜ賆g& ă2ɬ鋴՚:+7ŋ'"av iLV총v֠&KMȉ kB J+9y=sqt5ӜK"DGƚG.f ZwJ23 @T̃ȼXfFY\b!$ŝ2fhQуg!e" CK$@"=gmcA8BYɼ箈 o菎I}Iz&WeHdxUR8+Q s#TK,| f0Yf2%sg6CI: BBӉ1ġJZEY[-*Z[adBz}\뺎bq,,]xvs{0^̖HjDQIn=|dG ՃiYtfhRД8&p*-{6d$= ٗf'IN񬫕.>0n~Ygv6L͊JDK%x+I֠J`y2m[,d3]ם'b-]2}Z̠'34O: M" 0o`kY{>)s LbmTu"$,[Bp/^H:6 >A=uJch,plx[[Lk0$挪H} l_qX%SBYja#9/hd{,}E+Y%G3m1 IDAT4Soyt7GfgMf-r m5 "1zT : ؃{ێ3k?c<,q*JbYs#2!(&pE5fHZDhYSɢ^F) <i&+0Ti~5KOkJfܨ$O#SjۊLWi6ZQ &P Ɠ^tx(cۯ%H ˹)ɢZy,X($ߊ%NPӜm l·ff*slP ZAE4(OJUk총Ԥc6l&ƽ.KPٿad@ .2|$LLx|jЖ(v)8mN1_h[iS[E583وG4*Ӭ̕,ʷb6[,F:{=&94EEK2,mF 3\'  #0b F\$v` 8ےcy-Y-Msf9PUrnI O]{]kJHP~嘈9;ibszg3EɄtLjTniM Eಥ2 QxE2/`WX.}P@2Г,,P\^᫈La@͖[ )d9y4XFm4{@qouP<< .MHJ { LGiJc7֥=LO妏@#8 DFVmTOO(X:Zc8]FG2 Ըi4h*џ?s#WbdSj'$?\J&RaLwDtr"<DB`1!^#YF"Ny8ίGj|)a`kއb0aZ(ubb{2%xQ[aS4c"we C#!%ŵSQ:UfDyR:0e B#+N{ .Z { 9tOuܒ!ʢ9[B\`B“@F+']D9AE,R6v"px܋{CZY=<'|e@biEȆ-T9t^ҙ-.lT=cCX'jvvEa;%*e}0^c4<M/MW=2i5Mq.xɃkq-KqRz*)ϔHJǟA`YxɧT'4R>I4g$%(Q`M@30ţc) ! 5զ-_,h 8hZE#UBU~Bcoz$e#@)`ɖwx.{Z?f0S!f bnDk7ncR@|{_Og=%f$"|BjdTH^M7+k G#l6 #Ҏ#>8Rf%gc"t|ocC&Qd; 2ge${Lݱsu~XC(oYsй lP+<:N+:NwH!]w0nJ>ͣV)VjCɹXMQ2 ++)I~(׌\޲)|<WI -6k'Jäe8]헑$Z񘩺OGI$|>joɼ0#_ޑ&`-=,vtV=-gwXM*@#}jFeI=>buO#}(!XNB z[D? f_Di:]*R"v mGFQdEe;k5S5It'd >^ٱ1=*'K"i#ijmT&:e=r-]x&³[\@k'soՃ~{3 `tE5%tmmQ}x;@F72r47h+FnŎ uڲdy~wͳ=Krp>}w==iڃxd!%"I2rZ&NDd&r_CW/aFJ!F[zb.ADCˎY)Ka]Ytz4=F[(f$:ίy n1݇0 ZtG6Y[te~ii4t㥜1mPR{FBiRluuJVGCB*е1HeeMQ{4(b@tDavl!OF*HNc;9W݈x '"1@%z]:bNX$h-c cH>u $2O)z$F{#zj W+9t%-31d\,'y]_=L ?w\{*QRLUl*d0 ۚ;XXqd: }vbtJr8˙TU6{$%9(k*P#ZO%2N&%Y]ޑ!@=;% x:V!*]"= 1:gƣ N>gWlvRfXDcxc `pt0>3Xـ`# 9c*:<ƝT2^c$`6RkIρ) 87-KD:su~AY*ҳE|06#t&#! $J$xLL.Dg" ir!P4JąNhjkd4_)sN!B>)謟ٝ/B):b(ڇ9Ĩ}F%de9%<ɳ1l_Ω(4 !7yVb9@%XfS t !,Mhc(-?w=|G8.9&!FW|,جSXHD :#>:m,$ r[G20K"UJmDeٵj0̥Mt$͒Ş=EW I4=K{gX#)^Nh i$ E4UGZ2x'_e]bp[ G~U,ل3gCP=aelzƚ" E :a-xMTNu~x(6v6m+hBR5ƘPYA OOJQ=qKt….xx-wX 0{)_[QG/$*e$JFeE%;%,cH{D sԒâhkdzɔ!@3b=) @XeϪӀ}_|$-:9{saB=*ʄL1uA>>cSc a@,zYhڈ*JKvc;⽞KE贌J^Dj]WHP21E?[8KDcmYk9Z,cK`nHl%ϸѨ.]DkxU5xEe:5;܌0"*ړbd:fN"GdXS,fӋ(VQ2fRpnZ%l4ҫ㎍VlFJ-k&nq8E&-`] N[Gd:z>”$8NYGC1*шhY-vz_K~iV?3&1}M937U (1b8UNcz\rp< ѧꏎ;z>9=|u~(9Iƍ[(67e^~_1E2h7`XDlbNCer<ٓ&i~ KNL9mՊ[*1(_AM(%B8'(oאҧF )EE8XGu:'̴]yc4hθ(&;j)g9GkXLٲlk)2Q#=doX"2ԃ20k0>(J:jE21 ̻)2RRN)Sk%\}3rȘnrsTOv8 >R߱+-|+ ZHH BXwrʗ@(hLE)c5X<ժ$ F00JT$=>&:n2:"9Ȭ\I Z?9Ui;-)~e]pHr,t]Gܗ=3Q@&Q8\+9 ɪ&pKJex3єI54[,҃\ 㕌LA'2Dyg9:7:5rIiu) Nrۈ'd:ίP,ԓ+b5[;ŋ/pE T_c`bh9ƒJmq釁-iƄJad$(mdFܸyq8NVfYcG5W1S(+=:E -F&m PPO#tE!AgKZYPc+B1[gyT2h5OCϗAJsjӎ |)]uAD}.̢g7vhb|aF88@6 dh#|eC4fpD'tO+FнҫD<8:J*T|K t{}WfRٱe&TgB0AKX@&fG0lN<(*{?|!FO[Ci,>J֝uxҀ{JXO'&\HEdX됪rk*2M51.֨ô;!ԛaXA2~Ƨ\HeUfI[ǁ&1~)Ns&DA>ίGj(/wfZCV=b+w|RZCЅ>yR<.0KaQSDf`m%M,< .z޽ 3G H^Y`vNOf$e1"k'/+Q#Y0*Jh?#V*#&m~`XYe13)FpeNihsuO=2$%[W4$V(H@*Y TĒ1y.',*`bhF7>]T(?t'0VIY6XTBж8uO,>4 s+*NFk^x5 ,fB8xt`9!@ZGETʀ%TR?։>1q/iF>^Au[Rx0ѽ*im@ƚ{RG5D>eBd4a#gI'j!a0_GQxD0e4< &H촆@kY0% 7Ĩs!P{ >)Jbz2?}iȊvcw:ίP+u3yXc͙< F4*N%W?Yd3zN`/^HzE a DMeH@Б<)1!v{ :aR1<[&zQ-WSbH4+v$ -AS0j>^F-?wzz'Kd g_Rc{1xѢA5adaƄxOt6,`(WA< zL^x)P2!FtOs>˕Κ1BMRWOQxK\0!kz͌N5^1ͨӱ1}[6өť΂^Ľౣz#{"#MV2y5״Vz׳kRFL> =z&i)PSB񂳥7$#"c`MUpHYi>fg{`ܽu+o(ɿѠ zGBhr=t˸c4ʜ|L-F(A>l%g*DcM%1)]J?xqP(qqp1=͞9H5rUP|$O2ᆍDNF->+K5cjΎ =;e_YBqNWgM0[(cY0mlD+B]v5,Һ P0Ӵ"!P -B'LԞ>@Y"X|Q(v@zQ"8 b=@k1V.L-2"B)h1aڧxsFPqh4W3L'?B05ʪL@ 3kFS;0D-(HUX0[s41*I*>Kk)Bqx_sF +tꧥ X !`Eð>SjI# f3Ut[MKd,+_+U ed}y`cV 5\rŞzZHO}ZkuvP2 ֵҵbP ,7 ŗ:.[é Uۀjv/ &H1o~G%gG} nc=)܈Z*L0[ [3:zl%}c+q_yk!11`c dɪdW"(#5 ɣqG& !9d)m|OcA&b1zƦTHkʹQ:?_5 *JjTzt}Vn+UlYrXt'KܥRu_檈d4lqbJqmF{&6dB&=fk&n%VRȘt[`h itą+_;]Q EA͎˃Ig.J ILuQ" "ҲЯ%p/w%8V&)>@c1VfNJ'/*FBMA]O5zFDfWlТKyȕ{xuL +K\ 5}c×?Y/{CR1҇{vN(Zr$4MNbtJl6ۄA`Y`dR~ ] %EӰTzD~SfbP@LƛXV-,)L0+rpeë/De˔/ϸ PY5(c͉+γ>_{2޳B"ލ*5Y:~,bsc NIu ЊGuvA==&RJB%ڼbՐ\_zRǣQ5.]JcP=W^&S {*?qo>wƐë^09Ԝ_׏adCSƶU~qٻiRdLL gM w¨sw;Tfg~n'sܺ1`F!⃧'P³'/\ M'nduIHRyڧhSX (D豶pVL{^}-xsQa o%&CuyzSed]XOST drJ*NxKm(L> 4j- GwZckӵ pfsgDD3CͨRد uZj Hu~_?I,N;BvGY[5׿T`~8bl٧멂d5T̩/T y=KWD]]2bt#j&,벌בּ'6]pr۳k F+ "hQ1;ͺC`Y8ҝis||W(LLaPiz&tS_=: = J~7q.>jIeqMieL%F-+uYY].zAK*R&x9:]g>tD5.36 É U&)뺲Į]uIQ$zFCZ҂ RUʐm[< $VBrV̙-M EbYh! =+6<58rpp"6RR}5^* d(IxY/]o#'_}up}"K7NpSBBs>_AG՗LTs([,.+9a#kc}2lx萦=A"T o"J"=LiI+F RZ2JpǞIvzL4TꊊG% CJsOS|7~[w(Q0h!̩dm 8K8rW]B:zvwޭDa3_aFg`:[]ark|u?zaA]TSIce{}>z\+L5Zgi.tJS*Z2!UźOM\=e3=or-\w|JQr%rigPA)qm9\x JopEjey P_ ,Ӹp"P ,:}d{{Yn5~փlk[at5T eZô4P)@w`D2Tllt4 'py[^9H5%,Y,5"g)lgL"87;?m9وG Qu~C 4wWJVȇYF<8 )s]eY,ң@D v`5+7|NoUa95vbKiS`Ufd7Nΰ/ *Kʯ|wwL-HIFOqD ^8Îcd~"+/q~.|r@V5h۞EuY`][O\"}Y2jnJ%"KPB9%D+M ٹ~;ߥ/q{ܙHNJ9(HJP~X^c*ZZZ|/{x:@"\g_Z0 uUB_2nEmDב<ίGj@}0=6Hh4z0(=S@`u!LP16)‰s Ď~VP:0ok?͡J9!ՙJ!ATf c+j|e 99x6݂NǍKg\.r^:kJa_ջE絶rBz({޿s_ssSO0O@mK_v4? lۖiQ $'dńv$ G(:23IV[93zz\d&ʌ=Iy3;%d23_1OXsC3|мrko |[y]iBݹr8OyWgB{>7{G ow֫_>UE0ۏESpPcO맰  ]WկRC(*Dzh$ѼgsAY%㹕L\zymb@XbWsnEpBδ}iec6rC^扏zpx~}t  (P:VƩiOi d"tyWF|=< ᇄFP0i\<}|ۿŧ?ip+_ܓ|~º xa~O ^/w"ƒ`;|/q=wD7ckz{nqxp S1tBY4!mP s=¼a5i ͛:"A4ʚ"3%bCLW|,mKPX6҃?h1Jq>gOV](|cʻ=~^οG!|.{a.#|g?_KcWƅypsp+\ηOcWJW%?;&IOjfӌ@jK:|l"J` =#V:"zƦ#V+~bԨUA:G[c[p7N,YQ*}*ʳ?q/'o÷'kmN~|)~3xumDž#?Lo>28 #Nօ'K}s/bhAZ`5k;ίag2*TeQ͕ndrP";L) CKRFr[t;fr;sz)eh\2VBu5}=O(;nܺ;] z^Wϟ⫍KR"973[;ϵ= ͗*܃soV3{AN:lǔ"L8&fq5#hQ^K<3454K"K'+cRXyzi7wU־.E@B,Q >W_6S/k|߹G'>~c٭C|U~#,,|&Osm=a[:޳[N}a^p)VV)IH$<E9|gSAH/LF &'Ɛˎg޺ˣMȃ!sO\m/~=!dN-z:8>Vy>q2_{ ~+{ ￯{/Wcgr#'9uK:{V4ef|%W^%Fi؁3cRT5tg3w$K'GI(u\,0$+!ʨ(#hUy;^c'o?c~>|]KĂ.lf Tdg6L_mYxxwYyګ~'0/z/w"bWcNX]Txt:~7g:`%Oe6SIc> 5S +wpdKHC4Vv'{޸viglJȌL^Dp.=_|߇I.B=ui'cl>"`*'Z~Mym>}+l7߸ɕ Y0ɆGϰ?:b3O㋰h^~);G39Ĭ=W~h" a@w)=k{5Sbv Uo|;§>APE!QI뵙ZWD Wc ?^w^ԗ}Evc~^Ͻ_kc@֘'AUFӜ=2co8-Ƿܼsl{| l qz?7f \j3 =|GϿkKpE*2B}C)o`矦h6!Zt!ܽQѣҁ33nBwE!龠TH,wAoh+/<= 6w*}#v'.ps"*B)G@8ZӤ\¹xrvwy׸}&﾿AQ_.;KO;W/_O~sɏ1^,vm4=n.r5nEUXbፓ.$/ .ܹ}.%q>O!kC| -k6h1|aBffqG* Rq(<+/s ?I8SmzZ&mvs$yh䚂uJ*YĂWoW<zlo(/##Bc-w#kyO4n޼ͷ_x9w)+'wnsKycTRZ.[%+˘Nco:i>uO,#2 /tOp1o8tB GxoX>8O>q$CFڣgA&֪[-?yyU^{+w7>f][sǺuuX,-ڒ,YrZ݊7A$FF / $1H#IHcYd%Q,RDR"k={ _!@a=z*ŋ}Sc2!sk)K~emC9s#j ߽grsά m9+T bͤ3|M1׆ S5L aKB#! )qb,rƭz,xnW*MlyM]XqID\ͷҴ /(Z½FRJSzT<ȇSy._ ͸Bt-˩aǞR677w<|f#y*)( <qjk~Yl]^θ J9Oqɛ*z1ARe a1S+@.jyqsP 92\Ď)Z"ӎ'l^,rN,CjpPN*dɰAXoB=nydJ>NYB"(0Q Mx1/-'!j33vZm5_|S#yxt |q-L"!D%L,F):,bODxu.LLKS;"x©5Ϝ[|z0ư}lfퟕ)>! XD>U0 mC@Ƅ=᯿6Oh"}m? gw|S炯S*׌<+H=8^q~gb#v[sư+Cjr{NP6/qmbkDJ"Yn\ & Ef4G|> O2ٗn0+t˧bL#H.F[[HvX2Y{22X8i!Må?vs) Vo Y{gN=pvc͵UrL ʛo]ݗz|QxYtZ֔3-WykNpgCMZG\p=cv[0S?a{sV ud)U*oY.FY  @I`P_j鯿5;#tN?\í03/Xٔ<~worBĬlK+lo7e:;_y 騥o3GӖ:FB{qeʗ zm D\td29 NqɰNi\R<+b킶w ˷r"\Q)?mlELm\tP2ˍ"B͊ydLb"b<4*FW[0|m=_- [s!? 3*Y.]n9wy=C/݌[7˩g7 0FOpC氾dJ.:D3b*3` ֨+o+w8ǯ<\,LU16)V @껒! %Ԛ.IRՀЊZgOcs~K/a#u 432C|3^+ w_}Mʿk?˿:Ed2x© Z#޸6& W(Jp̘u#fÝc|~sqSBP%kFXek)1OTs\O~#|;w }lM5ʆNuX>lJh0%ב{ f` te)T %@^ /X=USݶpv %P,Iˇ!)lsѠhrS&},BO#DB2M&x+r:8'>r+9V2>s]NO3o~{ ~(ySd2S!FTۘjD&;g0jc2)""gW+jcTSzVN,V6v]zo1-%$2FROP`=XL e botD-Q؝!ɢ|me脿/9oY';a]G6rm~~0K1fJg6~W$֎Gr6{_}43FE9UՄ~A{lf+|6ܜFQ]nɊ-]CRꚰcy)׈};4 r=Z˼xX1ªi@SU̴|Q!Dd\#b9JV xgG9Ĩ_ ƁlBqZ35r(.O~8#k}<e 5u.—CBH|#Cl5ݻܸup,g;rvt}@Rc,nt CΎ( "g#쬬}1_{ p?p֕j[ )fMr@yEcٌdHJ ƳEr]21Cc4IlW_yjxS>ansL 3̙/!F O=C;Z唯1O?YV֞;jXqt)I 4i1 mfYήg{ 6¬huS=`ĝ'zN@AN6Miپ{#O~Q~ߥvfٰ^V)75//Z8QeT'XgA"KN ly);/7c{SvC`$}(Biʀy198f1[euw[Sy+|>U.хL>';X_e6ɄoPn.ĥ1C*pG)_2{~ I#= ԅ% _2<oyl9HDo_eeWBnYc*n3iL1XGH}f ǫKi9&]ᆞG+ ۝pf╷`ZSO=D 5b%b) ={2k+ZȅM?am_I|q G7_gnټɂl\P1d9$lhjH)2jrt(&%RJhnˍ!:>klӚ75gi}D`p4CsGJbn9j {nZ<,SܹQِ4z[|xԕB@B)D%rBѢ'<{ eKińbFwt(O ze,`$HDStӕZwc}kUBQT6:TX{d>o`cv|_KaCU=J(vW{I@;>joN:<k]|c+cyD=m s&L@C>lZ[k }y-RgO<*ybt=NH_#?rJ,GF !>81 4GDJ8J3ISq]#ȤIIP8?2s9@GK*xX,"\_Y3a)d<uUBN$鉹'07xgVb ?r54&\8yh5*|ͦç9}e<;&@ʙCChH=XփC8 2$f%\O}B'=ONZDː$g/)')^Ûԟ$2ݯ~8\#2"GЛLV[RcGX \\nR7'ss:K?;" 5ٝ;,5./czCRO!#8=svs$M522xf ӧce1Lgg6G NSن*^˷lo^{95)7nSMI nqft~tn(]`5n$NoV/$|m9~'q0,ݣ=h6(>妢 -FU (+l '} H@i>@LgcVlPɂ3F0azK"Iz UG`H&QUVt6·i~$z^~y>Ԭqah14w"pnxq>#1vA19|MŒyh9W[~ӅgV91E2n,9M~̤fQ %KNi*KW(UCiSdM `1_x[!ID@>>e&RPlPҲeF09bVRu k1EW(9>]Fjysq;!8?┫j&4|_ #18#e#t|;o~C$ }LD+{1&cSd($Kf6` &Sd֨g[cǙZyMl*Hngd4(l #,MYż+Ae()Zj";3*1Dq5 9<V y`z2h1M !=Xp<BUK: bVO]K=A;/ۗgL̢jω2 {ƣmK á#a9c̀/pb',"}ߓ2SV6zVdezl& ,LGƋ@ 9F*I*/ׅF6Nf r]8ywf>ۖjId"J4,O=w-|Y 0m3;nPLW~?Bm>q hrX# k͐  .9b Iu ALx P&Jr {2 \*c Mdp#f!i*0VoPIv }鷯6l  '3֚; oJ '⭣Lt{Sj[ws4Nq8rVgJq_Da2Y SNY4g"FLfxedoZ:]n<>so7x{sV/EDLjIxr8GD雁/?7kyk1* Ct)kF82S'b*3nX8W)6DIApFd*5ƳR+!Uyh,{w9##9vZGjK$OsFԓY /S^>><"aQ9m }??u_K5ǯ~ J'J-B ʵu*먚+VRBM,ƙu Fu\Sp.#22Mm0㵈 >G\c!Ō^qTqQ*!g,:1Jr4KʠPdM$G]V׷pUBʁfiXN ӳ+@7W H *Fz#k7;ӧuMd ) 2h`-x`R79SCC+@G,&,?w ̰uƤ…>"F5#ђr_,.=\"t#)PHT{UM+TÆnb0]twmA5iGY. 򭚑eޕ)KUb志Issg$ Y+-'c?&*/j&qsWf P?=qysxTQ9P,XR*+, QY,hdchK=dH/%Uڬ`l8GL}tb0y+jX$}қb $nߺʙulʙS[0MOkc")?Q]khJ&JirҰO LM@Ha`΄SG5?Ӌ /l]sW Ifh b7T!ZGc)+O|䘊TfHd}PИD5'ŀ7 `mGX_H/4ZD#\ְvE5V<94~;o3@E0<]bφ{΅;(7Lľ[3󎬊@%``9jwjc[;l'e(X$`<04nd2ʠ`JOKNx7N&qwvWwfE_",U' &bdERփ`e75ECaɒfbOfS95D)c3uؖ<+PEWjb68IȬz{; ޱ10dVE]yrZ U> WHVyG7x&caX+6Bv˼ETXKl*887&F>=jXu2$!Hƀx$z$9)YdeԠR"OJ;9!PӓL=*0(}!/^kCfmN=[U/O8 XӋ0J g*hdiUڎpV;7(km$9wCM8h(Bm![ X +lgN9{4"9O6Rnn!;K TNH&cr@3"ϟZWCDrd M'K9)@R/5b"5=hJfbpY9m=ϙ.7gx'!]VU+VTQKG!Ee #y#pZ zb:e=ɔj:h]*hec,b"1&Z͈uԵ)S9K+uW3ďyg3QŻӎ:7$!'FMŬ/ TyX*2e#$$!ٞl %IL(X,*?S%#Brkє>༁16$,F'2b0DYu5߸sX2ԕU*xD2PEO =^?ar$ QG3D3`Q6Dyj;Bx}b16Έag*`j*ﱢD8MH*rU|*`. Y:lM1~6E`"ӌGlo7> K` 4 gXdҞās A=»+7t/tHu!&̒3qCVSS708x ä WGR+FX8\ yWb5H'JV7l88R8=rp2o Ya D :A 4Ӕ^x&$%%D!QzTS)t>o4d :DՍTq&(:51ETY2+R1XlX$qƞY7e4@̉D#t0ϞS*PMLIr; 9(qu x FX^@+vb6%PQ{nkW'Bn cG:/T.w ]^/hk|2sp5ՆvpVE`akS7iR}Zz8$ڨ %)%P"F'i!1X `Rm.xtTUx>8؆AEBŻңCR&̈́@ kvCׂ9-%b1nNH6Jd/ $$.|>]"JFLA,ShN7mDDc|"lɬ>ޅy#APMU]suuí[ܾ=ǯmz[{W +Ueg <'l'48ttSJ$4;z[YwgIBHcFST/Xmk2uD3Êc2{4qz}*#`h 땒 % rNI:-XDqTЍ}@[|mj!mD=F &gO1=Ae!aoe6,L gD;f{L^h'Y&L7̦;00|DheI[4'FF&Q|h1=ؓ'ጕ+PV7]s6Ҟ9'7Z |5UP4M4ډ!N#2}w V2>()h R2撀 vGr(c"tKtfNe@$֙D!cGH:H}A: j'ܹ{{^]W޹z躓9iK(w|.5uUnPVlRrve<н2Qw5ӎUYj_$$pheIIM$`^NoNSr|C7u>>Kf;O"^}zk Â݌_~ٌx+j7wCNe3%98>,: n?s1+Q%Kfw#lя"%6ÂmB]ׁXW`_f7~vF xxo҆nݲ40KLx ~\~s^t7(女= , }LtFcG7̌ F^d9|؏?^%<k͉"CЩy3$iFHǺ@ww!Zy9'\{H<_!`Y$;+{k'3Qk>)ܺU}>&LcQb_*/}(joy;XtX}2NdjFBN Fg;3%X{yB1P0JVik?<4ib$soVl )2-bv4(Ӕ5vA.Y2ǰXpoVk],w7Ո eK=Sh&r XwN&/ucB{L6D z[;*B2VyP1$3zR߬I bob퉞N[( ӈ\ hhH$D20iÝ~CBMAu>^ls R])Wa+ǩK_ 2[h/ܬ+Yc|@OrFA[t\u<| lg >|)W׼/u^iC(k9;tf>U%TₑGauØ΄^!Rc)cHH911:\#)&%NMP"C;|u=ΤI9hl-;P Mpwl;us||J9S3Rb> g\WoѧM~KoD ;&}pǢ;ᔪ{N3BLӆkR:!Xa&"ڡ$2&N1YHqQIH ɧ$!7Ȝ`mFH*l7c/dTnwD6'ɘ0\+N: EJP0LBxe] }f$1Jc1( 1*;gtqHB@"a2Vx! lpAf~}挓S=kGIAWf7\?

:{IgNr׮G=cg+PGiz i"i|}6m)mSlσʔAHṊw>Q{'_rvdxʹwͣÞ<;|wo{v>>>sfgO%NIӀ#ж-^sXsb{eG>3ctpڱ%#UFr15xQ@oA2.Å @iJQx":,@-Q*g5  w̿/ɛy_Ihftwmx8,=73|_y&uʳ%F98#. A <d8JV^]WtbHL fX̗AOS"ώv|&IPOI}345 )M%1%Dg6;d3gD ^LϿŃc?Q+<|lŻfʦp:Ľ{=0B̟8$A{ ;}/E!9݃r&2F6=SpaƔ6D$|Jo`O\#=R{= P5 pH͈rlTH=xȗ 3ΆfS fsZd6cPW<WGn_9S3 =glZŸz-:27Z~ZHtT #1YpYy3guc2 87v?g}$/~< V+iu<nGW.\] p)_nşyՙ,MEo Hp$0#h GFjiNl6`q5M!*2m5ZУxROI}MM@SŻC6-zvЏɗ)3hZ!$D0HՆ4 IDATm( vht0oyy{[kɤQͼb>GݕN&avίIաaAR! XfKB+n_+E0czROFg'ކ}7I07 υê$P_fS~b\||rfS"m *P{gotSg}~ŝ .N899gRJH)L(!!]Q{UhwWcPW[澥6ɦÙ5ۄS,/8pã{Mp͕}Sr8 MN#ƵcA+JnY8Jʝȋw9Ww񞻆1 U3wo {eOmNNkn#ݺsbD!̨qCMJ2pDpӗqܔX6̕FBanAbG aD)ɕ1⮏c h%p" ,)2QD.3n#*P:vWTTwĶ/OS@6R^{Rc_u=ma<߹Y뫕4fG(hZY{O&gXIK&1VZ6\* ɔ3A3Kh礨Q4)S4Ѥ:QJcʘFp!4?QBNEH*Cna;,W^#?QН_`ڽJ7,exw.Vֵc1Sf.Rp̔NC},=QhnXKY3:u^g}F BF8F t"lԅ$>M}PPgjN(EMR{d 8Ԡl2vNEC9''? k|!XB~R<%"MΝ-:C{%t7l 7Ckfli3#pBmCX6Ó4e"Ҝ>OhX$ :ѭ &4!t汞cM' /FQa  ʆ{ Yޔ61L26NK}6w=coxݏS [WT8J$$:n4<YZY4pEmd@!La  j ס a2RqTI?jX [WTzD!(5SӁcNyLLG#FC`9đ]p@놭Aa7v\*;RY-җfZo7*I[w//bg-U SV* $*I5#!zaPmm[xI9ND2`D#JA InQqQ\;V3$/pt%D4wQ$0҄ ũ 6JRHJu=;Q"·ϕoԆ_~>KK34qXB uNOyLtD,6jCDL} QL8d324M!LOHBtCܩQ[ўvlGl+D}L44ү;u UBd %AVAc2"SpF3I!yкSm+ ̍?H9^wgLJeu#eǚKYawdIL%y`1Xn Bm0rd_Pz"m/EH,iKxSƺh p\4Gl<ènv i&8ʅ1cja#ڌP9 !A [_[s:vl_wd_xNc%hٯ ͔*tL{'|#vD8вq%5fq̑k$ws C'x$(q!_GdS$ Y&TI=' 75,I>[c%LFHty&a L;ܶ$-P+u ANO3og,1&G҄W! Ch "p9ZqA$Ə˰`]PmG5Ha(BU 5H@Fӏ8*P 6O):ԙzf&sCu3nj`S% :&T<)Lљڄ4U8F_+ƺՆz L|R؞vN5XO .d5n֕I " Um)GtnX42"[z#F')@sMjȰr6۪4"V"%,g4tP5nP ݇05x̘ŘHcȖ-Q2$IԀ)2S.*mmQ lσזv 'zdunځ ˊxP|;(= b8? RZbFfiE=z'H||mJBJF'3SAVH:&Rq;GP'3`ꏳTTF0%ΨG @HL`KCi8Vұj0o2ۓ|6*4Z!z T6"P U2BΠcDaut\';DP}}! 9[u '7H#HC`BP D;n$ FDw=,Bjȕf@IۓTPɐ Ք`fGhDAҶt7`J n`Ȩ Q[G_#1c*/l<}hq,CI(i{b/'Pwjͯ!Tq'"u;+c bcMPDM)1Mepp˞i~Y*ۉ һѩ8t7hRlXW֤Lvӱ!cQ AD>ĘAoCF`Q9OF92* dXM*ی)2rNBf%";SDAs P>XJmLpr=y%gNO /1h#beӭr|· 9 ޜF%"@d71tQ%Gx$2RW?NFD!V01 C 9a EHXP\:>d$ B11ȄnGI=' 655O DK&o4݆0V&\FBi F;4"lKb=aN@7ofR"NG:{~b죥40ב#Fk'E‡(7X_L2#mF^ǗndWf&@%zjl-'WL!0~O% ;XeAGʖv=*0O[NO'JI!YFi4od= ;2[HZfNhl>x6}PTNhH 2t4J%8(v@t:b ahB-GQ 2=A%\W\5 OI\#H āy%Z4> E3mY-B=4u9Ʌh_]Hnt]&ǍO2k42ydD TfxstZ,ӸX(JN"jiҕ] :G sP"*V 0Tͣ"-f\LdgQ`U`&RٙM8\gmב⼹l7 rڒ4QwqVw~{  ?o, HIi**`CXQFWI4(W ĖD# Rs8^wa7y߼<~=w9s|[EC4Rh EFFE|/J{%T>%񥍭#5qhITEɮD:sHMwBDCat^-/BtWNsjAkG@F&s5 HBc);P1e-6Y\H-Epl2"Ķ5r Fql ,%%d}E6FyHlňmbn,j,œ:<lRGmȯB( Tv4D18Aj+QѮ_iGDm,+d P\%B(*kck.QnBPaq)Ӄ c8mkmpp)6UVWbilK ǎ#5 dH6CBqOKİ=a;ʍ0!XPI(aPaH`XҦ U[8#%(_QGEBd@pr*ilFhZX.1" <,D GEY(PPJ#5JnH2X@)miZ|+!@(!|Ѐ}aYŠLrڎ#Y!T y‰kddTJEꐀ(d]GlAB¶DL%h=s~*BE=\6樚v>RIr>.h'?'Qi h K |+Q:M 3•Qn[d@Fڊg P#+&iL^HZb4œ>3&q ;r4*q:%ŠvNaP ݛD'#lj"it$Q^0M:k!tD BJ] uBa u#,'cl8NhG\¶P{"b:XmRTdb t[8Vs&me ,WHBaa[ 3YR ~#sݹRWEg$ C,%h] Ckc9  5AfQUn |N`aK m' v@@8Bt"' Nr5|lR",Y<)tmE pTxqAcEG1 'IC !D>M$!\'-?,"-%a'Hl.*n-ȈnAS9u!*irDJFJ%Y壔E(è)vdҳuBDfR 'd\WO([ʕ Ɋ l@jF9Vvta`+D9m"J(Q׮QtSU ֢W5|Pt$_ *7 1k\ly^m3uȂijtҞk5 mGmRyٹk>[9>Qs` o.Ԥ3~2'^MniމzM_Wх$@Opf1vgƏۭ0Bt5ٰϭ7y/4_/:}m۱{_\#C\^u-עϘpl6sS[Ztod "ɰ]LwDaj0$~`Yn}eB6zwڌ{ a$`0 (a`0 ?a慚Z֮`0 ? P[[iFkMMmu `0%}5?I)ISZBhD ` )+d?6=Du=RoCnQǶy7`ء|<`0 o"X|<WTc/W?{= 45K~JEY2u7zr۶y;ɤ0 ,Y rFl6yK?e7.!hkme{G^9>Rh RQ^㇒l`y DYqu@ ],G)%B>&˲v_j ^Y,si?x]蜰#2 C۶q.,S6.JL Hy'5YM[K3;ٕ|w+Wjd}( Z{&QSSWP 志R#y B_1ҥK\-4P[S@2,"*** 1rZkZ[[I% 'Q_*XfM=u͕ST0 )--|}iY$IxGee]߂&BJhmmmSTTDee=m6S^^g aHKK ZCUU%X̺顮/477Aᚴ8C]]]!WY۶Ōi'jjjXikkZfZ Be$>ML6K[k+PUUDK_tttdill,`ՄaX&Aӓzzz"aq())l!RJZZZPJQYYI</|fimmömMWWx>q[[L2Js5Sc0+q7;dBWW?+x<~tCaxѢEL20 C&O>?ul槷/ˆ#Jyw5k&Tj<{OGG;:Gy$RJ=w>^r)OB$;+ӧO'N2iaynOAրϝV|M&NXȳuyW;bxV[o '~G.<C3--L0N;u֚{oxGk[+?fRrHGG'JJRu(..^;_^`'LrfZ>YPJvq'jjk83(++>;\jkkh z뭷h03qdOÇc;6/xxX_/***# O bq8Yl.]ʍ7ĝw܁֚Ũ;m4<2̀5]UW#t&=wMqq1Ta d*IàZl?˯6=}Q97<"---\}U9r5I?o?4_y}hp HXB(*¶m OWWZk뢔$L^?W$I<媫O$|=) YgDR)9PFɞQZZZ`t,l?J&! C>#Z"Nvx ׿ys]ʑ3g`ذaAyk(J8?|2+Wdq!u]Kcc#O<$_|)O>R&5ƧKTf$h9c6l8s#Hlr8@߆p===zd4¸=_} qHL>#0 Y".]JYy&Fww.4SN׋L&dZGzvMM QRZF]C#O?X,Ft4{ʕ+7090ٶm[tG&)%W_s ߁]vݍgy_1`qh<^X^yU7GlÍ7Ē%x뭷mg{nRہrŗO? !xk6|]iژ4y28l${9hhhdۑxwp]92/pCQQYյv\wCEEeqgAis?ϼys, ۶u,-Z hh1\re44 ˽PtttrG;`[{/Fo# bsq45}|-Ι?!ms)l2>`{=TUUQQQ1`ĪUXr%+W$AUu K|BQQ'}GMmL1A 6i2tqhnnfa6|OB[[3y6v,^t%%%L=D^y!1g\ΝǠF]ض͒%Kg)go o2e uJKKͶk3ct\ŶlfΚO< ~補ub1oo#,~e&M: ˲2dDک˲8xtOF1KN6:|gȑ޻\ww+W~Gse g{y%1 ϘAyE%se}察,W^q*FAWW'?,[d ÐwڑUVͤY詂~_,_SO /ݎO|̹elfS9g|x"'NJyE%saUk|駼yW+B*:x+n%}ڵMƛ(lBn}g}o?zq{쁔&nçε\Y'q뭷>Zk.R./?X,q;_,g}㢋/M3gdO93l唕WpsDz~\xE6G~;ى/̢)**3mim< k4hBIP[WR #'ɐ%Y})Sګw/^XE*+䤓Nb{Gګ3 >8`F~$ѣGs'ov" BVC39R3-7k>ASOq\ze.>Tê`h^8ꨣ9X՗L03fRZV΂ p!pgf}6QZ1vX~W8;w/\-%H"_6lCKk+t1tuvRS[R )%ö-OMb뭶&ٓim4ӎP]]MGG--q0>5CAw{${9vJ3d`܋/`Itvv2k,98l,'?)e|<dY2L䰘][/\m|rL5~dMsMa]wEiͮ9*ɒ%K/M7\/g#;ή.8uuu\ݖ!C"Gj5K?C>0 6lkEE^˲,5k[oqo%ɓYbXѣGSnB)IKӧMcygɘǰV[y.;}Q2N?s+3i mmI*ßg>.矋[˲ejVALÏ k">3X|9%N{ lN˕+ ȣv=P|g'xߡ@55ϙf"Vqq1̴2/`!hYJ} k)J뮻0ĩCS',hf1o.v-|d 'NJ{{;3gkn^SO=O~r&5HJ)[9AqX-c۶Yf555H)sܸ͎E۶)//?gQ!Xl)xZl+V: Ғ0:|?`]IqZZ[QJQWWY31kZÇVC8kx<ҥKq{Z,;z(2$|})^ϡZl@,0n5kVvԙL9NqI =0%%̝;UVҼdOw͡"Ͳxb<)%Lfל7yN=y䑂`u]6R d9ߛ֚ jkkYSH'{8w3* C-[=_t d~y @+~C}= {9CW_E)5kP22VWW -RQ`L6C(7\ 3YϏ?8sq_>`e2RrW0g\v[JJJHqq…\`cǎeќt,SNcʔ"9 'lr-<3(Xą^^{8\_ ދzq%pg6P\RL{SVVgS~|A|9cvIrQyY}U)ioc+?r̚5sSXwOO/E+=GRkZ9Ł=qx !G^3ϢnF?3ga ,R뮻yHf>V_-| v},_)NM7 S2d`vmWϙ6}X͕W\g܋֣ХSO#gK.u]>C^xEΘ7ot/ٳIlXB\`3f(hj{fYpEQXT1nwOƱǴ2n8s<0vnxǙg!C䓿r˭N%[8cxql_^ɛp(_w/"Z/H3 s1pؤg{%tO_|ɥ#CISSW^u%F¶m翞n)R>yo f: ׍,Yp99Sf 2'dqe y#(h&OĂRZVJ{[;W^ueAIA;s/OњNx!"c}NRkMSSS!JeJOO7BXB2u] *8555h6nZ[[s:\JKK)//G)U0E :t& hkogP}}Avµ)ꫯ6lX!ODww7Bb8uu}(,/`Ȑ!}(_E]]gX2ΝSȭ}\Ðf0B$ Y !줫&^~g~ZkZZZHR8Cqq U,_p/AJCCCW V^MCCBzzzhnn3-))gl6KUUyjZG۞DFMMMض]09 4h W,ˢvAQVV.$Iڑ2OoZZZ(--%bժՄaexGU.R I&{VdܼAp)%D ڴ,+W!הP[[˗_~YV"rp-)-cOQYUEii)U\DB֭[G:\Nu"{ n:2,EE ,[o5---BLs EEtuuSU4r!ZСCRFBBc^ \.򡩯/=!]]]tttH$t:MEEE!Bsc.< # [l-#ٖuMkȇ°xw4{ۧZ10`*~ZG1$f;ZA* <، FA,K2 CL&y`0 Iv?E}-CIENDB`qstopmotion-2.3.2-Source/manual/screenshots/pref_video_export.png000644 000000 000000 00000137475 12536560630 025423 0ustar00rootroot000000 000000 PNG  IHDRCOsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|M׽YD1vmh-Z{Ϫ5VKjB*jfd"Xۄ{soC{N>[lQ#B!Dc 0hРҎC!Bmݺ5!RJ;!B! @B!l*ҎE!B)AzdB!D٣Z Y!DIQըTjB -B;|c'C ~ܿO'-^Y7{j΅\&!)p{<;?m6*X,-~sʼ{?._ڊzwOcBg !JJw5hmExM324ϛ҂->zFPpF8B.P( z=Tb>'ɃN=WY *Z[u[ڷhyl+3]Q.HCVQ"bw:/Tg)?/l j)ʽHu.^ |'PvxL~ Է!y*,H|bhX* /~Ru\#Y,zS,^=YYYX>oyi/|((##ҎEQ:7?ǃDjyUK0mM/k7XymSFqNIBb I>J6Y0cgeǮ܎ՅzwAZ0WWzD$v F5m?*p4ωY1ԫS{6~LOC5SKר`fFh߲zSeHNIBūذ{v6Yc;!!)& >Wf !|9s Z:~_˭8+zwĤdoB 2{"~ Q߾}?zP*% !Dsۄm%Z7'NɁA\AT¶ ^ %o$$$uWDV '7j@5GxT4 AZzUt4WooGBOC.\U=ܟ)++/Ҽ/?> y'NѱՋhabFd;KMԺ#"9}"[4OT󬌑Bɜ_J()ԭD=6nP0o_*P7"ta,|vv؎V8;,ǽ9p8B RRxB\HH=2@QP9 Ȟx%T3\сc> mbׁ?x笞!iNwoզL6GjרOW| 66iOƾկşqslw(Q7ڮ56V9UI'ba͉稜 iR_yujTu^ ֡ndddhkTM5 =PմmW'GNsg2-?ʩq BJʷU668f^D޼ř}՚\xɌ |<7FYYYãgq*UoN BNIKKӬ=^S1rSn/g,bPcu -y\/hWğ_yMg9xǽ1j8/TG! JR ! &~7+6~|Eʍ0>tNP*>\\pvtRŊaϻIMKU@:βuMЩ066EGc*!?܊C3(Jyjtʠ/F\,@fMuC[L.T*UFv~&?5zwJz#8+LK?boykaT쎻3bP=!dhԮɘw=ܻ33S:U^k܊u2d78؏/7oc_GZٝ]ly7{E7F ~g{>zF] ߋ!83c;;yjZgQVSz5PTOdSZ~}1o̟{i320yxnڨ~l:58liJ6T_N:˫VكSg/0lm*2GW6j@VVk&QlٲEݾ}{*TPڱ! LMMQ(w6l Cߦqz &&bcm`llfleJJ FFFyl=j(J,-- 555O|9233Iyqsm]ff&fffs_SS<_033Ș{`kcJ ZMRR Z]餧,/T*5khϴBk.#+( ij2335 %c'xb,J:>5A£rdeeCi[ҵoZZZِX/ZԄux}}Aw^CWy?/BQT2@Q"}^r_OB!ʺi8@VHw늅9 3!W0Ύ͍[6 ٰkF 9de1e2 ~o}r8922Y8w..],UT*MLff&˗,ёaaxzzȱu}54 w{B!W%֐=;W īO>gT '''^П ɳMΝѭ8IxDCz4]&9ˆèV*def]A89ZjI{~[lϿ ))\xo7nwjT2lBۤҤM|MB!'%֐mݪ-[-}zdIo ɳήx4,@Rs=,w'_4Wvuj^k[oS#eu[!y-((GGG~ܾ*>9=?<2JeHs540~TvG"BQ+jH 7WW&MAGD|8.}7WW.XHr }%~ٵ+WC111 5P՘hA!yW- JDEG^Yc2G{K!(ˊ{h]1ߌ]Offf>YYYlR})B7#A( ԮK!|[l|o-8JQmqrtdgRz_o}Uϸ6|4w>/AU_aTZ3Sn]` C=7 {`ddo}kԮU+OřSF~ϋC}AoXoG9M30/i Q{7ޭQ7++cƎ-IJJflL+~Ըݹñbw{|m ];w{8{<4ReMֹaaTZ#A$ЭK'ٽ;{ɓgOIko4_ʕ?'=|jTT4L/Y#7|TIƼҷ/.. f (EtFF: Ņ 2ZWCClo zN\._j59u*׮[̘2-/mUciT`'Xx ]:uSSfff3KETt45{1uxݻϦo71lZN]Xx8Cys0 5j6~+K+~ٵ /9v2^ *ܻcƑaeeɰX/Y\뭯 E~3220e*&&|q=vv5knxIMM峕3a?|+K=3[{6{t>xYY*ͽdaaF[g'7C_yvz/CtCm۴ֹϳD^ hݲ%~bdzY7CdTN!<";k#Gu?{'OK|9%K?{ p~z^Iԩ]jU>QO#ص7 g_nΞ;Dž1e R^jZoѾ][zzQ:+m|95{ѺeKbHJJz8J 1IMMIc?^5{4}QCy@|||h닳[$9%;'CɭMVkӆ{`lB]ԩӚ];wwt؁|ŋL0Sݫ6|☹˴{}7kJڵik֤AzxUo#_꫸?=GL;z޸PF yzzNpT޻?,3C=jUbiiuj]6;oP}?:y(Qng Q88yiՒ6{\/=W52+++FTҹCG~ dQ o߫DDDq:p1ZW*xw(t|A/aic,_X,-,ҺmX21zսz2VYkoM^>-^z t)jCv$JˆzRS~V͚\ JM-/9cg' N֧>9l+AT11dddd3#!(s3䙦OAq_+:QAzd(9pj5]{051.X7WW&M͛@YSMOѩӧ0aN_%qq7m:?_|oggyo:7WW.XȸQFXx8}}֖{ב#d<ZP.^ԮU SSjPs.`blOSQރ-ŵ}aꩰo0!.Y3-7#Q }Ʀ"nnY3fs=~q^w)g{^]o\]YS&=Μ1B]#)9׬Ғ/\57{|-ʽدPVRҐ{8gmmU:ߤ@QICO4d(8'P*Р~=>5G_ǮtICr8j5666 |͚cS":g;^~a+-eYb%4lPׯ!$BA.Yf-)J:olz3qtprRS'MyLMLh8,_@vqŧKhִ)/wP׻3*!1e+VC,-->yM5J?NN?? {m򫧜^ڰkm /`%XZZjmr׮^ɴg1b8 f,]>.띜EkgW|Ys2l(5hw;woV\Khy}|(Yέ  s򻿪VP:abbR$EeuNo>!! fe\DQtK(J⸷HJNƶR>Z}QT&z IDATwLu %P9S͚> ?_Lqrr*MHH؈#G2eƇ{MMq]r"ϸ{611?HOOF|^8[I)=\8 QIC+HmOlrJ 7~ů. 7WWtkKK/EѾ][ۄG0o'  |6i"UM=TؼumZ"(333̞XP(p.d[a<}JEw-ܼc]{-S]R[k,)BSr ƚt)8CwQuڙQk~ǽQ ErYJs^EC6)) #"2AGzF:!pQ^j5L%33ϖ,Օa8GJm/P׻^ժX q?x@*\;׻ !t+oQh.[}9,oݲ\EMOWДI w]߸15ר^824&]i3-/4y4eS||<>qcK;Q\¯=ϻo.(S}7dٵ7tMQ&xAɅI9zMMM5M2`ǖ͸anHGmQ ~u&}w^FzF׈ ׼~ B._֤bǖl\#Alurmf{Uc'٩ ?'E܏fi+.;o6g[oy/T*d\?xȀ{?S/SgV})>{{Aw#'M{-iEIiضuk~ض/zc8Eɱ07j*v( *|(i>zI>`ێ>rgV9=4b~|5dO;dJ&MN=rafN3З&ϐB!yTZϝmL0)0ndSR)*Ą/D^ ?z,._ɗ**HB!xsߐuwsu˖|i2O`nf쟓n쨑 SSSZγMWW.=xt44.|m jh( -aiIЅB!4dfMʰxgt?_ 'ݳGbR=ЧQx@U*O8R'祶m IWLm B_<}) B!))j)jz+5!iEU*wR:L$6SWNXJ;EmYp-^ݗ,mVS/CA8mD$&&2{|8 5jTgV7BEI--`ffm|G'IQJGzNEammirR8?Xak+k3D"fQYgvOCNWh@FRWYˑ`ƌi'}&7n$t4y%3ʕkkBe$!11Tz2= QL|J&p}Ӝ[q]+WCiڤ }z]6ot)+-!D# YQb[PԌr'NJ%jcbb۶)w0b<ǿs'ׇ#A)ptpЙ͝_| W.cFFu'?@ܝ;[c̤K?YiӵfgCW$$$SКo:/Zb?j~֭πA̚>ݺGsϿ<8W?9y`yZ3;B6>Wor! vDLl,gϟReƍ0B.8n*hF͟< 9B< !+J\yIW Q?@=YVvmUmZ]6݋sfz:N֬ϝ.,<ϝcItԑ/6gdT|ml*VvmYn=j.Zo쇛+~'Nr N9cx X  ƻNmibԸ:@!J4d(rYYY2b8zȴYIP(4/ru~T*%/y=næiӡ#>>K`iiu[ReKiDz+1#|~y_9˗.܂ƌK^[HWQۛͤjIvfң ˙Kzb+>]Fߠ8{f^e}SsP-= N>Br2.\̷$If/!Qif*m9k͚> ?_Lqrr*R2{?11 lm }+_Q%&f&[Y=OW6 (x~Df/#+sLoR(x<YTY_Wi2Wqw~%y}sd,c !Da!SR᧟Q(xUZ!(ECs4nނBX777iS79ibKKHM>7o79hjG> ss1&ѼM;^ܕz} d߁\~C3!g<+WAz8^R<;[L34jC.hަK}u"X7oI hܼf^P}go yvhמ%-7BQ6,7^NZ|\~fee1rx,رe3׮HP06} dDry࿯oq#, #A$;7gDD}]oݺjR3!h7c>9BR1-9T*MLLl ˗,f63b0<==9u*>pqqfgOq]pv _܅ 9&pٸ!oɖq**$jZsʌfӶuk~ض/B!/!kddĜYˊUX#"ܱiQfM:r&~~88S׻NTZUg'OaY,l96ibmvD=ܱa{'OK|9%K?Ξ;Dž1e R^j >`hyunڿ gTTm۵'ZPsR*P(܎Mjj*M2ױB+7/{V*#ƧWҶM/w?dæ3 }8F2__LMM h9RSOAfu 'ߟ,XS8:8t.ςN:{!yVP*̞9r-r?_\]4mǎA[M5Z ƍAz8;9v5=ׇzdp$(gbbbL}6si+s,$qbbc9~ΩN[{{5/[iblllX~Ux]翩عG3TPSOs48 ,-,8t0Q?q'N|N.^]r5jPZq;M!(7eClcGȳܜ.ʒcѻ@iəGWRI/Wa)JV.[J??XɌYadpp2s077g%[tыy i/ |uYx LjD &&&:֥s͚6]9c/vSЩC{)gI9u =q=sJHL`ي | LO jظ8lm111 %%ظ8\]]1}qIRq=222qrrD,dhBt1033̬0Hrr2AC9XYYh\:R(OLenns l]T*uK!ϧr;yR᧟Q(xUZ!B<5Ґ-nݾOʔqs-ڔZB!e -(B!D#=i !<B!(!+B!$i !B2IB!LB!(d-!!=_@RRm+UbǖO=? yWyWDRall'BB9n>x Y!D Y!AXZZjYXXvHό>k>۠B!_GviDFEoJ;R|l*V,r9jBQu) Ƨa"Fu/*TQvmU2t)BMhȊYn=7dޜSDFE#C>gHHHՕZڠܿu_mӤ$PfM&kݻl&&&y=VYˉShmM֭x^ؘ۷o|U1ɵ75g.5k KuZ`HݾM8y4ff?:p@ !xuC6))PTgd{@Ekkd :ebjc Gp=ȫQ'CG -?:LUV/]bg˩]GNBdTժVNڄEsm4ԮMŊ}$'LpuueGDP'\uOKOgDEGӨA޻Ƕ;HNNf5Y[[ӲysLLLRe=qn8cmmM]:\xQ; 11#7p%4֜xo7nw5lȷ[p#"֛addD5ȑ5d +@֭hצ jCԩT07sX24a:܃wH>ڹ=uӔw~];w\~5ӯJEvOuZZj:/:B! 6ds377GZ󳅅9*J}Yj51X>)33MO㢢/IDU3%+W>W5z+++.tL{(5B+Tb/R6|;ΰAxD$uja:|8*Vĩ8;ev~OnFXxvmZ͖f8::r}Jear8 Ge*{=geV~{IO`Zʩu` _B!>GV+W,^8c4/l9==rY뾎}i/逴[~,&6ʺǼ*$ӓÇ  gffƲşR6܉ˑ`22qp̌,^ IDATB퉻s /ۨ!-ūZU,,,Xd m[ N2 ̛+{-[uoܹs@V 4lPTnɓW۠c|ڴA.aS")Z(̿g15>9؅B<}#G||<vܻ!Mpwsc΂̞1WWWΞ;7WW&M͛@YS9:&? ,ř͛annN=oo}Æaiiɶ;011߾Z0pwuhEJ,^ۼgݲe =TTc,с'\_F ֮Z==ll6YpAٍi&hW1RM_mlmm.钆͚6]9czьC411aLp#ƎCPhf7W|$8vjүD6}ͺ_PXG ˖|,[T6`OLlҏSga%xOe@INoeiqYV'qvrٙ~ f\Bgb˖-NxI!00A`HϦxTj5Z qQ_w~f}ZZIVTb fM&899Iݻ({3xb㽶B!J_``^ϔS9=!`llsfffOmIRǣBYXX0}$=w{O#|6,ЄBh! " >vP'/uQi&( 3SSZlA-J;!l\¯=ϻo.B!{Ґ-o7^'##Grg''N *B!Gv#V!Y!B ZML\ n"9ŰB\#ICV!"&.4{gOȕ\\J-i !Zܺ}`SцGgMEj׬g!+Bd-W{sg[%tY?IdFzdEy'=eNCo0}_=3$$&R[ۜMףRprtu[vn]:[QB²MK~L&"##:?99{{lK oC~ cw:W^A͛>)<CLmNj5G2mlV/_JU u+?ZÖ6xE-Kݏ[xeB EnQx.$''3pxzx ӓ6|V7q/sGo'iۺ5d2 8ƍox{rbWc8`2g7ơRay?xJEZ59s_իUfh(SgӨjztp%ὗ؟vKTt4__ǒ+w;2O )y㗝زbj<^^ݺ1v իUE0񅲿ן]O}=|NO$&&c^=u6v͚B\MOOg}{"Ktz=6nǧ@_nLN[ oc/7r!^ 1~c<ڶͱc (Ɂx8d2IiAIh4|ZbxRRSYl)Z^:+VIJi&<3r!֬]G i׶ oNxO?g3[od;ͷ M_7a">1^}v Q㈷wթST̙s,`{Ӷuk.^3yۇ(_i2k6&N2x9z,QQ5 ggg26oGi'j-1yyzd$M+s'E`@ڵͳd"::ww7=FN}o?>>!z;;;B8=,+WZ*x{y9F#III8;;gۯ7nkCYZpѫGw0_ :h >]=z=d<=̟&Ȩ(r\w T8j4nz|[1^t`0rvÆȱ|I_}xh?[lNZVQ>sv$%%aVf:.\KN9nFؠ~}?]ΰHNNƆZ5jw%=w^/3m׶ m7`kӆFӡV۠Rqd6iLMR2Ztc:ujɓZ-а~0]{?w?ȳO?#۷ m> /O/hbmhw޼Qemב$''hټ1,]h4όRret:֭Ga0U&#rJ:m{ޝdE=wZM754%{s!bbcYt Uuny"/_ v֝ݐ*塧Beq7a"_k'}yp4:1`PZ4kPkT-۶c0dΌT\XODpz9f.YTGfIo%;o~thז^Eűx ;Jzj\tV,?[DǗy;=ɉdvX}r\i0LR#[8::p䘭_Dz}Fc:2.se| PBf6=󃩰55&BUXl >ZÀC^*cGM.u'Yz{AxbΟپgZ{ZZ&`Ul EQ=19CT d2n cb>dZ'-?O`ݚո1}\Xd1nn>r#B憧Jg}@|B=-ڴǜ9wһ7?~J>Z݋͚ѢY3.^֤冬8Y_?|3^N#mtX,G2'D)˂kdmmmoբ͛55ys~9z+WZ2Dfo?'NpY̞EƍWϿ4m;vҨav/VTRٲ'Oq34^ %|zj:|$["۹C6j6lĕW8E<j̼ٲQ+nnnTRrԫ[ /ׯߢySZ67_IRo=Oޞ0=,C2*jUב# zEN: YBjYc8z8;vyӦ[w`}zyH\B6t^[>#o^ӣS*{ۿ]#)_1-]{8&|}qt4Ygv_tgb1LJƑ]zZx''mǐϳژ[6!S&[V2q_ä(xyzfFO>&11 [8!Uդqwsn1{~eXҌxgٿZ- {{zzizAk~c̺Oʋp?mZZU?~,YWRGq&D5XbC ɉ-[agkK=:;ˊ1z<<9qeAA2k|F /nEJEF uݷt^~Zf>zr6-%Xz5>4o^OQߝ6 + u,Ww ;666;{y G1w{ڟ"Vsx{zzeڝyYڡd=cuDt:?o//5lZǛ/b/CۨTа~}?b̹s'Y;\ݹcWKʈ̞ܸ8plmm~/7j-J1lBL7h4̙1EK1iZ`6wty"fYv)))ԩSqܙYx  @:u,_D5̝9+W19d:P OsωwSVR-7C۟ZM_×_mZ*̝9'''K"|ڲu~=&ѥSG\:Qczx|'Nb٪ AppנVܿQQ.OR[=+{@Fo(fo0NeɓO9wnWn4Ɔ93BXt93CR3.!R(O*YզMnw ]vѿ" l9a\QΜ=KO[othĔtFӑkI~gAյ?38agkם9*:wimƢ<X5+[ׅ۱chҤ/'hܠq]G];5]?vGhXnnލgzJzcE^.v}O+ʿĉKȪ8YwwIœ}zdluݒȊFiAI{]2E*38W\%܅s` wQTGJ$r{$O Y!ʓBBqsuC)p(US#0pSXe"+=+i医;&[E>e~󣸋BLd%Mzd(?SXHZZZQ.YMzd(JD-])I(nY!Br# IW>J{NU'ddPjΡI\Yմ>aXU.NՎodD$YMTU熞]M;PK-ȇ&9 {Ѵ3*Jfݾ(EYBnއ98t9 [TɆq_]Gcfsp򦞦Uhl՜i`lê8ZVs]kKTb>̏1|~8!7#+Br=jgї΅'So[VNQ IKWxP˅Q7[ i8٫D /4QU0o Z[>;.D,z^?VcJ WtTщ7q%=\aSM8٫wZ yWGkyMyƓ=Gf"9Ӎ<`NJ#ѕqe !ů\&wZb#ЮF΅'Ӯ tϱlG*y:7p\p5NOjP#|}4;5 \LyU-^%8fƆQVcF6=Xv+1ڱpr/%p%2/|\4 MehHOpZԜB<\+RF-N:!ladct$&bsOnƦr1"ƨ|'NnHHcrO>ED{ IDATB@Q7\̘|~0 C> 0+ȸos6\$##lØƛ|t;Yi?W;l:އD#ӑf3܆ OU5g:ծI#W7 GVGoAJJ.Dip!Zl@˚L&<=J\&zdws 6`VQaOՏOW5J43~ eLG_f= s¶!?2x`lX2㿾nE:Ql F 2{[F˟77_}'/}]JaP3x<`?q tdtG_R^V[%Ks;IcՖm=_~䧰2K Sҥ4jA0$!ʮ 4,AG0b}ʏ[/qj.kט6skV.#뱳ή`O Z4ocFh=z d<==s"juF$sqj΂5֮eix;;d8hjۑ}m}z 99#FbggGDmΜAƍxq7kʸѯYֱX ~k4e?a_ұ#~?~_|/V<>LXcԩ+Z; o 2"NNN9捛kܙB<S!Q5~KqjbLxc];w"4,,3ْ:p|ΣVؾFf9't[`0PfMFJJÚ"?p0}{C2gtLefu(PNcm <=?{&U*W`¤)8u Ʉ-Oɨ0t(nܼ @瞽|'3dī'uGkUƍ勍Ծ|t֛l|S/]f˶2d0%_Qe--%v;Nqrr"%%l'..ooǤdY!DҩVԩ]3E:ZdF#gΎK7Δv*z=Sgb6x&wCf!:i᧭>~֬jw?[~\Q֮0e~_zwXl L6T̙V)SYa` oo;Ɔ bcY nEDcX*U1Ӣ캻P1l#Fwn|Y3ڙSa޻DhX:qp\]jU*Wo|˶(jY]tl߉=$.. \ءsc4 QδoӚUϽ{Sًk 4m(GSgߵk,}!jjʖ'Nfh(@JJ 666TVC0l N:gY0{M2_ni vd蠁Vclؠ>=4i巾>zйCu @dTM7FQZ5Ԯ@ppPٰۨqW^ep'!1?ewQTw-P|}y-\|wwۗkO\TL 'NĩSV'}~/XӶ\| XwmW—ku'qlB.=8hr&ğ%匋 -7cϾ6ӡ}%aX]WXx8-Zmy~y~JZiZ,Z@vmsnw7GGG,ϷsttD1{DFE{>$;NȔZftڅ1h6lD5ѣܸyGqJoFC.ןIHL@ukP+#+(];udlbbcұv^9V9OP100|?߸aY^E6m;^5._f9|}{ޞ}WTKOȥF֜Ţ( 7g6TV- #LCr2gϝg͜;F 0+djB!r&Gv{hqR#[Bp8`_(5iB .lظG*VcխkР>~XGÝ'OYˬy1t(~~ܺ*M5~Pj`U 4'''l݆-}{[_z!\j͕:|hǾ߱y8k[>:3g8QFRZr粿'^Uɘ~ {oۆ֏gN?mg(o(X;|A]-mZzhYO׳mNcbPTӣ[W{WW^_N]7f4/s8 Qlmmخ[ms093wt.^)PNK{GG sgNgUL(T“}ФQCj5fYv)))ԩSqq緾z؂hҨ]:u5kt:x7niָ1i;}zr\\kz:1 }SI#[:0פZAյ? CLl,Iý\Qsᲄ(o;F&MxyN>Ao\qd,_dիkޮMFFD*aFQnGF( >9Nsago/Dfr޾)z%(rGV=R#[ ؾgzt-[xIvKTt4__ǒ+8XNyqVe+WPrefN{zuL1NVѭ+'N1xjլYI!T,FUWޫt-j._&5-,׮qw p5F2 G#4m҄y??_<Ěhܰ!͛7o^ 2,]7&_eygnZƾ|Kt:=&Ldg3fԫbB!=a =.ٙ^9|w͚6a4&=w^, @RR6j5k֮¥KDG KdwӭK<pu DryZ5jwl!(>Ȋ0J JZOdT6?ߓ'о&Ť o0w .˯cUDܾ!^^q|g2kv6pBޠAYQ.5j聏mJޠ12%'kӆmР~{^܅ L Λgޞm>"6iiiXJRe?~J>jB@hX(nnh4%JrJ2qq|XNq*,w'>j4ݻvqp=S}\tt4`96.etgretz=~VKNH?oOcFo~Hdذn-_} ;~oFC1gzڷvW͛ӻg͜@:yblmx᥁(£0ysв& w/DV!"OQD(JIdB\Ɖ^ҪwixoH"+BXB%( #U!=B!D2M&SIG"D(( %J"+(:Xh4%9Yy kGVQ4tj~_Q 'sfݏ[xe Uceڬ٬^q&KVSFy'Dqz᥁DEGh4jؠ8ú'7nd{$pі۷?ZR]oEMY!ʑ.;Ŧx25WLxa{Ytz=6njPtREaƜyFfOׇ7nwOb21ta5۴G}ԕ (s0ә2 __n4\+Td2dyU\CŬ&IJ s|+vݗ-ݽwvvvmgvnϱl||<C2}9aggquFx͛Preڵimie5FlBM^ZO6mrϫghL')) ggglmmr BdT^^j;cbcv2͚PR%<%^/OO~ݾ5wۢlz|[1^t`0rvÆȱ %(4ԩ]{ʐ{ҪEsZ"0x(GΝ %K9u ?Y"Ξ;Zcv.Ic8|Z5k2rP*W#>w77<<9{T59 !ʴ.:q;2p9"#ܱMh42}\RSRYd1?^KOOgJ NZ֮^cle=>d&dJbڤwHHHd11m?@zzzv5j؀5+fr/w77jxV-@*UL q2O`/֧g7oR~=M<<{g$cmNcA8t`ּx{3sT^-[[g:٥+WI`kkoLNaRRTVjdӭKgN1Ю-]|q|gsw3Ucj3^zިaUUTfKL&=y0=,C2*jUב# zЬԮ矬l s[&MzM 'GGKʤ Qs}o[~Yo{{{v_wǖ?( ...t&G=d!DrqqEfٷÆw~:od 44 __ EMϼ1+,75N?II:#"n|jzu-[XƶEtQH.=w`Z<6׿qiDVrY&T†xbEjŒML#\]-/e} A~ST {ۢt+h !J$B!ASQ$$G`@>FY! w7wL& e.!qws7UB$B!HOO?juI#Db20h !HKK+"wS!BI !B2IY!BQ&I"+B!$IdB!D$!BY!*9O:"4$`)dgCm4z~PT$&&Ӷya}R$B!8?g=GTqf=qӳ{/~yy|/. !VXi*B0_{n=11Ϣjy3|wDgr'=BQt:1x{yhJ:Qd=i_Жod]qd@K(I"+D9ADEG瘾p5lPn7ndɊ8y 03nkT ,r:|(ffTZ)߬:* tjߞQ#gkw)~ز/ɉ'Ó}zDIrU2K ~.LJ a-۴ʕ+P4(̘3!pM?[Igd*0 Lﮑ5 Y)jI28:j\8{73]:u{e,* QZVkam@!Da Ch$)) ggglms~4z d<=Ϝ7LDFEer^\홒}|H緭quFx͛Preڵi@1t:\]]`ޟ1Y ɔUʶ\zd]]]Yf5vvv6*r&M5IF[6oӧQvTā=řdՄHݛ˪KXv'Nd2akkz2j+DEG`Z6o_G( uԡ~P=l݆`ӓgRreY"Ξ;Zcv?/֭ݣ;F#֘ޘA8r1c,t^>Vennxxx]4_U*[o\c4 gwR2I:0 ԪYÇRR%K۶#GINNɉ'Xа0_SHrxx~ºnhC`2HLLң$ !J;fΟ-W(kWh |E4IQBfhLgzUc\}{dE.pᅗsϨ;zsRY!/[ܥ%>3gkL~^tޫ#R( ܎Um[Qd$YYWԦS9eEDa74$(~`,%5~}TXs=Xz;՝a&^>NqhAh5~4GVD -=#N"kZrm ;kJ"ƕ^U lVAA5i~A99)jr , !!垫diqc".nnݿs9jq_?_Ӌ0nZdEDD(**"88p},-f:U +""Rłbj*#Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋlu] k]W@D/(୕O?sao[j^UQ^[jDDhDV<2w:|ݻ1`Z믙<\NhSUuw`khެ%>ܜrlL&hʖeO6mϪUFyj~""Yĉ'n0qx{{`6:d?}V11]'?K}x'xlܴ_fٻISUL ᅲяc@ٻcLjnќn]:W^]=I;K|"4$32B6lL??W׳oY6??>+ MLTehm)9컒%S ġÇٿ\?l~HJfelܴwbZ`oq]DDS9OڳKC:w?}]*{׮dg琔L\^_2:v&3m.m[ϿfѦu+L8I<ɓv/('#t#=#wY߰Gvm9qékZTK^͛EѼysرС][ylhҸ1AAܵ RaEDb "l,EvMS=ݝ*Gp,%d5\ܫ'P@֭4HH`朹|g *{ Κ^G^^s^ /NoW{ܪpa.ٓK=g_|=<94bӡ};<<<*Q[ݙڵmS׬˯غm;f}Q/&Md~o.""R1YDSGwKzz:AAAeoٶ 5~8tp]Yky2hմk&99|f"\6xw9eՄS[Vv6thWGuww yIލu7xqV-O?ΕW ۫xAdO(n~~sڽha),=aCK}co>mFq^v7\w-{ŋhѢSeזhcdDv۟C yED. "}cƲ?ˉ'1L^EFкUK<ٺm;+)S^ӦM|Uw(vg߮ZMR1BCN]DD*udE#,^0kq A$%'SPX@8Μ_V&L &:}Žz)aW0LfƿA pCu+m[fKhۺuͫedD\u%..f݇^z~*|7{;|ŗ=ut%//}(2 OZf =>p?II'٧=VZmuUꄾVjܸ(\/7нkW4i\=,|}}qu=fZIKK'00Cs wv?la d2KNNnnnUX\EmyJ[p rs(ٷr٥+lKeU}i5z}T=9W\~/۩<ƪM{&{}7_|fyCJj*!!gd=kb!;;员Dhh(>>5~ng#皂d21rm^߬ZJVv6o.]ƺ ͥM3j$͢:~+3uYƿn&Lo(2ay)rHƍ}K]}_{3go[X|)& ƈQwʒ u75W^ɝ`ܓٺ};VWWWb(}ii vۛGݹ{9t0`E4(S'GU/K|o,Y @&Mx쑱mL{e;܉lf`~k6a@عLݕ8fv;WOBzFgϢeLSm}:{}xyz0' ˣc\,c|*{yσٳw_&mZ^c3o>? +/- KWg_~eKHKO/X{s.ٳwo'?kOJ2SGv;ztg l6ڷkG|ɧ̋SмYJɹ'3{<6lڌbQd@xX8~Kbʣa%׶3GJؽvj\ "#"oЀaZ0q26mf#xrܣXV<2Գ-h߶-"#*̏m6(zЀڽs$!77YTS:t98rߏ^c?K8~ח|C/թs>_>RG}rf_zxx0,^:63kXm6\J}r6Sr,%&Md1ƍմ)/=7wV,Kx^}5*KEGNﷺ +rqqq۷}Oݘ8IV>Kxx[׮eA.":5nՒVV}V114m[DӤq#zqۻo_iIhE=zFNNݺt[.vG`ۯmoܨ4o֌GǎlݶG0?qqq!&:_֭/n61LKI!/?N(s잽{y'i׶ S{u?p﹛6[ְ!-7+~M4///ZlI-?A0tIDATG`@m/Q~^]GI/b˙?p-۶V͢酯ZO*{U6iմ-2tȥNw^7 @.]hC.]  &:vmմ)qڳɹ'vGƌk4_e?vc\,!!\ԣyWX;ouES D.iid?Nƍ9z4}|| hbYǚL&.9ĒOÜ(᭨.aa;o%k "[ 8~(9(''TcK]f͏?qq%>Cjj}hb")# KGv /OQwr+pwwQf2(**{GUvgbX %$eذ<K|<]ٻo?s^K+|,YsN\l P6WVM[uǙk(X P<ݧ&BQט38EK_?sLJ TOQz{b>r ouqby(ȊCGYOl6Nffv:mJ(6iB֭=w>#G܆7)n\=l2%VԴ4nyx鶎 ˋ_֮[.$%%!&M4fߢK|J|}zSy~ʤQk7b*y ???'}7~NJ7Utja_wWӯw9{=o*모j==ӓ&Ob9y:ghʽbZrmȐ!N+Q^UU up?k>>//Դ46532YmW'//B4=ܜ+lOymZ?qxBHH:dgg\;{eƍ}rwd=kV9L=➘Maa!״GjKBBFdEym݆f+]<==+5O^|Yx;UVym7ꗊPĹ|߫z L&ŵwd2ٝ\k*Wo2{b]}6i-qڗ nՒM+YDp1B;YqJzF[ϐA*"R~c:^4@DWkP MhH|Y]Wpp1B/ "//O4i\ 7F@S DDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐ"ܽcI $! i77:a͸P)""dEDn^C0!aD6l ((#d:_QU ""7Yz,%- D4 7Nf`o?#7u\9N":V@9v N)KsdE)-l$M59NtVi̤[!""U +ROed.. '+'rEEqM7g?c朹֕!.)oNN~cjf08D"p丅"0h_2ng[sQjSDDjȊSy9drA?H營~b朹vhOvv6]zL{e;܉lf`~GnL$EV+~E&""ijH=@VV&a!͎gdeePsVfD^1̾e7jʴe?f,͢uzv^s(iCWayzI* Dž'}O*i&y^_޽zvhqChHHiHӈH=Nvn&9YL&fs?9Ydf%S -Z7_|Vʿٳxc<||| Wq}h/ Kv]Ȍ%'>>tjWv꫈ОgcIfM.5dA l}jă5Ȉu's/}l6”),Z$??v2w |.q̴rJې!C> !!ÇbD+=j&8Fn^.Oݻ{E05bϔ_P@nNeZV8b!4$Qs/!!A#"]QQyyy4 ?KUK K]fk\uN "vA|N)U DDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐdEDDDĐ\+{!CHOO8M#""""bH """"bH """"bH """"bH """"bH """"bH^~KDDDo6dͩ7a2kZٽo73X,稆+4lH=LZzq NZz' {n U}]iiعv*UWg :6ڰu l wU_Wڶn_7VxYz&'7 *dZ rjZbQ_WCI_WuZH=S2fqMgYzf)\UCeN}]=;YzƄI᪚l6&U_W}mH}c*VkbX6 ڜk;dEDDVFdȊYΝsXV|}}T}oL?T?s%_ޯrpW?vS7p]pu7p 7q5dZMz_ۡYz\|]TT5kv*n!,wm:S RRS;q+l6Һ:k{dEDDS퇚M'ky?e}h޼f /wʎֆ9_#??ygְYm6[+??www憛[U4ȊH)&VkVItu|4o yI:t`M1cࠠ T8xy,~۲\<+r))ݷg^=yc<<=`l6 Sy2c ߸}PTU)Ȋ3&S(amvyyy"V+}.4lVxM՞=ѫG.t0O<0d֭NoيgЮaa|wXV233ez Pt+jk..8ںm;'w/k<8V+~`d2q1rО\u%V-۶qQMnn&Y~}=Z ""RU?uߘz=}{G%g_:ayGL@/6VeDE5mdb_}Ez=$iƥۼ &1)M3u3xk%c}M[޵+I̘js}}&Yz6m<ɦ_e@tҥϿ{GyV8v,*md@~=~]=Uk|#!Eҹ3iw3+<, @NN.ii9;88k YpAA,Ys뺯QojI~"n:"#">K3fafZDLff9,XАǓp{۷Avm S\^iuY[}yq+tOX8p ILyzնMkZaop/Օˇ\_vq![4͍f͢عk..th׎ Cyq _5 #X2&kN """Lmmhݪ%eֵ ެ~ 1-xy(&//Osns|U_^à 噳 cllaY^:a '44Ν:Y5iS,{m,_A~~>mڴf Y|YY@ ??_&.bs/`c).Vl_cZrmȐ!5\%+~Dϯ󧥥1}߽thWWWJh;tqu-w[GdĿn6xxxetpʉ'X,}ت\4hP_l_)!!A#"""Qm#HiM&SEx{S;K^l6[mZڷtg#&?;/CUϤ +""Rϔ>?MqrӍtv,14N?oi_no8l.]Pf{ee}ml6''2 EQp\iɿIʹPA ,m҄Ec&۷Dz,/_em7*P#8'xw.]pղ"i ׎AvVq9٩#@>?ʊ ڵS;[⾻&бclwYrրlٲSfܯ0Mᅲt^:폠U˖2ǓmpG/A$3#x̌ 763g [Iw>tѡ}{(WoN6mpl߱7*Қ݋gernmZfΝɑiߺ5-[!Sq#7,.B6y"W "_~a|_IC.)hזצOgBN h,FO7#Ϸ|<;I(h2N'-70 :v@eeeyĞds4ov|;@S5|2ڶL7N CAOIΝȠ%K&N~~>:tE8T>5BYY,YL|>Ihr(8}NNg ( ˲x<w Æ?A8feXEkaĸ hn' OѰaV\E?,\sri(֞$Q_\ye4_{T8`w5k'y f Ü|R/t晜`n\x,DUU6o#.sqb&@P04 U5%>0,G^ɋS񧟡j7( dӡ}{.y5;u7 1 k'zQ׏4 ]<֭❊߈dBFutlƼ,\t-Mn^.GQ4iA ɓ/Xq3MP8,Gz9f!eeeD1P@SUt ˕=dPݎD4~?h[նwC֭L~Y‘0)Orβ223uh4Z#ď3BtNp8eYATMfqٴi7 mq\DQLӤ&UD" ƍQYY)55Bv5kp\uv- 89&K4$:YHU|b(!ݮۑHGՐlUUx܄áIOKKݥvgUӗiZdffa'^yC!4ZfI{B36]'%%Ɨ̟gt:xl|b>0HMI! b\.W)[sIFBl6[rYӑ$;K GϛfOkɚ$DtbOE!//+~5M4ͪP#Y!UUiҤ ͚5o7@v%KW#iL !/?'QdciB!ġKAK!0 !BD/aB!!˒-BqtC͎–e՚81밦ib1t]'Ɖچao(pU%ߟ]*Ą{<EӴZ訪|/5^0LTT_xBݩcg1{l̙CVv6vp̚5f}ƍw\u\9r$~{/gG,9 |駼̚5kҮ][l6g$EZ/u٩_RcyYzx"fb1ޘ>fMuV>vr@*u0FN9aYx:qx>L䩧gϞBr/Q&Md]0$'nGx#?5a֨ ÔhԨ)),?擗G4iӦZٟիs9TUe͚\N|>?.d̎;,222&_0HO'33wk/,rqK/ѯ_?EO>SNdeeq8甔HKKqFTVVEQ %%0(ݺܜ:,MuRC4^k֭ۨ(tѤI^IMuJ<yyyR#beYAƎjnnF0=;;i…?pqD~nq 8cdZvDt֍Lp7G/A4[TݷbZd{]< r-犿]ǀ3N Fyɉlذۃi<]իW٬,[3C^ٳ,M駝F$73fqK/E5~icgܯ_ ##Eѣ{^zE> vm2xZ \+(JKK_̈́ w( K,&1}̜g#ck G"troZƍ?< L:usmkt6NQQXxbƏv,/,ꫮb5y"wq8p,*N~0Wv0vxD"X-J! cҋ)((`…~3l^$1d6l@,Yfl6a O>8=ztҨq( hg3;{|uF>3gϹg'z2qhƸoguQу]q۷GQ9^ģ{0^!VMM,1C#XUwV6zz\pXUT-1ͽ*Jt*(hGNUeYx^mF=,+މײ,?f&4ƍs1|{o"gCxs7w{1M394]m e1MܜČPڷoi8㕗ߙλt֭NC_vg˖qר=Qm۶c?.bB#G^ٟdR>L 9<sxtxpk~?^aO ]3Y'70ء;wLՒB隚F*Uت ۷B^^e2Mm݆p]USCMRN:vc7CqqqϱuͩS fcڿMiѢ+WBU\.')tޝI^]6l߾]Qƺuҥ pM0dΝ{lR tMuVs.B6jU֛̙3˖֩u,W^s>3,O8NӲ̤I&L|I;@ # ѧwo^u\.-ZYf˲Cɰa׋b!?o:|Gs,&Ott8a̍1x{}sgʦm4= BA^U{16ki{gv<'E8s̘1n@ PcH\5MC8 ?Ϸ 81~=:d_ϛr}FFFeeepdYVx`0o4zu:]I*ԸN҈D"ZJUU‘Hǃ(x>*++$!WtrPiS }_6mڽT''NG4,dԨQzؽm)))BO֮][o`;Mb~TUa 70p?Eaʔ)sAvlv'x<=˖-m.2{wG1%BWN!b_h~:ɂgOMB4̰ |p8L(گwﭼ$B^_^GJJJ"^!\%B ;ᄋMXYKFkXy;%a?z,?BGniUB!V=~ݚE!B8eFaKSU.7'#w5l6:t~5;NV5/gI!YE(0C`P#BC#'ZHB!GS ~([t6?J4ܞ5~@!8N:7YYYdffҠAN9TVXO?E0$33BHBʰ\}UviyUrEQ4 MӒA'XUߪ>쭖e*'¥jeQVV_$???z}Ze%/_UU+i~BT|~&OĘo4MTUeŊ̘9p(СQPPix^fΜUiذ{.-[d֭[oLgX3f?FwM4wcS&Ԫi}i7n䭷ߦAv6V!q#Ffnz1Rl6Gy$Ç_Zk =!!8L-Z={ҢEs:;t]gժ;?%[JعNee%^.ȊB{N'ee\q߸m|w\xP^|En7/HII ~ p嗳uVVlڼyh4֭[{p̟?߁f՜|k46sɧb Bjj^Fl۶tI<_|kG\^uN9f͚ů0B,^/e54o֌.>č7݌eYF0  ^@E8N^|19n`DAtԔYGԉ!acaʕ\6b}(BYY[m㣏?fΗ_rWӵkWvLĖe^AAu$JD(~1zF#8"UMK>͆H%$!b1ӈO-cb=` Ⱥ5kо`c=ƍiݺݺwpm4kڔ֭uI\zpLwq;F4 =no+ XXX~ IDATژD8[wF [BHBzeh44SfZ>l'Ɍb-1~<_}5i38w;+ )))I&L;wfE<#:9nU(r,#5k6k֬c'kω&֭1_jU|4?:P&Ol Z=ʽ>a !zG]Κ_‚ypдh=hݎnOXi8NTU4M`<:.EQFa,\.WrTPTӉmY|1{<?[{؏fr-Z2zu<2MeQWVIfn}l6ޘtBv|>_UxA`&hH$B,ìeI H5!~#|TwwO8au 㡢\g9FQtMGQUR"F![j ,]M6%82 ;Ѽys͒P#,-^LFFJ8`7@BB`ՌsS|iizW5"33 Gv{݇!̪!٦4=hV,I8}zuF%!D-nj(˩OsVXyxgpbC;w.7o梋.C}WsQʤIxGP_^yP# 6ТE n&N'ea&i& @ @ii)ph4Jnn.(B88BΝkj 7n܈eYhS#,^4nJ˖-ٲe uV6mJVVŔahݺ5vZt]'аaC(4mڔ4TURɦDai%%%l۶ UUi۶-EEE~RRRh޼9|rl6`\7nLEE , (++###ۍirGR\\ mˣA 4jԈ.Y֮K.]̙3Yni2h ;8ڷo߷!L ׏~q%ТE (\pseѢE5޽{D(**0 .oN0dƌxJƎx<<&MӘ?>֭c֬Y\p?au;ZƎW_M>}|t˲0anŠݻ7SLO>m6,]g}mFQn֭yW(JJJʟzjC]N}63eTv/<9r9FD#aN;/{/h~geŊx<㨪ʦMFĢQXH8%q:H]"Y[ åÆ{2D#5N84 } 8h]w]kƣ>ʸn娣J*dI8>SfϞg5W_Sӹ9Xz :UU:i Fg1 ɽ{c&iW_Δ)S䣏5juhwVÈJ|t Gz`| LӬMug#F!121F(nU3l޲"ztew92``Z vmX 0tETVV_uҒKbg}ƲeK1 m۶ҿ!*֕L'<$:G"Q^yUz:=Od˖-L:K04Mbp0ر#W]u%CO_4Mt?Oc<ݻwoS4s! U 0Qm&pÈFԩGum۶cڴi4hЀX̨QF"LJƸqѦM[ZjȑWrnロh4J]8***۷/~-;vbx<LӤ\:wB׮]81 Ν;`iݺ VG3c rsxGŌG"N­FFF}o<G{bI|B/^?OFFQZɓ'[C/*eBTU(, @0p4}>w>H$ |>4MKHMM狏v\."ޏ7xRSSFv;NUU1 Wu=OU5`وD"h#==22334ϖerޝfc&>EQHIIAQ(ii*M6x# sxXVx5M#b(++Dj/MphaBZeHQ6ou~`2gFQ@UZFQ~99i:Zfn}l6ޘ4? !D=IazUee%@dwm عs'>e& ꣠p2I4==.h~@ @ ݳTTT|V^as:Zb{p55m}i~P#9T5ٚ`0?|HN8q"6β,`{O{ޞ/F!^1#>OpC?aBZ를l'{ܟEAZ4} ЊȌB!r 8qߺ[zݠ!>79i__}g 5B!j]:/̡)`@+āR}] EIMISP#YQUڵka|'&` ފBFzTW33 5BQ ˲m6:vD#!JV,8jUU_A^!kUBB! jB!F!BBB!!B 5B!P#B!F!‑psm`00MS&jB:l6?i&ZlE)(hir!sȣҸqcڶm˯BС!F!ϦyGy;v,_; ظ@i呑A `bt]# Өq#>>I֭Y%%%lnSTTΝeXI0ء|>L"+;\Y@SHBQGO?CAA;F竱ƍrPTͦ,^$++ ڶk˦X駞kfΜ96ibztk]w͌3iٲ%a/0- ǪUy9 5B!p8;X:[E~~kޙ9Ɗ+֭"ᇅ?sكY#4y2F]ONS{|DFM&Mu/TVzqګv6GvѣtTjBMr}3|z:EQ, 0),2[0 X4 ăFJJ FfF99Z`0HEE|5tԉrErF \7z-]F,cCQiɇ#$!X,U#G3z\tᅴhќ_J3`,\>M61|ewb `櫔TYn= q态k ]gѢ% &>ۍŴP#,n3xm#;s䒋/wFZ4oi5FD>:* O>M7̰Ko͠& ŷbq9FfFDQL<zх.4/mBqRUY ]QX0N?` (8v;(*i 0 ۍa>/୬@Ӵϖextʊ ErU)ʤ7KI4lfkVwdzcRS#p8L8Y +Pdq]+Y$!D=(  Xb%K/f!qPjCǑ]p#F!=ir JKKy͵r ~{N8'ii{^b!`Ō:h,KZxUM)ڵ+h大gujF.@n6tsu݆auVBzNjiā:P#L!$ԈZۗgHB)h9׮]˶mۀy999F0 .\HϞ=bOǵm6lB8qƴlЦi .DQ=?|HBQ#@_N^uˢEꪫ6lXlBͬYٳ |L:2 o{et,KQduKkA4Ν_(曜x≵>\?jBM7nn4 zt֍|EAӴs(6-3ħWU{キbeiڙX{zx馛4 ]י6m'Nddv]cԼEaٲer-?0 .b^yڵkWc}!Bi~,ZEQ޽;mڴ+,x M,4M‘vy<?|x~ H8tDu8/޴^u=}1giبPc['!סd0S1M=s=hժ[lX.h4ʠA>|D322裏0 UU1-tJ  x}kMQ< s%TFògY>qn端bΜ/?N|~ntBQǚ-⢋bN<4u]y睇"33+nݺѶm[f͚ͥ^n0v1f̍λmۆs䑝9sguvó>ZMMEE/n_~ɠ';3kWM<3w̙3CD5j3-jt}wU5GD:t(i*˲`yl6|>N(//M6L(:6zp8eYת>r1k֬ZC|}>|pZ,Pj6 * (qKt ![c&kh;f٭O&}d8JR rj^`{ZQ<(lĉ7N=?WBB:E2 _cԞ 5h}jB1MLÐe@Va`Y&u:%!D=i^o% M:kBeEyU'_k%d7jBv|wt޽2BJKJ:5JBzHQUtŋ9-qp]BÆ رYuz!,vӭ{wtZ5V΋8X Pdw8u˲KBBӻ`˲uns! u.F!qٽ⠿V$BÂ!d=q]uJDh48(PUNݾ$!D}+([%Kپ} |aAAZjUyn$!D},/,E?D91`qPھ} 4P#6Xv-,kAE!;Y>4lkUBBׂj' 5` 6jZ 5BQ_UP#`/s(IBQğ/5M0 9!R[iƲe!r ;;^z[oC-F!$I؏LC=&L.3q=nEQhа_ J/͢1rrrX`.h4am^kJBz^`)MPu`֭QTTDe7ҹsg,v:ap1ݘ>}:-[D4RSS hǃijz"B)ԘR[Sse%r?>_<Œᰰ]ד 8N,˔Ou( HMB2^]%Bf#55Mӱ\]ד, p8'~z5*55B!jL,i~UQ9a6g?_~+WEQP|>HΝ;'i`0괄'o 5B!p,OuԪU+&L]דG7mڔ{g+Wrm?{gGu_UV[KZ-YWy$uHgxda%$37d'C2L2!1jpp 8m[,ɲ,YKK-]CWUeY|?Z]Unݺw9%EQPZZ QAB,# A@a $V"IԓOc0l? IDATH' R)B7 "OWԹI  EX }ӓO`Rt[Τ;UjRA/$iJuiO{nj u,b1(BS֛obs`ZBmF߉^D"Q\EܤhQ;8Ĵ,K,!{ X(ߏd2Y6 ---p8y1ܹpxʃŋQTTt H$~fϞZzN{#Xl9}w'|);qvߏ%𕖚c?( ݍx4 \|m0y$A<,<=(HRPUW6}addYyr=Q(8Q#gl2&`4,Ad'PRU5 ػw/pul,--jTS LN9[U՜l`S~.\Ckk+B/dmA$m5"MdbEQHAF4^I]X(8tPVFu zu=CUUs7a&XϬ녝 ePrB*osݦKC C:.L0(N3k*RЌ B\.g5& )V' L]43gX,ӖtQ +Ha+̬|'DQUILYRՙ.s.WDr|'\P?mxx]6-,  ʱcfF86[!n; X T)QNsli_6')Sy~$A$8NM]-͇(p\X,bH&YU/H, Eُ~/..6-*"gGHi~?zzzLka#g?̨;v_XlN8a=p:Fޯn灾}7۱N/O&$A4C[j]riZwY45m+))FL\}wXpa 5("{7B&` Z*;DRu5<ƬuЪbxxGE|>,\>FSsݰ^? <;0;9s:zALUx|JeEw˗/3Z4 Ba ]]]D" Jٳ$rzˎ ؿ?FFFNYRH}p8x`0xJJV2Naa"u߾}BСCp8}ɞkdD"SJ V+:;;1g@N:!iӉ׿-5%FI:n`BX Lkd6I( M[g̜{Y-,q19+B!,a===E" qp8`Z&Cgp]]](?>DA`c.T^zWh[זybn"^/hAN3ޭ)I'z$Lec@޻ݻM)$ uJ}<`ӆYS“YwHoekooTUEuu5188՘ ˁS$sUUUڵ,8~)wb6<6S"M|>444Lj}abR4C.|mVNJrTVVEOOɤ)W0+u3+*++3a] c2<# #Lh@?4mNx~CHMMbQ3!j2wX,x?<<7) R!IL z<@1wӗOlD---Yy<XVذ}7J^ CAp8044djoLP{cZ ԰genq,s3A3(jA !ۦsDnx '…/'hPfѩ&$cՁR[,3B`"Hvg!LL'ϖ'Si;$p8(+$ݿfMYE4MCEE?'&̮$)jƟc!bL]/$equz!+"Ro7t:yh&K3hD ]g|h&M kQ#'G˖XVUwč([f@/yc^_fٰ_`VȽi`c24-$m6[v`mvU,^ŬHoOP3^!I/ l{aAfWQ?|f㮧MO=\.8NS .Q#IPZ[MqВ $Hsϓiw/doQQv^D\c1; NO_y}ɳUfRUDIw 50Sig5'av[.R htj#:zU']bcm(}Y+O.Kf>7A3@aA!7Yp=bAWiRc5u~%&TU5mgV ds*ݍ5Nَo͐^INlKsF"jA@YYY֥,/,#z&[>7#J+.UUM'`œmdƬk'v,Dqdq[ce4f\n, NF濟JV1 @K&$RSe@H!8Y`Ht m05I$ꁹA O:d2q+wX`Me̚-Q~#I3[__QfEQ zY YR̖gkc(ѣywַlc&7f*1SW*|XvgIՕ 8q`e]x5B%IBQQQV)G;A*Qjj?n$_{ ܹg} ݻ 6.0y[[[yPJL/-**sB8 k,HRb7oߜl zp8# # ճS2O|__ߔOcdd flNf-5 N0 >i8J5X:9כq W@TlY-fF?kx(**2Z +A6> gp=2f!.jn巐`eozaTyreV&bDLy;gağy/MxX̵.-4]P&o}r\,`4cj`_N81 ތث3,.$ ]ˑVgKV1KMYYTUU$I)(ơ(&<3I/K4fٖ;37;.x̮jc{ۂE6vuž3{læYV5g MZa)hҥ* 4 Ӄ%E>NYnN_FUUnN*r|rYQ1k, *3eΝkH%IӱL L UUUx<\PR)ᬱ-VY" ;Qb1?⨼N =3FUUl6466Y&$4sMÁAӃ8{f~L[g;٧&]묭jB\c N0?.F/gG0OXH{{:ʹ?ֱVUUaѢE tle_ȮجCf3~`,688/J.3[ATUUg4?%U+|J׋B->K.Egg'褦|trk>/(8qaymOX,k\ Мlc y\F!a׷ZXx1p1R)Ȳx-ݛ9- & Q#>/T xRbE@UUUA15DAFSUn7J~Ks X>((`!Te  ޷' 39bqrI b&TAA!q =rsf֥v^]dCm HԜb;M:bX7֩g5p^N>I+nԦ BUpZw?D"Ap<#㨮w܁`,xQ1oI*Ν/| HLxl#\eDww74MCqq1oo$oao|(..}$ <üN/o&qXV;twӳCQD?|A?4fvQ'Dbl?b`ddwT [lA4ŧ>)TTT?W'ɬ? fJ韧<B!|>:I4R)@=}2wfl/3(f ;^o0Ef޽{o\[G IDAT#L"n@UUEA"@"໊777CER_ݛkf#Me2UUEyy9~?awslUO2D";e755A8q$ zu]?{X,8r`Z*͛Պ{@X ({e{YD aA( .]bDQ`0'Nׯݻq7bժU\c``,:I;X,}A$hR444  ^^^*޽(BQ ```s ’$СChii$I˖-$Icx***o>vP˖-ik}v̙3$bkvʸ_G}}=RDQDOOpp8E$ .B,X Goo/zzz2tbp:!_WW^y=z$AEtww. QPQQ;wBQHχ9s 9!ȑ#H&bAuu5 BVϚp,#رcrs O<, V+?e^x!aX I6nh8 pE+fYe<bYU-?yܹׯ7T*ee] /` `̍tRb\z뭨 q(YqM7\H Hnŋ/u]H$ڄjPF(˲~+100_~Be{ظq#I3=v~!6uxAoeV¦MٴiBpUWA$ w DQW_rl߾[n @8ѣG\E̞=(ycc#e3+Ν;YPWWg,@WWU|>XV+|Pjjj_lܸ… H$i&~Kbڵo[XV(. #Lb׿-[۷oiSS  eسJⳟ,w8?"JAQ޽k֬uԚ444 fa`ڵX|9> 6@4twwc``gncѢEꪫ /@$I\}hnn,(//K/Nqq1J8_pa޽ #~,TU$IӟZ\|P[*\<}3/{b`ܲMQ\s=v;w /0FFF odYjFii)NJX,(**BEEE9tصko窪b4aUUqWO>$:::x_zk$ \0דb9scA&L֡PV,cٲe8v"~#ٳKHeh ܊TTT> @oo/>d2iX(++ZEtuu;a CCCضm8}`q)lrAPRRX,N?>Np8{btt(jn+eZ V!Mr`Z1::j|Ci>@MM /_Mt:;NA>+ߏ@ ;5 ]D"}b+WfX{bf;3pfc‚ yA4.L[2(iICii)JKKrRRR*f_p$ Xr /b1ĉIIp<\.!bZGFETUU|~7rAUUv͆d2yEEN'w Z!0X1PQQEQ`PZZj%I`bqA<8s CEn׿_ i /BsA}}=y)%KvgWK,F~n* `Μ9hmmA,㬳uvcƍ3Cqqq+Lٳaٸ Cf} 8vmmmّ#GpC9dY V8]&J{(LB4ޮ%,# D(0  ^X[[0xaOA`X 144~.IcXyV܌^{hdf)ocAQq!rV`&=ʅDUU?傦i7o$I`aq],=.X k9 e˖AUUny_UU>_l144d/ `dd;DcD"8~8~?\.#СCB4j+?"Ex /^VD">d\ LL$Ho&R]RQQcZ?J? aܽ,#v7o(ؿ?/Ccc#$I/~~?ܢTYYYf@,ի$Iرc1UUQYY etfYa#{x---` с-[@ebVZY?ߺu+7A7F*Bmmm; o6V+k˖-;#D"cazzzH$`Zxy k Ͽ؊7&5MCsshٰc~yf^Nfukoo%y]]4M㫫X<f6)m/\ Cߏx< :; Qs<%#惩i9眃!歷2CeY---DQ(=?g˻' 6z̟?PU۷or0|Tz!S7`U@(!{ha+`R)SC_8vX4q8p8>:4 'fvh4ʳ\.Hd2ɯgXz1001If`edr8χP(ąjB0̚hjA|,lp )az.Qr:2>vEԇXNA_?.Z?q=YjNG،?}`I<}E '[cfO\s "ʲl^{ce+JJJrދ8N'WzQBn`n}ݤR)zX(0aV1reX8v~O2JXкzl?Aֆ[rA^x{!PYm}n>OsŒw.< A*8=-5l`ѩH?&a*-^KrA%_<'3v2Cs)? f:(..ƥ^BTv7{3m A!,˸ nݺIG*A$j8Я"(  5AA$j  HAA! D AA  5AA$j  QCAA  D AA  HAA!  QCAA  5AA$j  HAA!  QCA  UQ?{6Q7x).|Lh$s&?{A 8EpzU xbyVg2fΩ bjˉ N\+7׋A0d! D ~lOPP7w.;PXF>ePԄY8\>q>!Fw~桮5+V[x啜p?(f[fT^ ?QCa=xe_j:kk֠`9t8ڴ;;wS::2y\/hx~lԜu(?v%P%B ۿ \k΁wyVi?.oFs 5pW΂W9Mp^s _(hp{ ig'þ{D9v wطoo@=`PqT^=l+ p:"_o[Bo~3qݾ>x&-ssTj'`y)^x?)b vEP** O87o(刭]k )Ck`xD/xX} ±u+?q \w5Vf;߅ F~3 3)ut}+V⫛ayu3b?)[ny וWAz睉>u^HwB? K AdC qgp#_Āy3T'z =痿 }\/6t܉{<[Q#:t%,Uѣ(>2:|}=B2;~DQPӆ=4qHkKy@e\uؼfYE/`V0MKED$3pO} b @_G$@Sɓ?.`FOg P.E@_w~6D|>DxZIqkHL 1o!b4o7D򬳠97#G&ߐZZ%-?_\]rA Sr4o!qy͆Ě5w}$?џpDY{(jt,IUsl;&" לkF`ܶ] M>~?5VA,{$Fꮱt;% /ybыʺ"M%QCY_?^O8f Y)+hX:T-:z%K ùq#>YW\#bFKΝG?j[YVokw֭gիDŽ¡C5v}XT}M z+Wߴ b"H.X0Vΐ Xdn5,O+{Q\9 E]4H IDATgWcfC];Dq, xh6F]%KlPN$>=%׿$!U_WkH É_Dk!WWCZ!z53 ۹z5;-MxbBjWC[KckBIXAć>;ې?BY鄲x1"mek7}kcu"oX>v- 5/{9m>$w=ԚhV+ο_x衇OxRt G Y8QUԏJI XI(4z}5|F'>8у~,\4mZ?'K C_9T!AĘا* NGꚛ'v~ٱR)X[[QկE'.LAYP$O3e=dNbo*  QClgHL55!rve% H?ѫB" SPL AA$j  HAA!  QCA  5AA$j  HAA  D AA  5AA!  QCAA  D AA$j  HAA!  QCAA  5AA$j  HAA! D AA  5AA$j  QCAA  D AA  HAA!  QCAA  D AA$j  HAA!  QCA  5AA$j  HAA  D AA  5AA!  QCAA  D AA$j   QCAA  D AA  HAA!  QCAA  :\4j ⴅh0%j4MMCq:M T1NV$A?W QCAqCc45t4ӤTWy7H⃆ cZ* UQHC 704Uj3_ D(ϋ#*Ϥg:PU TMS$jH5It#Al-GFftbJTΚ o{raʕ5GUU!hG80S#8n,?`14<|.m 'Ě5kPSW7)Ŧ/jRe{:R.Ɗg!JSFUUCSUt.IlLz….nAR]8F~Θ:5Mqn/T͚U+u+*8ӍUנ1gyS0SYO\u^m˘ bn@[?Tvꅖ'(oį~+444-¬)S-×e|͸袋p 7ࡇBss3.\ݻwcY/4$?ጮ3cj4 $ 7oFQQyTfC,\ 4m]ǒg\)r\_axDI8V%w < xIS#v 3 ^~e\{1<< I)J$7>;?(}=瞌85uoŞAeAFU+rɲ[b2^-B#nq!|ģ>O*)g33Ϡ_={18N~l?Ŏ@R(SPd}+jH$~n#LZAIĖGKSW Qؠ4(EߗjhN bfȊz}|K/OXy˅n p(n@4ŋ tzذa<OVĩ*04Ȋ`]]]N5MfC,]}טA@MV Q3EDQ@q|:A3vhD"/}Kgx<|į~+_]S d߽ދ_~Am63K$_{쌊vȆ z AVUYfʢ+~a/wQU{WBBA"Pյ"O$d-?f2$<#6l]w7߼MnXQ4j]ƔHE&W]&`@ Шpċٷ1onY`Ws]!>CV+;w;2-PP,  1}5|6***9r$Ce„ r- 2|p1?N8oư( i5UuaÆr嗣zC|XKFck֬O8zm;{"~i<\uv2v:mc4$ L>xΝ;3o<.r&MTCV?tCWYvUUٱcP{tsPoMeYi*.^_dA5'\ }3󟢲_cw߲,B a4FfoipP?4  CPQQArr`0BPN+@7t,sHO>nsM|'Үڪr 7ЬY37o / /M6$$$]vu`lqSϱfÃuE[6ӭk׈9u^#99~d)O-8ؔQb02e ݺu0 ~NϿ6n/YVr cfeAb0| _~YFNINN6]}yj~"s$'':iii4oƍ4 Κի(J(bl۾ UQi<ovX4>6lw{Irĸ*|>_#m͚|`V S:Uea+h~=ƍ a`tNhsLVB3o:̷nb̛7?Z^4F6>&30-N:)8qb9[)Ղ{zdúu?>!777x\.'g;;3r5OVl8N  b:`q8AtCGSU.FxL@4^P"^{6O? UQq:#bKQ¡HΧj8NTME;0kI=Ru5kݻ#}JR'&$eq-?EIi)L,/_矇b|"Ea1HOO~zzi|ŗ*,[׮]7u/BڴnMnxdߘ3 p۵* G.i4MwiJzFG hE=@jY`ÈP5/Q(BUU4ʩQU4MYJx{׿֒@l8]nR!  6LvFr!ܳ:L",S&w+S9ow\ݿIؾӮ'ߠ$fU&Rm*~-&Dy9 g^3NEwIekvY˰oн;tg ز--x}{rO?"OPyyz/o˱Z Y{>]\ve$%%6x4\,+xgਪ?N7) ա9 + 6tk`$ҩ=~ZɼDzFf}6`U7a;No0\?# kVi\~e,^b*++˯Xzh5RPbiaw97_ì" rѳGO4M/{dΝL:-[2q3UQ9%KXr%‹ x)  aZ'L;`m{Zxj~!>>Q=²L D6ap:v]#K[{Ή<&[6o{Dt]OMvꣀC~RLQ׽+mrYu7%pxnF7ri ^0:}s(۶G_y%_v;veS2M8cѿic_F\rCٶ-R'L tu{kvSh+W櫯v;G.q&6&j:.ZW\.]"S&Dz+4[a6F M٩:a'C^V&A`{JlT}>Tϩn+-✳񐛛Kqq1Zk]ua(fugϦg6 6l඙3[Qkw[n{aܹtԉP(it,S&_Ͱa~1b?#99ل^}5fϾW_.ݻfZ q=IJLQqgsƍ%  NY$^' ijlDEQ(**fѼys|>6lEWa7 <-[A4:u?^|19gEJJ inZg7gСXvv;W^y|F],[}tAUUzt`Рz X#w8ہv)yX-apdz~͵q|>90tQ¡:wi1\5뮽G̡8dax iP967duq0?n(QX"lXX<3w=#ر(_.\L'?{ g,7 o/GBUUww}YQ;g/Ob530 љz}p8ʕ+1 ~[)O]۶Esi:ӧMe?2bĩ$''ӫW/4M4-^yU^{vn%Lb >f0pͳ1M } Ǝaoߞzmhޞ5PeY";;m۶fQ*++ Tz)--4 |:hFUU|$&$ii*R^^NIi)=a`lw9.FbN"RZNSsw v5zݎm6,4U6 Iȥ#-k5ɚqYg1`Fz!44,bk/Q ZwJ]TMt_)71~~uvmYf5n.*Bk{FdaW[F{:6mmxe "!2%xSRb5</gУ\^P6ii[Ϫpy'9lF];{ ;ٰ IuӺ}ðP@,YظU;tamw!S%-E3e!(>ՊļĚ5_ ޽{fj݋)J$敗_a}z;< IKKC7tڴi 'i|Ixޯ _YE~˖̙(J|>۶m#'';veJvm[QHqba;Щ-`YG֡]ӚdeY 믽&VeAR\ 6sN4ʢ=Dю T:1 #X~l6`WߞJdl:|Hıڅ[AjX>`U[4MI~V8N{,Z kT:3?\}M#t !cq.F3+}㎙M)[=ql۲R|^/iidBT`wI²?um8 ;mr|>/i){Jl b+jyCyjZgT۷GBABB=z`֭lZm`֭[sW0gfΜIN9N6mD.]X 2 GfΜIn]2d ӻwo^|%N8x}Q.Ev?Q#F0j(͛f1פ{ڴiW_}O?KmY~=J3xjEQHHLonmb<>{^oB|\BsE!...ⅉ~e˖\6~O9]$99;w(ųE]7ހsϡQy9 =ZC"QʹtRw"M äo|li) 4x~vA,n*,Ak;ftIQ֮R`$RnAjrβ_tRMƊՑFh:hK˲vmui^ 7"IwǎPUɀ c~EBC;^l4ў0p\<\e~'4: x饗ϸItؑg~￟o[oc]xa,Db&_v.yOͣyL:q:4lƀ<, "==7xy?E2z"Hgr9gEr{-[r}zJKKkS^^κ5(//>ӹu4#OQ+3 arssQ5`0<)<<:wuLV?O^{m\UDrd5Evd&֏IdݖNZ'tKnn#O;_ee-gYT÷ԽKٺ]h,ڃ7r0ZCO5矧ѥ4f%kL~Vfq,Xk\ױ`AGE T|='O_߾|>;U>;'==w4a@7vM^(z\5Yw3@o`rPʦ!];Tgݶv6v(^ ҂1qr0S{܂rW!%u;۶:jA\;9Gdb,QXJJ s>5C7bĄDf~;z8(j^e1 ~}2ਣY4IKK-#1hB".=:fk8fAmh׶md3f@uLä}<~4;T5o3ԈM`kUj[X+->{1V{~TԳԀr$ckld&hѢ233ީq5uA cW_uVM,RA/uLG<Ĺm膅ѮEhS}!Z~h>ZR'sIR>ʩ?o`G4ofg%%8LM#0~\d̳8~&"2:u`:EM}e#-Z<|8˗ɧci7@RN*7ۆ = 3z5IWOY6X 6׍G΍ :4Kb`++5…`g3Gx\6LF=2(TSӠ1-1+<]uӭMK7BSc*hLYN06 E#4>ozooMgh4-:۷e͛G^^qqqLK9wV LCf"ditڕT|`YX! ߿ h6BPp9'UÇT1P0q15Ot zTnDbMVJ /@i1oMkoTQQ̞g욟kݚ`0ܥ3)W] Џ:*)S2ujD=$O>dž ˆUjʍ}Hh6ƞ`0VtMT]gO2h<dј?>-4=ȡ5!LG…,Z=}eܸ:dVt(Gi0'YO!jxp]XԀ{tҋ/FxQ, ##/?_4C<"%Gz`q:]31cڏԇhN9% Dx۩7ݾ/du\K];H=juVRRӴt%6U2IOwnw?( [7m$=.?@FhY[7owٝwPv 1Xe%cYŅؼi#wløeRSS]i&gfRc}dy{n&--ɯ2"aП0OwMM7)+샀RnpF]ER\N7aNZp8DqQ1Ɯ\~\ٞ~1{32ٴi[nFSzGM[oaPn{Ƽ|Y͛yf-[CG),,OD0d6kƦ嗥=z]ǞL6n/˖F?ڞ]/~LSaGw>Amgg$c͸#[qAtGz) op @$T\\D 'm6RRROH!B EE{4RRRG0t=+m6;ftfIM)"i$TcM((6nO(DqQni$lpͣ 9unᆦv}:dD?[)z۴HʯkeY8].sr6Tp:{4?|sU+O|:nI㰱)0Mz4UM}9 ٴC)‘0,F8*j29_G^9hQcY wV^a aƨcHwa?όAiз-' A#FA80 / !QcYAAK&^[SV`:D p8b۴e~~$Ys  P}ޯ5ƲC  `Y&ϒ<# "jAAQ#  FAAD  AAD  AAQ#  FA5  "jAAD  AAD  AA5  "jAAQ#  FAAD  AA5  AAQ#  FAAD  ؤfc3Mp[  FApAOpS[eB3GjFBN /Ð2?1qT>%ŗH#22ulx4͛}Y/Fjѣ(:t_O H\[E{fţj$v}lhsd> oNlx4ezS5 FttVvmN$,%Kтرuh?ZEÆO ͜d|i ;(2m4cIK*$-YBҥ}7%Ԝ=߲SCAV^ί⇅e%S_įO>}ʶ /~=`VΚ넓푇Y,Q0f±kWj5ko>zP,_qNADxtt:~5Mo.??kӦ毿l:}v*zd5JizۧNaqBYY>yr옧`}sv F?nb{$^WI%SuY߾5>_ַOuϋG;8ߴSC_U,艉u±cGuSG=jB t8bNA=4UlTV6BKQK;A8F&k6~#8S?pД{5y֭cc8_z)A_wV4LH `ʹy[\*v pȐ ukp=mܲ8vS5 r v~U-^\kמgE ' Rzʺ \ap8tAA84N`y$FA D  FAAD  AA5  AAQ#  FAAD  "jAAD  AAQ# AA5  "jAAD  FAAD  AA5  1luE  zXǦi v)& an###~QcYdd6AŲ,,BQEMaWbY_PQ–"e+ X EQpݨi2O4 EgΝ䶨6MoPL]  .jT30j?Dzزy͛gsԀh{Yv ɉ v2v/4/S.~  0.;d谓5`?ڵkرSݢFQvёR8;f&eTQ'Æ Aػ=wGUjK G}PmV}a(JPmמ%־"j,+I,P~e)ͳȈ$;a"5 Ti-.zPn y(/ !1Q HGDOTyL@UUvnBt9)*PuMVţ/˖t9IOόaKF~YF}Xv-9-))) $>FDKXfDIFf3Jv|/t3A ì՗bEӠE(޺-6oDz"r7A[wqe e?&`Y^P+jz`($%h,," R[)ݖiEBJIjz:tek[4yبԘfD]II(aaZzt%]A{tiXݼi#'95ߏ(hQ-VXrig`:JױVTe i9TV{a3 i/Aؗ hNM] )9JZS}D(-+%5%57'A M ])At 43FDf/H{!BmK̈äYfpS0;OQ¡0Oe͊~cNQ!SjjnC  n6kNVZIY}V%Pf5ja?c-Vb]/ZS# co/i$&&ݧ1]UUٸq#9991߫DGm&@9ddd԰SlyHNN-[-ˢJUUbo֬p*K4پ}{zv4v{IHHhthe*eee|> p=Ŏ;i(TVVR\\OV I/`DcecXEjj*N3vzdffpԾHp&˲ldff?B4 :wLFF~ ݻKp`Y;v@uEn~WO l6RSS"ݩ딖n^糬( ۶mGxHOO?\XVT @YYaObb~/"j0`GoIQaee].{_h>SOS$ ?e?,MӘ7o)m۶2MvriqQYYt2J˯81tk;gyz˰ޣ'cǎ% ~27pCn:mΰCUU)//c)n믿't;hׂ/ܜ?v :U+W`yyѣiRTTİNIݯ{jY?<_ <`&p%%a<=>qqq|<ē,\"}>{m۷z*ݻw'-5iӦ7o>SN!33s:{Փ'38zt֝^J $ z˭j_1y4 K˖-5kv_~??5WQkY$''Yg0MÄ+8&_=:u Q;f>,xjHAQ>;_~ɹj:lM^///֠nv{}ݳaфa|G">>pP2y2ÇL83lIОGE|||̆FUpe4+W2|qۊ$&&F;JJ?ěcU{^=|JJJ(..3iժppDDe0 ^zѧOBvQU`0[BӴGpE(/+Q yб#jeոf("( n͆Gi$%%HU݋嗍K.}椓Ӿ};rx<***꽧ea>l!s\3{z'ફRDnEW_'`YV{~?N3p݄B!t]nrbno{*OGU o呇:^˲x<\{us뭷 |3 'ą^@Nnzev٤DŽO("dYIIDAT!!׋ix<t]' k]uzݯjgn7p8JHH ='U4-V=(p";'=3:;Юm[BcU<^|%=<[Ipo՚Fᤲ0wedҷ_?6oقf3v8Znñ]׹Xj) 6,mԨf### &o5*V9== I|B"͚t:u+&L ''}qz;*ij$tqcwgs;u{^{Xſ6f²,-ZD~o5_5>VyXf ŋ4?`R8-UzEoeуo՚餤#G,9O9 q8]}1͛gӶ]~G%%%=ռ\5i/"I)8]n꽎(l޲.]:~|ᇘW_h;11ze]V!̙w<;Tar>lӱSg[xVoH}rѷoh-?̔)S뽎(h?^~ɓ O>Kr)))Ea֭lڴM6(//#-=+Vx94yY32IIMcd5f)#fQTT)#N%UkN9b+Vdջ77t3? b8.32:uW]u5͛g㏣iVjW\A(nPNNN6gq:_$ YJD 4ӯұcIKKeȐ!B!ڵkeKsy̸6oH׮]b> @ǎYr%ӦMcq$%0yU+/loh׮e%|5FiTu]k׮lٲ`ᅨ:~yy9}  X&^y% zmi݆+Vp70vxMx%̘ŗ\˜K.!9%l߶EQXb%K[oݳgc6 #2Ÿ9;+~o˲ۙ?> 3c :t?,W^SN!>yG93}=r}4.[7)6otrѨ\xl}Cˍ7 JD75k0}4n}& I5;o/n[W6mڄ{=-.*")))&ʳE62.**󒑙iIV{FB!F_}/o"*~YcrTZ?}KG̳?xb(k׎WNl-//Gñ4kWfGv:5we qǝtލ+'NĈL6[6s1ұ$%pp9ufN1Kǎ#!1oN<ʌ q\h-)q8`YI^Xf5ƍt2iU̼}&k_b*m۶[o$$1z8Yg4ieZ`>l}#GƏs4"`0Ȋ+yoCcF$)U<(Là,hhٲi6l 7'p8cMz$УGHH4Xr*̙]:lve]H>Et/Dj˲Xn='pa"xmۆ93,4ZI' cƍ8v:wy***0 oSapc ())aitڅm`4v덄E~,YŒUqB!:vVn]i 3<ǒKYyu\{uB!:oo)((e^P4Ꞧ%iعEQh޼9q[YYl@\dz߂6UU% q%cشy3e8]N^yUmC>@(bMο|XDkmᧆ3 p8PUa:Ch mv 6l E 6mDjZ~?/p{S$;Ǐ󑔔@jj*`W_#̡+Vpc())aܸq9o桇䦛owcΜGbɼi&TKQ(,,dҥ= vƞ0~m۶iYd5ϢUV嵈=URSSq\YβeHGl1a|'IqQ!eTx<|7X(QGlݶg梋.0iӨgP5 CaU5kgoڴiC|jMf[˲(--fYYeЩS' STJ>ƲeK)*Ibs,SQFeġiZ˘HjٱcfqcǢzeY}v0Mw}38]9yɼkiꝢe}7*\QA|TN5nOA6tq=kjލ}Ҳ,Ͽ~[orF6Vk].#F`ԨQdffvڥ #OĉWҩSGx"C !''P0ȕWI&ѱc9o-[eYdfd0d93pt؉OӦ՛ 4*&L?uw_PU?>@ M7L^=?n>Y7r n0ӧǍKF3`@8L[iѢV_c9\wӇ˖Ciw>v!C 6l(g… ,+ROu2y _p!9s2xp:d&JA$!10رc'5sYn?wF#e lxR- UB߄lmVd] ِKrYs4 ͥYHH%TsHnMw}C$|z>NOO?@8>>f_|V!vQ0 *?E>36r]cFDO.%\~]>yReYfPmyV*voV UQ: [ggg7IAI)VC^VAyTwuA!"ϱQl  I,˂,x/_#dY$ F4i ue +eH^okarN}P<Ȳt;]IzNg巪K|{}֟/ ֹmVQ:qhppI4 ,0bn͏&c Irv⊢EQp/'Q1L0Qב.R. 4 CQ(cyUUy,c iB$ FRAQX,|˶p]wcg2 Ȳ IDATxwxTnz!!B-iRHGl(P@I4QPEE@*H-@*@z}H5y|${{fdvƍ5!BQX 6B!d6mȪҎE!BXh42@!B/YBQڱ!Ba2%ȈB!(S 3+()ZCBQ!DmƹKW̠ٙb=O[L3ƎEmslƤ7F]vV& Z6/XiX6 싟WʼxϾ\ɑ]@"*e !JZfψC5qHxM27+= \l=4kXB᜽tBa1yҲqC*;9礧+5W^R9ǹWY9w&N.ˍ[%.x,HGVQ"bwujԉӵ7^hL/^P֩Bдm[6CR[МtЬQ|q8 =q1:>܈Ӄlu65akccWo[# ;;[G޼evKq^@!DhXXXv,Br菣î=KJ^xIoż|k6ls6W2gkSfBRr όkegV0NunnQǛiz jUH<\ڷ7m7ҢqC\̶_bgkɳiݬ Osi@n&2-iz\ ӭCvSgIMK$Bpqvkv?g',˱Sٰm;I)nքW֖צ^R_} +s[z;u-;vs+6ty"ʚm+~>̙8wqe1xԩR)a!|WTvS6܉'..[EMa\v~8Urĥ3/\сHF IJJfg_V2:NȟѦyS9~,|hژh~;t aeeɞ?Ѹ^jרNrF)ip~;thWF1eggsZ$1=iӢQ7oq zt|kk+mONaŶ_sɠԞWWS%G;xNРNm3xBҥK!{)_˃]•Pt%owf[{0;`X5=:櫭ۨHѽOQ#p~Zd%GNԪ%M1k2>Kƾ?"<&t9?G9@L?hұyuD`f( ۾[hPV=iP.4oԀFukݯymT;@dP[|<=8: َ7<^ow j`yWCPpJ(Z6畡d&333RZD\ts!yS.Oc5\|ɬ,233Q7FdffBge*;Ubpt=|M]ȋdN|yf(hҠ_FNJ !1>Y<8-P/~Cnք5~?qiXBa.IQ+('ZY[4kWۮO>Ӄ:5H᎗;æwA8|_~E& 9|_,--i: wN%>/pS(Jhڷ7?EFFqtd:kbmұyJVdҼqC~=RF5222lCIS`>@6ߥ3"Q?o/n!%-ͤvB!D5_Bض{/66ml5k܊‚0r(pذ=E~ ͻowkT˸_ݍ3QW9}~^|M!v#3+ sMJe7]ɣFvVvё!}z-ϿjN9Ϟ?pqvbh޴mޔlL! QlܸQӭ[7lmmK;!D9dee5 {~c+j@d+9jG! XZZbcc[E222fc=S|'ZvXU*JHOO_6JEZ;m* PTzη_ϩ:ib  K:[{#[z=dff-/~Q*5udZ!c#+( i4T*dT\جsQjyQYYY$.7';;O6]5c322Ϧj踼N))0WރBL-Bc_ܯKzG]BOrҮgB-Y~KQJD>Be2,!$BQDҠb޻ P(Z*׮_5XN*U] Vaִ<6%%+kk~j(͚4ߧL>0ɣV K˂MRHJNƥreNOORfT$lD!DEUI# Ě]L  &6^̐ǟ܉gё(JzɓőqyZ.SRSӣ[7iii888`l:o@ܝ;,XERQJ>jתETt޲v/$Mlmm4?ƿmv{ !Bw%ґ-ٷl5|{;; Fbgk+o5?__n@JJ*oO̺fQ̙5#;[̩`gg˯{LsΓ'++EEXb:oZf”wQT,_nQZ5De_ esx~0K\._5<-BQQXG?pؑ?=Yj4z?'OST'Ç>̷OCxD#GDzzԯ[?bQר٪l6o19ON;ቜN:IIIjh(/\h԰k4lBۤӺUmZ2!BT$%֑I:u|ПN1yhޛ;/n~}Zp| >hfZ5Y|)VPVMƎMO=B!DEUflzjeyI26mlӆ|&NΟnv,B!Y&6A#Zzz:>{ܞš|z)l3Z˔ϓUP{GjZM%_I3T7T|N{g ##O QhI} ,,[ɩʢZZnyw6Z3gܩɹNoխSr [x̽%BAVݬVKGHݾX)quuקRxIGVrZjo.KtJRRRQWfT*qyHJ$*UR*j8tnXzz::a\q.--7RiK^/ߨ20H珉UP{~ٹK{UP{u'OBP.t M!zo5֫Ad24+ҩ3ߣC?'{Cۮ!4]hߥK-7 ,{)"QQ/loݶ=yֻ;v- r`y8~:uIϧXz |ڻ|wM퉓ص;vWF an>̫%ܷ?seml,vCS/cײh!L:]oy>|5}ӫ {sksM[s8v8<}'&&mo]0 Ql߹;wjvZdgg3uRRRy{d}uyj5&L$Ǝ#˯7;'řsh޴)/]f:|Դ4 .P~}ٵ;69K+͚4ZժFϟ#_j&LyJ%FXrnՊۋauhAYY,?oo/Zӱ}a ߗ;\zդk0k4VY[9]uj5ow!{ҨaܴxKQ@-ˎ9#@II}I7יg9"3N]`[jתI]_uyժ17ڶc:<DZ5ԡqq8RiBvmi*,fh w7w $(0;_ZU˖xyzҩCR҈cV;Z>AҠ~}qsu~ݺ4mҘlނohwMN/.\`I4k҄Z5iެ8su׬=د=n(VsGߵ,߿gz:y MڵWZ5QV-ޛ1 w1Eyߚ[75pppޞ ӰA}N=gR{?xJy/ Y!ww|;w@9w^^77CD> ҮY_#^DFET* ރ_CB8NDD`C9aƽ9ZgJ~Oa0-u2{]t~s] WCe*[y1jgZFBZ5;z4?55SԶQFk'C.]=}$<<o/OΆYq߇`n(Vs˃ײ;]ȧ5yceeEDd^QKy-}&򓎬FM~ T:]1Uoެr-?]du?t3ᑑ]rqc:d0vdRiC`6\ 像0q4vͤkP|iLQ^C(&ÅKDPcM}ؔ_ϙy'yҖgX4oa߷Q7S>oEHGVr **}hH/;vameS䄯Sd[PЮmh̉'YӦ4n0'Q888yV,yf`խKli...xyzf:x{{ئ5ظ8^v[@ꂃ=>`ƍfMiղ%ȟ;\/\ԯWkk+֩籲$e rRQ~ٹ K :=I}aQ2tM۴חy|3ٳv~kV!ncc՜zSz?yҸQC|}|O4~xwv5x!8/,^B??ZGb< 9TkVd{ EH{;; c׬8C05W7XMW?]'+>Yy5v͛65t؝; }E4 ժVeKsJx򾵱)TiX)6nܨٳ=sU|IIT6/OG(y㽕AJj*.+[1oFW}N.x֛fFl\>>>&W%5tWi*ZMBBYY*<==tBw }(&IIXXZp诿:=~=~)̐܇`nNE1$99g+C>Gff&:^2oqoͭЭ(#u y|FdSXe.EPC=x١zH%&6^t}#XCW V->ȇ†Mܱd)lll)B()j5}{*vvvf~ɸX0JѲ],26֎y՗._RPcSٔkfHaC0b7'֢Cyb}egggpŜ,= IDATx}[3BǢ#˯""2aCM@Y\| Ç/h4L: JŲ%Íp?`9}i3u.i)9~ܾF PB:rQz5.\Ħ-[2pεl.]34n}S:sKUg,ijݻ\qI.^V-OA6SRm#&uHQ!&OxC̥+We.qwwcgx핗K;,!DU;II+{pyJ%z`Iiѭ4X0g#i ɝx6:XɉSV8mrqqݍouYPL>KX-s-=q׭3`gLMVF#].XȡGP(4_ /݆o]&v_}& ПI&]}vlݸ"(O//YYYl>C`׮EFubõO;~K/kS9:8u֯Y͡GXKgUӟ\44tߟ[by|~-#GRIwϿ+of֩4Ӭih٢9^|>] nnz_ZIS/V݆oiټvOv7lG|(9vvԨ^kkES҉BwdSRSpy` [gط-ti4KiH6>\0 )gw.] >m4 TcB!ХO-Qgd1S'Md꤉L.iiJ1`:¦4'}.VVVtڕ]ry|>Y/>f0jB!Y?__:uw@ >0z)37EFV XI0/B!*|G`i;WGEpl.]ؿ٩V j|8 `=oi&4o N /1s&Ǥ/ma,dQR, !Bcґ\2߬[˦ﶰsw֖u0{){pF]i޻DjٷRIjXB>94'B!.eZcbj4%Z&]*U24fK5Y)KCq-/J2ݼudL%J ..{KhhR4~ESQT䈽]Tyi*D'$eS|Ji˵;cVJ2β݄y*9VWGj- BT Q:$d˦BjZvZ&&6/OQf}3T9m`,{8e3%;,zan6FXZ*Ur,T6FJERrrez!JtdETE[ Z9t0jMвl%%5O>] kΝx^yc-[phْSh;IIɬs>LjJ*5b1ԮUSg6://Onݺ lַj73{B0xeѫZk;چRD3XYY@N[><ӌ=*m>qw`G>zJE*U2}!(_#+J,gSkIHLd ddfj25v+?_%VgMZ56y" |z{<_[MHܝ;=GGG6}_{s;*_6:;[;lmmٰi7oҮ$Y|h ?\LY4hXjپc/\,6hݪO>šhтN;#/3/[7n %%'MfW_3f(mv c`ի:5m֬)nj5ЕN_}Z}`~{]9wMre7QCF^kutOr}j5Jbxxxp#,jժBG:I'xkK֥ilނ.ۿstzu8q$vv>{U˖.--5S~ۏ 4FׯOmy޽{j_T μo:t`g˗9w߮_G hެnT"m#HNNBdu\ S%qe9ƌ3;]֭tƛ-v;~k֨7 >:  ֯u@nGM ٻF p;&}+/w/ ǿF JW7/c1?mƮϙg9b7ʭz! QCVݿ^ݺ\ KN5$2*X4'뛹y08EFE]d4'R${~ a~^z~8Q_hWW 洇cr|BG:BxbN{3w{xdz !YH .:&yEK>ۋAhق ÏٻCYXYYz˫G[sBBHJJ6+9z|Yߊnۦ͞g,39z=Ƒc9ɕXYdh4zj7sX gF| ڴjM7ӓ5kئvT}Lmch?XđLjΫx{7abTɈܺ@:YXc+VNMz헸V e3xfӗE50>2%BO`V^CpȫRG|q·KNI)R47o29~;;;9 wOPzu$$+T !=%D1*^E h+KK<==K%)>7}LC_fNg>*%qe,d2i$2{ɈBJòR%GYߊacc3{^^vGϩ~š8TJ(wtt, ! !!S( j(pecё ۟;|n- Ϸ^LJO>^^<.c`kk[2}V4 ?B//󏧧k?Loy_9~pݺ4Jj}ѩc3o5֫Ad2UP{~ٹKږUP{ڎkw} !swƒeMn!BOMGrFlP͝Olƾ3GGn59t̹s_ FX!5-ٷ_Cf:FM dqssc܄>rG3٨j^~k}Zf”walƌEj՘5m-[4ۋO}§>]O1=wޭ[by|~-#G{ngaj:_QFX29<٩?lȲi !z:̛tU'N"<"IO‚uCݍٻF ƾ5_5SL5-珃>Oo=د=gzA'h|jYu8s,/\dԩ lKZ5޵ VVh w7w $(0:ޭ+VVVݛS=\2A}^}yݺs,t18RXjgZFBZ5;z4r;B!,C9ǟ?!d-^c{`æM|ޥ l޺ 7R虛ʱT]LFX+bbc޵K}3w{xdT \<ջu_}M|||i\a{ygX57_6o t1iC`6\ 像0q4vR !=VS (J̚h_Lɑc9vzuRzu>[mZ͍ɚlF;RX\ZqÆ,#B#;cVV<3xp} !Es|}|"=FLl,ǎv^}ŮV<.ggg֬]G lݶܕ =q$9=q Q;~cǏ\.}N\ ʊujh|,NB!eGr:l5{;;V|GGƼ3y玼*Jzt `!R*\1Xb%3g~{Ύ/ΞƿC~X#gB `fGI!gɢ6+8_rvmT^̚3^}NVLKٽ[~dڔɜ8y~ xpqcuJJNb銕<‹ :C#B!87nBBB6?HAJj*.+렕E2{Crr2YYXl5 dEgZZqq`g]O}uR$$$tF{nW!x܄|\R<)VI!x*dGV:@7׈lҭSܻX+O.^DO1yBm/+T*j: !DYU!;v*쭕:BJV(T*lo;+ioBkqsMɟ?DK{ ׅۤB^2{u:|=&Ǯ.LltUZI|~&N Bc?{ P5<ȗġ*[07h 46:^! |Ӈz>~gbIR덱:XU9Jkl-J1MQ`dም˷Yw8HZ8Xr') O'+ g׾Ĭ"^%珧KѠP'!1CТYS"HZ5-裫lSb2SA۵HeS+eEȚ+Cf,;kK3"5C͂AUx)ȝ9ۣ83Mʢu ulTG'3(`HR3Й^9- ,6 {k%1+_cr}LUg+-@,v<ʕ]$*5s`Wős>~* Ӟ5;Oz,5Zdbm~_؋.1v$ztJDd$x{8i.\Z&{wF</¥$%%I'dg~8 k°gynسMH`5?qJܩ##KKk٢9?]oZ5kezcsj(/w[6#^|Pn߾35FaO?cnnݺKe׭ӌ1cvndu>Q0͛x5ٽQQӃܽvP !DES!;|{"v))x}VfיD\Ͼ \ωJ=FT#J*ѨaݻDžKMj6Z6n;^ި:_?_:\x-q8;;lwC !DET!;>(-K̓?szxeL T*{\R_ysOVbjG4kq9#=l{ވ 5wɍUNIiؠ>.@0|abYvgΝml߷ܽ@dt^^l='Oɉ[o>gLGPm|n=Ȩ(yU.;v:_L9jxSÆ)>;ǎӉdfkiL$t`k{pFl|׿ #:!b2gK|+1{i9٪WdXTϣ#P(pqL\3rF]*W 55t,cw\Zz4nHɰ0=Gmu65W1.5ʉ/,Zp-N{Wh_dg6no~vL,n;AKN|q>5$&&P*}=njy1υxo< gbtYu/pw͍HUJ*~FQZUV~CbNju>WM ؅"هGdd}W7|_j |6w $߁w{h׊ɔ#T`o^jvVX-Q$7)=[1bHQ0";__N9ˉSt k.A@{{{V,Ys9p<>^{i_ l\+LyWkҰ~}F< 'շ0ԫ[fMp nS L9> 矓'n:|=#S }؅QlܸQӌBBBP!o/?΀. ZJPt|9g&OݻwK;ݿNN ټe+ƍw))$MGϫXXCY;)iw!HBBBْԲNJeC.z#ĊUFd8;9|ˋ Mcq1e݅G. :QŚ)*~7MEP꒐Ȭ9sQm~T+i݅" 9Q汴PʖQη떉ddfrߜ>{D| hќ͚i݅?!!!TA;B#ee5:gܛ=cxH.OF]!+ԈaJ0$!ʯ:"+BT4vDV!BT|ґB!R\@!* FCL\ n"52 !9 BOG@:BQ7V!wt%'㢷w!Y!(nݾEMqvr&33B_>gΝBRRquq%##CBT0G]v:VVZSiӉbߔv( 2eT-\đcGqtpd䈗4&0EJJ 6msǎԫ[X=h$xi4"X;< o6n6-@#w,`W슽 ( ""Ŏ~VD"w%@H$;KVT !ϣO2wʹd3wH"[S9kN石. mr}ҋxzzp]_-Hޞ=˺,3+W/*F!.wזp]ӉlVVF oo2L/dd\ EO[ш(8%AEPbyPQYG8e=@AA}@[%YYF~EV|O>U~62GQOl\zc[y{}zS 0Ǝ$< 2m, ̼8998Ĥٙ]=߬*6>O/ ;S'OfҥYc"f3*?ȧ{K:'jefejq(E]SGdHIMGGǪGqdD٣-7ӓ桡m;pQi4,]NGb Z]L۷k`}D;%;;;;;הȎ61#G_a"۷Ooz`ۻ7>\BVVOvv6]:wk4j@A~-[XӮ={9p[@Ю-CF~d7/!1#N˛t2.\grX91 WT3fIl\,K?XTաɔW|C؟IMKCQ|د?8WW+[o֋WWo6,ufͤKNOTt4 ~C۶IOTB\!l"{)^/f}IHL@~~os͜eӳB/)*C,h)wM0b $u3~DEǔ;ޫ=q51^zNe4y1Юyy`]z%fԋsYՊbod/Z~[<#e6[}QֻQU ?YӦKTt4nނAQC\kil҂. LγOMqj޻/hqޥ|||q74_Wݻv{׮ݻv!(0YoɌ^# ot؁^<ƁУ[J,G#i7kV@h&:rԱ[dsyG1 |;[(0oZĆ6okwOcMr>) Gn]پsҪeKڵiOdˋ7g͠QÆ>l}nW~@zxghѬYKGI̙;t~k~.AAtd[ x=bt:_@zz:N'/ċS^cŧKMQ#a|*ڶi =3uLTUs18O< XPPi%1L[&woΜ9K^^Mr$...[FEGq]ws۫8;uX8rrrx'L1O.ޡv''rxB5"++_9,%:m:c~,`!Fif8s,s]7eq ̓Oٗ_SO<{Ǟ̞;G'=M-qhzv`yLSR15<,[uK"EGsׄ8::o̡ QQ_j+[0[CZzƀ~ٸoRquuc@AEաDN$ޜc9Gw6O2Fa洩<㘋>…Lؼe 6z5Q#V|F<5 i ^V|qukIMM%//__[-ZX$77bc+)>^^^\ȱ/=ƕx9tDh&%1iҸ![~u;',%; gL,~o'Zjw?C񷓓cyIl۱Dh25fs0yK0  $>S^6mJ>}Km/W?.gkJ(656,yMہCeqL(!ؾs'u( dghӺm۴l6ӲEs<<ɸA,-[4eKٶck֮csf+Фqhx8OS˾Z4o]O׵k9|e}S/֩f3fղ> `=r'Nys mj\r^[Z-C'쏵/?*... <Gckl҂˫vg??vNNJhzTc-.N[ ldO8d} Oi܎xwm{0ߠ^=;FLz2Ǵo`6؏,'Ė^x.ۏYQxyő5}*swҵs",zWϞ?q3fOxkLb,~`뾜zo*/Gn۶M9M~OEsg)˯0__ڶiƎݿÆ^q8əg1L|899ѷw2uW9s瑕}eo]ҶV-ZÛΆחD:kSDFqiؠODcglחw~h4tرIIɼT7 EfqQNFD#c6iբMNw>d0nzvEvHHLd߁X .ž-Z{KV--:AX)m{~˓^D׹cG-՛6֑39̙;Ӧ(͜z#gL3ytTUՅG.1tsueѻ/~y :&!!Y(%52xc2e\q?N =#.~ˆu 6NǴɯ˘1{m䰡o̬ۖLV~Ӝz{A\QUÇq1,[mZ|΅2.\ (0wiVE!(0ݻY6>r+?7kٳ>D>h)?9 k©<̦j,Z1??N~ࠠR-(B٫kdUVC?Q0&LP! QsTu"%5լQE*3+ ;;v⍷˕+.<'7ш[^ʊ3;;ܼՏٿڒsb2ebl&=#-LZz:ZCJJ >W4`4͵H[IBڽ{7/:Gҩ}`qdDVQGo5޾`:U&6W8KCՏҔF$~)+%E\툌(Q݇N%ߦ~ !l]눬 !j{q!`N8ɏ?¨tk_ĩʩ@jd5ǩh<==Ʊ}q>WQ9eDV!"#B:cm2[Ǿ2OY!De҂&DB+&I1:IfcǎT#o4_B"FBQ;LB);'4c$BjL\|UM%AG_~=DVUUr+mTUnׇ˯_>4 mZd?l_O?)Z =,;g6 !j|}@Tu8BXc˫8ju"( #+ ?~͛[ێ':&{̬,._A@%_XYvMc,ks=_>Z3g#y{*AaWoBQD`İ|b%&cz ?gnZdԴ4F#*Bgeeբy?l9N9]a!B'գmք_SO(f{IILz1|*|}?~3{lBChx8_\` 3+4aϓƧ_|O?ç˗ӕORl+W0xtSkÀ~hڔ{&>Ğ={qKg71#GZ?IOO/ !BTu"usu 7 <$ܰa;{TT+:&i3ml @HH#k3~DEǔci5|||Ғ\ {o5 L |Y6YYY$$&R՘fggx{{~8Q _u``mRb|1Ͳ6[˼w$s]7z͛ѰA11d\ xk;ѫggk IDATz}OVF~m-vvy..WrʅB!*UId6d0~=#rKt:;IOоm[DNz= ߝoI }UUqsscѭ+E `"i׶ -_wLصv,;g6/ܷcڔL>^*Xn]wŧl'6mwc0J'!1x:=ѥS'IdBQ(VRZ ˜0aB%T}dffe4^bb\ Ϛ:u쀃=UO]R!!uBXXX%%t:::ES:E|V!.3{ !BEY!BQ#IiA [: !BNFdB!D$B!$B!5$B!FDV!BH !BIY!BQ#D…Lr: !Bq L"k4XCECѧoLJK?&==׹g/XU !BkS'+++~sQQL6vDn^.Oi㎫گlFUիnB!WN$ .ܹs,[!mZ.ۻ7<8ɸpWmO$?(%vj:8\eB!Z_ZpB&kaCm%$&ұ{OޚFs^?#O4|$= `lFY?XFe7N9bڣcb3h70L#jΠHȨPJu,_˪oW5_y%$&=<g[%+~Xg6_tLjofێB!SK F<ݭ˾{V?]tf1l(cF=x}dffbѰt N:En]_>AAL{u2Fe?0tRۃZ-{-qD-LР~+딨S6nLHÆsY,VKHF>{͛ѥS'EPt:VCxqʫS/8/OO9B.]X|={ՕxzW( X %*:ݻ_3/̚ȃik=h,w~ aa"~u DEGӧ L y|vM4isOO!yGb, ӨA&z+[Dӕ\LQcᥞ+>qa4vvV.uMHd|rv5 c;:ڔ7O$$&ٮGn13fЪe ۬w݃ԯWfSR;w3^>r>__>_5;vBCZZFSp Θhصg0[ iؐMIL< ޞ;Ǐ/5Q1]G.<3C?6ex{EdTez *\t?ЃWtNzJ]!Z?uōcFөC`OGLG߷q;p{>ǺY|k~];IIIV\TEf[h N{fAOJctlߎCHs쨑 E+lķYhSڵmCvv6g"# ՗_u:%99WtNzJ]!eժU+Ƅ *1$!j \]]J]oxI5 3+ԔT<<=p6*%˧类ǹ(^+!¤@ڦpjص?_8_FQڶimPI[uRU碼Bu Q1uLf{szJ!OY!'''^}%:DjjAAtОW!Օ~}zӨA*9~uV^+!$i݋{Uu(^{ZnBTg2kB!$B!5$B!FY!TU%|qqMƪG!p;7'^o !D5p>dڶng_-KrJ2'8$Bj,.>FnnnU#<9DV!D&#Tu(BZf۶m㪶5xzxVyɓ$BQ֞Ző!jUUR BT{f#kKu.I"+՘"RTD" #B!JX,fsUG"eڢ*UJ"+ՙ !* !$6.,P4{IJN.|7ء}DT} >ޚ5aa{=̦ce !j!YY!Dо#Yְa*g_~ŹhN~P,֦֮ld$O;wFQ6ỉX4lЀظ8ޚhЯ/O?8'eb'cnL&͛5a־5-۶Ogʴyhg˗?JzF:?|5FeQP0'*M6 Y^-ZpQqe.Md|HHL`k1lNNNdvR-r0R#+|:/ ==S[o`p)yithז1FݻUmӆztgꌙ{bp2?qL{/Yhg72{KmYw g1ͼ:uSRx{18_xXtusQs8>$> x'FʬWt%ձ46*ۺ0~[f]A,`aڅWub@n ii d㦿IKKՍ?J"+DХS'B4ݝ&ӲEsڶnEu0,4v>jϜٙ'X6uV|Ï%][t: S2ܱ#fM ޞoayL6EQn;2{t`1MGUU\]]qJd5 sf`'t rrrhٲ}OOOk=le19x0/ڷmSg_l7;͗,W}(r !j f*UVZl2҄1a„J I+%%C)fOOb/RYYiرko6_\='7ш[_ʣV=жU[rrr:!D-{n:w|t:9H^Ɉ(OR۝ ɲOED`oo_0VN*ZYJ婑Bq#R#+QvKƅ 9q$? F ήC, R*h%NWNR#+9NED_DEEM7!#B$#B:cm2[^.׋$BPUMމWLGc4iu !*Tǎ( F/*n$X`@ 11spl / !D5l&.>NBT:<=k%Bjoh4UB|4Id˫7 !B!$B!5$B!FDV!BH !BIY!BQ#I"+B!j$IdB!D$_ B!!9yyy=NzxzxT@2e8}!G{V-_kqwD隷&M&\ONNM7)=wAUC8;`dddЧW =B1hѼ UU˵-":M7K'uD^^y8-UUh4Tl6VE)Z( Cή;v.o8֭[ira7y kUl6s.&CEAfOǫQ_kMhPrEQpsuhaIdzpP1~~?A^^NNN wwX FYhSt@vv6[o':&EQ$)91#G΅L6o$E!QCuRlk4qHM dClݾxO?ӳ{7p vnAՖ-ס#GVpӘ8tnFkˆ1quq_אn ddd`6Wj?ƄFQk" W.W+==މ+Jdz]$gİdgSPP:8_طߏfM1 r!|}̆60|8MRr2`ycqqvf쨑៍8С}"1[H_"m~>VoF%]\iBv=ue߁dfeѽkWz=M7'3OwrssYjZ*x^!ĩXF UUJl Q #QP?__k2 жukr/8tԴ4Z-IɌ6Ԛp1ȸ@V/@h *&D6u˃_g## m4'%]Z/z|}qvv&i%**]:[׹5呝sݎY{)/j+W_wt"9<ޘF#9.pws ;;g|Kkggڰܡ;nU? !h҈[-^^և4 C d-ŧVޞm.oNGP p65|t`~>>ލ;w{^E.]ض};? v 2I IDATNa?qg2l 6#!!v쌿ڋmM7͛q MNI%GjVkNcA"c8B\C.z6[MQUs}zb}(5ߏ>n`İiՊc9Ef4_۶INIoUĂ$BQ#8;ӪUK;;qiբE&8(wwwc4˻ !^CڶnMquu%8r&5- ݻ >zn]~]q9)-Bu˖D>CtL,\/B 幆9ɞ}0֑ZY;gxzzҤqH7IdgAp5LYאT6mBh_}=??IIIٳ4j:()-B`0H+j]CL&pI .`מ=M&F Bٶc'%H"+B! qH#6o?DDi\]\KSУ;ݻwtdWYʪUԡC{0&LP! QsTuB!51QQq:RIB!^X!!BIY!BQ#I"+B!j$IdB!D$B!$B!5$B;>:k6eH&J{lxgן'  ;AEJ$ ɦmv~,6#|3]&|;""dEDDD-)Ȋ[RiL$h2Irl.GD?_?bc0 ա +"Ҁ%M&5-.qRRپs;ё.CAVDKLJ$KAA绺Ю[mQrlRDYj նАPOyRi瞙JD1M- "" ^])t- ἤ +"Ҁ "R/"hDVDD*bp8DD=s^vv6iDrqD6++///WRgH#"xj6`ˮ.JdٲuPt@8N5mfuV.ֵNe3ᦉ: m6\q%٣mrrK߰r5;VMInbS:xp?"oIO0 "1|8W\z)MjW^mʁ|6o |]A,˙HV0MǟngiDGEA !dl"# kԷtą8&ǎrjc~$j5yJNBBی9'ߪ\8x~mm6O~Csѽ[ڽ5seָ:uZ`&g>^iSxP` YYx-á"rfl6rrr N@GSRbXnE@@eO |}fU[ۿ;nвE 99η˖8ڷ;14mK.f֜xͷӫ'4k\VQݻ;2zcib{TPg}'k=p_ςEoq!=;߷/7eWI9IXXۙUT}MonuE 4yLaaoUc]#Rک7~.`~urrrqH2|[u-7GSRpD0MΝ:ѭk3hyb4a˶m8<==qqۭAzFϽ"k׭0 ڶi]Y|Z4oD~n.l߁bq]w;'0$8PGnj٢W>|||xb2L{d Cr7v;2벋띁(r 7p=?X'11gE}2|Pv|||l߱Q/guo'.7M4ne{#/8/\ko,%;sir;9xP~ubcbJԜ7 CvT\|8V^CZz:/?ovֻw8fJ짢@WQ=mZvDhh_q]JWqϔY籇bȠ#R٨($쫥3???rYR22҉,ph?+/#33)SSOߏɏ<ƛ˓OG8.!]w?XB\׮ П34M^xn~ ;vG=NLt4^{c?}-o*SaL}!f~.;q%0h@<W_˳~~_q)}|LSs{s\zE /~k4MwfA}|>Ej5{|R223*K?~Zqe^ a~YO^k( mZSu;^7Z*kw?Xބ}N^ya۵K|ٿزuk!//ڴnͪ5k ]tfe*>_%O̚MdD3>F6KOy/|{!<==*=uJ4*0̑*a4l޺CsWaXhݪ%׮BRXXX"k(~Ğڜx>ZLɷNթcBB9v=ww_l[[6i\/Y+:x{>l(#?zu 6&HNne?\SX*ZYiozJ_Xp֬a鲯y9DD3iӺח-0b-#R[5r,[Fff3LӤI&9O׷9|}}?;N?9/P4zA""mpb"}nUӓaC0lر1~Z3K}ŴG}Zv͑-oD6--Lƒ_*NpQѓ~Z3o-~T|O\__EÃ2x@vOyzʕ,S&?HTd۹{>EjWFǎ?Q#(u^{ "{fyMK_7c/ ( `׮ WN; D846$%%K/s :xP*wlQ-94p!9z_ill6O )gIH`e\8v,^^\v̈́Ud +eA>}X+|ԃ=5~z'?n/zT<44,W]6Đ]n;Gx׸ph \^U="U˨cYO ??? _c#+" JZz:Ad;5kك(2?pn׵+QQ<1k6DGG Armzh =8N;ХS'<<<ؼu+;wvjeٳw/P4Z}Ϛ,<5U'%◕ɱY[7qk9Y3"É`sxDEF|=u+jdlHFFopn˚٭Gih+l݆Md5|X<,Jۙ: :ѥs'<,IH[5r LuvEŸ{~/r+RRRy豩thߎgמ=J> &TYxݥc:LBCC=Ieega`ͺu<3֛DGG9cTIpA@ާ]{M6qպ|rrr lR>I4MBˬGZZecj&ii{RYPTsA~>M`U-ip8$:xn="֯_O޽kjeo[սWVU}BCB*]p{Y0wCbq~HC]ɾASo_vߗ^Ȯry '_T_ia8/<~9zDȊ[Ya#ǎYfܹǍ-qWcFS1"rhluj{w8pP.n8qYu1"+"RȊYګګn9g;Yu1HDjL!ŖcmU:ճgZW cs~跑HˡÇ rDD%#3Y,$8AbRi݂KD.YVbc )EdEDB"#bh~nu(Ȋ4p.e!"{qK """"dEDDD-)Ȋ[R +""""nIAVDDDDܒ%YqK """"dEDDD-)Ȋ[R +""""nIAVDDDDܒ%YqK """"dEDDD-)Ȋ[R +""""nIAVDDDDܒ%Y䒫aĸd;Vf۷3bx&? *sknqw;6) +"ҳ^`ܥjj=.""HtЁo-նibF.گLecvyAztƳbGٴy3}Ǎ`'ejNyaC+/`݆6iyÆ2,O"#"Jy/˯斉710M 7N$%5I=HKOo$ [4?ILL"$$3)UowÞ chצ rK[q_9+.g$%%wXa#V+mZb㯿rÄk˵TZ M-qSW`X~A ߟ| ۶j' k^iU_ފ_V7!T֬[/Vc&F\P"]."##Ν:־MtTq]pӻwW+p8lْ09xdzȣ|!!!۬;vnWYȊ[IKOgӯ)((`Eo ߟ[ob鲯ۤ[ UW?-vmЮMvőGY(6auyۭ.3LZ6o΄KNXj7qQK4d/?o/;u}.a޲uduX ##b)V{u+:pﲯ߯/Z$"< $ !+V '<,}pns8Y*}EW_˯/ॹϖN8sX'|Ï$%!"3O$&&|}EJJJҪ~z}{W-+$G}tܩZdyHNnnU's1|Pشy ^'*]DDꎱdst ꊏg„ XJKKsu &=-ݮS-zg1}){ʹxMDDV|| 5w qk֭'*2(0 v9㵈dEDj(=#3pxBM]TGAVDxyVwIDAT3h4^=ӣ[7W&"rVQ!7Æ b8k%YqK """"dEDDD-)Ȋ[] DDD\,/?ԴlrϟVW(0)ȊiMIhJ2vI@kVr9vvo'"<( pq" ɞ4aЀX,%FG}IIfEN9""".|_:uR&ĞÃb| V()Ȋ42p#ƍ/qӯ.MNÚ5bR`;v6;ve߁rrs2"P7ztZhj.8W!utłiÃ;s~ڶn_YFil,Ç 6v,,{jl hJ X,eܱlxyyU~U:*v;x4BBLrrrf֩p''G#y0 L !䃴kmAP`]^?8;Ƥ]MYє&8KƏUHKO`ћlٶ Á'_8;nT&8z:LӤsNtڅ|_l991{ ZhD~n.l߁bq]wSt%;ORR2Vcpm5--'?D\.]\uvUѱmӺ~*cIMMYa#v1<أlтl|֬[ONNڷoJ͝7t׮#77???L~pa~LȽ#G8nµdggcK؛ }z]6Ӧuk:u@\l߹-[q!M֬Z[&ބb0 =Jn^ݻѣ{JeЀ 4֭[q[`VTSձعW^͋!e O|޽zХs'F2.p_>EǢwcع{7 ΡCvj٢DS\m:'"'a:TtjKeHNNxVFpb&soo^῵,ڇZϥiaygzveϗKAV,{fyMK_7c/Vmu4kڴuzA=؛'/*?9~92G ܕ:*c ;CgnDx8Ptє ReM>|8ѹ00>vVYtÁbq䟎P>=ڷ툷wwX,eO\} E GV,@ppǎ/a]YYa#b߸ ;w7߲go^n4oĤ$ge˯FdDr_QY=U߭kˬ߰))l+tڕ˯OYn=3g?'We]ݻw#:*_{Mnflٺ:<ˣJ9Ld۲/ȧS*BYbÃeӻGXShDV,׻gOF^p><5c:/)Ӧc&MݳYY,X&ǏϏᆱ̈橖| [+[پz*kLJ'^Ӏ94c֌,|m,z<:u%44))eә<&?(;u*1 k2eV8X x`1f G>o/CƎm}(0 m|R ֧N-XK,1Gqze0aB=$\]Bc:LBCCdW^~>96AAA%s8ddfbۉp_ŷz/O/]}UGuꩪl dggEsl1MMױn*zvKtT Es$_ѧzt룹"׈ ۷+XClf=U˶VmX͑#IDFF5Wި"Pq٧.7 +" RDx8.[Zșxz[u׶UpUYG}Q9K5_B"rv󍂬%~KDDDI||FdEDDD=)Ȋ[R +""""nIAVDDDDܒ%YqK """"dEDDD-)Ȋ[R9K?~2D5s jZ^_CE2xyyn畫|RnG=UH}ٸWcewުpKYFl/0ٜ0nxO>hJ Swce ۛIwELӻ[rڞK͑iN$1)F-Ym>q[lٺ ;sI}ӈH#u817  44))(KDWI&LؿDAVD2,E#'dzJfhYs%;;f<@#ع lII,,A]u8"RG_lbf߁|t{8yWPic?[+ҋ3uvCL[u|4%M7WL/" _(,,$*2 gQ4,}^ι%KGL0Kq_iii.ABbhV&P3h(xȊ-)]"r~WC:rqK """"dEDDD-)Ȋ[R +""""nIAVDDDDܒ%YqK """"dEDDD-)Ȋ[R +""""nIAVDDDDܒ%YqK """"dEDDD-)Ȋ[R +""""nIAVDDDDܒgM7=z4iiiQHiDVDDDDܒ%YqK """"dEDDD-)Ȋ[DDDa3M$&%b˱GLt QQQ IHn OOOBChӲ KWdEDDɤ%0WvRRپs;ёѕ;a7[}] iv']v5^AVDDILJ$KAA绺DvزmKA6=#=zk)(0;~Zm +""rlRܒ 4$Z2v4ume(Ȋ42:Mtq%>=(Ȋ4Bi*\N)Ȋ42i2MjȪO[u< """Q+q[iRl>mr(Ȋ42%<}=s4"+"""e(\9gq8DQ+""'/@ϯ_{ ^Ȓ?v=c/?&S fao1ֿqWsrᥗ3}8_ЈH#s&.,,+l>jhS p //K/6[cXHIIZ:(Ȋ46F ~%##k/&$Ъe˺iYklMGdËJ^^_x2M<ۻ?Bl6^^^xyyզjӈ88z #4kƵW]gw?H-HKK灇&K֮@nn.ݺv޻$,4ee49[x7XfE]O46ΏpT{D,֬] @dDD(_Yټ]֭߀-'qiѼ9#~dV+ƌI3cX,=w܎O#Tˣ9"""P}gU:xу/wB8v8w~өCbcboަzO^ZlQZ/,,dO~Fn8 ?!MaoBsyxQ0MΣ3fǂ/1Y]%ZRid hV^Cnn.p0d@RRRټuk:f=UÀ~3j$s~6oRYt.:7}ZG==<ϯ|Re6~߾︝aCӻgOA] 00 #GC.p8l޺C3l`rrr1 [dڵ.hjH#T6";];w>S.?7Oz #'f?c c͈l]k~c~^~[o!̑aQ,zdЀWal92DG9qo.XSO/{.HcSWүXBJbcbN0xf۰mZYd۲ym""գ[ lٶ Ν:F8[!ii\;z VpZ0ٛ'}^={ЭkWط?IxQձC{ڵm+ /K}'cGb]֭ZEٱktԉf?;o($c=ucv_CAVDD{|۵%&:D}zϏ~ZN֭_ѧeL{a|}}ȶeW`ȠA,:~Z_j2>^#"""Q}G2Ż5 MO|y;oaCGuU_tU0 ?ͩPW.MAVDD)t(j"{ڴnMz?^媾n tdzDGMWCU˓M7r8վثȺju9dEDD3 KKZsRGBgAMA a cHRMz&u0`:pQ< pHYsttfxtEXtSoftwaregnome-screenshot>hIDATx^흉wEdz7Drzrr( DeAVDP]w oB@  mwMwdf2ǯ^^Lϯ֧~U3?|w)D$T$Q )HIVKE)JR3.]_&I٭ho _~*O?-X$v&_rYivq7o M;ǽjt( -dTA?I;^]عkQX`UTT،}f(f17o 6u?t5l z[;=Nn#Aq=guJh>;x0u(t֛?c'Z7~䱲rMao.X=D~~tYJq*om'NRL㢼W^ȕ+WXӒҠWƂ@YS x}TN|p:e۶^ hߝtjٮrWJ⣹wz՟rx\:a6jվI՗y:fz L;ZnIS@z:<Ν]wl޺͈OV9N|YwbӤeEM_UB:O9H;q? 3f΂Ҳ2~n3?x{98'[?zxV l[L8RYy%%;wym;*nڲ ݕFs?_^^AU}}MZ_z{)3kGȴF9wɲev݇$j=*TgKJp_}֮#stׯ p04;z츦S /ҸZnv) }f_b[ g[t >GB27uM]SMw'?9'xY> fQ/dĨ}(X6y w[}}Uic'gJaCy6䀣[|vζ͔&͔fK>tG_A|gnǭbYŒb\Xzl\W7oVyhWfBp`H80wO`ȟɧ_)^6` /c׫$WKЧK<[ޛle8nOZa鯝۾}ws{ӣӝR:=3x+U3gGQ✰Vƀ'ꤖdO<]W{s 鿅O>z_ACpXE͎&'_+-V&Nb+gaJk0vuz\#,b=$R/F` qr8w"GDְf*U; 5zox0?yO&w.QPXݢ _ _R۰) MJ(H E|6 $b .ߡ­KRҟrN⮋'pB\ 7kC7I.4?o 7ԩ#G$^ER܀>yv@(@nFQx?qĞ={lxXQQUV%1xa/,,ܽ{]^UUuV=Nƍ|Q[fT1xV2+@n@`6i~ƪZRRSSUTT} Pꋨ4֦fK%P܀~~~֭[߬[V.NIuWשseezKRf3Ū~4-7jcTM;(6[ZZ\RrG4h2#GfuÅ~Sn"=g.!0|N5&KnoVD77n|YF~XBs IBXLBdV:ؐwTЋKlI~BҊ>BCxoBLF C B! ;oD'.%O V7cNO\B 2IE ?UQ>fľJ0)~tek9zDɊ[\ Q龋;5ǞXE:B}4GC?,9Cp8<\Fp|JtQE VeXẅI"Vgϙg=z#MA5[}KX !4K!8mMϾؔPrc@LOX9̧No^cy~p] }k9<.,y6?hMmuj.l[N PN:y!2V&Dt!>s ࡊ,I)@p^F³*c6i-9Βg~ Yzc# 0#x3hxx,.^BXG!ECpٙ]F~'?sÃÈ);+ __OSҔiyJ< DPe j5 ke+3cDl u>O8껳){p֫WYź$ 0! 4<̀Ղ*(M OBhN]tD%\.CZ}U/tOa*ipS1WZl=21n[SFmLhS̸ΒpƥK3 g%@I@#$d D}6>RIKXIk[A?Oj~ɉ񭀠'YA?dV@Џڇtrb|+MqR{Q .-A_I`OZA?;^@nF" + @@Y8#2ps}#a漫UA3f̜9sɓLf̸͚@bRQ@pC3X;vl„ #iܸq|#qU?~| qglذaѢE˖-۸q.ޚ+Fn,ܦ=dȐ>1v*EׯZ'x1AĎkq7=h軫G@gee8&T5;+hSSSgjH5jCYF ȝ1lӗ6wWϏ7fg~ZZ3Ѹ$ 03b @4dgg/_|…L 222vرd>M"45HL"8T #m5qj j{ΔzjO)tRqV)Porh^hgSw,&D}6k :X <uNNѣG1P|GK(l1[TJtogvyf$^p):@<qIp qY%<]|}M$ \Q?yףKTà֪: ^H]WD22$k"-uNUpSpVvŋclk|i+"&{PM%Kzak&ßuԯwYgs>pqxZȺNIJeLzS@; R=Ft ҫ[A<)a {vXΦ2o;˥zu=8;ѷ~m@]IDATx^}XI~9aͫ~5DDLň HVQ*e*F$J3 ( d ڝ = P3OOMuUNW]}@>%C |JJg1 C.,,j-))Q:$A pZjϗ/_B@162W_TT\`k!!ZWTT( ʅZˇt+&FQ V h@LR @h(#Aр(?33ёCU2\h m|\yL)&~jB(@Ú^v%W1059ykJ̤)#?L:ɤ|L@+R::lˇ!itz!?~D D+ͥVQ5a*׼h׹M3lT؀>8Z{f2Ϻt|:rĘ8/ [/\ 623]CSk,ͭ;weԜΜ=7"~ML7o*5GDb8]LVטs >|脆L~ۛ7oxUm;G6o+iւy,Po}2$ԇ#kzZ/v_]#OrdFC'NWK``!;\j6o૎>M[;OOtJ8QW^a;ќ6}&\A;Иv¡#G_$'cA!!Ғ@|.vyp`~Ǝ׮eee,gf@}z%RZзZj4h֪'}C!ηh?.;Eyz4c䰍50(.SDd$vg,>9-11y֫ל \=+ 0?7l?ǡZK;uCAl'i:'@Eњo>@?y }4#;!}=i]׷( 5[~=c?Xp;ql& Z!Ϙa L 𓦩봷cxI|B.(9i4>56[kZ#199J5l앜"sݱ!i×nYỲ(qawbǔ<"B"dp;n#U-:IM=<gTpƴz‹5~?s?Yk3ዏUQRm sWݪ_k,蟡aq@4ݺs?i*"2 3wjZZHXX=gk |`bA]'~*2bCRLH2hT C[W'7o5K53|kNT:Kn/]/5x&/_đ ijW[c<6.muIƷ _8T\\e ;6qr[T\6{<&fIksv Ȋ/д3tގqtq&Sk)Y'2*=Q?;2>NTN9V3oC0?*:ndz,[•dyOwH7o޷P`dqͺf-/3QQEJVe}:)q_NV@bHfCnZ ubm3%z֙ eDu@RW4$HyO_Q50$0G̱"% fHG#Дƣ#;JJ#Дn<$}mZ^Z D__AkJ`!1"w|Aki~婓W.Y];,Nzj>~t%++* >FYnܽ.|gֺBPO?S`WhpiW8XNR>@; jB*Ӵ\{!E~gD]2'$abԴFx[΍Wݽu}~KBwI@rm#؇ L՞NXXB6zL$e1@pҊPQp_\y+*&Rp[ΘSdZ(I$" J@{՟miv-[Exk3A%_\)X([TvP*wCTc0 v &8q YgҺ,#+Qֵ\Z$촖X5)@h* yn#"@h݈ q.s_V f\3ّ ǏE>&|p&BkM"W 7iL>ZgҊ\ +ܤ1 @h-I+rEZp|p&BkM Ck<۴bNpp0{ A@(2ozywI&_RWW9r$uB@FZ=;i,[;=f7FETҮ,ꢝ;]urq6mڴo^EE/͘1z5zu]5sg I}JO`ٲe^gˬ9&\'ORj*PHu$Z'Iuڻs7K办+FnWn|")>dPr 4TccE@-FȤYZ$o>m?t.u<,gƮr\ZZgמ} |q͹|2ږ19KK֟$:+EjNuz־ Zvz0߼E"U.#j_eL-Ҽ*xexMtPI}N1_%m$H4P:Z]/.)s>iQm̽絝buc}&͍ꇏb)W@bRT&L4R@*9Iw;|lΆ&$L H%Db5(m۶ gA~~ҋM&opr2mי8]'(#>52u|B~IA))#Oh3) rdBX8yM8˼MO5gIch bV.r )-;HN g.R.dBc$Qkgga*][Лc41ڻo٪|vkki{_\wNp1IBkc\rHIMkF<r.\~777 ϛ?v޸8!>KgJuqX  :"@Sh~.~ݢ(IBkc\rHHk~o߆|$F!ti]cUT1XWWÁN'hH%JrZ7HyJKӟHFpn޼NBH4MBųeFh2]ɭ+HKZ'JkXD!PքJ*1Кp@  VA%&Z(!J8$Bk%DZ DhM8Z+ Bk%Tb5"@hJLjZS5P1|[Uc:MxUNz.țW Y:XPPŠ(?mؼEz%;'|{ !uUeZo܄GFkP9icX^"Jk&!-Y֡ϟCpFPb%$!K8-b |䩠1#Ř @3KhaҚj`cHKNH~AAnn.w@VUpRqإH|aQdfBP(C*%gMhX9v}E)VBgԄID\yKBk(+q/sBDZ<~''(d+QS"  *CFruBОD@ٺ%DV(J(btAei+ " E\ҒFx#s DQXv|\\·.._AZyKZ׎$"WPl {/-Yk%> يΈR"7!hւ{hDywA&3n$hZG:vBcHjP8nHHꏀZe#5(& Gkńy!@hݼƋ֌`"kHo!@h&Ry!@hݼƋ֌`"kHo!@h&Ry! ?A@!uIGuȒ޶X[+<-6B;l82nк2Nḥbm#nC̆Z+X[+<-6B;l82nк2NḥbmP wMaaa(b%+Russ1bwlaeM6!͛;tPlEiyZUUyE)/sqq?~x˺eai9a-Sbx# 5?>yEqʇOGF> ~|dرBmC`k7o-\ rݛ 8,-6c%E /Uuxx… z9-#ܳǟ<:٧__:nhh4fQv9t[n޾1ĔkZ AO \ffMȠ{$d(ZܳnPEZO8KS޼⦾HzMIJtCO_ѢhC<2:i.c`j@BwgLׇ*zܸqY!._|ȑhf8Q8Bg2f9+qST[FsD2N#Gm"1݄TCp7o޼nݺKre˰N"ֈ*v&Oќ{E~ZtI@c'NuCDPF g@BH;l }+ZR@feb<ƺ5_r h-*phѢ%KD]]}ܹXК|M8>~\X"7el<|DDh-) 34#,)8[{x(n."Yh yn {.8 >\l-p3̣3{36ňnພttULTabԴ}zՠŋϞ={s΁;w BǤ\agΝ}D4N@qOA;l4WW(*-I}\ߺs.p.U7dp]M}ky&h-*L/5{'''0{zzzV…AB2l0l888汸54^?,d:stGfR~21_};y c0pY \9q5֮V[ KMkTK:p3lS|'..?qߘEqIH@o@hT^Ry WZM3-UҺK,nwj" xcQ& G%'''$n$Iuc#Lotdc#@hto;wzwշ`H^ yЕк1&u6Ci7kgB&dc 0WQ}:i]aRg [Nt0ڴ~Yn!M6#zw?ā]' Z++K?juI"-#Ah@F8oIL[ 5kvM[;L[m2-[l'Ғ 8 @ޝ2i`"ycοyp/a}g( 1TK*7ZIHUԑm'c?){>IYv$u3DXNfH[[tGZ~( 9f- dPۼH*+I&&|P8Ox9\*5UZIqA9+K,%&|P,g_4wy VA%f,:|챫&kk= mA@* M͜]s67s3^C9:! (J&) ӃlNSއ4⽓Ҳ<b"(ꏀDfsbxiTYN&ubR:^~ Pv-h㑿g !R!AC^vZ:ڻ())ᗇP9 /}U@1T'Ĉ✪9Zн)(k!Ir:?(++{fhwB]%\k ~KWBCfb^+։Iq%ye_DkA"аZd) 5w|De ;^U %WSbaP!nTz5I6;WZPUIN['r8 %$z)l|tưwHpl'Jh$NR^ V!nrdc2[K)[R|3ք2 SX c"C.i`'VZ~+!'ȀM뚛r#C.izOZ{HyslMȠTn+xEE +y_Y^@UykEŁKH_!eUkTCےaKJ>혖5]n$%STEZL֭KrVʫȺ&P##'o䒱& UT wyu4D|X&7#We=鍒"OKfk%i; WߺER@ƣN%x&FRmXeSK2 ZBkekSkմ&-Jh8=[v qBpt[I|Zc1X(቉l6B6-֞ʯH-f8')/'*|$ ssswb2 'bOB NǎAsy;M&_k YeC7ϿUJ#V߱cS^Fst?nǝۋNXHH~.Ş$N|qGHQҼ~ YM;trp[~԰y]m;`I qN=kM<`/I%ZT[5܎a|Çݽ/ܾ#~\v9u:c ۷Zxd 籱Bi ?}zob~&4TZuYv5TZBO/gh;c cH$Z(Z#ħOg7*yeL#}ٳ"iGcdT4[ݵ8"-ւ"'˟dzsf?/HEZh~L'i]̷;W7<< ?ItUwyc}] ޥe<~"0W0.rĄZH#תnh]!U B.[ZUc:GhwᘞZ!4Zq"I֥x~3g\fɒee [_:*ܶv^v]w(̒؊ϟ7ǁ_ +4A#Vˬ8\t5[[sEJ 3)-D$f]Qug뺰KKkQTd; 7߾㪑QcPP\RRVߗm~N~yia4a ׋Cĺp{0T.?.ꙨNQ0hZ32EZL%Z&j?4`M*Z -+HkLgBS |DH2b[4OV;^"W@}gAA EkzR 'S={ϟili vznP;D 9֥-/DFٚZ?y \aSQ3oI5ͨ1=cS|Rvf ;Ĥ)#ĎX irP|IQoUn(=֊0 6;CyyMku#z]F7 gRyHgž,%n?/CUZ+x2B/}d/İ#f)%Eʋ H!1**_[3R<"JKq֊7>G2!ZTք2GvRH#9dT!NbDIQVUEd'D!N>R"U|CLkYA@г5\A'56j dnlICAZ[>@'-56ճuaucL+I K 3*}\2zX!)ZWZ7Τf"-W%+Y+FD+ȤdnDID!p珄DՈ혒TO/ hR<>xYHDՈpyU_>V|%NH#L+ ^/﩯dZȓ.; kvLreJ)uqM*LIFF2 n|`ikK6CѺd/[jN=cwg5_[5et˨Ms^bNA/vU֡@ii>"0 2s39~nIWF}a4[ޝ=&ryvݼ𭆁f28e^ng{~Iωzpzj!~Kҙ|7Fkm#U E@s%D0ņ?J_W}Δ[cZ^>rA&մ|8Ė/?%%yo2.`Pu#6Ą(Cfkڰ? I$| /URU΀i8{*>qNn ޤ{.M<'UY|#kIvBCׯES4fZK&) LH"egT~4SZO( %&[^M;\-/+Gҥ߯O_ 6~ GS$8ZMU@s%D":mT65DŽ5 yyOUeEQE)U_J >d<+,tFo"V!l@ E_?:g)/_u}k~&?D I# I""3jZrH5c+B65">yIa/"Cnu";'^\3k>W{ +$ '};r!<$XU<=~Fkh$)PO?W"I$YT^INH5y'Kf>"`}: KO']ܕr-ý9.JK6_aոkdq[w G"j{]EkU@g\V"`}XƤ>Cݝ$M  T0*z#Z>"V ꔜ C4XUXޓY={j9toɬSXŐ?=|RodT^]|/=!NSJjj~^_%Fr={TgN gN9kߝCK8vsr8H>W8j6 ~ Ug5 Aaq!׸,n/7ҩeS]Wy)r8nBn*n Q#+q6\gkOZsrԹ33܅:܅3\\S$ xx&ӹkrqMf$MͰQJb)քZZ٘Am~ضRȩwVԶ͏ԮuԶ{vе~='`Ut.?LAWa ;E+8WYM⚟HQ#x^zz}@}zD?o_ 4fP!ʀDt.oo=s+Ϊ2EiQ&u_jʶoCwV0!mvlףk?wt.8e@73\{koqzp[7/W_w9JMT@Em3ڈד; )?rpjo(Jc 5s<9GN T(}Jg55916Y6T}4bKŰ(_ed|WUɷFEʭʗTN͊אsMeSSyʶ/,صBx˃N V,RM_9s͝-\_w}kjfj5鵩S|Ԛ)F.)/M9Ocח.]S\^뺤uJu~;1}-wH_뢌[uaKt ״iFnoL\M\r,<8'+=2oQATfEeEQSVxuRNY1?kTv,C|y *H܉ S9ԗUԗԧf|+e91u܀mvG玶];uuZ獽ýg[t(Kcj1emH-7Q+*}jHLSZtjsS5=U󿱁99 4=w۷nۭ}ޝ;yp.*8BEEpk,Mj_B ]fW'xWy?>޷GiC|񃿪:j:(;^`ZOt@ԬqԌ1Ic5ux2)TǷRyJuJTu5oVQG*Ϡ IDATxwtTEnfSH$^@H* (IQAD@(TE@@D UzfdMdMٚl΁ݻs37AAj_8AAh6mȪTʎEAALb V AAEsEV"Tv,  `4)+  B@ fAADZ AjSg!(7me ia]8&Xo{zy:)#"E2W-oAx:+ tm>3 g]\i҈f9,Y{C_\.puv-rܼҹ3qt7J_c.xͭK `SgDfc2{6kL<şZ.Qk׋ tyㆼ+H$]~z=ܸ;\bkcs{ŏ<5%O?u?eω_ AGskEe"Bl/v=@D=խ;??Ӭa}G ztK=t?lgo4mĵ8 ['Pnm RSrSn)v-܋Յ"ESM׶JmtHg6s-@Bm_oLSF,K\A?/^F3->u:JdfeKg;rVoFXfHR Zvj^;t7ڇbׯkьzuީ=]oOC~Nf }{ameER)ʍ[|ͷԭǠ^8|O>^ L7F{yI~;~Rg۶^܍@vmiѸ!)oA|wUOXpsv[k87oo ]'>1 'Ǭ}Zͳm[Ι8}o0HD{c)x; mB6Ͼ_hp}G@ZH$ފMH 8X|? "+N)qM[D""8f\4\lg!VPR4|/|23{99Z.2H+Plߦન6^FVk>SJ (/@G,~c׳5edffؗc.x5eʒdkۏU\0CO+3njQ %jAĹj|q0s9v5(> yef&jj8:ĦK^6iZGHF8wKKKڵ Ϳx*L5v-4uj%t Yڇ|ymKBRr2]/K/؉+iҸ1F"0dAhH0NDAhH3N 11`\E*ҳ{7ML&ӺOOOmښ1{t\Ubkkˠ4n9AAx@ݻǁUq/:{a' @dTV+c&L$1)#GbooϦe@@50i'u7q[ kkF[7n@HgɬYFUxlشظ8fN}7WWRP&77Wo#"ؿ/Iܼj  PG~%^~K7/pkÃW^|o +M׻7gΝ˗Ybڄ y3Ƕ;2h :vsNܹuJe&4 ȱcE _LVVQOH $-^Α MT2#wW+˾yKԆ)mBEz:Sg΢cn0?T!iUYjj31Oвm;ǞA˶XqSWTxHV!̬ۗL"#ؼu%VVs72O}hxc#j.^D?0~PRSrȻYfɸ]iЖʪWS_PQT:VTz0plU}zzxpԉCJVZo[%S(XY[cmeUU999\aɜAT*j}8RuAd=ܽc/##X<=$==5jDj5Z194gE{jPege85x߸י5}11`\E*ҳ{7ML 55˗s 4iܘqG?3gR)jC^ʊ=+JK/<_d;sG8@5?>!1{tm/Ĥ$-NCM??}1 w.\DRaii 1qXoݺtddd ˙7g6ڵӚUbkkˠ4n:KDF $-?mBM?"囚o;vlJiSӫg\ʓr+\nX7q T*-5#4$[HOݝu"HHΛϱ'H$4lPkoÆuښqIlv ,-u[6^6W^-á}{ǷdBF`<~ey)^ SsC, mEGG_F Z/Z@:u 4n v6Wsf54_`˃ B5kv٣*77'֍P(;i2k}Wb yWOLHbRGޞM?lͷ˶գ;?˥+WhѬoԬPw72upI32ݳG}Y۽7mJ5 Wz~STL999|3ݹIHZl'Yz 4j,|!^^|`?Lf~0{eKbb7o6ޟ6e+W̩޿n]fϘNM??) >[H݊R_rrrcaa5֖kW!M 3+e_~ǰt \:ء='MA߬^nϮݻzQy.NW bÐpww/u[6?Ys?$7WΎbyP*|t&MaMj-˹c3W,X2ؾ=kW.盯b9ԮUׇE;{ѭ+Je&4 ȱcZ:w"]̌г{7?ӖODJŶ;i+=_qj4lЀu(?4>> w%#ۨ\vS&5t}綷|.NZt_VDĿОϴ%0ۓB(Dƒ(JZ WK3T-Ύ z eHtlߞ LʓҶMk6h@p\]\hDM[ܹsW:9"W]cI4oڔh\9Sۺѝѣ[W\]\JVu ˑѨa5l_ Wp9lL{4}θx2a4io// ~VZ'%Car4,S\ťTj⊬ TnnE;uhOyW<=5,N,_W󚽽=DߏA*ңk7~ٿcpC^޽<;"G`;#/Jק7ki9p H$t_*Mu'2 _(;+_~KQh_V~L=euYbXɫo %0#GҾ3ց.e=]PUXTCyWd2YMvv"WtIT^Z5Wu)m[61W(mQK)}Έ 5aeeŽ\,s]YA꼯/O:;l?]35QyOP@ylэa $&&ҵsgu}lظw3zo~g_xc Q?xa7nbټҋ:G,Caa_6|ܞSdTH$y? R/OI_xx `ݸƶŒ{Yۊ1} GȔX=g Q4viL=ט*}"+1<;jX[Yѧgf.>>ƁDBa+ΟNFfhҨQ޲#F ټe+VV0x0S6_0\]]qvvÃh~˓V|ﰡBCmpbbc9}}ۛ>^1cKdT-CBHNNٙ9r} ڊz\z+KKBC/8{baiAh}p/M*: k~1sfۛK/{ F8my75.C m \qWM1t]9ƍ͕s.u "=WD.d2ڥxr kZc3%h$P >sg JY&̝>,|aIgj5NNNڴё]eoeE|k/YRy|znny I$z+O*ҭs߸IC^ חfZi^J?mdΛOcmeEpd|h!sqぼ/%/MՓq%f 0VjZ*,rf7.¹ *4T@F_ V}ubeeeK>k6O@"h 8my75.C 1sǨ/Gz?[ss2Ï1z -53<|Rr/jjլɒE 54]JR\cccSc3%h$ٸq{'փʲ9Vff&tk(2a.XUJvګ0wL|FF x{{oZZYٸ8;y=99ZֹRHII!;;w_*ѕdNRSӰL9wl70(<6*ھ9w3t4>3D IDAT,oJ95[E(w6:N6ټŠP`ccSuDg^u8{*Z!5L&vZuv2UiHRe骃*|c7oaiiy@y年mŘQRL#} ]@SL&9?7.ksMU eSxvѸQC5 ;y4=NZ\~M[2d@s <٪9b5^ZSx$''s1&O_١̍[y^"pss_oVvX TQO@`ibYcMJJfsI0cؘ% /;A\@ҚPΎ7S ӛƛYTAn [*.XXsU܏!0i'u7q[ [,윭-6m2 f'QvC Vc<قe"kmz @ p+"G\khwYqRrOLȚ+@ܩ9w<2]̲/&5͛ѭO?ɐAe)o߁_ymL$ Pўځlai9ECW?([qvouYvNAA15`cFX[[޾#Pt9ϴ-Kə:<O3gH4$u}2]QA"985T,\'ڶA&j9cAAHb k@E/hk}ǪT/%"J윱Kk  T$DrL5{tBCãҗ%|{ZBMԡ5rSqVT&R;cֵéTOϣKg+;j~c3p0>Y;TJ WT<} {=ʪTD[-%jbՀ+nn:dzStqvAD*OOO1 V^۷*;VތVqVZKHHL,sՉrj.7ށo nOgf~?| c0u$7kV2nթ&n-(#P<=<8D׫JoTT$&&Z]VS*X[[ͽV3TNFF1xzxjUsrrHMKùFRlt\uPіS>e] 016qv͛6>e.{S"rl/Vb [Fb9E<'${ fϘNXUv7kkqv҅Ǐ\.gޜthx|{g7֖A3i8ŗ̟ yr\)ٺcVԬUSN:ENN5X888ho^lٶO?_^,YQ'ym÷kSAՎtںq`gΞ]?jG`IjլY]y2}x uU~0{~ک|=? )9:2Կ ߮Wg{+~k6cj.L]aos"ڷbԯ?"r/V8mZ6QUlUT*UJoSSKęł>ˋ,`'ѡ];T*̙(nGD09/3_yߟ6e+WțJ[* 3u2{tj1OYBzv`** S#''/~;w##U)))%CVϺpqqu) m0&]HW.߾ݷ?Ϟ%<,!{yӦZڌ苧 _}zdێ=vJ={l'L#C[[=pFtTsޟҔco_t`i~ 1(y~֞ Y96ԗmFm}T VxzTŕފ:vh_c,z9 7o]9(R $ T*i2V-ܢ9nn%vyuF@hp0-CB49?zI܋6iK/s"vX`F¯yQ1jGrQ-LJ{~!<,49”IuƮ8;Йciڤ1uy^{=K|B+JwP:sn OSx]0U:uҨas.u3~ojVDڗu1V3sϙ;A }V R gZ/.˾\̲+y3zHNS*WwbЧ4+nGƒJӛ}ϴ8x$YFW)k^$ g{T/ ]@V,ܿt!NcϏ;C-o5}}47uA܏PJb(kL˅Z`o^Xl%~.ɋx ك%_-cێ0Gʛ (ܿ10}kKӞu{#밠mVD Q8C "'\Jo1EVz ֬׃;qfYM?__bby^OjjI^DF+"9_oZWGN:MԽ{s\\]qQpN9c0Ƥ\\>wtomLio)m.Ϛ͘ o( }kMmo6(d(KMi_E\'\Ef C+Sy̗%Ky1rMyC yrry0uALƗ2g|7\BԮʹ);o>?mJq9V>Ԗ w77w–;>~ھ;ތqwsuX+ek3bl4??@:k/m>t4ĶRTo{lk(7o)-]kڳ~/gN%fy0Ceg%WGUQT! Bt|VW*қ̥VST{k2FVvV$$&]NͽZ&!1gg̓Jvګ0w aʋ9ߺV2OyXoqgcik/`k+CWxװAI,ͪa h7F-EJ|i脝W+Xv>w27yS^g|o|1\mWWQ}l◿0 P=y@ E-Ƃ^ ެ8T'kٲX*gzlfmÃGYק6{Kzʘ5.O$畷㼟"9RO-qbpsfo1eBkVϫ__?i9fﳾxװĔD _4 P}<S7Gͭ\7Ũ4i]w4oh{ rUjv&Sce.|張c>{):M\۞|wVRrUjn=H 2 d_Jf_+6" Wj+)rn*IJ*,p#:4iτy]O1;;&l^{8l,<(77-j(2+fIEAABR߹E&ąwhMzV@R*v ?7'u"|O{x% هo7NB+%x&]Zf.4jpNAA>@ր /;>T~3dcF^a5*%0.qcyLj1yY@Va1)@ޭ.њ߮TQcgP[1 P5T+})jY2;y3w0S3j-W[rƅTfZ8RՖ8VH|4ӻ+2sDg 3+\LZ)kѥ m91w?9ydUĦd]Æ]{ۢWDL9]{ vQS* *⊬A_.%~c'_vA,zjȕ̌,6fJ,zQFLϿͳ `TW?ey@˧{(=G*I#x/ak%rt]{ly,S9߬^3}d\\\m_*.ѩкeEzf)*2WkըTy9;0aԭS)J]1}*T/O@?{()ˎ`9*2sL;\RKTc,Ź QTXZZAL7rII >А`82#АfLUVBb"= ! .!mij155˗s 4iܘqGիE9o/5 } z%"ؗ+[w`يޟ6>zp?&HRzvƴɓiOHA̞1V-oڵ؉T*Z4kFhH0lE;_}9";o>ND"аA}]oR{g7֖A3iXǬ+M/P}݋惏s xb3p0>Y@ 4mo^lٶO?_`37䶧oݺtddd ˙7g6ڵ3M:`߅]Cļr)rrrǢO>ơ" h֭Ӵg]9 Qz2j̒d% }<ڃ&+V̤U˖eg ٽOLJ7P3vd֬Q#GhͧJ*r֖kW!M 3+e_~ǰt \޺ء='MA߬^nϮݻzz^f~0{eKbb7o6,]P{0&CQiu=ӖISaeekW}YbQmF]6}uSn2~Xчx{yт3:kgtWh[ݽD&Ly\܍VZ| ߆iFWT*>*T_b [FA^vlJm7[Ӳr:uG*;, ֛oTkQb [St Ax}ۜ;wYVW[S־#چ܅u2˾XL7oF>ضc'\.'7'F h-#Es\J+=#o`Z^ѱ}{?Abbwao2 q1ڶiMyq (fM"]HCWr׮q~.[4ortIqJH$?@TҪe(aZU\jc=_XEֵwp ;]&7Wˍc-m?;3m5[r mn:%sA.]k׋S:i/VW߼ ՗ȖXVO BY;+_~vy GpC nEܦ}gT._W󚽽=D/߬RWE`quq)U2;;讋m<^},`juYbXɫo %0#GҾ3f=fcۃxʳZ׺/::o3<Ȥ/7Js9Nd3 >ewslas` ՗Ț ƭ[L5cFX[[^XmW$ H >XWq?aܲڵjYS˟Gq_qSs5q>t!NcϏ;*˘\k)MWD];/qCXEWf \g]X3G;/mGEG7mM4SBUYC-uqv&C;Fv 85T,\'ڶK&ˡ?XXZо3%" IFSF\.gXYYF}YXZLhH0>L>qǛ8Hh:}C_]LJ?93gͥ˗KkԯA|*VFeL;+ΟNZQ/e(>|s&+.\к_7WWvv>zm‰3FՕc59ڹ1mB׾o84>|&]"hR uNKS(:v0GϚMZZK>_dtBWd kӺ5}z9shܨ֧ [;V 8 IDATz,Y\^^z~.\K_~R岯Yd)J͚Ui}-z?c'y_'Vqrr燘} /VVV\f3j$fę%Ky8oi\Όhf*˘zw>ޓ'jQTQͤӰquqa,[[zutN̚u1jT*c&L$1)#GbooϦe:۾GQo{{{< Csyf4zl#n`՚MϴIIyȺxw8֭^x DFE1aleڲa&b9= oFAAv-wuAjԨAB x2a4iwjP`s/uJe&4 ȱc9s.,b1m[ܼcێ;b#[pX"0{t^=X>9zbԱ;u~P=^6ΝV&ϐA[0)o߁_y  TO@ё<ï1~h~=t]e ::oޏ`ܢA}}j޳Ã1:cw=cyf̤A[vp+6.GA{*O$%%fw$''ӻg۹HusfΟ:_Fnd3 j,=Jo͕֬7oz_Hn;?->H 7bu>u[[ֵ.* Z_UDQ *$@623du3};!~r=g@O;VzYA F(+3SO{L7M$˩/uEͷE2}{d踑h" 4HO}X\}bccksim\7p`ǦR}{IT ,ܜ}mۮں:G)##]';'l;f~wߟ/ݦQǟ=O&:o茟.~zGutI:TVkuLt|`xÍ2 C_븑jǧ鉙O'հzrZZ\}?p[鱇*##]w~&^|n͙|뾳^|IϽ0[Կ_bcc%zvf=k}WzGݫ1 z>הQ n ƇZv^$ݮn秎m#j23"22RYe'f/,L&K>2;fd`JYAD)d`JYAD)d`JYAD)d`JYAD)d`J.@qƩ4)d`JYAD)d`JYAD)d`JYAD)ٻ&zn/:ryXQ30{Tꕕ /@O.Ny}G5 CejhKK 9]z\W<e`A3@k:\t,`"zb̽W<9]wVNuuuHO)'ߜoؠkoIN;U%-JMMչJv Лo/+99I;nU\6K1SO̘)ժ7Ovs_+q{4U0uNƛSO֒mٺU:kjVY駝K~?2 Zk{}Wr|G|^~~IRuMfYB ;f. e5.KWj-/ߡ_|Q˿XH_}N@k!&Q/á@0 0fw8"##՚\EEEp IEOnkh'4d@m۶]<5x@޽[׮$sQjhp| 2D.Y-V566ꆛoUIi(1!A˖/7YO?xuO77Wڴ{= EFDo>zW5`1j}zZOv^{xyj[nSm:rPU^u}5.Kg&&&Ϸߡr-gJ[^~ Ս_az快F%JW^C+5X:CS3?YhIRM<\ yۭX,zw?ČeuYvZ o.Tg|K>?K_V#>z)mr,\إZϏi_}H%:cuťkҟo{.]ԥsi^VMe:tb{SBd0zuCS[׳6wHtNӎ;;tw)**Jveh%%ATPмu[,%'&R+6$'%Inwujݳ??6fԉᅲ$}d>[dǕ+7w=k$ <s =Ao{WKc_RvwӥOy>G7m_^otْg [42{rNRe4_x˖Z;WzZ$15vrvXsWΥ3Y6\{{5dY l/+ӗ_wu1 ?D9\r9RR"I~;eXƛOsgU v]xy!>_kﯸQ9sWK+2"Bڵk,Vkrj~r#]:ΜrX}5}BةTS]ݥ,řQT߭s/rEGwRWӰzڼezee[n֐ֶ%22RqJ}z9L3}rI:k:yXY*1!AZ;Wbb?E>Ú=^oΥ3111zGuҘ*+/ח+y'̝;KJ ,ĉaIyUWWww"⻵͌UР%$+.6xŗkY> |,X@8ILH 3W\llإ˕tm޲E|,9F0Qk|^_to,qZ7٥^4H ݥ!A01NԘQ'vw)pXpAD)d`JYAD)qY'ɧVigu*wJ\)iJKPA9\!#anGeXD\J-"_W5՚[:vh2TBBXEUZA Ȩ(9~LVW5D:3BA55Juu(NvFS~V^‚"fr)..NQRllN2ҲTXPo%[uֹ+֙眫?vJm;+*+u ZuM7Åq/n[s^6bFS[mR+CΔTƶ_\\Vvh˶MḆaהRFzjѧtO#d/em-)՝z_0hիuqvKM}lzZP a]tWbbbeuO=::F ,tܚ]eV+tc$I}rs5fԉmР}W\\n99+)-Ֆ[zUV^TŵzCՕzS].g{m>L$AUTV*պ v=_nGYCW?MY Lyn%Ƨ(2"R}mVR}i/=''%)%%E\@EÆo63T ~=C}rsuӭU e3W^8УӴfwZ:y]?&+VIi$$I/=R%I?_/4G~_v]:v!ח_ܗfb0 ]|zg$5/'o.gߜ~ǯohЬ/jiry< .L99ܗJ]xei*:r&^ty,+a2Y߮^_CMѬ>ah֋sZm2 CwNWvGf!CZ?u@(@r&jfwxZmjLvui!5ٺ[dZu귗]6J]F߭[VGܜubN@OU*ݶM'Fl6ڭ+%%Y11:z=b^3C hB\:~Hy<^UUW|# UJJ~HNj4?$'!룏~zqD_J߮YIQ'nU`P?ҖGP|=bA ӻX7u[C>u@GXZĸ$)ݕz ZSb\߬e5f(5JkN.5[g%32| ?s/VEeb%i$IS=Meg*C=jcF냏+.O>眣۵Obvݺ=66V.Wkm{:}!ceGjj$,Rڰeܞz%vNV : X P,KN$t6%&$Ï&_OKӮyg[%tb(T甓NoW_CU=Dm/+o&Yd4e:s-\,wܦQ' I}ܭiӟЭw%Iܭi6<?ee6Za"~ rXj8ZкMi1px5YtRQhhhP0T\\,A?tb5@A IDATrru z裀 +L=a@'H+W/x?^xf+Y瞯_?Q~y~J:~}Xv5ڸi!=辇sׅ\.=Qt>\? fd0e&2!Ao|[gWEّZ[x6ܤ}mR^΀6sRjllٿ8SdZUYY6ge~Oii?^֒Ry-4_O?\ޥc]Z'wEO~. ,uJweJs&0,* (aH~CXLk ,ow=.>1i566'+=-K\~'~}2VIilr@Ǔ7k:g^˕}n99vhpxr:S$I`PJud^gs{<Ȣ6khNAS[)ZeF-~ %G7wPU d+1a/mpQWW%˖ +5^xei:jx& -ez5lh&]sMkn]_Z`0(ݮ_1^}f;*4Ktք Z窮Q˥;p N}s\}Cf~QK`]ueѵ7IknqJLHh}W^},Izz9SN$m/+CNӚjct}Eё4KtcdY A4pޞ\N2Y}rs;}.jvңӟвX,ꗟu7蹧g(7': BA”!!ɣ^V-Vy|Ay|}J&c_el͒_2 C`Pʔ{ڽ[n˝zim _L8CiZ|Zn]/>.Nk[oo5UI ,T__(Фg?͗W\UakSZbMD)1.Zfb3jA_^$im~^JDGKj۟dl^&Iz_llR].m/+;)yfekώDGGː~^ZEQWdF@(@JufhÖ5:OG^|O?N#z5ݸJOG׆+?g~㵄hyx|<(:Y!Iw醍Ï&_vi?cY,l֒VEeeH+1zgݫWH UGk97h1GWX a*(7;_K6 ]KBϼƥayizc54'^nPnv~{Δ]qڸq&9(9LCo٢r=8e~1\7Rfƾ\ujoSYd4bB Ol]FwuքٱlV[ZXt˔Ţu]s1bx225ɧt o׬ Nfd )0d;+Wʶ*'9A/L旂^jvk[Vʕb0.#S?şW^CJKMGQ:ih{}#Ss$)o?n Pt:픓5旤mWޟřz*=1ieefȡC VULfֳRcc cՓ=EGGwkeug Qv}=#eXܻR'!@(,s5ƍ,X@'N<%U]]%f)""B5z5q(""JQJNtuFtf PeUhEe&^tntmkjd $oWXfv+11WgohjbTY@W'3j.*!.IɉNl[ue Һn͆z]=vGc2DFD(2˨,ezƍ: BA~ Ð;1)CW,bjjuwi~ K 7jT)))g?\w+9 ,.93e.32suy~n kw:|kg_v~= \8zU G ,`FD)d`JYAD)d`JYAD)d`JY p55v*.WeNI+%Mi)*"#+ tY ,Ӓ+9]Yi%Yk򪦶Z?zKtWfw @H@*WW5_b%כ*jFTgF7W @d07i*,(RrS111{mbcGV^Ǎp9/՜綹j;hp0566;Ycxn[oN8X{* -6)Օ!gJbcc/..NVUje& p'#ozЙKxY[KJum vjpܱ nӟ.ޓә"I T%j-nz*+/Wjjn[CGө.3^qqq},(::R'3,<^S)6M )tSy}v=ԓhA}Cf~QK`]uex%:n1ZXahAV8Do{WnG.SN>sWTt N)ɒwߟ^#/ݮ?]N;dI2=4YVN;F7HVTVK.MWёB[o׫V) ngﯼBE5vOhYrY,Ӻ3Rθ,9l.ݚgB ' ]^YW={T ]~ź?) oREee[DFFj)Z =t f8͚nZ 2Dizpd=8e)ɭsz缨ËO+(QlLf?2UˊW^m د _nE3L9<<-| Нծ]4ч34tȐO”3٥OV×@ə;'uOIcFUv=4^5b$iA:.һ#;~l1B%IIIӠCkumU8dRRU[WGh6?p -$?r.+VUumۮmt竱Q6Myy|2ԓPjpYmVyy6mެ8nfN\?o5U\' ,T__tWfAT}}㒺4הRZjpՕ{m۾LӻX\^V%::ZmHIAS=>I]ɏuV ?s/VEeb%5϶,HMm]'AS mزFnO;\'[POsw:s_Ԗ%z銌{9Bffh(n**+5fԨN E@0ǸNIҋ=^Jٰqx]utք3KIj4򘣻N@ M;_q mWW_%@ 鸟-Y{m=Jl-{_cG`@Mj."ya 㕔@0ږ̌ }3?fi1GfuHO׽<+/L*/!Y,:jx״IRRRvje@^tM{)|$5kN@2 C6]rlb旱^jvVreغd׿$I }>g'ٳبAǦ)%Tm __W3VVf:t(?nM1Su PBB>̃>\r>ڼ<`@~l~nף>~Du,?p =eܹƸq hĉ$}l6EDDfw<^|7=EDD):*ZɉN|.؟FO[/8P552RRaƍp =A 0 C>@-bjjuwihFfƍZ*))UJJ~yYםAz ;WwnG@Ed`JYAD)d`JYAD)d`JYAD)d`JYAD)d`JYAD)d`JYAD)d`JYAD)d`JYAD)d`JYAd_SOk7rUV$RҔ!r8"ž;d ,Ӓ+9]Yi%Yk򪦶Z?zKtWfwڣз3t7,rXj8ZкMi1px5YtR\qϰgb%~_^ojwӷ=3Y~V^‚"mnC3u%Їe:cp~=H+W/nwtwjϾ%'9H)66N11pD73 ĖmЖW xYVmVk쑽mu'6mSwZLIU||l6[8iM =ADN ^idEek.v$Eidyzw]wZ+-:: @xJOњ-*ȊӖjWmW@w¯ fKR񺻻nҷȈHmoM =kd L8r82Whd,@BGd y^%%)9)z60ʞd !e} =Cw0%,L S"0%,L S"0%,L0 \;%I4d ngogNY3;*˴d"%':JNWVZoIұG+ݕݥ(-t ݍ a\_-֠~JMRdT_~_^ojwYtR\q@BGd LMZz TLL^##8*kqd;➁ @زmR]r*66dZF[mR^΀XeCBGSd LԻPLLlGG(ݕ凩 @xJOQdD,Kڬ6%&M @p8"p8d: appi$ѷASd L8]j ddvy7`PM~ɮT]EBGSd L$%NÅ%:%%z.:z0PNnO,Vk7^ :)?z ,@ |m.٤vMW 8L-t =K L!ͮYVUq JOTTT$nj;+WVp!?z ,@ ͦ_wa:-t ݉7{0%,L S"0%,L S"0%>PSOk7rUV$RҔ!r8"ž;d ,Ӓ+9]Yi%Yk򪦶Z?zKtWfwڣз3t7,rX*!6IQQr8~y߭kdщJufts=} =CO@07i*,(RrS111{mbcGV^Ǎ覊{:z ab˶MJueșvjծmٶIy9c=} =COA0QS+C11:tWvTz.:z au+1>EX,kڔK7z.:z aሐf4\!D=COA0Lv)jA5}r&Su=} =COA0:2;t[z >D3C :=X,Zܞz5x긶g)&rdݯVK6)7;_@0V3ѷ3,-0al6zgj[V&(!>QQQђ$ףںݪoU\Y-6…g)Fl6rTJU;y%IQVNv|>b-t =AL UB\ll3 y[Aa|]з3t'S"0%,L S"0%,L S"0%,h{p IDATL S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L S"0%,L SqƩPt30%,L S"0%,L)o0 ء2=.tbctY, ڰyjv ÇnWrRj }~ @QCUU:d).tvZIRFZFnؼA>OGECUu|F6oP!? @)+/!C(NbB U_wdkv訢~JLHx,aq+%9E])A$tiY, @iYiF7Wbnsz}`dCa@(@zG Xd!\ 0dQfdjB XA0JL0 u)[^ @a1#{0# A:|W o '|D-7 SU }:Ί 3'h҂Cys=zv 䊫_ϻ@g+=>ӯC60# @9/w-\HG_sf[>Y =aiAEe&tu/T~^V*++U[WZkׁjB X}˯knsM7o>gֺ7Ȇ:#{(<1i566jǔv0_h-!ñ?w3EC?\PGdgs7ߙ>Z>x:d-B^W ?AΔNݜ =jYZWE.+^;}F.^kb71~/Ioh /Q/xT0H>hF5Uy9R4o^8ɦ m7KIh\LgX-ZoP2V #S[)cZKuF7`RrSe%aB6Ѥ)n}!use9O_r44r1}vxױ,N08Hߖ@wwwuI;|}j/[ʢ2~Xşjj0hmm뢨˲8vMMgYl)]]> c ysfQu(ZZ """nso]&5}sESww;=acmE/~}K%#6Ɖ^i3ss1 #GYxq}θn-n'#=fٹfr}ܴh6|%p8)ȊęHYYlش/|~%,--’q̵AAVDD$DlӺ}/_`pۓ`ْ%eo>yr+i[WqHKsRRT ;Α5M >B+?̠ǵ\3^׭׻cdz;,X0M?ᠡyo_2))~Zڶ=8`>u'(-.ZP`ee~$SRXx`|cj l lM{{;l}n~Td":49vaEB+˲9z{{HO٪.MᎵjFVDD$Epok% /O6`D|leoj=zcԁϡ2Ho<NAVDD$o@p9.5W_gn^sr">nV6{ #3 ߏUUWe\eydUcu """qj64w=4Ćj&[K[2Msฯ6#;TMkdEDDdnŜj*`MaxQZ_Z9dEDDLNvMgp:H281Asrit8U }>n{B+ȊÉeY4{~i,2Mlw6N@ +E xF+#%$$vqe """q&I;)SDqbeY)X0c fE* ݍ """qgB3\2~>oAL.M +""""1IAVDDDDb$YI """"dEDDD$&)ȊHLR +""""1P[[2:IENDB`qstopmotion-2.3.2-Source/manual/screenshots/prop_video_export.png000644 000000 000000 00000135610 12536560630 025434 0ustar00rootroot000000 000000 PNG  IHDRCOsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxn+-! ]:ґP,&MQ" "" XU:HHo!kʶ$<>–3޹Ga B!B3#F(8B!0ƍYZ]ڱ!BQ .B!vDVPv,B!BL 2"+B!IfB!Dy"S Fi4̘KL\_..F߳aVm”^M&fyw^!L2"+0oܫЬA=*V`ϗ%k`oKy_29}KߛCGm';> /1gVR%xI"+0SXZZأ_q7Of(&_+ ҷ}]5u卑ϡP(XO/Íۡx{Τ/66z[>3ނSމйWB!!ک JIMh/jVž_iT6Wobkcàھ-d͏?1{~ujqF iޔK׮s'2ժ0qx~7--7dЁ> '$2Ttb@4m̉sزsw}iTuQgIJNxpv7YiuNX{z}ƌe㆜ o>v9^O۷%icJ?MhD-]ڵ!ic ҵL=T=AX] ޞ\~S{ҭP&ҕ[@G#{nУujTgK9~NNzc[z8ݨ[:NN4_j}]uiݤ /׮7_Fh4tnowNsyq m_}/w7 ǜQvjӊ-Ѽa} N]DzFuGW9P{TRB끴iք '!^2"++.^?o/U "*`^}]ff&iii$&SϜY(h4SPk^'%5{;222Fɕeozz:iiid~}GOpI~sƿNmG!DBcgΣhxq`֯ (y#и^"#ϡOʛFW}b DFc/HIMK\6$VYz;sKKKڵlhj5&6iPgӯԨZ4,--c@+;oӾUsbSǛm[;Qw=v<8~J6͛7~} XnR/^܍GbrI'x!^Nё:իhsEjThGi!wBWC=,[G{{T׽4|߬R/NSo ~}_͕&[ߟ =ohrJwnӊXt%4n wn\*:QA1'$&iGov; •kzy2gzzPKo0_ڣZ%?\pv~iݤQ!6ltGw !D6{{{  ‚4INN&##kkklllHJJQ*?gddR$>>GGG222HKK֖ 8ۣT*$99KKKlllsH322rm3󩩩dffjccHTbooOzz6i)v?ݼ+4S ,,,}g''L~rn --|NNN&w߱޴oS-hHMMվW_'o۞(JLqBzoC.+Wq;(O>|_XBb"+VKYa2)6"qVE̞>x7P(T[7 n=wٙeWT*ƜWbb"VX[Y}mPpngO+vSRRFO*)6"qUE̞zXS%-- BW 2q/&߮Ǘ_͑cHJLAL7w/^CfM9r8)4o֌3@Xx8sޝǥ.T*գ;3MERܧwh_nښ>1w,mpoV~ П'B!$ŒȚCHH'jBBC ;xyѨlU2~c7+u +QQݟӦuysD֮Z5&MLJ-֓ĄX;ƾ>FW}ڲ~FDD0g[0>Z {#09F``DGGB!D1&vp}8}+sÆˣswSgr%}6hڸݟm?3d@:u@N]&#G™3g!8$ѣGJJ*ԩUCGJds`h{(8s*( F%%%-Ӫe #B+Dctй4?ߚnC}OBuvZ\sEgy\quq)Pynuj,[eWQݟqNvOiB!2;*p;(O Ȩ(=E{FF뇝?oDʕMޯBzwww7݀VhՊtSfdmڹB!"bId54ټYSԫLJ|1cg-XYY2t`2Yfx ImP(x{3}&}o܉6[ݯ/]}#͛55Wr-ԮjXY>6B!(fϖ*o%ȆTѬU*,]˾bђиQC[77W"X;VZ5kdXDxd4 NNN vDvC8sQ^vDn^\Ev:6)9m۱nb:6Ĥ$fyݺg m#,~9؜gQ$D9вy3KjZ*AAlڲ *[[Y]WvP0|HpE:uG_^ԮUhPzVrcu0rl߬Z5}...x{`p%$GzϦ2qId==<8{Xi!DT\=~ڿ\z%&&bemUIWfddds%322xOGG,uVUy`mms>> [<"%''~8::?픴Ĥ$ vxcIJN.iVä{ wIWl\IIIh0j4h4xܟ6zloҸaC},1e,Nc/ctX^G>$Bgi<'22ի3kp;K\FTҫGwfNJX||K#ǎD8n,53ivm߆RDPQ甔|0y:}vl~>z S}ˏTT#3`sgϢol~{ w?c'NA%??~2իڛc9s}GGPPNm\Əs,5ؿڵȱcj4jDfMٴy IIxSz*9KHh(~/\0\_~_.Zժ{{6  a5Yk6r+s2ߵon,,, sNڹm(m09d|09ۿUF0te/Ϧv ).2GVr`Ǯ]tփa7w?Goff&&Mށ-ֳfr;ܖZf);~qEV+E=?Ya vPG')9>z~}wO>so4nؐʕ*v9G$4~jTLQ,^XPQ-ZU?6iߟSݿ} dλܱ#?m}-bޞ9fMɗ_|Η_|< ղ*c;Zg ZX;NNLy3Ma⸱ܼu7'L$)9Y`^{e4;WWWV4u:ccYr~\fMy<6ݍ-֬/>ŋ;qe`Pk,zyX{OOOgꌙUھͤiEÎux{y1qt<|X c({{6եNڬv ]NN Cח60:fI9^sH"+D9б}{֬oޛGʕ9eB8s!!ލT,,,Sѹ3s%f5^=|dl3-7͕ ?~jo>ԭSjU~Ma߀>&.^+W3cmZS?ݞGѵKgVLG׶ԨO퉊&111~J  w#ByṬҌA&qsuΎ 9jQضo޴)-5ÃۓLtɩStԉ0y޼ř3gكѳ{7C fLJ _&gm߶mZSNBZh԰ժѬISnݺ 29~%obڤ 4Wo//jըa}+Wחի܏e߁0(FAZժcogGuW.cR{=wr2M}^_}qze3٤79T2@r5ׇQԭڍ'7&B}OBQ*֝eʄ>Ɵa>zosJ~aw33i'(tT* VP0>o,rQQ?*Et\2:EueWQݟqNvO}OQF 5Xh7Ncڵjp=tܐb߳c/O|5 Rrj٩o]rPpSVVVyt~|Vkf.5e,>o//m3G z"9nݿyjϾfϯа|LɟL׆9͔4c &yg6QϦ^$@XX8ۏF!A܍c x{3}&}o܉6[i}YT4nԈeM3{{{6mނ%CFתVW+!U+\]]qvvÃVk˓V-j7DEG藴5o]\ôm@;]9S'N͕3Ιt 7oWW`ooOקR9(F uliL$͔k \_stt(rd hղב& K )j{$B'OS(Jh԰}G?.|Aևh4ڴnS ֕?mco{-,]˾bђиQC[7I >zl z>S*t46lyW^oFV-+J9}}?mGRx}oNd}0/|mZ޽x{{ԯW7JOgђ]u,uUJAYbDATh9eT_:1WeJs\5[оST,j(^s\f+5\0g:*{"YQ4QZS<~ޱ_ ?qZ2W^c- 8 yҮ':-HB%+j X,.)?111:|i'v(v:MPp0nn<7l(bi%D]GO\"= e T(FK[Ac5V6M[ӃҚB䤲cˆamHQv^T/|G-)(':zle c;q2ii,[7_/g񂬒o-[XMұC{&M kY;v%|}|زa=IL:kWfQݟӦuysD֮Z 'O!=ƽ:lq3/*[qlUڲ~FDD0g[:Kk JE*UJ; QN= _B':zb첅@͚4+׾( nB Vs=0 s ֬~4iܘu6=J$-H_Hڵj2r+9s[ .E h @ƍL?n!Yeޞ5B!DI{bٜ-WX)(Vls~U6Q!4I"kJn9FfiW2~)_'BQ$5P DcJ*PeL-)BQ$5P DcJ@ZZS!$IZ+h\I,¸.Q[d~!]t.pHLLdMtЁڵjv8݉Ytء)qcL6~[,}?X[YQFu&sŊe)Żcw77Iv*Rp6668;HR]6SXQ"\[.0tœȊURthU-fMYC}ɵ\#ǎ3qzkwpvPOQx2RpdddsŊŶcj5ѸpWߌU.)"EWXcj[b>4gظ8rܒ@Zlɠҩh)sE'$E%/=>S8AFFX|3`sgϢol~{Rے ;ir貧tڕG=ΛKv4l8AY:qywN۵e=Ƅ)SپG*W U.gOv{]|뗟W+᧟k6Ę\XE=]__UN-0V!m2>g.,>Lo|rО!Gp _rl} r _ӏ>a^_BDR)*)JZf`pwwvP+W&66ZktJ'ל\\]?ko3Z.==?xo//>c>3:k3glŊ|犣߾޳O&U͎;wF u&`v1Ov{=ӫ[#Gys'j5MΝ*PE>ctIUx@C爾Kj83:wuFWL1++k_ Wv˲+LnÇ1c<~k\'sdͤXxx\eΌ hMt{K~ݳgnڟs>LpH=wW.ԨO퉊&11Mꆽmhs4y&so@(CL|ڥ3U+WCh]LaTƯvDFE1_?mE>cWvE0y޼ř3guCPp.]b[գ;j˧}@Zm?ڮxם9w8Y^ /x&MAzx{yQF ۧPݿ*ԫ[Gȳ)B?  w0%Cj(J=Ӈ5}̤i矠P@1}U. hRԪYuj/;UYQCӪ9544oog} s #[#eǣpTsWÔ" UhKvk~v;{MbU xՓ%_.c붟w ƍZ 푳.|}Ӫmu .  9X䭪e6mU=C/*T.Yr^.l{dW s'WE=]7k?9r8o~[[e/k cit9joo>]9:ͭ۷9sSc$Z!9]nʬw2~m (Id(T*.@͉o~)aa(JfNƙ7Y&LA$+983vdά*lgP^=߯'%5 ѭ+ƌo5r<__qwsuz^~رsn{C/]Wtm¶ѩ[Ḅ"+T*Yh!-7gђ̙.Jmci9ذ0fxxѮ|a} z 躘 rt6BTŒWBBi8;z<99h+e쬽!2%%v]17nXU=}bGqTWX<a +!!k4Yt.} QGe/#+D9[Rm~ 666fdDw^PˤmX.*'}biz搔_ X<a E9]RB'S %;_.ժHV_P(WZ!DDN9а06C1(g]sP4}'pw`i糕%߸N:P[RG숉#LzBHdˋ￧O?o'-ޚ2YX%}j5di/+Wq;(O>oƄDVZ$eΎ-֗s\]QLJ;wPlB&&&^dT;bedd0> |CB.k_Voѭ'O"Ν\b,>ZMtt4:OII:q_H b0­۷r6gRQJ̓$V!L}{gaܡ];;ZIF4o֔M;_~95W7ryj5 <)'P(>#ǎP([6W^Qݟp;K\FTҫGwfNL2q/&߮fђ:㋊WtڕG=ΛKvؽg/_;weЀL8_˗<۳ K~5G#)13qXjTߒ ;iY{闭πA̝=}z`4FCm"BKdڲn*b;q2ii,[7_/gh٢'GgŪ4oڔ3it4hXrرs'\䌛4_lXObbNcBkFe]o| ==?xo//>c>3:kǍ@;1}o`۳yT3g[ڛ㈾wq̋Mtb~{LXmLn^3Λ6ѷB!ʞ'6IR*GhgBVk?X2" ##G?s{y_S ,<w{?..f__|dU5TƲŋX|ϏzofW o$<=< 79¶) c6B!D!׮_g;s4~Æ ښx(kjGrrww̶͛`}A3E@Vjō@)3fk6 Y9Uz DFE.%r< DťGfz"B<$5"&&ggb8tjϟϼ9sUcyx{3}&}o܉6[{|\rnQvmU._J͛5Az|ɧ3{{{6mނ%C&SmڨiQח}XXZоm㒈Q!e$FiݚgzyYk֯WJ~~@V˖2띹4Bk$Nb Ih48991!fKd gL|B<,Ç3TXQJ%K-dXd))))4nԐVU;8gC8s Y!D1Y!#v*̺E_{ ۤDžB<Yj5hrFU g`3gLVtjf;}}1XEh\wo 3׈lu߮ƩB"oGѠP( \aǑciڸa8:8P?%_uEچ>O!D|OK۸"c:y;R~T`l|l%.%Ѳ=J.%H'fFBm;loɽt<*d횐5Rw^SP丑*ZnK~ɮp?а0jsfkh4ѡS=s _w/~㏴i݊ڵmٳP(ڛ䇗_q7WLo&p,0[ѩ|>2 Tk Ƴb=+%jWւ3Yc*p%+T)빫׮ioTR> ԹmODst!sn濞twϞ 2n|*jFTdTz^a ޻BcOۉѴ TI=ѽ=\1 1Uͽtr89j=z9N]n>a UxD{Dv˯qaEY=ݹ?nc'N2fx*Jڵys̫l޺M :sKKK>/O6l_p72 ?_ҩ#oɿOacm;qqq(\?saf%nn @eJT5ʕ+ڳt,L㯿qe_6pwsWL]!D{,Y]u!mk80 v컪;y4ԻiϿ}ixWrvJ8|#Pcc֮O̠ j;r_7y8fukD\:3 cp0l|BPZ>} +Vs텛+666|'v-gΞ#4,fMV% ͚5\4j@[\ɉO>|_,aj6uv4nԐ[ns;8J IDAT~ <Ggp;(gF5INIxjZjpT3BذaG~ۻw/룚cHE/hkAXlcҮ+}Ӣ?rz<_JJoFs?1n̙qKgU!)M͚#|g+h8R Vʂ#9MM&b̺ X9}?ڟigkK`Ӟ#NϻB'jD0@ehH(R5\Q∬(8;;;f5 .͛6iƥBD\#BܫacmMؾ]i"}Ċ5"+BX&ORRq/!>Zq@<ǓBQDum2+BQr j#1$!/Y@LJF!2:$%VY'o/o<=uGCU B$~ 4ŵLõ*8$B!tApDZZB<ɜ*8QV.sQY!IJNمEbqqڴiSj\]J}ڍ$B!4(Owi͏&B9(z~kCY!B 4 jrBWE=5 dDV!({2"+of-..lڲ;wpsuekK}ޠP2"+({6iL>@٘;()dDVQйcQٹwQTǿiݐR!$T)"=R{ "4)RD\]Q"J:dwdMȦ 9sٳoΜ9}Vͭ@ϢGNe? ==O=_}KT?\uۛm)c0ťy+KUwIJzDE%^ٷ[(t:YYxyz.)9ooʲ?%NGggU{ǫ!"'RF_v-F^zdwMe.:rPL?m+8r7 #Su9t(z1zu%K$@$+.>y.3(Juؗ_BRYb{o_8@jZ+.aBˎԩSgyo6}/;wZT^?P9JVVxW,qs6p0ƽ6G"{~MhF#<֧7GQ@DlXGGuw~K "3*9q>s}(ܰ yn Dt!hצ d24 ᡡlڼ^sf ^]RSxcBC9r,1, p\| -ԙ[ΝҋT5-=-c( qyVXfy qoM_%uf<ZMvv~BZZ*5k5#+x[mg˶5 7o2u|}kxr[m`26{6C.oO\vZFLAJj*#F?h*<ݙ>{Xw~ٱ7l&OkWD֌Y| 2ە zYTN* ?4;;ԿZV-ٱs/ B h$.>zuKIf[SYxQKf;?-X>ѣl40xu 6D^<=i[kP?06F7ǎe89: #8'̞6www<1坜YxL1ޙ5FÄ̚'P(ү_˯a,}w5c~~~|r9Z&/:ys5 ϟF&_8sܬ&}tBZz~B+iiѭkD$=BJqY{{j׎m4m[֮߀N⥿9s+.!QCKoǏשS̛=֭Z4h٢9_҅ h,<~"XlhāC $]ҳGDǶ!ܱ#;vdC?M0Kp Ϙ-cQKZo_'Oy~VEid㧑\tAӃ7`V72I:GG{~m~xjubFrssJJd re-wwwҨ݄pyrss5oA$8::3O>Ng:P~ fg9͙Xp6 q0>ыwdF(NNRUNY!A#G dի*@ݺXi4|Ƿy|`8BǛhq3/;v0bKOdkdp%jIw~~ݹ5#)9Z$kMNTUڋ1gt]3ޞBV2(ZE<=HS&N/NTT ĐRSSmBjܼy2ac%^=А~rrrpuauVΎλKceBѣnݺ;99qjު• **JzdVĶN89:P(E-iB:71'LT U W(tZo!X[wUK)=Hw#k4m#+BaΟE_F?s#3.\Ȗ?3"2i1B!D@Ann]5Qޱ{ݝ>z%DwFrssGV!*7?oRBw7xzxէʟT<ѯ/O`(0[YQZ`k !V8;;prt6 ]U^˖-^ :[fIdB+QdegN=ঢH"+BXh$>!ҧqrrwR?2H"+BX~(J[#Db41 ܼyӦqH"+B͛6BMB!Ւ$B!ZDV!BTK !BjIY!BQ-I"+B!%~K!d2H|B<:QBY !V$&%Bxh8^^G*%%5gOWfqH"+BXOxh8nn:!7W77j !UNÓl["D8p۷/׶FOODV!"oܟdq$BTtۖcAY!HE/DUu*7$B!Pd2a4mN۷dB !UBh4J"+YwھF -BT GPa>\L&GˋgL6ѡ};/TǡG:k6-N~0))/6-[4 q]>]a3Ç g{nhM/Œ9g.qq|r];!nw/ DV{HnogpF X;x?$ZF[DD_JmѼ{,^ɧ\Il5/\v/;v'-Ik{ރgϝuW$BTw(m0{> p MT?ycdo?蠟̓O_s%нk{pnYٱk7tV}dVYaKڏWCDDO4j^DqZ"#*BTZ4i]ya ݻy][\48d^#݉cᒥDu@RϼwqJ%ݺtf/Rjhz9^qp0F ^W_Rr2 }wii=c:M}6<|DӐzxgL`h4booc}z3z 511D kБ/q=o?\%BAnnn+Iڵ;1hҸ1;waA{h߶ jggFF+l)Yߚ$^KdZMvv[o!== knn*K."Nztε$N>ӧIJJ&[7K saŒ|c |R.77fQkXj%K|zLc1b`&{ȫo#)9lNDヨ_*S}Wb2g8M<==prrb{KxgL:y~c۳1L|~eykV,Y̳<ͷy1RLJwf3Ucžpiբ;vﶼL&]Xރ&LN[.zzeG~lww7w_`{VR4\]5:lIzdt0+?X͎ݻ iҘvʃZ*}$_҅ h,돟&&6!;;;;;qah:uygVMCxAl޺aY1ڼק7]ҳG%}U+KN B4 <)ϞohZvJ6~K4Y<==~:jU f3{6kh4ұC<|?O <4;<Ī5kٹ{7sn\]]i٢.ӭ\Vzd-oߎk_ 5b8탣#>/zH8 ͻ|z ];u\1c{dԈᖛ!u⫯IKOk.ÚdQXrR#{}ۇP5ESBT6[ZFRvm5>yf|k噧K9REK8r7ڷm@ͩQ}_d1BJQ\U*)n{@Qֹ36o!["bvrtd,X4$RYŜYb%Md2Z'u(JΜɚuX# iŋ,s%W dպeKztw%5,O[ 8kq/-cdB*Jr_}Y!?FV{M1IdB+u89:I2+I-[,wV(:om+ !V;*'J"=#Z$B!ph4OvvJqrrw>QY!Š\|}GT:!ш`͛6CY!7o޴h'B!$B!Ւ$B!ZDV!BTK !BjIY!BQ-[B!&ĤDuG*E__ DV!"1)Cu8BT)))>{~6CY!ŠxCqsu#''QѸQcGDV!jtzdgg:!*Łh߾}5xzx|؍$B!yL&#rL;n߶ !E/z!;mU!Ba& hPwھM& GVqjJu IDAT8BP(0D"+7a͝o(C aQ*lXa#Mthߎ qΚͪeKSWcbX|ODdyx8c_yڵj銍O-gDrJJ2 Ρew3RÒe+ kc^߾;:<Ԟ~ Cg$ң[7.\QΟ'.>O?Vc㧑֬i5Q4QyRM&3ޞ``iv݇;@ q(ѷhތ={XVU.!0LL= DV-0! 1퐕DV{ID73vS ݹ{tza\4~޶жYppp񥥧sF|mX;>l)m5TDlB.o_ҩc%L-.. t:YYxyzKIx{T~|i|jZڵyzux%_}!^j|}F(]KdİQ1B S+ &ٹk7/ Ba"ޱ{7kFCRr2 ckcy$;qq,\Ng޻8u Jn]:3,2Z>ZCGįèWnx'h4booG޽5b8)) :vmБL&6iBxX(6oA4zS||/sڹcFhuܫ+lfa֫g5燏WǠRx{Beޚ8*ӾEoM_%ufzZ&;;۷OB>77cd 'ztε$N>ӧIJJ&[7Kшd`00}rsXd1Aeh֮Z҅9|(~)fpo:h4HJN.B` \~/k-P./-z2VXƲENp<Ԯm ,3-DYXY~?Fѳ㖟/)гu%&?o'˜4~サO=w?lfNNN,[.oϘ_Nqߘ;s\hdƍ딙3Ѩլ^Er1"p<~d0ǣ)͞E[6 y6 ThaMܰ}̚5}|9-6*PE8٥+V['`ooYllS'MS*Sg-0<<=",K4\kN3O= Q>¥K4[hNP}Twwwܨ!`~?=wȟ'NG'DBPT?3/Ic6ÝCزG_7S'NAP}KFwŪa7P*qx-ёGzXE #صg/[mgI*6!*BD~tPLƂCv˺%9%gggEMCZzՇ~d88_m$$Z`۴lUmWcbX|OD}%jתe ;tSgfղկop ¥TqDk=i{'DoԔeGVQZ4oF۞R^]ESuL&f=ɕ1޻ww[g AX~V( =ʏ?̩3g֥3_q结QeߤȾ~wvVܳnoK q@Νʴ` 33 4t:,FKppp7qttUt._/оmգsLJ˵Vͭl|ngddgQMoU*deeu4 BQzj{B\]g,z^ߝJIJNf!<޷/ 5-KzGh4booc}z3z $0`ڷmG0L4 YX(~،Nˋwf$^="N>R[Ό}%˸ӟO>!!!'''>ڋ#_(kjj*@xX(%++fa+d}u Y'ۣhѬY=o%SJJ*KWȱ0 g[SWL֭Бz3j0խkK<|,j5Ə$ֱqq,\NJr||gn:k Rݝ~c_ٻ2ǛVDGVQѶlΖm-׫kWoJU=,*'^hc}PLJGHn'''V &M͜=Fo=cL6??֮ZN/>d0/ͼw俞wrEǐk4OuyѤgd_3᭩,_GGbUԱP(:qߙȗ_!i~q:o9d21ml \ޞ> oo/._JZ0L6TF F7U8n޼ԉeyoJڷm``98:8bb<ްѲm@;h-,o-(M7\}Yk ^_ ۾ q}F.>kWz>p@|GNO#x%}U+5h{1Ҥ1M9},ODϐ 8p0Ç FTP(DVv6͛ӢyFоwxyMQ#wghZ̜QcWԬ(G~K 2kZkݲ%=wcK_U̙9+V2itL&5x_?ZlA6k?ƍj^{B=E~%|9A3se,Wq*7nPvm?{P(ԩ]S&ѱCRJY=&N{̘N:;s&k֭cڏ&$ /ӓbsrtd,X4$@p2gxEYKTrZgΝ@ӑxDTС}Kr-w"]d<\\\u|礤$)-)"##M=o88QQQ 0CJMMu喚hӣB>srtݚg3h$=#wʛjkc  oo/WiFqSe8'GGIR,Ӿ E=EJe薴L2%JvwB]n0Ij]Q'Wc2pww'V] !VX#+Ľ&o۹ O?=/$5-WW7yj 1B!ЂsѸϲe<ڳ7eveDVQ%x{-Cj5:Q$y-,33Z][5j`3KHJE B!G|beNa!%'Wӯ\… \`1w !Vxzo!++QT*xzzr2orחz+=IdB+rssO.K{d͛ ufpMY!OsY!BQ-I"+B!%IdB!D$B!$B!Ւ$B!ZDV!BTK !BjIY!BQ-I"+B!%IdB!D$B!$B!Ւ$B!ZDV!BTK !BjIY!BQ-I"+B!%IdB!D$B!$B!Ւ$B!ZDV!BTK Qeeea2lBQ%:!DA99|{'&6gg 4`Z F{{{ʊ, " >^4iBψܼy1om3czXZENfhѼ ι !(HzdBnܸg_~El\5kb2Ѽ|ͷeoᒥ~8tB,Kk>^O#xo<1=wB*ΝB#=BT!W}՘ڵiÛ;F?,[G7мY84u]yriբzmM& *|Y벦ImQO!7 QEddd]h4&gjRI=r*_34ü5c]:u䭉8uG҅ Xj.^`hԠc^z1okN\xkȠgueK OBb" n^)t&O۫Դ4V~#~õF tĐbo_#d2'NFL2ĺF2s=wyC ՘2>>><WyHHd=NN4_BI"+DqEZZhm̹󥪯Mh:  ?_?}0(Fég<}fϺz8:8$8gb2h8_aޜ0X_~N՗F*QVYK5h҄ N>U:1Tǘg=֫K`` 'Ob i'O!>!:kəs0 %.d QEhZr V+!No\KJ"!1th0߰8`[T[Φ[r{;OOO/YD?IVVサ;;;Y.iuvs5&ڵㅡC0xmlΨ N n]<MCprr*U]Kqv!M[nZ|[(OH3}d _~-~q !($BTo="xzzX4_k1^wY?xX@Xֹ$&&?0q4T*zD0r2UnnZ-iii6mjukq;!I"+DQNmڶyC0yL?֬&W~#@l~z+YR7 IDAT&7;;};j׮zp|ݷfMvDN 66--޽zDž`Z6mBcc yAwϞޯB/$ 1׈$ ^O( ƌ~Z7j'89Bx?Fs/̙L9 BɑcP()׫Wz-ZX8_L9ݻQF >#>>>P*cعg>\7^^\zc:ԩ][WQRܹ+]c' "]!DdY!777֮Z ̯r%1L;*a„h,r?d^}i4MCB*dUIErFk/DBB"W^xkD{+=JdFMԩSۆU@ff&...x3^`՘._\b-W*&))L&P(t:ppp(=;;GGGɓٕ: ,Jʇ/\DӐ&zGRV}+Zr{EZhNG{p0jgE)K+OvΉ7?obuz}^^=$%'RY?" V[uYYY'$ニFS.&Bع{?AϓѺ:r^O`FFu m?E|a#L1 k?V@@%%'3p0ƽ6G"-CB /?$r: &#FbooǫW'1|`MhF#<֧7G@rJ  K<|,j5Ə}6 "Wcb kP+@Lŕ+˹ц|:SoF`"N>R[Ό}%T*պ:vBϿ`'}/#6.q&SNޙ=bccᒥDuqor̙#+ 4e߁r6*ձ[s'mxoZm*'^?P9JVVxW,wQKL<& kYXq[a%[lNIIM-r[ksV-pb7o͘e8::Xe0h۶#L&,,M?lFwQU3HI tckCE XX;E ˢ ,߮ݸ"T" %JɤHI Q{͹y~ '$ԹO+ e7&6O?EtT4|e+VRVV7<8/ |n;HE:*ϝ"ؘ8x0vNg˶osXv;~윜+_x֍6Nފhsr~nGzFUZ~V^{Lcy| +YZZ3?ǂxx$%3gCϊru .o.e 3f hK/yV~jU]9/elbfMJxxY/ߩ~;t0z3?aNBuzWw~v328y2I˄;sA{>28Rx}|>DG]ϱ_|;~7olǟ|AT]ϗMM}rf_h|9۾aάױ;zIs_SghvMŋ?v,m۴, fוoѷOo^}ul6[Զȩ*JdE!^^^pc.߽Od 8?S|9kDGG'k7~5.ǫM)fumKNCC+XY:wH\v2&Dm*y 8? \0`9X,z`6`߾۷շm۴!6& <2yǏٱsG9|xyy116mXյh4b08^=S;mߟ?>Nn]Sî~ tҙH:O6vd2ѹS':w?T]4b q{sh<2zr whq+$a7Ѻu+:wD|]H>|};99\>:}|5^o}ҹcGKhHޭ+qq$_'ԵO^!!>aC6!%9)DsY˫5ڶt9\ES Dy;~mے@||\VZNzFY .b߰_6`06d0@WaCYn=u'?/װi}l>˖CTFxЩ1f6MZZ:{yL/̝wZ յ=!>9eي7i2 9n,?ɓ?`@􀊸!--HW:g}os&˧G:4ށX[/%oIZ;Sǎoj8^Mכ2L8p_'}MTy???|Xj^u~;ܔȊyF @1[D R1.BVz _|~ʠy\115k/1߿x ''CVgfwy\y\vj7'k*W[۝CYY>knVݛ{/,X:g+.'h6_[HLt4)IP===u.8s;{eʧ4qWVs̙e`rF&9P*t3gs^~HZAA7̉X]:rjY/pp2?7mbӖm ĵkG.yE{+/݋V\|)ɵ͙Xj^u~uFDV}w@:&v`洩OkFfϘYƛӽ{7^7\q/u 303}z|ݙMxsmw܅ Gdيu`00|q-/֯O.p$/\~[KNTyܪ\{Uص^'6&^))U& ՕO_cp8*fL㕅xb4AA\{UU~&0U>hs~1&?:'Ng5s3Ly)zt^%yj;gjzPΙUcUV7VHb<7cZx}[e"[1l(o.9f2;U.6xpe|[7u}7&3k4澲ǟ ?7}ZpʙXj~j#U Wv5RSS=ztEAyyyIs?ƏV\"#dƼcp͡-jXVJJJ r{qI E v8Q>u!oC7U8]qMt\C#MIoJΝHbtJdE)yǎզ͌"W""7@S D)&oAkk"d͇b<(Lka97@S DDDD-)DVDDDDܒYqKJdEDDD-)DVDDDDܒYqKJdEDDD-)9]$'(H"t현#lJ;EDYl 48(b#%Vcͺc`DǸ:9W)""Q"+s3ݗtLP)/++jd |%z&",ϩ;#""uDVCLODx4auքE5ˋ)M֊׷}-I@DDxS74E;Sv<&lԇYU`'*͑PEV f|0 52zd#΍Tz>K-xФ*I`sF##'UϏ+/{'ՠv>!b9WFAPS,vr mtm[!8HL֪`@zt\Aa!o.M[RTTD.]$׫]""R;Ȋx(_|||Rp描Sy{{C9G/{0|S*o,^+/-[yw<ϲ%5m*PNGimI?QF2Jqթnz:uȋSTd=kn穩ٲ7}Τ%;y KȊxpJm%^N-0(-+!,sǎ <;Ǎeyթ |L^w9oEdkx-rz ];},Z?mm|UVDW4>Ȋxh `00X (,oU+t {Xo,ze>^VZ1}lrs^~H"/!emco#e\^zCnH jﯹ+XLL>\b!;'6mUN#"fж#C\G[UY.$'mGl6[MIN&:*gg?τ㉎"33 ͞rA:%&Cbg>6+j{&FId} jhdC0V+ڷ/#9]:k?65W^^DDvJdE<˛2ѺUAZ8“&`4x5J"k2܌ipOL ((k~}zSPX7$?| &?ࠪ3>4eδCؘ,\Thd,]%oIqq1ݻwys1KDDjfXzcԨQNѣ0$WM ___ȥZDIISMQRR(I왊KJ(X>mn^`pe;EDjDVl6V+AC ˫m R{RWFshhvk(98s+VϕvH9Z """"nI%%""""▔Ȋ[R"+""""nI%%""""▔Ȋ[R"+""""nI%%""""▔Ȋ[R"+""""nI%%""""▔Ȋ[R"+ 9|Vա4 %"#<\spWz<GҚMpɕWN1k \{rx>]wvN]~%pWxyFV<~97x:i<fSVViS#lKBCB>ΊUosyⱺՏt/6~'BTTTM}RqV[p bɛ8t0HKDVă;~q8yOH`ؐUX,s뇏ࡃN{ 8UoGn\zŧ^VVFAA[ۻq>>{qe0x8rrsݧDDĝ( !!fJ=>ryy.܃hda<8>79E_ 7&6㤥Wg%5C{Ϟ;9{;vnW\ν"'7[nϣ䒋.~Ȣ?Yե-6mJQQ]t;ǓOvNN>#UccHINbXVz$3 3gt嬶Tۉ'xTDQ"+A <3Äԣ;?///l6ONNLt4o,^b;rcyx,_2B ydIDATxhCϪi3LJuYbSLyx2/̝ni@)\}DFDyVVdtnqʰASmn穩qciЊ>~7,,S]Փ_P@zF L^8;= ͛[)S5gAAsdfW''ڷEDZ%"&9W,˯~ij'2"\|H^xwΝ)Jh42i}]*q>>>uN+@`` # ?⓵ͥNh42{ ._Β7ޤݻڼf뭮*~o;$vhs3PVbٙlU}R{wϜ8yGD1^1j(wHMMeMsu@ǎu`k|}-W\RBBpppeZ@ƨ'1vfsYV+9DEFjک!! Z*5[Fv;N~$|}S{Cu}XhjDVF̵1uVu l}1TV5_1ToM Crc.W'ދԇYqKZ ""d͇CDģiDVDDDDܒYqKJdEDDD-)DVDDDDܒYqKJdEDDD-iYc"==kለ4_bcchXݹ@"-=VD]H).-!-= :Rdi(Pd?OJGS"+a Z>:ər8.Q"+i~ÇHpg(Ov{s}݄ȊxWuJT5 shDyhDVD>EDjDֽ)4n*s"Ԃ1cͭwXs׸mб[:M-FWqG"S zp%QRRʡ#GкU+n%i|-3FDi5,@6>{c?d__*X,H__YitXD՜퍒lOvN{̞{yq8r˸\}lzyǎڼfيlٺ KQ]tq˯,YM qw߃7K__'7z\u%nuYj2KGqϝw =FF ރm]DVDC-_1Fdkڵw9­oߟ,yym Z?dXh!#k?ݻѭ?GFF&&][6mJ/ΛﯽK/<~>pÁf3fWX,L;namoȊxdFIZ:x^kl;?>GΟ[׈aCxHv?iSۻݺvqw5y4Pon] tԑ>KFp=7|NDڶ =ZDrRRl߹tn: F;͛{kv(Pt5G644]V{`8f,|F]ke`e׮mk&aaddfb06d06|Νn/7k!-#/6n+`֭s+vm9VZͤGcn~*Gr.xCBB>Yil$?^96:G|Ԥ9:* Cf6`ːAp8>tˠ '#3>Z{~Ҳ2 Ty^))z1_%Kyn΋,[9% _Ml7#+"ύs%b"-[6Y|+'Yn>>>:WRtԑE3cnM@ooo.u  mӆU}^=S &8(0V7Epp0qa;LJx݋7Iݻ/emE, {lPj4:#+"^G;n tҙO$,\e e0mXIqq1]vٳ=aC2._S䂂BXI~AP>M wiO>K2}l\y٥JIiP[:իW;F= Cq_yyymmol6W""켼*56z&"kZv'ORVVFxXX%%%(~~~lߵ־n*C\a4ZG%0 WvepJdE<ԏ~g?FYYY3E9 cu_U"+""a%%)0sq;yӏDGFXv߁}Яw?u={nGu_ %)`JJJ\  kصDcO}]OAtҍnJdEDD<Ȃ9LqqCqKvs٩ieeeNP"+""a*u:Gj{ju8UQ"+""Kߩ!}DVDD0(j Á'Fd l_WE1'vՑ-ÁS*(0%l86ȊY\5Bv;[RD_Q+""i =Ԕ?-^v[hv6^v}EL-h%o.nnkϴ-Ym67l`uxm"nCm199L~sW11HNN'+c!(4Oj}Ǐ'Csʸ]uD),X:,|eQgmw8 b|}}#bハO}BwFdEDDvIOׯ]۶tuYn=;Ï?NJRnj39I#lu{E9;XMYlgglb6zv#Mlڼ17&2":/BXɖ۰ѵKgw; ]o&3+ ???.ty0o>?كhdİX0`08z(VkI=Waپs'ii 2"+zfuU4@DD5u?uz=G=Vw~PSp1n }` mlqq }-/O#-#vm+LI\̜ +Wf#S1p^~ddd0w"LJdEDDIƍl6n:bcb~`ز:uL 3+ -,^K6 vG WJ YWr,jcne_xۧ7=Cdfe1~n]йSGόy4&>\l%w/&C{|||HHg޽xyyԽ;<\v+QQd`0лg&i}]%""")6lt܉ӎ߿__X:&vo|w'31)ָ`ȠAo*>_8lgrr'-aY???9}כDDӧW/V+[:=oze+VR\\L׮]xi,BCB8xV$(vp߄ l '%K>k6@Rz4IV^5jT#$"""mLIqqKe=ԣ;ބ͕Զʓ<.w+..1cW1[ ~~~lߵX}]nɓVV%%%Ԥ_l_)55U#"""בIEEY _wVq86fTU}}3&Wϩ_ДK_Ix! BCT,eu9nǟ|JD6ya/#}TU1Զ*Ǐg70~finwa2"뮜*(051իoI׶*~~~{1xZrWW֡'usYd2YSUKTkY???uT_W"+""abcbIKO#$8?WvV8N6&3+АPu=X;~zDVDDÄbpϏBCBl5fYkY9DEFQZZZȊxFDx11FWvv;eeeN%VkӎMpPRRjJdEDDqIDATx^TY=gϳggwvggwgg4fEED`@r$`"9gĜ0 HQL(oٚvA@?u}}Uջ>W]]Z D`B H` EU"@@Z D` ήYPrSS "D !bd۷CB,² ?t%T D`]Mv;:: "0Xew4hI"@ ݡr$"@ɮhj& CP9d rB?e^E?8gϖp38rs*++8tl&Kdw䩂:]ڊ<%X!b.[LVL``yBղA~ի]4X{d1R<j9Ndݼ]ŏeeݗk#"#.Qfs&L^t>HMA_~ZR"clCMHv{u(3d]i,+z|eAɓSee簙l~&,ŋd)M(n.D]˸`+ D~E[F;fr?/0˦$ZRAf;T]|YK5\Mc3WTT8`R66Yi;:=A:8#W~ED%M6>nϜ4oN%6[WEEͷ/--eq3~Z>VѾD#YeWP@Y=ᩡywEcYCʘr3_e49 0<@>I.UH"\{8m]"m׺7xVPuB 0Ak84?^[\Zvl24!jNy#ԣ>{p`ѧgbiV $ar 9@ Ϸ1%D}$=s1B@|1"@ݡpgJ%~"@O X1$C쀐9D=ˮ},(ˡdT94R&ٕ$Lgy}d̅#D K"@ ٥3"0>vvvj[2"@ !ew@T8 D`\?d D!'.eij,xa'O>vRC CfT_dĆd D`hjj‹9}iaapoOj0o{{E!77wK"@;Mfee DFo GxW>~ݻܻu3ꂓ!D@ ܘGb~[njy&^|Ccwɥ{܋2 w2[FmÇF͛7bdڵkB-iKvK<Av=f>e/7JpA\DGC NkL}q>mÇ^=|狑\rE1ť[6%BO_;+eIPo塚&e[R W$h!Rv{p2yM3`ҫUȌe~|bi%'/!͘Kj,٪0!Vs,¤PƦ Vy<1fRQ[ _:_?HY#^8ihic2V8_` `8=ң_fwLp>"frmJ]ǝ 80n]?2&VD<[zț)v,'_8jӌL/*r=Gh┕~XOH#O>8!iİ(g$ƃ2fTuU2z蠇!*pvP+2~󖕭GP IӸRK˗82ټ_Z aSvrmJ:񤟐pg}wK[}8__-,+= ?z+}㙫˹p1j'b&m%fg[fh2Ϋg]f>unLH}!Z K22:2d8q74 ))..x/|  E/܁;=bǣǏ$(}̗;wز~W\Ŀ"1$kjkqŃ$n0m۸N2q{a|5(t(qCQA ϝBbKW.8j_K`eWᛓF1lʮP ai GQw~P*~soW Aq CBl Ulb.z2N\џ],8 [ ㅁHBDT4Rt_I&A"]VcBKGG'Ue3ijyz,\-^b/j!i YGW'Fo]qm‹644YvY&M:y:TLH3  D0#,Cӝd3]cd>H\m;eKvŎд2!AB#".8k(B(MɧRIpAl{atPCIE!%.rtFCW8 G$5/Y98 p uE'"-P+VY=B `7HnG f&/Ǭ't ?dGv ֤-K4\-B2W`N`ƈpثW :+ $=\ϼ)*B>A4'.p -ndt U]E8@lha8c칐-8O!Iva" "qXMءC8!57|AϞ= /kܕ{4j+Iـ}\}ƃ-wt@\ElQp0o3I)#0JjD?pr- qO$b{idWRK+_A ,2;pJd#35YGVeGJCn:pPp<{#+Q[7bJ}5y;b@"Џ0KXaa@p… 5ǏQ*BugΜB]OᢕB=P>?SSS!h"cs޼ySPhY"{n''{"X!ݪ*mz)˲!Uɔ'sϝ;K65J[2nį}sܹ#AdQ t ;u VKII4sJMjrhll,˜.>|0tvǎpxKKKq"q!Iʮ{ n5:$E .}%[.I tM+VjdsusUKE WFԽݗ/_Ó { /8 رc999^^^. Rt5۷[[[t?H<ҳMzz:'&&bCT2lD'\poss6"p9qsXd7-- x*VC%** wڙ"[$%F EdD -1Ox/$v&DnoQ~"@{ }/|3 Dz'xc-D"+B;S~"@ ٥s"! !SD!]9$I&D@ A&"! ~HT7 rHdW:5IdCҧC$rxЩD|H$>M ٕÃNM&DC n"@ɮtj2 @e9--Mv&~QD!F/ aUTT'\޼y5ĚI"@ ^.+X!Ԉ_[F[J"@#kم h0 r9ĚI"@ ^. 1;nԒzN&߰i©f^sCU" o"|}YQ^W1{h=rXkd"@{EggVsHWA]xӨE 2e ;*",UIbC5;Mq۞K5&ϜlffjxMF JUǖֆhR;]t {A`yzTo2{h8᥺LEoiooR$%هcC"Qge5]{]#dj[j.Z+**K=gyzn2(llƦȨrnCc#/Z,84otݍsrst)5^RF"GMsVvOVvLcTQ[%4Vi 'B}te tR` .!۷NR$X/g}86  %^.4];;[ӽ|^Ue2uy*fV=j(:`Gv} a٤ B^x)?ʳE@ZvYoCӤDVpאͪv5K;wFPj%.#FGN҂/DcE˂tą {=-)Kz9ٕ_c( @w[vOQ~uz' i߲ˮ'$ٍAü@OʱŰLxO>y$o%o:(d2  O1ҹubz6Qz]uId6" n##(>\vokdf8O+Vk]=.\0UZVvd> 3#YrbEGD1FQc.;ـ, ʮ C<rn.Od]y`Jm$DH!@K D`P Nv4"1 *!Ldw2xTMD a$CiD|Hv?ƣJm"D` L#Dc$@1Uj C>8d #ݏRHv!ӈ ~GD&@;FHngl1R ߘaǻEp1EEEh.,9"b_[F[Ay!}D( M ?wx1+;_d&4.)/} N/ #vYĵ¥Ke2Y),677l4hr*$DL쫨m蹶0ddlhf_ɀb/^`I4%YeKs1:&ƼFRS{*_q/kШQED>g٭HNlKHtjkdL, 슉tM,,XȼhPwqKu̷̹ڰ}mmmB(.^cv/Lgu Y%3wڑ%ϲj.Jbtz5\6蠆6KddWR` NnJvph'ȃtݍsrsC^0WellVv%m0T5!餾y޾};at4#W ͅ X04Bi '~q)Ӱ!%ӎD-^.4];;[ӽ|^Uӥ؆J ɮt) cڎ/X<%ϠBܠB6૨Bt)"g]}4)Q\5dݯS_˥]yCpZv%Ko0bI8d #ݏRHv!ӈ ~GD&@;FHdc<&"@0a/OO~7-'ӈ Ò~/՟?vX&D a²;? g!|4"@'1.4[|{yLj"@4QwW!m;GO7//-" C~߾[! _QlwH;2aI@Dv?wX.M#^H C@b. 4nW~j) F@$~? Δ4|MUUVƊ0f6afcb2Kو  17WdUT6bVl_i%_~}MniM3Z{2TAa/ T 1 ç W+ _ٽj.^rv|7#cy{,d3(_q/kkOe]j|oø]Q٭HNb ;w橨9,)9UԖ[X̘=w2?)9ݱwݵ3#&$b w}- }j2{6͛^g펐K)ȻٻD]/[m|j" ivEe\v$2ƭЯC^lNln2(Aj78 -)}mgG!2 @Rտ[ M읺nDOV߾};]qN'!SQ;_tYph{`nܜ t#3FCm_č)-ÓL䓀ߍFA>zhO=.+rjp`|#J\} 쫴P].*,C]Yk[ۄ=~y161$<.]^rUWWZ{jBIUp@Qxee`~)e qRVld{UN1pU|X:Lp-$*(d6Il@񵢢[1auذw,)b}w<4C)%Y.d-9SF䍀~Ⱦ? MKxW:=τ4ioYeJb(*=Wǎ'^ ӧ7o~`$J]o.@l͝3?-\_5y0+\`tFDyL-4tnccwߝ$˅n y;D@~Ǿc>02.n1]GFPv}.(G xl\Dvρ EU_eek'Bw]wO;ǥEN"֌K~e( ĝ+ 8H*S+%vR" e#> pn.Od]yfMm'Dǟ~Oyy#.4D$ ,?}t矎Y:N BDeӉ+ x"@@~97Y=oeT D696̳Qg@D"@g8q$?aQN"@솸 vb0;f,EP"@Z}um^$DYA=ZG5| WRd)"@emF̛x޲D9 D@²/ |S >;0Tt "@@?#'S8}P;'Rz*" oeWSo?]?[R"@zI@",3&Sl4|Tޙ`y Q{ M@Xv{[zQ^@WO"@䍀vEt>csRj/ D` +%K;>92SDy# ,+1mq 4Lj/ N@Xvt(ɣ7K"@@ H[8{rFKp²U`-gG"@E1]bsCS j. D` xNu>Lzt)/ @" oDe7IMy13G "0ey(kS~@WO"@䍀O`;ѼT]y;D 8-gcۊr N"@ /?wlt)4҄2 E4QΐRs tݏ*mR{7jBX ͛7;-]]]D"@#ލA+ƉJ-lwˈw &DdA%nYb6Vt8::: ǝ7n[Z>P+"vj2ߺBbARSKJK?T`z&}Xk?%% Fv X=YR}^+rD-yF;NG@TvD fN*"YfIkd4j~eɃZ:7|>kA]absnda!8j{"}A!8m%gZR33+).qᶶHQ`K}CyهQ^8s<|E@0X{De}Bτ=n`/(T]c$JDNj/ }# ,]IbxH*UQj ]lږ|k&SCKEEegl!O/M"(fc'W7N#[`SddE\zWtEYq) RhO[ҷ@{" oD݇'Iх% \IBu/.?erg7w.WF5XL9ru| ee̹9͕b:^"@F@XvGh.+p=_ ~ jeYy=TTͬsrsQZee+Wtt`+b{DdN%}; F@-NygHj΍.IvxeFGNyBGH׋Up.X yO>EEɩeiINW7ER,SK@nQ<Ë OإzLIIa_9 ~Oo7*66+;ߓ)cQ_(32oB%o޾-ۭno*)!EyG]߽y%Yҷ@{" ovqޮ.'Z,_N52PbF20O2)ܸ^M;!D!B@WArsn,9Hd i4t-D  Ob8Dd #$9@!D ^<]dwD_\c~^ИA+''5$ ,]; M$y$."@䄀Bse~|sN.("@o7]~"Dݮ..D" ҥVܭXѥF.X L@[ύd b rK@Dv5[v(Ϸ8=ɨDvM91ޒ`M1*+RZ`B| D@ a  ّG7ĺ.ͅbCT"@K@̸X y)E1-7ȮGV\K\Rj[bHaoWR,kZuBk͡%/#.Z2IH]#Xoj*/Rd8>/1StvO=xSIIGQ(``1c2je)Լ:ۏVٞCa%D Av߽ GFoj W cB͸rM\qقvY^٘eNtܽ淝&d@Nu:(jLjx|>rNOwbduxs  rB@Xv;xژ!'DA# ҥ ~|܈TA*"D o~l8]99L"@HlA]TOP" DhZ沲Ks# D% d@!kSn&!jD"пD.YghΉ(Lʨ4"@w m/8u"@@+E MّKiSiDFR "@8] 2 w*% ~.1јڻ.;;-Pj8 D@:1d^5tVv7--vj5 } ,Espژ6Aqr<6UU}{v 4۾xJt졒4wB ^~ ?QMCvېbvZvKk[:Rd m$QYfIa!Ș1Gih k{Q"@ v+]WJ-E:_!u<UvʪK/RЀDhr k*-R9!d0)9ݱwݵ{bdpqԄc' p8ܽoZ,*(\iOg.Q׸vעB?U-t:" oDb1x9ËgRKWQj a uu7nV]~7?`CwA!zՍ]?P⇏CB'Ϝ@Rտ[ M읜ŋSUzoNWSa[l-2WyE_A((s ŏ?ay;ᨽDn[aT[AtgAL󽰂.4W"`oX/xuvvNSb¯d-ʹ .} ! Sszg_8#!ظp򲕫$"r`!j{e+59zU D%bx1XByIq=_ ~.l+WΚ \YY):~@HvY /_b--VTTb;d5aic XJ-2i:zq`cρTHo[^"@/(ݘJ.>333)! 鲞iKK ? *`]. x /I"O>zLxиo#GEm;e:s嚫+"Yd77?y&9zLPvg{$N8"@xمbR&Bm!Sg@mkp\TUZVv2ncc͹ aP}H s縃-YdaosV^ / *p2唤 Gb0ûJ|cc" ļOإ&ԨD>/5>Ӥ =ۥ^ ȏ2"@zI@HeW^Bى Dgbcxn^z8"@@w]jY.ѿFPiD! Ƭ0y@-%D`yY{a ֆ{ԥ6hG*"D@]^4yrt PS\b x ܣ@" GD]^tgatWabcVTΙ_"Gg F@vGt4Iv|"0e3FuD4 "pT G@d$C~dg~ O'@D% 2!/+[v dKJ'D@ ]v2)+5% -Hμ$݁O" em~+94nWO j2 K@LZG^d{~Ra`SD%qyd7!#($d˓M@vs_܈nM7 ${*$ n;m &ٕSMd`ݦ` 2 ,{*$ *aO`? "rvvNKKDK&D' Uv%tAX W7ov[7 D% &Ж AbRB%2B D@&==xم h0 rI D@&}̮Nnq~&9$ dxs/ݺ~dUg弒ҊⲪʺUy* ˊ ̀yuYSD@ٙۖ#1[^e?VCSL}8FX^2?qn.𦡭Rdú`SD "ȋiˎKtkiN+ィufĭ%>>*{]Z՛8m%gZR33+).qxx"Eq. l橳f:2Gy̹+17n Y"*{RZڍH^-1{"U==)9Hb5A& ,Lvu jsEɩ%JSQC D >٭,f ӵyIfb 29vtF|#\J#UT;F#fe {2zؘ-gd£&޼C-*?֚B()Cv32=r+NM5" n2z9SG`.־WYř[;rptstp3 q_k~>kdf8Oy Ү_gBtρ J}.VF=}+AfGGFk%PFGV^dbF}O"0DdvS _=ꋱfF};fmEf|=fහj$D 2`ּ])mhh{PQPQQSQYW5nX4$D >m6g|=]]^4|[F"@G@@K e o^揠"@" "2U}MUD/Rm c È;Ziӵxqè%d* D`XLr~&/dwXD2D@۝T/f/g,-NM![ Á쾞T/`(3&DD@Tvg23c9cy'G D@@DveJ1O~9@6"@}={~é)d+ D`8]c?.M  ÉvbJ~dȻpj JDdTx8cH6"0󟘲 L1ڒn)êd, D` zD^qx7{n6g"4ʋ QEfQ}DJ@Dv˧0ʟO'Ɖ~nn4y]Vj."@$ "/!))kbdBy \OsY9~cHQ6?$E" 3ѹf0G5kze3 s%iz;e-Ah:&2DA% dŔ)2exWR^TZQ\VURY᳊7o[e1z)29%Ŭc$gijj C|#~`^R+߈5HUcL084gcU%[)*) Pcu\]S#)o]ݣ1"0e)4&U=FESyn^:v3VI}k.{U-q .;jkdL,˸Sg>udBLwqߥP3k\q)EEm͌s†})_Sؽxx*.Ag6p'QuD G²p~dW]}ܰ6iQg.ݴw֑4|ŻYa,N M#&u蚆vF/SRIB+޽vQee/+*ؔW(+NQPH .EƖ>}> ?r됧.!3Nnli0EEeg d"Ar ݝ'ѵF~3壿79~?T 942ACt=ᙝebc v+Άwym디.X~8"| c2.*^ ۠0DNNB" Xo?+![\"8sAcCn.n6[<;kͯu]VA{d&677}bR7-XHJ­ė]wf1Ȁs¥jFack72`8DWւN DG۝ŏ?KvBK'Z}1lhoǬS=(x,/lb@O"[:IFmh{PQPQQSQYW5N>iR =v',%vX(e DIVޗȣ]G0&2Ay.K|9%Dq̳qSX^F"DH$ "%eG9"@@'pxIv5H& "3O~`;/ŏD"@L@Dv<}'ф}K;"@vg|n|VmtPW__q[njǃ3vbiji؇!"{0& ,c&{L7aRTRޣ݌s?Iӿ5;"@#aٝn}uO00eC&8h6ދZnF*]saye$ ֝;TTZxx*.Q`K}C*j-mf̞Hテa¤vf>cwdpq:Nlwpٹ{~I5SN5sΣjL4}uk7nhؖbl22FL@Ddw{mnMlzn6~"4̥\:fox٢5#I uu7nV]~Ӌ yEZS\X.Q%| ,~(0$tYo޼AHw3x1~ʴWs xqƴfw!D̟p 3}ݗ&LD"пe-+=?maQԿQiD" ,LNL[Ně37l]3"@@79Qo2ëdʨ4"@I=ۯ}O_9柟 "@_²ÿoܿ?_;v6F#F~~>"@@(((Xvi3|gSį?}oeT DJMV~r)c5OG}"@ SuĤo Ww?'[F II]?{?;?|d3"Y?f}RJʈ?{#'~ >KRgT D#**+]wQX9iˆYFNO(F"@]?gsƎWSFʪ׬YӇ/76#e D'a]8^s8.@KOOyVffVP`֭69cb|ҤV"@z$ /4q'_IHژ|OhXdϧLv8wǹ7k?e D@%ťIa?Sa?ۤ?đ nz:4Z=<#nؑlEJff̙sQP S]aRO\z[mz/'Dc%FoE o.{cN%2)+,,ljj2b֘7M _Y<<l[S|rvl_`dx4#c;be7/uUWWiYXZ:UjeDو }V{s瞿xQVV~gϟ YQ_C$;]CdԼ2bWէ?u󹘿K!oczkqS8>GmO.v& &jj|+x?ȼ7]qNoOS=y{Q~"@>bǎX)Fo+V{%exo2/wA8ˣӭ̗)LJ}ghHsoT/WY2u^G(/9wGʪK٥](y/)"49n{.QטW/T]bf+œ|[+P'hEeWlQƜ] 6DJ!e<U3+k8= D#'Ӯ_/,G C%x3gݻwڏR-s1A>Uuuo\yW+54utj,tz[KpVw)++.#[8X+>fS F/xKvQt\Qzk//PfQDi vQ,rhAPn޼3c]F0, _wieKX nI'tr5Ϻ~ǝE#pƍecZt|2ko좊 ) {)1I^#@yXw_dH;5GڵkO~a'4[vW;"K3m ޛfxnqc[۬~1|'4ˌ4k`YAF3LCfZ*Y͋4g<3haz7L \?1DRRp)F#f+D 7Q7d43vaő C,Y 1la5T_#m[l4*O 05hvH㹡!gYo[mqjx+8 -s6+3CFX-PFJ@AfJ7PVVV՟zbÔ0##Mfmg1;xvV8+x[([[͏2=h&c1+B1Z)V9~qR͢8Eq* " 7T 1P <bsB,7^ph-,` T ^}Evf@Xm5c]\:fybd׈s]5r`+s`%fݟ[FٮsԎۮkei$bqJrJZjm(\%X9XF WlN1E9V_1P9VovblDa^̺ٱVcG.ڲ(P%hqåFj&MBL[,Ze2I'ZkbW\.vv6͘i` ߪi" QQVk:گ]af*|eFي@X#,#գm5bmWZE bzX3vYZ/ݶ4nIcĚ-5S_k4bQJW eȶ,rI,X{.s\C{Ygg4n;.pX"n8gMdC6K"D-QSsPYnkjP3%\֪6blUc-Vm N%z8q(V=aY1V%vAdPsT]uA[Մ5jۢh;X{՘ګ:, Ya=?z^Զ6cU O0+%Z 2`4`MSqF.1j1;D-_e$q ߹FWq.5A-VGn[a*;.fkU:-w%#a(kbvFPvxGuEVxn n+㜗TwY-Zo c"E;;j-6oz!e}ww< xGxA[x'69;w|S!NK_^/Ԕn 36bTlR裛:jѵ<_ݬm5yGקZ;{d}˳k]{T_෮w]ǚk96vz^ 1C+lO >:<5Z~׊yz>ڹGּsh̓K exs;qWܻ y:pMa\'r7}7m0ؐ-EA 6o+v~qc9>[Spb] ?u[&|_|_Z^+s=Vf\uH#gU"'uv[[pB'6,,<]xl2.x{OKZZ^PTTTZZ4`mO[||wv]gE6ۮ2wxh?2=>V/=WeښMBuWVЪ:KU+kjjN[Uwz0WGj|W4 ֩^[Wľ.̱.ԩ.UC^94ĸ58UքՆ׆moowntҩ9յ>aֆMINUۛO5՘Po:²2ȴ&tke9?镏+/ &Ss~1׀  ~Dc, 8]MQ$ ~V~ywCcLf[)xS)b,Qs_pOZqfݙvi =-Mqf6FcL5'jSiIW! a7^SK.θ>޴9ŌƂOS-L7GonҔlބ3^śV%6DbsxWцU& ƜQwʲ.٢!6Ŕ޺9ٴ*B*fsISl{uغk^ϘZVYvbefe:>v`SU~yNQ͗WՄoO5 ɦahHM$$62n8i*|ݫPu1Ho:cވ'듌k?zCKhݦ`˛0񛙓F-0x}䖎zP:? ~Zqsp0jJuڍbߤI5- Ѫ _Wᵴ{k)u B51Y+n3j%l]snG&ٌ9cqMېMjU/n8+j#7ׄl|&P;kUX7w$0笘ViMo"tZBWi-gBV[d5;Wh^&p I^#l1d⌙s&{=i͜slMi;SߤصnkN?eyyWSYǎ{NAkO:59V%9՟rhHuhK9sh뷧ߤ:_pqvGcYWm+d"Ƥ%MH`#&ܜ 1 4bL-L!bD3;v&ͅ9{=bÜene#ц\vbnffn2w1WݘsNi@z^z;#h7֭]q.-Q;юmmI&Ĺ6D97D4Ecw%IplwhMɏunvl?m+ۓwtb.bλ~ʥ5ɱ=չ5esy7siW{Ss ?Ԇbifdt3I6ݭȤ1qVL9sƞȜb͘w͏1aR,LouDs&Ɍ9i\sd;1W3&ʐIfR2gmx_qNLm'~Iz͙Mܰ ԛ\]ZsәI\m;e~Ҍ9Ϊ#ٴ5Ѩ#Ɉ3V-'ަ1W;Zv,žX/okK5fΙo|-jvrKkA+.dӶTg-Ik#6lhI~7C̎ -;/Z5^O6`mIcn}چo uAC_yڄlqik˷l.ov˅qq)xxݖ EKӦ-)[:Ϣ:+sksבБ9zLq{UWv&Υ=t{Wۨmqob[ܠ'-i41ҭ5aX׮n-pw4F9u{튵=޵=۞uz'sƕ9S~{{kC;-pw 6e-(nMʜsz+ԊI4eb-ݟPS9[&q&31iK'-sҲ[a-Xnfꌟ.;t+l ؆IcNogu'Byodn@m1gm5s`E#sé38{q}Zto'-mIFX ߞ4`[34l@[֭ ;ϙt66i-Xp Zv$@1.YEtkh;˶]7.Xy%sÎ ?ňl\؁6l}uȚڰuMK[k֍_C%tQZM C]Ww0Wqfڣ]i5[9?A9~}w˫Ps֬sŶ;kN&c'5һrZ ߎ [OA͘K(ǚ{EQYrOJGIENDB`qstopmotion-2.3.2-Source/manual/screenshots/dialog_new_project.png000644 000000 000000 00000033542 12536560630 025524 0ustar00rootroot000000 000000 PNG  IHDR*r䐜sRGBbKGD pHYs  tIME7g IDATxwx3=uC )ZAAE(EDE"&X@,nA󇯵2~_E%g-\([m;v[zu5j ǏA$ Q>G_[`(}:w3{0HcϿpyt: 'woi-ů1HR8M>WZĒ9~K<Vi-Yzݩ\Eѧ'TBqT7*yL}I̛ϸ1 BDGGѪEKlJAAkբm$dgga4ٽ{] vwdbon. GN:|mο$UUp߯,d23!++W}CJ2 BO޳8ԉ%Ke|>9uкU bB*9u뒓SWo΂{UTIp8X9qY\Ѷ-a?b4q8\ަ-2SI(ʟQBAInkoo/~dyz>_SQM?oFe:4~ݲI\xh"6n$::XE52̬$INUQj1b??oɊU_QfMf> dY&..8zg14رc'>Y̆p\xiY{IU&)Ur~ܰfa٧3\'N77_lesseY3ԢZUDGG3p5Wsa|K,f 7O6cNZ9f|,]F-0 ]IhpeD٢xs"dY3O#2`K0nx>\\n7/]ƕl61yp#~^y*נMO]]U_| ϋ HZ,>^ ufon.rr"*B2ë]W__S=#hB s. %\pQ%f:u?o-IÆhތDq|v-iجVӊҮZlB\.7;vrYD&6&Z, ~) 4`׮?ȩ[7|C@)"B3g-PHFId9AUUjdf2xw=4oڔƏ׭[ t==Ά1trDIf?7@zѥsgZhνcm֌1A"+(reHOAykbbvPF5^~q>DZx#v+|7]v[oU~Fs7>* 37-QÆkxmێYi^y:ba%4$,˜_QJaa!PXF#W]݃뮽Ft: DGGc2|-\.6v 8N>U%dbѢEa r>)ɂIJO?Í/1IdY`׫,q\wj}RU˅*qۭ}v8DGx|>\.,qOgwECJgZYpש}%#=V(eI*v8ycM(*qSyNNT:*8UIHSߪ 8 ѸQCAC:Qz/sIB-*ZRQp:zz)ňJU‡KTtthoZlf^ tQ1J-FT:tQ:tҡCtС:tDC%KytY]^ XPUUAл \X kDQUU\~*ƤVI(3DU=s*)"_omGb6ҥEw, ?o?_UTDA$3NN^)DuHKOnW"*݊`0ȇ+ֳto]ǣ(B^%7$-LuL2DUym*~G2c7j.~ xթa y2(*(prG֗Le,vHsZ:QU^BUTP.nժ?CLdJ*(Td F#AlĬ`+9YۻxpJo}ݭNT:tTG]?:*uXTBmrPp tttSݛKkD-",;ÇIl$$$\JUU2W~H#8`@Xڻ*lذ[ou_ "M2iD|/22/ ӧO;-=ӼdUU|<\^zEm IX~=yXZf̘18NlBvv6Z*eYw޴iEQصkv_\[oqk 1e)P({ǀ.YTN1cѣ4hЀYfi/[͛73}t۷/GO>׹ <6QEmڵ\ۣ`0j③(bZE`04Պhy#nX0 (h4裏r]wz4RWw0Z~E2 ˊ(gIl60x<^E!**Jko^ye  Y]PEzB!xtEQf>|ժg2s,LF#+WkGus^/vB @Rҹ];;`]W_} ,s?G\\⸱wo|8w Nl\<ӧϠqlu3=6Yy d֭_~DZ$,u߯P)Bٹc;//xcb1ONaa!/YBttt}H #&&3r5WqF^^(|Vb[>ӧi&VZo5kسg+VwaΜ9f1~xx_OZZP+m۶Ѯ];dYf,\kג˷~$I :믿Ҷm[L@ٰa/f;w2|;Nȡy?HJL~pzQbk׮壏>bʔ) 9BCi(ۨ^:@Rb"PEQ̬?ǎ\ye{N'o)S!2Vݲu+)Sjocm:nw_5Z{6Y$Kl?[U6}PHvIe)֭[8v(q(,!!l ɂn׏!Cov(27fҬY3EmԨ&AW(ԪUK{@nn.-bҥʮ]HtGFUUF#III}kԨub@Νٽ{7:u$6nȸq7n`Mw^ڷo_n vˡ w *8x@+/I矉d6iӆse A,2*λE( idffq5$UUIJJ,"\ 7o&%%Ys],V+vw|9HF\qFTrfB!6uF[da)Y'#>>2b!.>Y?Wg\a@rrH̖ TIH`Æ L&آj)u߉}fqoΎ;PEZjT^T-v}x<޽UjיL&f36l`޽>ب\Ke^%Â(\{mxM-x5j4GK($P(#Ly<Ѓ &We<^O<'sq̮Ɏ;2uVB> >ڵjMBBNyyfԿ>Çl6+0` }z5e_`1Ȳɂnn<O=5;Ag3<{3jfgsmCEIdf/i8}Eel6ڵcР}#;wzӧĔhޜ[ҋ/*2"B4jEQDÇSOQZ2#UUU\.:t&** A1ci\*nw4L&zɤIHHH //no~iLVV111ԭ[2k,FI&Mhڴ)}jҴiS ƨQ.rRQU傼c `̘1L0{-<תUK^/(|8Nf͚ɠA5kLbb6y!j$%%b"'O밙D-:DFFVvܧGjEQJy/~}q;v ݮՉH,vmĴcǎ\Ib0"66ǏZZ}p8Pzu+2Å!=o>}nyZݔz8Ī62x}N_4JRR湄2^qqqE Ejjy'PAl6i˙FU$KRWlAصk$a2QU3#QJTrڨU—DS3Ug)rڹHbcb)q>99}VX fQzujq;Z"DQZ dY&55|(j$Io"ϔ/kFii޹s'fY# Xlll_S.Ą`-b~Ўbb1kie+W,|IT{b.=6y9'VL&N Ǎ"S. 2bôi:te mXV~N4zLY;tIT@D,%k0F#?L||<~Y1tml~iz;et:/H:*y2AgdEl2[(+7QJvV֙XƗ+\,abNqq B2wjG *k' ɘ77A]?EQն|bT"e+K}'`4Hٸ uSu YjV:6"fLٌPh\[.9(m(cU%FTT5囙*B@Ń(ѾI&CmYrBZDNl޹wR:?DɩIfLb:QUrأxbxW^uZ7UIբIR v/f*&I 9Fl.zD6((3Җax'I4xIYĊZ.Q*b]z=C:Q?ƥ8~7(((($L*55 {ۥե8TβͰZ41\oDXR*Z-p:Qq_^I:tT^RTPfIS5}=}Zg?[>ys<(w]?(Iq!_I(_)YE˖}Bn^QNlSzƶzjr%`OE\ݽ{ yC{<f<$O͚UiQQQ\.DQ^cySpVXƍiٲ%;w־ B,ZcǎѣGի5 6W_q5ШQ#-*E%I| ׯ'PN PL1s۶m:tΝ;%2,ϛs:3]Aƍi׮9?UUY7n̍7HZ51}CvA6SU@{qSQw&JO6m񠨪,[mꫯo#<<֭پ};!>}:`Æ :SQ *!I={'EӇN:im6VZ}^-*A gA.RUUQ5Z5? HJʋ,?~UU Sr}ixehРZdȐ!4oނe˖qUWi|DDS%i(111F~~>.@jj*.@ &**x»S=zVIIIFerO?eHj%..V+cǎѶݿ?ESIJJh4w^222J(,|r͛GRRYYY1Aߓ}ݧcǎ?CtЁ?ǏLQV$I꫸n[M1r QUdl6'Ny#XGL$I󑗗($%%ijTLDe۩R%[WqmkBUUrssyǩZ5;(DWIDAT}Yvڅlb0e8Nڷ@!d9 qqq̞=;cXbS]fj1Dm7kp5ꫯRZ5vSfѸqcf̜ɉ|6+ջ_3RNRS9p!7n"..+.oK׮]iԸ ҸISbM۵Ï>`9t Ok㏩[.~?AH l̨Q2;ӯ߬^HɸLZZ/je{ۋhݺ5+XέCp!TرwY"ٹSG([Br*bF,bÒC!AI&W¥ 5= GAIYfȭҵk:L xx晧h߾ƶoN^q3UU>N' "47!J(yQAX6+'.SNᣏ>Gh4r1j#bK-Y4n҄?Bk&Ixg4kޜF駟 ~G֩ñc8v:vv<#X\.ͧ~Jײyf<NZ5kT0ͥ*P,+ ͚6%//Obr(wOZ4i$l:ˡ" fdd PUUsTTn&^XXH0$99Uk.;wwCvšCY~=uAjd`n=uJJ W\q_cGcZc(Z*m۶igY:(rq>3C||mڴ!::ŢR¤|rbbbxhРd( ֯/TH~|'|>}] 6mڵk_q\̜9qƝ(nM*Pb@: 2bĝ,\sĉ~vɞ={{Xh?#$us5jdv{l(J}v֍_~'Oݎ`0^(o@]QQB!z-tF+իyy^/}7(Ү]{ڵcIIIuÍTMM{qx)6pp[qÍFc7F:Y#>}ra-]ݞeoOP55:ђទ½bƌ]N~-֮]KFݻ/F@ @HP4bDFcb|U2e͚58N}dewC-zGOP#+{syIaŰYC^FQ Yz5mڴa֭<T^G}I&ѱcG5k Ԯ]QF#7|ϥ0Z,^FȪU+ٰaڵaFL2_wb4 d^f+B0'NHaa!-Z}Mҥ+))I\{mO aɒ%?Tr‚ o>j IE+ [,Fcŀ  ٢MCX,%>EA$,ן~fL&` eQZEB  $IZ"VbA2٬7cbbPz5ʪ?M&>Y1x<-=( ~qq8NmXl6vΟ(,[ IywFtƍe3s;^"oPO?YogD"کB!$IraXB!GFȨhl6k 6_<óǨD֯Tҫq&2,zgqH؄%# p8ɴB2R,k3:STjAJ=-St:B\.SKE;5]^WȊ?;xoqQx%)ABM+'U%UU IgzTPihXiݦ--[dEI.%rQ1W.&YָNTI%סby:tT|7Q:tTt_%C'OYR1ANEե9$o[nLf3 ۥr:k:t$ٹ}ބ=! :iطO?Y]ɓ'lщRrHoUpdfeQ/>YP;k}Gj:tҡz&Q]zAeWvfi3]D?5|AQO,,[}j:K,_zPWE4ߌ&)Rq-<ڴmCN¿ E7x]ңGRID@FjL>#>s碪*K.edgg3tBo>rp!I֯gUmFtto6Ǥ={cƌǟ~bo$0L|Gl޼'PF +¤IP> 6RNm $ITI¦M1- r+̞3cOH8!26l୷"::>}C?IqqQYTŭ…EʡCx#Nĉݛd֭[3tUg@\\,>^e/c~<&uO?qM7p:3>f3۷#66ヒ=Ee9 [T4ի<1bbxYf m/yǹ;ɓ#ZEkQjժ%k}6ؽF RPPU]'@͟}`z׫ޭ۹)g<9>ݞ- 1sLV~wwFfP˗hݲeL5ܩ(š7o٢99uyp5n,TR$ɓ ¼|b9<7{6ixn\FK5eoE;8P/U(:= ^:Q;nwuV:USR駟pXl)`@׮]J cEۋq 5X(4{p<1 >Z,j1q{<Şx(,q!q CQcbnX(EzYX,%6G; ]E!%%+hV4DOt\ Xr%hǠ1N*)ɼ[<1e*k֬O&M vȬQjF.R+޾};w?_|9=6YV+ٿFѣh۶-+V-[2ax/_dYfLxAvڅj=gE}kQÆ`X$^#k3>c`,AEE[oE)fEZl3<ѣG6m={Ԟ/2`P~(*TOOO׬ 1xn\95A$v;,~g/0#G-jݚw/rZZ,Y sf}$Ix<"5KWz{OTTV}U]rU|3z+2vsADQ$)13R0s,k̛?@ (<9c:w    CfV6Ga^PjU I?Yh!Ȅ 0\dddp*'NW^4k֌|ի믿~‚ o& DQ$::Ziي ~YZ-x( ~@ P)>3w|% XVJvlڜ⢋Ewl6<O N#F $ xJj% &|Fe111nŌL-qĥ Nl2F$I~,&ˬg搟w\2h4eWEG,Uj},<7gYIg=Ś||ӮS)qM$ KЬS_O=z3lʂsUll,fU.))lݺJʕ 111eDԡ?- +c.]*.\0voԨQ~:ަw69Ap8c# " lNf:Z9`kqp8*l`^ܹ]pJOJR؍`r8\aC 1u+}Dp8MCvc6jڥ<'hp|cFƶH p8_-u1֔1X kn/cAXbk?Ըp8nkV&FY>@k [ њfϺӳk6p| :o|>tnv+Q,5w0 ySOܜ f.7x[ i.[SO|B4G},cF%˹p|K&RR`oKQ#P⥗^bgKI@5koYCZnplAR*^N dY̝ǽ7x{""1TVVbߦ{^|h,a"|DQDXkI&e+0 ㍶"<?6mڐL$ʓ+QJaP(`??L8B@SS?y卽!HZ#*YAk>,tޝO2sLy]ugWXdI8Mk--'{{>DJIEE]p{x?f ! /^̫ɮ{&Hʴrq'p胸hdI& uތ|GC}=VkӷwoĒ%KeWpШQ4r$O,Y^#3ŗ0𫫮mu= %7ߜǟ|nsAƛ|E>_S~ȝw#Oj.UWS~'2ſ3n+Ӧ1l3a<vxM~shۦ-Yk+W~f RARSSìgŊ׏ V\ϭeqc5͜əg_>ZC>}ؼW/:p/XO=sQ? }0` Yx BSx2BWO^{8-kLflџ?? 3gbw "F?$<z2Lx3֛nd[`_pd^={fA444Wʫkv<#%#ܓ-Z˯Bd28Oư͐!TWW3k,fNYۗ 歷^'#\L}̘.۵Zb%?-l)V\@2,w@\UuuXkIhy7ֵ+_-,_GkM>g;b=[C+/y$L6C3Ctԑ>55H)+.銊Vٓfa,Y!խ1Bp|&>iݢ|_t^7"]͉N<=y Irl6_x9soèH>g=vfs5@F~.2R8g5)%,Nۗc L\6Ww0Z\457Zi&3=TN80 رSNcV[s&Мɐ1ZSo~{3ΜњcK>H\:5yk}W^}k-]k;jʫ"{|vE qwڣ>80rs9H$$|>l6T IWTh"t@Ed˺ "" C1ԭ^MbBHktLCC80+W9sHR5]zc\Мñi,nWrO1eKFiVUQ|0$*.Nn %RJ \tڶiSIkҦM>ge&ͮ9@&]v0IA-׶Eb}}8+OfcQQYY٪Xtz#Np|:O_MԨX0cg萭[6swکTUV\p8I*]ٞȢh)Y2#;M˻nLKGe:] vYAy%ʖnu=?q8BAMM K.e1(j\=;Rҽ{w6l6 3E0:r5p8acn$#~|p8<.p8ǷXX p8^)JYjp|k@Kp8v=nh(l]k ҮJ)(<(JƥּztsDb\WQ>﫞{U:bBJ|](:GGJY.75RV o$p8>jԨQm5xp2Hp3eNJ⪫bA}DoG}ɓ'Y`!;b㡇a)̝3-ϖGI!ŧϝ7)/[mXV\-x(x٬G-[3>6C~VTTpքk(֒H$`c vm7wp86D?DL8y᭎IhӦ Um3PSSC:fΜ9ߏ}j t&ڶmf=7oSNcw[mҦm5}!|1 P(0nOlu"L&%9蠃ҥ3l喟y{w}ٗ6끔F:k= 455Q__OݿvQSllro>|8QzjƎ=|󨫫G_k~ڵkG"JRYY[GW^kYav"˹p8_ xG> [B"ʖ5X7Je˖@EEݺu۠X4 j+u1u٥b V^M:TE1K03gBv^WF3eM+ L>(ܹ3U^{Ujjj=zٳ ̞=|8W"@Jɜ9sI455J%ڵk=rJR]]M0TmKv>za%JqGrw#ge}477H$ʿYt)L6mҥKghjj[n!?>TVVv2u"K)nKTҾJ)-[N}jݻהLEy ijjjp8_u [kf{(s&3l][=o/J8=>{pzɴ֒L&HUTP(8i?%\ƖPD"AX(Nè_]믽֚3{oΘ1c{y6?'GΌu]0 ƛ䓏IU1Zs5W3w\f'OwرG1e{o})B?裏.pqǡ<[ö́ gqAK/qwP]ݖ~a; +$͒N٢ƌucM=?зo_f>]+~|J)4B*JE cϚ0ﺓorqȘ p È#8N:EmsY770l0$t!B)Ř1sqՕWԴA0 92e \xۗnFf͚M7݈R .E2l0~x 8!r w1뮽MF2,.ǟ`ߦr1p_~<ȣNj/=;l6G8cٳ'+Swvq̟{E(HRR)~~0e2]t'o{}oǟ|1ڥ(OcB)֒c9D" "gX;ޚw}qRJ<b f><?lڏp8kYjZ`OmI$Y-~ǘX@XF<{1fJ+ ؂EF/_ΰaðAbi6]HC)E.]898YpL3=<_X~r9qŲcʫ֟^~*1tڅHGr9.]1Ɛb9O3;nPu.OdʔϻrI'!X|9+Wd, c9\.))S^`;pUW2{Oߦrۭ^o3p$)4T_LcSw|Ytء.>ɺ޴ 4UVcVʖKk *hŊTVVRSSqˉ'5˖ܼuݱK*׿ Xpa)A֚y>[d}{ H^ÏRJ%dvb;آ?VXy!}y1tP<dYVZN˂OyӛMQ?/@IY7Y?ԩSYw6(:"v}w~7i=<ӦJ>/ׁvѽ{wnF?2 MMMr9F O*W^lf\{}XLf_KeJ&֭+T֒f0Ʋb ڷo ʮBee%MMMnɷp86rPj98eٲ2LE:a;K/}#'Oo yWZ:Bn،=8Bbڴi %'p";uBGXk q~̰w .P(zRJ~m;xveW5}t֕:pE=9è?/އ+WRݶ-Gx駱֒bØzQh4SO;0Ή$ gM8jY\sd2-G Cߢ?J֯\.G6?_OzO $4{;|!C裏rYgd60vZdL\d2O?͓O= 5dR/bH&H)uuI)FP(P("PEP(ZaiUhnnd2eL*$(zPlyolnp8<^]4RJڶmʥR_@cc#RJ|+fCMi@_3cdl.G&YwKHJAe3PW(hjjZZk[|. ˵Re%U]6Hoh`ƌ\~ŕ9~|9[" J8֮Ukdchllܠ<|NBj'%ڴiCP ɬUWRJBt:&qXN8㋲֒*n{.Zl_'=z8~/)񦛸[ k ƍ]/Bee%s]olU+)6J)6u*W^yR &uFRB0i$.%f\k.NϾ~w<]T]-]p|Z=dLyYK4 +(<\n?\^kS8\.ϯz&2kYZR(\p8/'ֽ^ u 볔b}:ae[_}e)}qp|6Okp8m(ys6jp8[;fıɢ$@*oGE Z8.q_vu] BNfӣgOJ:Y-p8->+SN)UJ[s2M۶,/JZr8Mk6V:6e1/7uv'jp|;4{Ƀ$qp8Ǧp86-Jg!Z[m|hˢ"]IcC}ׁ8&F$coߞvѱcGko>o|ߴoߞl6˿oڵk5LN=}ݗfǏN9|\J)K)kyZxW~bZsI[^)5e-篔@;֋s?9&J}յpĉL8l1H)x{ @)Ecc#=~4N:rء曳l2~a.Zn¨QȣBX rӽ{wyYp(XڶiþR #бC>=]:s)H$}ỹGCCMMxɜ5l>57^d2I]jN>਱u]TTT”Xt)tؑoN:e˖dRd2hb~uaȲe˸+xW𢋹‹`{`>v>vHv8Kp|' Ð˗3cnfL&Ë/^{ɓy{ 05\ӧ_d9l3:j,W_K>'Xkڵ+O>QX@k͕W]gonhIZ`>dG /|VXI!TUV{8&;lχ~ȉ'믿άYBPWWDz30ǧ6lC6 H$(Dl%*nA/(ϣm6yJJ%uB@!F°@"HP( |)pp8@iPSS=5{7Lys2h ;]j# IDATtONy;}}=8t 赮Cs~gͥ]Z,-[cFEP`wbܸqep8Qp8A6߼zR{&MbΜ|Qʹ;أ~VDycSa:TJ*RL{e;`$JK֒JʫJcT2*-񶖦84Mu>Tӳ77n,QYK.fY2 p{$L~J)` lN8wwi58_u3Op8Mgq88rZx EHϝ7U~5uff%B^N8tPJh"~͛G"`m窫'? D o}7\'{v1~xq7ȹ#pJmnB)řg5s'{3fСZkƎy_R#`̙}o~+p-PQQAEߪ_duQ_jϦJ.Z։'r" JqI']o_q8| zs!Lb1ggcW^aȑGɋ/o͸q>|8BOK/eŊdY}QV^ {eP:+lR̛7ɓ'sGrөsg|c]wkaŊ̛7ڋ_lvX`>fbvZNʬY?~<dΜ9938l RJ1c .~{:vH޽Y]__N&a޼y\y啌=!C_˗3c n(_K~xw[߯߷^!ʛ;}p}QYYzw\eg]@͝D[Ӎy,gT4zs>?9py"<rYB,എ=j${5k4\s x%2i=<׿2n8vK !:DcHmC>־]5ƘV߉q65@q-@QV +z5X!)`" H+2Qa DhS׎≐X F *"ϠE!bs0h!,#le Ax0# R@ ,FZ(cDg (#HE(xX+V!PX4Fh"HPy "<+Ak* E!I C ք`}, )Im(-(!HHI(QzX"tь)Da+ !Dam)-HZ" ש@"o)# =0X12>X(ghP6 B[a hiV#(`ik44"D a%!i% m, x>b[Z[@aRaA[k8 R5 !<4-:"aF#1‹`-xւJ$S'*Z(AX:hd!}dж0iVcMB"DXHe + ,Q6@Cq{CbF $k"ĢV"m,R i%hX%Y@h{E$D|?I|F`-hcPRy{abN5B!aь;|mc-xxRIXnݺH&Z,~?nGZ,];'`ZSL6c,(V*/kK._|*++) PHb1x~| ySS ?<(bժUtm-gxb."{o&p ,3ŀ-y%"q>Fn-翥F*U/Y}=0֠cͷ~cchk| ӦMcأ2|zj)_Rc!HIH%y@HJ#BX0k B$ӆl@ Y H;%ŃdeR Y22BZ4@#iC@ ?T-BآXLFtw,4 i=X%R0@g"D$>Xm V P)A7HOb32ħD@+ҋ,$ Ň"RѢw;x@FX(!QH< zXX{e='!Q 3F"HaBEC2u!QJ/V#Y'-2I`&Hx X &Amu1m Aq~k"Dk I &ˤ[--enO6rKwܑ*&O;# Rn帛Ν;3jhtXk}+WQ__OMM wq;={dɒ%$VVmK)yd֬Ys̱Z 559c_JXp! zG~}˹_ѩS',< D_fϞ]QﺋѣGJ?DQD:W^a睇1cƌTRRݻ7wu'#F|>YVRP?<Z/_ƁZy6Dx0( `TYCڂg=Hܡ)E*$UqZh`4 4i -D'P>FhPZ*2 Zg(BZh]P"XٳgF $a"B[#)|HW~y0€(P(P - H Ɩ!B!H@'m,"=e$L MPq@ZCcCS"*d B$cFBa"H( B ([* XY p4VBY4z JCd5X[&Da"Rcc ƳWLk>I "Ge:6I E 1VC#X,J*nO 6+,B*0I(@ظ5aEDl`"chH#&C)`m,:VX_(TC cy4Ï=AI+huVbH?V{XXœ%m6ddPF Ė(a RIXT([;cq.(<x6B"(V(UxFEJ$R6n30_Zdhh"c|hQFyJPHXB)6‚ 0"jB!Ow߃vK,{l6EQD>_(ƶ91vXveW}1 :w\tӎތ;vC!˵0(-79߇aV[mŶnK[pұcGH 0 X~ӻwoN9TRTF\veaȐ!C6lgg}xՌ1_~Zei߾=w97xӧsS]]46*twڱGċ'; H! 4d0{$d<[WVcUV,C"A'fQ͍XI €o}%ӕiF AZGt ,X&*Z|Nń F$H[B+aF$6xR)Б!z`XW(жR0", lS-"^<[T*$(.P[DD$m<[5R +B%bm) ,~ha# %_Kq=$5K!tQK(Y(c[,קSU/5E2;F}[Xv s||-B'AmJĒ;8 )1 VE Ăx$0Fx~qFQE0ht5x`dae7(*N#V-w0FZ[ty :5B`)Z)RHmbwr/ڈ)<0;^/6;Sbc0XC(UH˜KAx@.de8EزbBXI#ڏ OkA;[lwVRaee,NLlʷ؅_zAA,]H̽6ᘭѠ݈|wy㧫4xIZ`~+^BzxY O".aR5) v6zE9T DdޜJ?gUw]lƢH[=xx014fjx ¹M AfVvQEZC戼QYM1I+v+ʌLrMLFe@]us׶^׍8W_?+/G?ʏIU׻mtqntv4~Ϟ=Uk=>g>O|q۹sɿ۟>F>uh9iO ?UD45"b$b1XMFn8#/c15r1x;Cz R ?ݓw1 z_L;3GK LXBtǬ4Ux#&"1DaN͂ݵTIݴ8p&F$5_8Z̈́P8-%jɝ%WLvA>44T?Y)}C#V:K:*#Btìt1YlLj$.VnTN>W;ZRה3شQz˜2gyAbCi+nKN!g;Ut5O)V.0QH`Q6"mH`-=; S+!fb's+ŬȦU(LQo-- , sZa[}Fx MlBZ/ mnhhOFߤjĶ`Yè,ŵ0s֗4ʂb=`NV SvfԒf0 c~JtyF9lA bk%!L>Ǔxnϟ؏Ml2x'<Mŧj>ӟZ5ōdܱyauc/!B s-B Q\󁲉[6c+㯾S͘v_V/xr )#‘%9rOmml!D6R(g`yC`'eF<$)j%[%n]NĦnALQԦAYx93 ɘs v0]BS IeIg1 9hTwhI[i7J4YO3R*| jd'ɥ&sN2b=tVEo-<}՛>ir¤G+ 6H^ ;4| ^&y8,zS>ηm9 $b\«.X;=zR'u!5춣4 vRblDjpLܮZ|c#I,SuO =}74 }ơ0܊æn}.p*>ޙ(6%K٣j@]J;bG0> >_ni{/TxJ1{wV_PaEM'24 ըro+(PڬQ+])).?Ђ6* ,%ÆV@hm3YZ)g5ݖv{,N.KzwcLut 5tyF wFskkFt\N-BAw[@ܜys,E!I>bk!ZX.~{&;)TjGR>NN *պ)Qc1\YX)"8Il 4k" Eg1rֹwu8 \4ڕE %%p2}@ʷΉiWCm ]ࡇhA6Vuh~xNǍZI~SF)q*2Aݎe3iP|vbixU7Ӡ2Ga-P6Kii.c~Yi!Zl Ң!!qrUa?^GL^6yo#`lvH`\*n,#Cԇ+AuO6 mF)u`x.E{LA]\W*p,/g2uYiX%*]ցXCDj~FӴM)^,ͤJ_)aXɴ>:\,K׀ -[\`w!0[ NN6̄R(Gӥzҿ!" ϋL@*2#m8W.FV9`L Hִjrj(;B!gtCM/Jdrw!94Ԡ1dC.Wџ]n8>m½s$s `moȐ$ӊE IS䂆PSJ}9ӂ>.O YGu{c]X)=eQ" Blwfb[MEv+6Y9䨜k*Df/CqmJlVwܓ_cP [.\(XyТV#vStxzS\!ouQC+Ŏr;l3:OH߉#6pS>{WO^~Xq;=#/MvvegU{>Jz}z/قys1-|Īh+.45dj:E*!#) ǖܒݥB93t/k@46U7([nUz8PW-ו1 b*Aەp e;xVT(rK]2auny iTvRJ=tAt 9J|M.Nx&2r/eb6-ZM1"f0rQ.z<7pG(i:*L^K64Um.F 1$ 7}m ͸ܲ)TYvtVB%YcHc4J&\N"zR2`Hح}@-O*0;GP*!;r(EGb]=8e6rVOb*v-fM_niJBVfKt¶!пwP?U W5p%%Nl*tC[wMCĻ4?KFۈ &AḛjwJz+ŪK{bw\^JpI{j%n~uHF%C-ҝ\=ZGm:[Th%*I94wh/- R}tleّpD5M!{(U|dL,6uu lY!4[8)|#:NȓMyTȩޣ+ Tfi5;&3TkBe~FI"O5'"PczEZ;ihIIqWk UXhx<78~Abɑ_ܠm:E]N.cZ;v}.{gzDղyic_ FŖmzЌԙ;DI<{ZVg`~r@E{1fgׄA-=ӌQR'qzՃox*e?c({!*DzD1*(Em-"ύ\ я"ԯUZ% ^KipXpC ivL<AOZ0ZRv[cͽSi;=-?WOӱuvQ)hmkIeG=Eުl&Ymv<)HKKߎi"v֩KL# G1޳mU-k.uғE1;BF][ _%ygIY]zt4F&9.XWpSVm[u?!KM !G\2mj]:ymꭀ{ bsL"tLnBkD"ˈ]n-)w`|8d Bʔ}ҼXjDkj%҄n{8`KfB!ǦVt\ra>qK/ cQ |y `w ȹކ)x<ohqOfQ(Hofxg=\DTCn!hLifFǯcCyJdd><+;sV7*80x@A-pQߩ8-NTXhu ü-ѩ-̉wqDFe;Y'./bo;Knt`0}H-B7.(gc;E;IZmR&Oŗ &[gDw"BLӃ_SDFWcOI Ϛl->Ƽ93U՚ t״Š*R f mzuhq.6陬.}=n5Yg[^+ :'-UUH0db̵鵫w}LKSxm v/FMF]%D,'3lXF:T$Z]i(?SEŰlca=C P3fҚtެCFMNjO9YפBHO_2ilt4'@?%hlN}?:uq&b`AӤs.>G4L{20vvqnvI{m;{z~grg|Bhӥ(@ov_g+狌?;^0@*LCDvG*Xe`6}SnN6YwDw҄rn%3DZQy%QQ^r*[uIXGΠ8XW!Iw -]ԩbjځp^nnS{{JĴo eiM<߮ؒM3:H WFLjIK]Iѥ躸]:KC|hSt\֨ؕP7K9Gk >[>\OA.sswĆC:iҥmƆ+֛\9 IDAT^ByhGT%/,} w" _4z,yF,$ӓ؊uʶ@ iM:-xB9h*mg(\JB[ >V/ F Pk ($iJД :rSLb=v]zh8Pi[ s>%5oɰ4l-&BvS$:53YC5S\)-wAwZZKZsU=`EiWOTˆ|jEd_VUlq)_OԄ\7Z °%A5]<]P$;Ț2w0boI'6z:Ykun AbluOڕc,"{J6o)ۢrr9dޮ6eCENasOuv~Uӻ:4gi9%NSI>EWxB#Q̡_:yy}̮f8Sy`|n$W BZTh`[.uR:$rw.5zݻJQJ(Ϲ8fU) .`$ǮMוQIb{< O|ҍW=©8FMbLWEBZj!_>c91UG ,]G"v9 t814Q }GF1F/ P%Aި-\3q2>4o'&M[ =\ӆ﹪c5datt(B\ Giﴵݤ.U eW~`Cq)ȼJGSfD \O.q2Gco=TS3^T({R]Mj~OEhM/u6Rg& Yɏ4lѷ]<{C쓨d6%fmTe?o۔s(eg۷R ٙ4bvp'RL%ѿglRX!w!8ՑCp덀j7Q8][ڸ+#bP/DKWq ؓU*.htoPH.rCָ>}S#z {<~ 5F+Y9@b+څ̚Rg瞸>;wwxx<945g+4^Y!.=8thV[emmC&c]^ʴ/Lu*l`ejq+%T45RqvaV[?Xܵ`oze\:*)8y2 8X.b\T|F[ !b^ԝ1]賽8N%zY~0wR !Xցc!IN F(,,cfLgVzr)h;[/bs5;n;UŻ]e=tI(*G`4pݐ= W)oc(Mxhxզ\z3v~tz,b=YtƓ-G1 vk=#nZ8:LBUy{SRg٤P}ά9UTה[lFo{ Y{^Bf.جkXFQBEmï>e 4SKnŌ`Ra5FsL2:ҎU="ԭ63[ظ5~)ދ_JUt껨t4;I*T>ш3"=n*9=|ɗ| _˾5_ՏCIS)ltPIY3YKCfA.ѯ6p E R{!+!PJsAKdxJآb/ NTtRKak#ƭ*!1}93ZS)T3:}UD{I_"mμĿDz}]ȧԇmg($Wᵵ?!AU Gp+]سsGa7Me崎KCDN A=O,纯yMޔUε [[tgW\tvCeY4 [4S Xť݅y|o1ldNz)uo[5- E$pT0Sy9DLZ3Z~;W\Ϧbp+YV3PPv$1[ .rkF|k  O.eBECtNHVxusuR1Tbٜ/}$Z+)n``Wa3E=1!(mD4e̲x4:5؊\O;NJJoQh4ijQu(j9Qx??ỿ?;;n<}~C<{c w򶷽gϞ~9WKמ>x䞯Y˿G>;.. G?FU"گ>S2//xcԼT\pguh[vo)dUZ-`l9nX"](xPCj`Pyu^hkO -` e^4+9ښSg}9-, %3gQhϰPB94l`֖h*Lutu* z R5nacXJAyC*ȝSKm|D6>ȆȎ~?xE(.W6#EjAL&n4^D1yڔ=ʏ.aܠp Jd:ԾcfCv.RZ̪iR4w]q%NrEldLY1$Y<ڲu^ʺ6)F#H/.L8E+ Sb+fH3_EF~Z[f\"lak>hbuñ >ý]^w0ꤾ=2}:(wvNŌeC30o%EqoL*QCux:>݌W}ջo>}I-?<?ض6O4} '>W+?D26??η_?!;˿ˉgOVkO_x??>KH[tW(K_jtw-FRAm6n-fj>9l5{򄼾|^hU(ʲn FX1mru.x -ߢ}mZS@fJN5Q Q8[=RMU+[#0r:rZ zi p)E|޶xQU# Ex:C{^hGﲣt֘*L,-4uKtx76WloJb#RblRSᶰT-b -`&stëFT:|,fɇO.):l'`<=tK_̝2TFplM`5Baol#8eA cZ0V~Jz!4lDJcpH_-׎N>;ӀnKuj:uJfF;:Q΃\5P8+5IMK@# $ :y2|pJvԢN-u~-b2})`F!I&<ϔdގNnOs{3vpc9!MkOrwwN0]_#?¶my뿞~ClSKS3?3?ÿ?9Z%}&* MĖĺyG#VjncBܴdgŃ/EM/ IuԂYMLؘZ )0+5._,/-R^2מU2~T2:hP) p#T8jtwʇ9Q5(%t-ӵ^=aʧf3&aW%]nA,$2<ю'fNfh@,;ѫCBDMލ/a*~$0ZԺP\YnAgӝ> *YedbS =hV0v׫>"5}q֝8ԙnts2WW_k2 YlG1r$yp|OﻵG$?s?˷W~Wx:o/|>_[[ϟO|ww]=cMv q4@ŏ9XtqlLp5^L'x>bt-OMCqM0-m뤁ƢjGP\6s3/v`jw5 :'_,ivSf-blƨ, 啝RX"/Rj\ 5ݛMIr.$T_FAo[{Su[pUmz|TѭPcYb'ZRϩp˲ś;&"S =Wق.*no8_N'D]u/ġ%׍5;f3X.v˓B!`ioh=vv%Lo nwJNIr!`ɖ2eZ]Ki\UXpۚK+(V}jN喝e&r2@ay@q[GR!u71~TnJ$>l 9^kZ'V.*}hq=Fq0׫.dZtm.͚weIMY%?3ұ-MO˾?xOOoE_\wg_x~?IOC?|_ox<)k\e׮-ā1 B6BETwУE,s)Rq}Űbsv0y]d[k-*dRgEWѣ $[;f%NhKHKKEm ˥~I0N|8JK.Z4o-g Y;e4:mΰ.gXe#jWwsNY%0jn]^dGcn^ 3vGEIy*کdngL*6ZgmNI crEjo1{ m}:_否ƥ%jC!n8Z%Jˈ1X<'kcb.!I' 8)f(\)ά #Z1S,:(Y&D`teF@u֨s19 46F:Ky4Ϫҵ iY 7HD,YaYy澈&-vGɐק"J#!;]HlXW9 GS_mUwu]~߱=P5@ Ij҂1FG &DJ->T56e 6j QL bpef<{?}]kǹg=3Np>҈~DԟOG奔7= #|ۺqu_3^:oy{e۶O޻Ftԉ֞2l!a8r`DsPgL%lGo==Rqba1":݊k^Xydž obsTOB5̅䌴FIΕ)^K}Ols+BmLNbt֘LQ_׃oVmId:v)7Zkb4ň[NrH#CQkdkh5_4G A仱2nƯۘlhK̰(3A4~ԃ8 PY'쉤DJ-ޤWv`mfӚ +ܜT: (ӭ;XnѸBM'H'ZR0+14F&blyJ/Uew/GhDV|Bi!nMFbzOr2R 셥1 U`!uX;sN)gG aA̹e0,)m@`S.t1eFѣ7#U1̥~DFQ^W`e:5K$eW/U!a%2shG2aFcr85ϭIPXbQCcЊT!yMiΆٿ枙}!t+9,YB  i)xV:Q7tr`A팅Oν\^Qudgid;B %G=$7+9LI.$b@3F:KtV-YW&CicbP,usYv,Za22h#Rt13䘄KvUj4'2ڹuL;t+Y<*˩5`ai{u^j;[fZv@J3YQmfJfSx&V' oQ)A`TɬIqYc/FsE͆O Ҧ|E8VjƖe”%oX@B\6M<>b(Vj+E L`3fEfAfZ7M Rk0]]46u ^M fF`(3rQ,րf/čڕμ4!'f~5Td}N* &~dV|^R\ VMTy褹 ,Ful. IDATK$kobSsOQp<93<#V7>Vӿxȣ~Gn˛uMc~ 1q 2''f,aaNVn@W0LM{VVz.0g KXMQ`}u}u6 aaR+"o;~G^ܛPՇoEOtcК<^}=Y> J1M\Z/^ap_RM7K@/na^$ZHUY iK%P"lj˲0m$ͫ:7IY,˫ {>JCW{ඓުȱ0N?] h=hT 0/xT49+NWYJVCBwiǓG,] Q'G &3k De/5b^C6:t]zuk5rVY0f;u)& z(vV܂,Ŕ`Z\jIJγ<}q576SS8UCSQ ,fM7AU\1^0Qo}pHLҪ%R 3R El-eD[+v$lS#4rui!.eð͕+W s~joNVm$=>G 3:[NΝ @ƜjVQesSg,S/|*ޚt]g1?ṩ£鄛Ĝ65UNi̊XoEYI|V\VN:](7,ȪiCVFAA 6?859̍-v ,R Nfew3M8d.p.о zHVtfљӢa3\Φ,T78t\2*tϻ,9ͩ&>'ݻԞ4u2kεv849F'zԲM+g%" J{,?k(\َo+a_t)933HKy۳U7IUS+ 9"Fe?ЬKJW틬=a"UZ=WŤ:Lx">+ZkDWb=drV}K=DTlI3v j#O!uaIhј[S1hO=T=a pH{H]tVʔ.~~m+/ɰ{nôJkuкRFm?H# lĬϬ X5y.3@7,lC@:md06Z)8yEKD< SU0zP%F&ݯx_/|= O{ڽcrjZ{٪VoS^>"ٍфPomaABN˕f#`ӗ)t͵ƽ>렻dګ9!Rͷq`YƌͼKg,ETYBg8l64#f@6}Ӊ~0LO#Nts]Ug׫~-iA*]ƙ2u 75\99T;K {։/U!ƉetNDJLI'8X$^zEդmRL!ol16e%|~4]!2)8UWWzd6=h7;2b*.g\j&? zHa1? uW ?hə֊6,^an QEhwS rܕ,@c)D[NZJ)u]hUd(ffljN }ˆYl*pzPN,'L\1TU`q\^᝴&F$֝>ucb̄nX*JgYh7V8 -OA=Pw_׿sY?œ4˜39@uγ$k?v,s7š>W2q.l 57tg] !'/ Y- 7U]aewuDzȲ"ʗ #!eFŕ@\Θ,\_朜^kT1h {VHJSJQ_zl︚EzEJYWJܿYSlTyX\iք?襤MYHF0sV 4Z-WGXEA9 kTI@1薺~B1Ujn2L>Vޝ}OQ?)pfb>碒Sщ)^ਘ;1j:t7! DX}DjΡ{7"JʐW0dS%4͜#0grn0qݛS%K(BL j^ZA4!P!u2NRΓT &&ߔ/lB}a^8hLZ,ozܔ22B̻2RhbѸ|l_9Z['Ey%nVcSwՈ jtiA&zĈ硊7Ceqr5UHYln{cεFV$Y+LߣT@v<:G&O{ 0]~pUx2ת !qC64*F1m[D9RJbH01speӊy3dX0+ggx`M|!}*dF 3Ɣ ~ޙvI[!vDEsO=ÎIE('uOs\kd 55iYfnM(MF&HBܐծOFĔyG ;a >pg~֦&l4V3zZ qW$5 Z1UH%5}Yɴ)Z "hfĝnH0JmTN= Haknњ1h3SޓsnAQ:!ϔ[S|.{)*A㘶VZI̕Xti<YjZRâN2N`*4B>KReXّ(ΎHaNjpя0'-ԦlRWKͱodqzF%ېj (WTs))f/f, 3'WÖ+#` ?bZ}^)Sxp cT$%gr]*%HTs1u^݊T/^(U>oڨ8VXW mI(JFQ"6BwwkXl̘d\ x~Y5j#ȼA3ڄMLr`IYUZyY&ʱy);SEV5=|<||#z\\>d9'y_ !>|??x<"yEG7Irkg22 V#kU V=@+!ubm(a{ u>a03u5RVS [[BТ4.** 6ndLjdʠUJJne,ޘgcك<J<KY7R?/.rjNu' \c+udAdmMd&.BVUFޅ6[}͓ s$* Z'c|LvrRR 02RrL&=yj.tÜϒVWY>)EWĹ$R+h"ĕ 7)Y|,3jqJ(I:&QP)T?tj7YH3V:2s< J;v, _Uj&cއV:ú--s0[,_U6jht":mil yPw|j plfٰRbH.lR{w u|m!Ǡ|OsN^_yᇹ.^0x\C{^^JЭ[x;<__o|#zիref'k//W3]zx+>vyLJ%\r<*_TћH2P/nOcTŦ ca`x7ɱ2G4@*0#ѪYzVt_#tOΫeXXo2$O8xgX-i?0SSNjL>X%E9UMo`յ "Q,0&83P" 42\\{ NS7O/ ź!wc*=Mj"ؙD,n";%OCO1SgTK(7R ov4p_#BF]Қ#=Rl\ԉPT-{D9QC<[lKjk'<: ]H&0˭qJȅԁ Ȧ5d+LQ&^ŬKfAQ}h]gbZEݬL&o {,+r@@H,YUΩ-`CdIeVnSu,0kl _eb e\{p$3in8aJZ8(] ox7n "}6__K_R>)m˲`Yܝ7ok!FkL{·͛7Zky;ɏWmģ13ww>~W9'~)^>=?_~ggL;gsFhg x m 100̖"wa#Ȏ:l˥zjjm{8?{*8ȱϒ'1!7.fpKUmiļ]\jjPJ ice8q'`tsPA ld1x ܸH8{/C*Tvc Z$y˽_53_9X1#⭳mijי +< @u\cex= ;Tjd0Zm$875 P\3`V lJĬlRЬ3҃="^{=s[FV-nҸt15(p5RZ8{ phb(Ud}j+ӏ ϦD001U'2qdr$vo!Uat(Ydd4c3wIJ"UAx/E0bpUzJ!H& [`51J;mX2 :GlWmEӐ }\Vo40+z]`Xo~K2"F%cg G󜵲sb0Nc3>OTcli?g?Y4ɋmQzӭs rKjEC3"&m8wbfl&H dĩ IDATKijC\",F`)ؖDte$OZn(Xr &B9YWws|DE5 kd$> ;VB578-Ri{$TS"N^edjW~ޭ&KnWT(m Hn^> zVTQ^Q+(\NKțn.8 p#JA`*<[1*2^"XQ~͒h~D&-\iv4'[őDEL6h)Q/W:*ON2T`zslΊLj#bwZ~e4K*t,U!u{’bspTB* ->vK qd̽*$Sv2lq^_6 g|D[MM|2`2Xy^QL+hE ZKݍK2Ϛ Y,%bS.3P*P$'lR-Oq1QMb_5`nHO)Ɔ1ǐb5cʳh|CėK?o/{i/xf_oo?xQW..w_:g~]JFp\Wgny&_sO a8}?򲺞~3xֳu=ē0M*srbC*+D$X윹|أ~2B,"ɔ:.G:i܊Rl:VvU `QP+S <*PR r3i.ƊK**&c0ゴA3%rhVm \mK2$̖e#rl`}S5dSUA0kh=e׎u ŪYx V[jYI ~ތJWsTJS1]Ӛj^h3}%Zʄkkʄo ';9 X}h|ԃPhsQC\TimL:Nֈᘍr(l$`VP&P*<2gN1dNq"AT_$rnxoLJaNzjEfΔ6̉l1f0*VޘX:[vu,6ck*LF5a(dՌ-ԥPSׄ3m倱9Q&D Lǚ335yzz'7Q~gUMLuƓ4pb>i.w_|w7xgyyگO8O`I.*[}c/aދbf`XYssjǖB!Rֹ3EiUbwx sacbٝͮY7;uhRDxLN;۳ǂm`h5LQ(Ni#u9AL/j#{|wF:A©'j`+}4䜦"vRdnw/E,Y S#UjǒnΎIl?]dkb,7Lb*m#>KD0^ؼp\7[ji5,8=a(šک a ~Y1PVΤcxk TRFpM)sK;%,JÓ4ģ™7,3=y9\\\?/})/x x{oopXxoW=? ^|~//Y뿞͛7y[JC=6z__G;-|:Z?-oy3)λSdqjSf!@/Ԫ( .;m։9XPXo:g:m ffr Oyف{lfӉ6vV$+%21[1֘.<-6iy߈p;;1`,zLKx1zQ̕&ygV5z*rD;?ʦ #bü:2!r EՉU> h2jj0545*RL9۩s|ʊr|6S7jMl36YH ,X84\" !jF 'Fx$w)əQ:#I t2&NQTùَgciNIrl Fsiw;Iw5[N2W;6uW\vd!R3+$Yܪ]<+ h]" ¶Jk%Ch[jA+s38_`4|&{ٕ2wzg68c2"hM%:= [iz=2Yl]Þ>%oXHc銑wy()αUv6.3{;5X27zfZ!# sߒf Ѯtْg [<9He9Fd]WU[[4svvFfrβ,ܺu3?ȃ>|wmNeYQǣwݩ\\\c"nݺ;%| 4t;a`f<|CEE X_ڱy\\,gPRL݄#~(CdZcTOa?>Qn<3dNJl-QG4K-œAJ9kXN'C\RNjR8:21`yF\iK1;&k;3:zW#qgk*0ݪv)L]kru oi2zKbH査64lк%lcʪ.bSqY+ìX+余{D4[@=Ѝ<@]۾QL=v)e}nUYsŽUtҭ3Kŕ4V-&\+ʅK$Y&^LkFfg{tyVTscdn"6Q*$'̿dr*UFIjJF3L)@4ZT;5.fMՇYt]dEaRqe(E vAL)ş&`zuhg;Uڑd%J[(%R ]1:!F2 no\dWrsz e WnBQ\0?㊩~99{R8ו28;;|ן/% #{Tţ^ p~>89yεQ'<c|h%2,<8EWkfbN1-؍v8) 77%%5ex_=EVVRcy`nAY#ܣVuD#4ߍQ@bђLS#C&:%+/p[¢@uWU%KmTYèyh s{BV#4Ifp/pS_"s6_/5r VI;~2[Eŝ%Ugi}&FlwZՑ:\j|Ǩ:DWRdlڌ~0 ˊԆ1!f+L療==1y%5PGy'LkXԿg̍־>ORDzd<6|"e6yԣG4#Gʨ tfKݦQZW0hqSo ^_!fCL;y@ $[ӐbOCŵJ EOP? *Όq ]3Q,̊ze䅘}髚kڰ"R2ޱMJkHV[*Mv[7h.WqޔY65x09qV9u+Opp#tsKߛ]GqI?ߋOIq|GF":%gíps+gai5Tb4}uU*Ui{sN:E^gph]զ&"oJpys)$ąə !~#q=,Y|Yޠ:(nĖΒ'cJanFqTv3<)2/Uӡu "q5};m_Tkscb)MoL0:5+5lB؉5TU?`=wufw>ZQ~Lmʹɷw)%M}R[{r[ڹWh09EoV}hMchJUaZzf!uD u2=8h^-DUd$zOIt#UR6)6R(] `q4vG';XI!֔H6cjG5Mq%PI2AEJ3'ImAnjx|6cLLEA'<2L7tӕ<2*1ޕv)$,Rnt^AӀT`XE8-%wHa۩l~6ȹe=IXp;x;5>ׇOxmnܸ Ic|#;-P| zxw7KЉr2Ld&t%/Zr[^5|Ox}-i4FJ,jw6-]'_3C+԰Ag6M3J5qZD3A+`.cDGS*%}HzhZNŮtũ;UEO97K.SpZ'-ՃKm*QI,/ɴ/L [Y3V+bj{e}r_ic!2ki10Ce+($cNBp>6K>'Po4fx4saulke _Zʯ:$I0-֞Yz ^ai }ӥh|"dl.@ךj2!* 9|Co2h_}?.)o Ҕ?J1Vfql+L6big)'.V(5tɶU(Y1㴆POQ3j ر|e^us~ u^D&,M~ȎO%l ˠuzRIy>sKKߺw?d[OݻP/3Yz__?OpSh"Znދ>1)/ur,SEn0;€}}\MkD:f+&1:Ѡ?Yɇ4 EյQWK'VXW37ӦnƣJ'CuƑ)bJm'S d8==TH xȦV%`[k2mWw1߀%F$JTՈ"A URQ&JRiq5(WZ  !4hMF  <)P{{Zs;y.wqlق9{֜c~k0uk`V?V L+?{k9 G܋ YW^\Rh4ZYsmOGkHj~> yT0h-U5F%jeG(. ӈA<+E{wP/:jW `3!Dk[Jv_>p`H(9$(6z.w kADÏw~9ˬ.RtBk5vXexÙ`0iW< Cd#=бQT[JiO} @ytb~BEUi^ E˰]hv^Ra!'1 Pٻ/GKPK^ ?"PaVcb8P3ҿ$?(hs64Ǚ!M6UBӮ؂fsq5li.hH I_ CYbdm>n+ t| na}k^O=#fOWF &va0b$p % 9D#j5#оZ{!t IDATpw;_az;eJjZzKsbsǥY؅.'ÞDmǔ@nd4xbZ Xs`kv,zXXTĠ Si+XM*yp dZpZ# x | )&0삪M>Fl<׆ѡ!@`fyx P&H̔jcj,;"$6BUj3ÀFp KzCİ\ ]@9żƁ%@g@0qBN_F=SIwS7L3$.bBzCr q MM0[<%FKDŽr`  ٶ{+WKGOlJȁEYl,m6~WYUȱ 0 ULVқ±M̼;ܹ@݆K^O9*ue_qpC It7hTVK"EF F4 V5gM yMLb[ij^qESJA~ȝ8/_p-C>RTkQ3pjiUKy kBquqv=g卄Uң/u.>}rh;"ZP&}0I.}JדPA4 Ikl nZ3hdj2Xb*)ᕴH;N^K o0c _ۅ$ԔB7Pq0 [ m-[uC\ tg\;Yzz5Ht &%5nttI6 (gQv9㉣iM٤ZISg *^7ECZ pjX5F,>^$wcrU.C)-7,D6 t1x s/8Ե]n0/uu9L&oH_,FX~Qv{*pҡ6;vi<vw_3&w:R~Ac6^P [qL<_0pE\t7@e>Oα;|5l1NJ7ݱS?!q-ڭC$G_>!x:$)ofJJ_)ʰNAsuAtM6(ܰYt{ Qu低AqgNt>PƖHR7&Yɪ'NrF\.0%k3r:좟L<]$[HjX3dD{Rl&D;8 ft& C`oӦJcY0]vCC&>5?fWY͛ȁ`v]ƕ1f(3q)i`3dD,BYP]Wj2NU*b!P uYo$UӖ]/q͸+ڲ`JE 4 $H vFD5EF׭NjF0nz} VƓ֧ ʵwzVP8ukf9qQ-"!mC!Z1k ꋺ RW,?>;o/OO/ͷ,jJ!z'^tWdrDt S9EHL42`G MW\:&)D|_`vͻѓ{6 mI`6B8VN؞;)a*Qr4=jep$L'Vf X "a1tnITm G"#qQ[lR֬ ĖWv-+Qgs C=;%mя߾S -vb #7O87d4 ޠl@W,VtTӺz4~>q]|{ޫ2{0[%I6mYف ):h}gU \7:0~őrh`C8pbi#cJ7co@7+HV0īpau)q<ɕ4h魊@al(nhlɖyQq-s! cĭC e I]Dt2N&]m Wݘxp`dr/GE9.`pTЦȰB4, >|ՎiX46D L+ax y%>I޷ E8%Ĥ:>{:qt:SH+=$=;/CP1VCQ4_n30kL#VLL1ۑ~̤b3\ }AVc1'IfPLG^W4*N;1lE8@Y$=fcQkqŃ7^Qk"-v4ҷS eg'riuPǁ5x(AIF05;- ;Q`M[i@4C" ԅs:7ׁ̨̤""p@OE뻵qgmloY\%L tq6X+ 8, }ZLN-rVEi5@Pi>P@w=Q]H5$FFtVmjd)Kl[ᑅWʇrb\u`h¶optBa.]"kؙxMwnl}ˊp e+tLfWR d1}%QٳPa{ ɵq=aۂ#1q707XFZ(r6NwѓbDz?ҥjvQt#gQ%NتC%!'7ϓ y.6@]n1YaTSvزި6 ͨv5$.:(az@a?{h q^),1bp堦%}W>Ò#!^qjr/5eeFictQ)7֘7;ov9I5SP$*}Wn++pP„s}Yzd49g15yߜ4ekSHf˹RI c83[:ǡ%`Gd=|k5r5`.B8,|@C扪" U(lܭ8`,@(|3N9 WgV]9>Նrxd)\Ypb+ul0 7ᆽIf4"x  qYR~Q#b;(2K__Ɨeٟ}Ї˧kVz'BtKt.֞C5$-{@+S `BMb |1/1+x ݐ AzڼjvC"D2njd~!3qI0aAEc=M꣛H%{0= D R77apQLW8xIsSثXpƨa D:cZJ GƁrP88930'=+p x/aO 0`p eHv QୂL QzNLz,:Wl+]w]wTq!dee9e9R(6} 5L.Aܗ.Ay#q # aWDƧXH|0;1B=o t8CN05hݚ !ᴣcpUh^{,(0kZƌ9/} pw|3q|k_Cwyts^xCv=]orq>pQSv =<ԙhȏ.tz1¨k"-K732if #m&E*g| 30 i ,]A:GFMi6jkn;"˟` >QkSX/)p4Z.v/! cH@M ՀerPQ䋀\ʰ/"k%VhnM3b{Áp|4C:i9K%jHL&&`K?cgёt9GLN 6/;!mn$2ɰC cH/ǔ:Q,: =y++:u2o̷ͫ#%@8)g$;"4'~E˹}Uq LLGTcg# o7f'ܰYMߏoA]: 2٪Y3źȾ`D~|[o}sx9~{/~җ??q\ٳgҗ<]tƻ(dl*^ *$aCax<~1ZZf'sawɔ)/4_ӹ]3}H̾иkl:t5&fجO{95yruX*:p<7gJ./4psʉ1k4+4.e19yO67~G-,c HD *JѾ^%~`Ѣ n@R -RhE.viOv2V@ STXP@S3^=n'@:DwPT[IL_IRlکWIR؁DmD',+<&cVz v /`b.)Lf+;[3[4 hŃpqA&3tq{ly_pl;VpF }vۜRzW#':5kQE!J| ]v6dTA0c]aPZ #9~sw];Zo"н\ dm.ưT|2K;Q.>8[]z [~꧞.w1<у9谐ئ荦pC6stl,p` @ni3>Q9y2ض;j67 7v @T|a| 2%j&.QK86+9`.H;.mŜiXSSnJkNfhaz%أδ@5p(ǀX8=1Q@R<ۑl'}f6ش> s+dGb!}ŘӅ C. m GZf^~ja07nbitCgib*.D1@PvWqO[I/mC+kL'0p e  Ռb{ĎDa@xP!pcvI\N0G#ҠmఉJP [n`I7<qYW[nB mi+ʞZ#=S쥞 јgj&7t}?2 U\EUvgX!w#BXTb$+&;āc8@Z0(38BF2nsD^W<1i* #[호Cq}M@v{x _2~W/_5o>9'-o>x?g?YQ o6yxﳐ̜i&[1)Í}s@f{QT -Ƒzr$rتGķčqve`:vӘQWzt!)7;!BG %_6neA)')ѢLf=J` F *-t ﵑMY Q)r޳Ed | 즥8r9̚( +\c!۰F7[iFBT40(Q I|F%,q(|-Mr%X[#:N5p ./Fe,lBݯ`P6еa45{&`+t7X;FFQ/hLbW+rͤBP& =qe čY`DaR|OGaF 5WӤ)lHM70%-cgV%;sG&pp9Z1([/PWΘg6A;S˫c2 1Ac@=Pb"(J:1m); ŧτ%}W)6~z^| s0 Os˷gO}Sm8d&~G|z?k?v1n2 GT&api HxO P*EzbTQ#}86Lvvv*NG># +{e8P3dҫ|F?yKhqg|-VZk}뭷 . sᗿe1^]톻; OzQų js(ݗcfׂz'(j!ռ糱h]]"\?;Y9KuHL/G:]tK4FB0!gs\lnrV4P&y;T.Zr3JUb&k)7*R'f Kc; zTAyZ( Mcl`JE#M1 kL ̐n(5mOZEȶmx71p\obqyw㓟$+^|ċ/0G~GwS; lERPZq&SCVH`d~i0~j7E x1pnO#6VS]Lؕ ٜ#n궴(\g/b&9NXP7dq_;DȜD^]87I:LзLPh<*/5 xLr6wX_mv]J?V\cEk֟X:ާ%e&̱YYIJJ#;+hanAX(9Zcz6=fMyYS1c0ofaA=;yذ21pcDP}uYLE.3 䆈I]Vu LQ4OuN\ s4rJs Τs< e7Z]7C5u29`uwN i1vߍB#J(i)uL0d3u7fa;N 3" y: L S،\D37D9T_OSw >4~v/7O w;67?ʿ›o韊m׾w}㳟4"^TԼvQͷt?rt7P7Liqk%`u|NNyě;Iә-Nsym#7zw^ ydˢde4{iylŘݑ~F DfeEqfu:N$(v:8氵9cbX]P5}#gfٖ["P@Iڃ{p^]Ήnz}vr adhl>"Y&=R\׋wAhYUүͦ=C7;xaIL\ 5ÁVB='*s< lX0̬p>-Q)"鵦*$b9ÀQ mf;E@k{ h{rl*, Px;fM,Ϙ "U[(OW8*H>u5m5 kuB1> Rحt}SjJ/"Rn]8GTNg17Dm}bq`wD4&s DlQQ(]YJ_#CE= ʔԳ&5 Ԩ6!߁x]~  _gcO_7?vȏi?~F{|_9^z4~z &n aNF\T|r#C*:1} NX*QFTI-b+=Cx6_Sj$m՜y91ْ"t2$L K:(Zc£"ѐK8O.q5wwW,C8ᴉ-{Aq͓sT] 8A:ijC1 Zf0\'<&{ ZZ*x1B)F s0qg]t8+⦖&"SCBI}9ԁa*8aEi#0*ny29%lPS|5.0$~]nh:f|e[VS%(m3vKגDTG~?͑4RIEP.$Ft=1 .y fBW'ϻ8P<=cИ3*[XEږihle͑7R `Œ{<9MK%8mM ] qsfF/r)}hLo1 ᄌt 2cbT] tMq6#vέTu[]G ?6bo~+jHnEߩ`̋iLх# $*`01HNf{lh{sW=0@7'^Ƨ^G8pChOm~ 8r`0z]] k، tv[@LA;:Bٵl4f)fmz`,&̇p :}hNyC]t)2̹hFkAjUj>8;1eu4!}źM [WW$KmqE̹>ޛ$3IJԃEJ`ɔ *\!opπ հa@͂e^7ER$#{9{5g#>)jq&Is~f̈1  mLO %kil8ѳ)`QCwڞdw2zE#1R˳Ӣc٘4¼h4 }vvۈNpi\ZimrbXUAbLlSY7 xkl2BibϙTY Ev,? F_i uP\njF :v^)^,^z3njlw)*.)-88vQ7$dC2|K:;a'{N7eHPm,0ZѪ)nUYut830,v.^0 AC@q\Yyڀ$k'fJeEf 9Ҕ޽M1XXYcԴy!}\htj"Sv)'{D^4xDbSf>pv1Lҙ4)` szA3cǭq೙VA['Ox%ƹl5"' ֹ IDAT GH"5c6k4j_#;'-TGh L4F]ree!anuS Z*&mFyf잴z5M˲2dYZ{P ơLgpeV&O#|Ghfߕ"1pYɽ`{fNJWQ`4qn4A1d%vl+:_F0ji|J3I؊A?UbIa3~ `rʮ )qFg.uݡCwtՅO.>G9O*+1~G<^>+!IS:'::Bygzdh\7;{^] ՑYNEˣSEuˮ ZM_gռLR]@`b6f뭹.m* v˴{*۫C\Gqಬxn} __o˿Yq}\Jx'O~1ߞ4].n,9٤ch:,=+v;7MwY3Pvq&ͮ ȾL[xC6ݥh+1`bx-az^W^Ǫь$xYZ+Πؼ`aV铍 9,*!d_'q_šI P0wZ fܝp,ΚJ f $xqu;sh\c.qvKؼBZfH=34ǚ_ evfiEWl.9ij([4 B2d"u( a0rӘ A+@fSrs 0bqu|H[`Y1(iuE m1wW8%V,"`t]̓K '{Dtm2WL ^1grjGO(%Ť:v ~/l>w]z7:5V'P깬nT>c '3vqXk\'rCjJp0%[ӞsҘ[o>[e*GEe;$8D5Qڸ*;j<'S;ScvXU12VSn)Um,DQc: ViR(r曲r(KdeL)Jfٺˆa|[ Uif<\8Q%W.HrEvtOTD9l>81jWT@c.Vl{}&IbWjI7%"b tQxH$F,i]cDzwDzctNc9^!A9ҪHVקRI eza:Vc=/ CݬR1qfnQFBߕ7% uh2A+!n> yTjOcZeͩee'ox-_=wglN۱抃#B0RW͓t(gr\< K鳆5FK׀N92Kpfrs{/__*{WٰiSddfҬᶐS8hRoGq;!ڴ 40lL$h өOzf`[{$v˖I|3ooƬQ^u!5r 1cj6ouTR8 e(ࠧ71F1\`X#Յjv=:U B&^cJމZv!VI%l!K yxPgُ$SڐV#Ǽf3)J] Lvp]ݓn]™pf[ 3$̴rirv" ,jf9 F/ҌTl!~ ̠s g@Qvl=gyA4^ͺRI3tԃ^`/XqZW'=8J9wu3U,a:A4lJ>@yTJގ*Yޜ6B ,t64 լk=p?l9&Ya{,&QA;os#/}ng|rkxo|-^)B_ Rϕ}Eå"9u7vD\v8`⮤\Gqs,EfNZ?4&K!? J(V'LyrոhY?}VGq'wd8pcUs}٩ #bĹJ(Iukf0#j2fX o)-Ycɘd /vMV\<8+M˸k׫?t3ifc}<.w{r;j3>foWJnWUz}{˺ݎY\86 m Cey>Vk# [g l/;=w"됿I<ںQ1~2 ? ~tgi0WnMf%]0oBdM!8=:+mr:u;u<ֈh!,#њǻ |$2N%Wls &)Lcbm2扥G jGvOc$xkBŇ䴚GMT^:Ka5‡ttKHWw:`@ &Z^|( {3=lepD9J=SRO: J!xFB˫ r&nč9BLV 儺y:Z:;ʃJheICH68M#\3(H\Vub9yhw,:ki?1kV@6X:\(DÇWګ#+y0HTohTW6,Ke$w4`7Y&'\OȍlB+{YnǟlW7-]Kn>iӇ.GYҚBCꝸ`~=o P FFu(!;;.ublx\fyflC,KQ'M)KBp9IX0qkɳ4.3$\N(Ċ$kJ7 WG͓^3&Q+R‚X${XXhYkBN+sMI=V9eJ嬑*k]5kV]_ SF`xda_Ψ\Ħ(:WQa5H*rV1#? xq Yk`5'k5R3ۉn-tD= b^U h0P<]E͓ԣJT1Jye}wf#iÝ[=tg!o}F f'br)-<;}+lXn(j4]ȱH\mŅ-[oM Le4~!"J(Yh)S8CF(qM;oȧ6S;_緿;\DFXr>+!p"rHO  )4eVyh"scj=n+ "+ԋ@l QܚXa Aui 4d.r4zWɯ?>|I|yw_G_K^Չ<|DuCSf$8.ҺdhTn?pbҀ]i2sV҃gCW7W$v\Ͱ9 tC{j (-$kMQ]7 #%=EJOpޜVTqun""$keqo9s ƜW7yX<HiF, _ΠHgr<ʴ3fn7ӑܝ t#r EnE,4kJ;7Ox_?F94 _ԉS.M$ᭂ#XhMN \T̤ KX*F4 C@yj3vkTge:&i ,/wGMW!cc!B=E>-FN]FapeQhS. nܫ(c0)1M5K׈57d[ŲrH:pmHdzItlkfSrUO;u""FIK\%\+_9R {|Yc?nV֧XK_E̳eF*[O_Eߟit-4$c»\|WOq6y`Z] VTh/qT#|$Z0Mc^# d/]ugꈩw:4TJUEݞ#pmyBc5|ɛ'.Oȸ}!Bd9O&%縊Mi/\S:#rs;r9S rMnLle.]*:w~"ٛgN|?~Pf}tzc6ͪ}lIQ_I:VzY*۪6xSx'-' || fЗg|II̓kCS9 kc <( 0Lu pwͱ3hA3+M+@Pc:9DM엓qI);iM1xt5KYg2&ٓ(sgاqCJvu_Dݨe\n]s "Uܔ\w͵\'ּ`eAt4B1Nrό!;|jsaͪK$>eJq2@pM4$l(M7ȁۢ85FM6fg>ŋ#cWף7^J[^r> >CEq\1} u/bԹ`37ڥ E8hWήMֈꊖ㮙 C<] KvCD(yjǸ\ ;{s|7b垜`E!\)4Tڊ0!."[Ostw 4w^ל:@@]'y8¬`{<K'azEXAum تy\5irH$)mCh\X;dRɜ:zgVuEu=7p Vڙr2u61/ksAYWUҕ L ,Mv6*&At&' LG+!U7c)6e v^ KieJl5~k8ߡB\rTappaNJ!Pa].E9#lʭ嫫^>Je0Yg7֏ܪ>lp{B޷hIл';Qqi2:Ģݓۧe~{Ǿؚ>X$’/}^M hߙ s3[ 76fu )Q趢g!n.W#nۮͬL&ov`YYJGSGwTDI"^O-͓A@_K[55&1w.zݧ2*؀ag}[ݔ6LFœq~S.Zceu_-{^B0h-(E8^9^E~hEa4h׌)6Nd XeBiG[4cΝ K QjR 4gj3l).4 KX=\%Ћ>]\ZH]P0@YUۘ+w34[Mx/yQ- WXjc~$\mr`)ET<o5I!ba+fGô@.6c vƲ󙷞1nc^KT\@t7nrM"fvbk[xu?I>S)y)\g> {ˉ1hP[Nr5-4M.z-=#h0C+o6tu.2P0fm1wn7]sJ+wIc{mQԆ]}r8ä͋9MΞ,R2{E !ҙxJVTA B{;6g͟??c'<+3$FZX:i7S.z~ "Zbdt2n Rdk\G&gůA@VEi> JYi8Zqv0䄘ؔ6k'}ld8 q8آH{x?~[8f 7kШ2(&R=|ghj4sk!Q@ΦVd? ǔFa0^0 ?QOGq2bA!yZ ;4b}Ӂf]eu]κ.p*4gVrH|kaqhOG+'ˑ2Hܭʦ1x@KH MJ#NB H¢_qe&4w}-!@}x5x;CxsY~<_w?3o.~9;?N*h9qJxNZ1@z!]Υ~s4+i[2PjLvd{aMcTϭh&!5Q),0:iCM3Z\횞)z*6&s4k{cNʼnqq<.?TKw1IGW <'UNVk>o놵K;W4e+l1*dbs9$ɳgv~?)1X}2E²R։oݻwұ̩Q1FSgFc/)08n &V1*~)b@S-AҍĽKS2xu&!]_3[gܓQt,C z\o/jK[~9hmCY֜"Lbf[9 59ڬF#@A;CRHM'Llr RYzSmg奘ڻL9[PRl3! 2٦Dj W7HSwȤ\Y+嚲YD yW_S^vCrbZ١1;a ?ٷpO~-)SSt֕R%>B$ pnlUR~BG<+E}uRMo\7fEfF T70_{f>ߑ WtƭsۙK09ƌ|\>lT4f+@MYӑ=ЋhJE= @zÕ?U "4$PZV)icMl2 bD/;<`ˠ탶'yQwփA|I`ָ%^23I;N|=|v|Jn) ["\pL  -=t[BNq)yP=Ѣ".TŭsqTЩ!A)KT*auih$kVYtz\fB࿜,h3 3ܥ3(qU'bԆuڜ|_tu3V='u32EN;G;nC U|T*4N4C\ T50 o c]b>4&~tgi0dL&1qTGF$m,1.zhV KEn{&syVt(d#paR\EN4O"[hfm0p5i9ib.ŸSCMڙHSkzJ^6mT#p*=y&QK]sx V~pO ғt!a@ːX;1/u{$3k.>MA``+ 3yu; BWyKl/xrx9xgyƓY.N3eM_glWhili+ѫYFyY,R9LfTFW1}ɘ+**fW!8z\5FY$Z͓C-gwiHA_uZIgS)2N79(B&ĽګKe 8n;|m^̧y Vq Ǩi,r\:Sݝ&Ai!dvȋj(X n seI6ۨ]|ν2MMFD.%taΨP'9M`qH>Va-sH6iOe`qSmq "ӨS& Xr +[vޡMTXc_L'ؖ kezs_Ěɭb K6D|6!5+*whZָ]\5sVQGN/Mچd*5,trLK$8Nފ?u/xcg#Uh$*<$d;tEmH3`.'4lBf62&fyrƄKӸ1F'fwlsҬE3}뛜TMlUpcܝ?W~ 򡫕 iqW2uh[:܋;fR-#^s?F[Ondقɔ΀@D;ܭ 4يt#q=ҩa qRtӆp߀M?{TVϩZ3Zv=DR "kd3"K('OcvR'nW^3PX1{ͥ T"t \;/jfot_Qϥ[2ΈVB/JfW&V*|Uզ6:e_j aLdIF`gmSbry2Ttq8Em;FNeu`%'u4jĒ٫pmfcZcoiWx찎[c6ccy%#;#:[:ۼ3dD:oaQ Ӹs_;}7<^W?һ3ѿ67=~'+˲pHdn.Kzif%;kr5ul/;>.X( ֳ&T7zBQVi@cLfbUz\`-5NY0N5PԀ"gHu*:hڵ&fN,YWkm`r {_Sm1GNqjAG45cy+7jM1z6)@Lf]Y/2k3Ctc%UwXi<ШNű9a0\<$Z;U,Y= oDQy/}`ɥD=61KyyoE9ySj1CYT5Bw-mK+g itƘ4ȶFɝ 68,pSeNbm`3i[!M;RiF* fbKWvO/ܛo_{ͽRRLV|y;־z#ݒsOtROh}2'5@dIf&i*4S&rYm>x2v2Dׅ1'q7.\ƞeQ4c^M߉LSz3c/_~{]_ry;ίƗ8ޝ8|י'^cy'oN{qSYVDSovg>̝}|0d216Q测r2Ye*2Kަ 3z\Scpoen8} tWgݸrzxjTXptvH-Ě@jQt^k ;v:agl+cg,B7BN@Xl"im2}HscJʰ1WfrYi9eg{PV+si+ EyM ^*9xV"D"ŘܙnP #)eb΅eXjDFe(]  y/5y,OdEbȘ~0SeVYr4μԙIIHDrmy =XU:$sQI\4662X {><ԏݙ',,+ɉ サ>7)?|Yiy^N{ik|K-qV3N\evQyS֊~,%σ'f˻o4aw8`r>:]Xm֩7.(.PoR JX Oï_w!|ȍn 16syG^'>|vn[z1{*}lo0=͂IUbpmʬ"ɓ NCI4doؽbjrgfZƜr?nM K-R:Gs `iVY?*̧,\^shˤהމq@Ss uS?Ơv}BI4%PH3gLQjɥyb+,+F=͋pf}( ڌ@p7% le8r~9Dd&Mbe Hޓ5>asap17&KSzg̒|Njv.~Z]`\?1idשv?f9gs wseأ (/SmTXJ LqDt! w3Mܠ6;m7F6&zy"+ǩn[Zrt>x5糟}OBk+1 9 sHbOJLߺ竿_g;n<3tE'YPnb4EHt]ID3+p4gܿM_wy'_O0NUs"NRQaÊ+]HEoX !Δ٪ 3Nͻ O"2hBxwq,ypx'|gb4OLaΙcVgc0Vdqk*H` 9h"An?zeť*`ʄ^ H;Jf _=QOg.4szz B:-8!!eKv?c[Q[G2hI :3{u f!νSIo5> x_ՏR48>nK7ʦY#H<@kN# 'Jt;,P"Tj~.^t@J OeBbQV1MrY: k$1k␸Ú{i 7ξyIΠ4V4Iy|w Nd?Am6ϧ$;#`Ke$hfV ۉԦ+VAZX UBZ(M"z1n0r,q/,?:VY6]&r25KT0keda46~"9swЗ[VRs3<=./~W9[ӌ;9ۿ|[%E[q;~˾5Q:$K_׶-;1Z{S{-_I4aLJt91id } hN YBX6icJix[r֚sAc}n?K =瞳Zc~*3tZ{ͯ/ޓG4U&{7>@v^ٱ0fj%!MP,(ĘY)f!9wK5gl?(-6\mnR%Q%]M%:U4et :Pbf6{1^\M[IHC:r@rX "S]z?^Hn`.:}]SRmh Ujwo *u{^_jSF] q21XoSgSzw-5D!`J7ֈئNNM:Mr գz/M~]X7gyƽR!:p.cٍ Q:mYR)n=m!MvP1N v 3K^ɉeآ'mJؾ -ν$MDzkZ*o&!?*2Y,ԭuM:K/wz;c=;+^|v k<|N  ɚy[۠vy^\b ?N^r?1p Ȫo4c>ã XRoas7]<[M伢\]o~ۿv?Q.yOµ3bds,Ǥ)ٌ15acHCFRԻD2ti: I#+4{[cL* L 0[Kp=s֏1R:F7%gg/L NY/kj.ZpKJu,w%^`׺qlzhjHu'ԏ{֍}I#֣7Rboi1YvfjEHAդ7o)~p@&\Qx+6f5Z@\e]cʍ4f9akQ.ftHiv%l~D>{Ͼ׿wGC)Kla4wh?P02!#mw_n.g_psZ^$iZnw& I5$!od=?T+,$-X]Ŷ)ޔDƧe")S ci"A:#}؋-wa`$ܥ }QE|E" XdAmޗUsEL']ie4J? C"+9Ŗ6t{^_^~8vkiBѐ$D&&5 l-LI 9iCCwhQH"$+^4DneŦЈ!ʒxuvsɂQ5<-1y'T3fD3B~Yxkspjлbb!F@~rhQ/3KK\dMo>J_7ǬV`UŨ8>^_1cXGĻ0CaUZouQIju;èi1%Ei!&MrX韗CMc$inc3=./iLr<Z0߿$6 Hb?$5FLۂjBɅ/8:0GϟrC]a]>q)>,؎-(c>ŦK6E]k-+4mI&Єpuh@rIM ̔-y9Z9[g|5ˮQRDI u v'aAHn mŕ-[o3Fj 'q3._W4$l-<)Ck)]=M *kx ks$WV!s e޻f 慦ŠٶvqH)Bad~֨q5x[^Kҽ5û{J- y" sGRZyFuR% b!s*9vꀋRhw{^חԤRzb&%, >$UC}@E1s#$w2#G˲0[,KNR!i$ ^zѯD7${TWZ 3(݇; $ }v:Zwxhݷ^=j#~뙧/&^ڳ/%* Vc`H4Wn-Q|9æ0cAW@r4Z=?/# ^rV˖ۿW[>~]޵e6>`Vj!eށb#[S mFg?cU(KT/74V&6*988H!BVjݜǒRҲ(po5tĘLHwV__;{&3hPT{l]ڤ{"M#-hҵg2oɉ x#8Zqqo ~}{^_rSsWLbу6b]-6Q&Zz}No>DG X<$:U{! ^$<Lia{ V Qѝx5z)5x c0t%w;;7.A v lPHn杪H0I(3Z'V}Wi/<7>9N]~upUϸ{=rTX)XؽNs}zt^l~Q`=N#G_jx>H3<UC3LLjh Q@;pFRKǛ= qH Q<c?w"!2eHDscjG!e HuࣛG4_(6 7%+]^V&W6Z $ .+gO돯!{ 983?˞;}G,c"~ph-n=%TGq$nK 5 > UHREjE=$71e&FD,SF"f ch )dr/h|: /_|ߥ cuFJz)=} 8=5N(W #f@.>4kɄE4;$h$AӋ7TjhM腑)ΧU՗t |r=tI\5R;w?yƢ3b /ȟtbPj0`3Ăe+C²B/^yӼ Y1Sc%s@%6J܌$Df۝$5Eb8/t59Yۇb*9+30 Ւ5aY8RӞ|Nݏ\\\mw\\^9R&Ӟ./_N_NvP0$aW<Lp|*\e+̓cp!:ϨU!Θ댚Pxk#!LI>'ں<BP\qrE1 @^r ~ckҽsh;^!KZ;$V ʵe5c5fKw-<8M'^,zhqs *YccH 'W,h Pr~n/=Ԙ*LMZ%o^雖Zly8~OE2z2.lW2q\U;'5޾$Wޣ5H"s,Fft*qM:%8^ _nHTHLMD+{<*CPiƋ4)<I L'H=576w^+(0-{-ϫqeµ˜\>bqɀ5$ȴȶo?f1_{=GHS*aY``VyH3=I^ \ƿX;3ZLkqR67ǰX: (dnQY=oN钨8$vO{v%5钌ƃ'kҪQl0U,,XPKl`\9:2[L)jaP&)cQ]5@7ߝ<@w>=CX wu 22^!ol=Oz=v|q'}]%e`(|\hQE= 3YQ $8#M=XC) )~j7qŴ#FQH s}Y$D*-qOES@8ͷuʿX ',|ɞ g/^LazJ'N.~vJ 91 Ռԫ74Mhgy<ӭP5r$V380%C}, 8$o7)U/Gko:V;-PM!*i$:2zdh2W ,Q(PFq`44KJ St*r']y4QI>"r 9c V*23uuOQW./xP&<;` +͹]x"ɩXc~+|.5>~&yd~B|YJ& )(QeѡpdHl d`덗Eٵ*. $CR#JaAsESbCs2*7U )>䩓dwIW4gyb_8ܱ_Պ~b2'{w^Ml'.+דEU hhsJ!ހ'{/V^)O'kOϐd>zHd|կ+#5o/~]>֜l5۲0-1 m@,ziIuwWw?UrӚD\QTo=9svhdQmb7 ւ9n< ܽE,anH^Aevn/LK95i8B4J-hzSkf똘-OlV$ܿ?η#4IA t7sl`p7^HR&\f<;j9 :hS$$ 5L⨷ U\GhOB#=9F7klۓ/痔W;(- Jn, M`Nyk|<3 eEMk?0+L2ɗ`kuM˧RJTw%Ws7[T*ʂZV0K=6Goo)@Z)tkN=YjBs0(2̸XIPIMYF?{n3D1`ҧӄ@T'8^DfL+g8T2DG{ !y¿W?LcvF-;q_n 1 1%1fj<:=.vt~pVY*K5qߢpUdkRy+U` vCߞS5kٞ?|ʟ$sUiDa J3 !$Uk~}P?g,OI8=μ^bX-RFﯴS 0r+Wsr:f3].ωin!II%F9'FX33ka{9n\'D7~?1n2Ϲ{h&V݈#5&;˞_R8' O^K/ IDATrF^ւ3zH Ca00bFj!tuS$D<;i )"Bb{ب& 2oFGj 4H!@%ON;C4RbL6\Or]'y"p5rx}ԑjE< w`ب4edԆ4M)vn/-?6x1JK MP"]BЪM X1xX\ l5`MmQw9Nf`vW]1l('BDH4T ņE w].D*HL雦iqD`DAY.,.5#ɡPQQʹ&]{u TY/^I}N).Z^<{2cډcKFwM3*o *'t:aA%du{}9I49pqOo[H|DkiB[!c>x-NL; TwNVoϸ{o 0i8qz9<":&#⍤iUp3Ea{ҡ^0e0+GߖDզ2E<|x~~>bh@ݞQ*+ poX"|$%n2+ij%IHёĴ5NWߒSp%_Sw{vg)9ǒ)4hKJYRp 3ƥN~M٬kchKq5lFQyrxOK埩Ug?8j}Ld0-ţ]]]|h#OwiLoQjN8;Ҙgzo0Gm@\ ֺٓo8 BN4R0ü(]e.5Ȫ+\C)Qj0Ri-cMH69;W{rcd$h2NARöyo#75g0(;4K[cNr7ZsLL"ݻ/VـᩑŨ* TqY JcX]iڄ֤{J{X%ڈv|;<.xoa}O! ;w~q?/<%M:u0hPJ+uRxYޛw~n/9DUZh7c`#aDEىhC>o8;`kt2UW5[h6Tƞꩣsəq~qw!ûat䀌?D*v|HOctF_cdl9Zy1(MCʲh16gʪ4>o|^1X?z iFgD&&'egZ* >rQ+ Fd4y߸LqҞ*3k̩ubݷf3>f9Uf&"Rõi#]i9s!WADl<{Cl|{fFPI#k 8.1XbMDsV޺b~MmsEY;엂ԙׯ,KBkj yAA[SX %^, ٬ԄVҘfg (5pw2"a& TJD[H&jL@YGS psyy1LˈΜd1Y"{uZ5EXZQ5+}!5O9>Z/X+BK4wD-:QRD2Wgk~ aU[EYal֙@BI@$. aW/#\3KYGnJ$+TۛEnn'~?!}`? #漊vwUBho1ia@DZԢ!zy7I%iĪ)A Ț%wkWƓ_ 77_=3v"ЍNulM)L>u{}IhV 8'cx(!-Q#&'.ޥpڃ1P)H_!x8T%l4Rqw-cl"Z}HSz Sc_h"?rUiՑg?9XvҲ'ٛI48V|Ow~}3zEjJ odo ̵suMn7I 2p bDYeqc؄ Z ONE+v Nu Ӽr˖yQ*wpd:dޅJJS)zDzgRTd3Qm +AY%(ll-\` 1EUvD|Sҍ`/nL->+~|!6=~wxδ}l9BJā(kDaẀ;Ubgi¼L4cQ,I, }E#uSXO EA[Wf/@yEwy{,Ŧ$IH V:ɻd4ڇxl)zhFKʕƨ|Ȋ2('D^i؟my+NbTE{!~ 1hޏf`M: VAO#ž2mć); p^v+ra^E5$)W|ǟtcWcR(M2X) -iUB]Q'Ntn\u6jHD 995,43 R*±w^#oP,B0@kՍoX0Hi߬BOV"Q4grpoܪp]q$xY|x2e?7>4W~ٗo_oBSYa#O䛕Վts6j}ppIX]rlƣgbϿ|/+S5f6i`:TT<֜t();QȢ%bw)MsEQJ0&r7z_(*?7nw{nKGe+FayT,~ỏdlwϧ[Lx^̨we+C;'D՜JhF,.;6eT@WUܙco(3R/7zW~R[ck A sOWcԜ2D,dDE9Q=dgayĦє 1iy3zEuP EJ͛ iz)(9>F:P|$:5GUr{rJ9B2$( ՄXvRwX@w 2A3C:P~2=ԑ#rޝ^x'W|ß-Ma)rn'GЉm@`':\ApW޹]. {yTǎbeBWX/-A޹vtq7rDZ ˥rE[)}asޚ?YZXbG0E-9:+0|r3-e<wk_Fl@É?mo0F[$Epkq-,͹=t ۹r~_ȿr/q{F3WlAXXφ~-u;qo˪H"0WM,yǛUE$RT9䁨K[EPLL$$B=Ī R d^j~{-.n)tC XyQ 7Hz"Lc庪{{"|!0yeZs*9 N 6ab9"5h^+3Q'ԲmLs|Cʬ1& ǂe wޠ#8ė*憗Nפzc7D%.ֈr- e2 blxY<$ZHOR'cMP.DËRT6@0fր@MR2w5g9R2U'޴7iл4l%8oQDyeA ݎL, Lp$? DNfKS^˞R[t#fǬ|U>6Rv SlƓ/o^₳h!zp#F0;[r92k[~}0/GC$ GBoU_D3͆raa9vN'jx,ɣK>7q# 'x%0\# 4 &ʆGJl4!Ӫj?B @ DK%B1= 6r/Q2"ϔ(DIW[% MV۹2kj]U2ԫ&( gp>3KARn}u>J(X p|sَRmS1$="ᥥn4%BF&$A=ϕkp %oYI=2SeOst@ltnucá P ϶SȠwUep )mbilqJdkbAT1`e6kN{DRC ^ =n hJ- QIȘ@:5جAǹSNKLJ"@1O̔:;57:Q(EXp%G̑թS|Ƈ?~o(%( N>=lè5 Zx .KE7e+[fǍ<(A' |(5_z,b)H#lX pjѕS=(lI֝ç^<ܳ YlHp g=W˛J0%y%ge(.Yw>y@^Os^G?_lo? ֺCհ  1%;q[noW^Z^9fжC.?6>yxǸ +SeFkS46xvs˓WZ[8F`UxK 6f&\3xqm+F :7Ni`tNiĎIsr1jZY 4xO<ʭ6l>}8rJt뉆R̈M[kv/xp7&:?VHhsDg+h/'8G.?#^5Nי/'͋O+qti<}o[H1!|Rӻ:㉛`]3brk1/?Kz_ɯ{dU2iH)w&$Ps5G "%w TaubUF(&t`k ݺւIpSD&̲h#DCB  6*eAa$T(Xus%UN}$v;-gM`lj$B(Goo?un_g x7j'Oꆽt𚏞;aN O%%nXP78|s- Dm<o˻#TT8Vc'f 1 g<z[mTΚv \hlFTMJj' [8I&O7OY3nAGۉ-(_|MI 40]B)]@ӇPꬪHQʾgj4A\c*\8ݯo|։ma;r)|p䣏yR+ۑn+onp{tO~FC XO_&ZETc|dLG|C ;n/w .K.v.+3ǶaLfBm R&TKJ"ݷaґkU qC$ƇiClR@d2`2Z%1/hP,v{n^ߒCop4C hJܳ%V m}.-oi!h!P1tF^ K_IWǒٖYKe)xX 50 n{:o' g<-G|!"Hkq0U"NNX͍R~1{,gh8'iq\~(#!9c4$S.AIظI\ x@NocbHe'\v\o<4zWRj,ֹ^,' 1<|8+˞g,A\,MxyEҫ !3]hɕ]pM|cɁ/ff(S6J`0̧g.$FqHqpR(*\]M"jҡa` w"OBf8f6nncL.Z;]nS!q] &fЃZؽS=1 ppt$$)} {f&z=K5) _?7taO-GH oR͇B_!`t2b~?W\?."dND0{Hd{WI6DL}5Ni{v;r XK TR=^[N+QGc5J;.o;a;lɜP!3 9" rZe$i- )~%|XYڲ2 Ub.[[yYajНL˜=CB!^y8m(ӧ$:鴲 $eJO,67e |l '*t:zHA].j8̨\ҝ6Zol5P53j׉mÿKژJVO'~-7tFo2+L ÑnzqJ)h/hphiοXZc5`)tɯ9'erfvj)ITjHCET D@폵/꒡L QjC4M"HiqP΢1ME"VҤ0ojNF<>g2+ESL(J6"XS- ٦'g[\3tRN_I3;rgzh'*J3{q0wF-u=j\c0FЏT0ز39?"g7|x^yxUx8 h(` Yp-z?̄&Z%}-&$ >chԨBsNw7qq qS{VSw;R|29D=aީSuFC4{Df ,.EҾaQ5=4U 5+"E߼N'jR>)͍ł%e2x&pF+/d7Z&_OaNE`uB9hMl MRrNSpW Ԗd3J{R'%|vtL7@3TAU$_^@u@j֛tn1K"x,2T (>fPf-u*]%RG[0@;\4&IE\3\2{v~2M蓯/r|Y4Q޿F1$hE))SIlM*=D +jVcBF) *s7+ q-?R~vx:YR 1 $ 6 "Tz5VLg(3ˎi˩ />᷾,Bl:mV+A}uBd/`t6S1O'<gkKe] G Nؘ%X]Y](K- Nc+'Zj|w l?cn)#,#?WpÉ^yΓc ;_A ;̅$F1!ᄬcY nu]75I`1Q=换@%`a _n91L(ڃ(Enc*0rYS+Eaԧ ?IPT6h9`1'‹+?ַ>oAkk*n}st9'f.6[< hU`NNtȝQe쮸*nZި Zgal'MGZ܃_1< Tx|E)+ܬ+Goo( nL6325&圕.#z"$v\FYKa GIb4Vn)܍݆+)XR#4Ɗk{C#XND+ =qgQU+NQ,סe8IclRK;Z0]b˃ Z)a.RJ"">-2JNgeUlݤeYޙ,?x6T#+T],Xa&pjGgx +5Ҷ͞V=laoL</pe.!YkK {kԯ?N)A{hՏi_R{*v@) GdgpsM!D8Hņ52CB=2]-ltmСd0 f Iđ`xx}"oyꚫ}( +9@"gk?ӏn=6qqN:)ˆGp{R39iu{!lNd;Su0Q(R`f Xe?L< <. #h*rr $iHw$̭ 'S}5X/rhZ{mMtdNFȠVN !3pڮP/ģ<)kRY2B-_PU"nf*04w>!b#Vgth7ʚ?'9݋ HNo#$&%tgBI `e(7F |aiJ)l-~×Ztps:Lŗ̓S] 7&S R$Κ2e@>8Mrplo6V|ϏE_9yA{ kz-Ьti9iB0_*w@J '. kjWي_eF_uT'2iawhXaS*ՄRS!w/:Zf&K!%MOiՃ.)}k:1[:DW<=Rr 5JJJd/C;No SYRe= VM#wPgܦ\Ed& (YSݘbJF+j q3&T 'F 󵎐`aXgZuDuk254W52sࢨVI/ZI.w[n==K݈5[5!x/ç<sCu6|:1PF N[WNp{%qs0;oA43ڀJC%AᩜT r:`yRBbTs<̔tUk2DS0J3T7X)J<<vhyl [jdkI {4:,R,#B<eu_1`J^ϦLXl 2s [<2'1E8K,i5͞-SU*]ұlаxV&p jD2Zfs|IVGkx Fyb!K_ ZKњȩƔm#{6C4RSȋ#={Q0"="79ytBp5K_q-Xde${agV' l m-{-7?vQ& Zzʔ=c}$(g,WrX䍐0)x3WO6r$K7FPw2 '"Ӝ/xS*36"$qwfn >~c5Gh"XG=OY>y0~O;V^]}/7+޾M[N܍w:p IDATuV=WM몬?_yYpvl`Yf{PJUk%WzPn_ "t&+crT 5uJ''ౠcGDԭEp|8dN(W/~?@R-_⽬i'>UsB"(\t+%(0f)uUqb 4j,Ϛ¤%SDR0ﶜ9qkUHm&bCd Ę8ák |<*"3%l+i4ɲCG?њ߃9WmJI&k;۽FR3?o8K^ {[7YHY`'l[Hq_~(pBjvڰffVUMpv<2I#c d0bH)Kd@M+}|uSk2x,WeQdxhcs-ǡs ~0-o3푷i0#jN^9u)-!G,`u80 S4l؄ځ[Bgܔp/8fnWƭf3OlN %R)Ke3<.R4o\2D9/%mR+t-x3@dV+G|]s{ηg~^6i ztħj^ICcsbw8]Ud96zYT/-U MYOTH0ԎJ# rǯ`[uwD'8oݤ'S"3УQ$` tykԀ$B:t0:Ufex ij^dmgČ^!/<*SwDi!o#QF`1OB wY *{{]ٲ<1̵v[dlѤ$& "#D 6,{2|Ð ʶ ¶lZ$(lda̜cD.bc=w]]ʕsƈlDDE%@zR:uoAN!atwky.TS֖@Zy̺jѦs`&L`Z۵z2=lip%"aS%/ UN4 ?%Yu,"d,| #FpY iͪ<XcֶwZoUn9G=yTQFk@%oTFIUnXќ`[cONwl;=zM vAFYKJUk\ZYњtC']&J%DS @p?Nk;tj(j\5^]=zaS#d;# #3 ¾Y7D/T]ImZ@ʔ2GqPVѨWt4V)}c{D:*_5 )@T)m&˕"p$&w9)3;4I;Wדa/qۿ~lN΁Nb@HïJLx~<{'h%̌0(LX06c du]EΦ FjHO+*AB{|ʛ^R%f-*btVZX!7V:!Km$x:R1Xf7wS':&l:6)QDL`b(%|I}V!䁣P,MGҖ5'܍:[#L(tfu3hd֟W7L8ȕհZg ݚm:bEV*N&j#fK *^y/oMOTʎOS=tb~do kX(sAFИ*M*i>*Q1ցl?հ5]3y=^qafTFhױdPU|HʢDGiU dF(A,W0:=㞘nБ2e[[°|J?=]Ojn:o[)eH\5Gp 8t5\Qiy1VWtYC d@^ G@I ֢lN@zc09_qzCvQɠ9P2 /x[V,ow?|Ø×o' "l6#Gq λox?Ǭ7 ocNa2ۖ>QŏjS (1BG Fdc9%1V'TH ( ]Q߹<CdgwaXJXtT*q|մQ B_[mAAU(9UAKc{n[~7.IVRL+4Zïj=lOqemndF}kT$Ո0 bj%X2&q>2qRf}AӒi3h1gI8Q↉\~WHj@*(4R Gl?|[3W#K_yŚHE8٠U"r 􆘭3C٬s6Q팻>_YR:yhHq+jTMLja\HvmF36\*0U7C@s Ӊ=c6)ZrAקZC$\ۥdRml\ OT54K "'&$6̝`Zu4= 37*V"+nG=xTaoT\IƸ:m< 6QCZD@.Wz>gs~wO@sp>; c`qDrm7v.8ǥ8/[99l;>JRZ2$D^9 =\U0Ɗ'su3%HvMR7(޿>}w۳-iq9b(`ӛQ{ VgLZ&]ZmQj,T+tk l_zӪk*&[7҃z!ȫgDS˗$`;ώnG0f˲n.TDݪ)kPᡠyCx}?VҼj![ dz(p]I%U# %@j-kPgɊISI9t-S+!jVONDAR5CV;bj`$mf$do SJP"+NObjq[zYJ:'lUC80ױF)cՍ :!W5'A lX&TXViI-)6|R!AyeomPw&HZ$bbtr(^)ՌiIg0&ɹ64!kED|^ BVU_0k (Y)c:\8wZ-:s]* " z$5?Zx/W_u~^0C|Wx{}N'ƛosJbmRQZ:͔FIʘ\8aIs-WĢ:L`zEB'pfV65Zpwm\߳t6Hsf?^4વiӪTE3cP(Ki# [{ߜ" 8]oඳ o?l>kK}A^?y$OB$:&`Jp1S1x~D*7Ji%&+TQp#LC(ӈwI\;mťga&bD76,ʳ/inWMF҄x4C-Az2J dWtQkWgQRoTO~BaʛbUha3.=m1jŒ#S7h⮤)'3cj_eD óPf:Fo;Q| ~{ M\\[b@p!ejZJfy5<I'|)U֘^qX)Q>5Vb0l :jn-(j[$=:'+LAu#SYQmbk%?6A'ҕZ-Uw !h fAp9QW4|ʢK_OFh\˷JhJb)d! q}/s+$w6{A+}`;݉ґ0z4uz=]OjILt)Ѓdk*ԛ Vftduu}/q-dܺ_X<|3s:9{B(y7v{ljHf?+~?U/_s[=^|tl/ŷ$U\VVt>A2b,h˭NZ'IVQNSPsh70+^n@Q8霚!ۅ!vpEuISH̒CܬIM+Z* g9!B@b=iۉ#xxrA%Mۋn\QFc@ihR[5yO5t8[뷡U)RA}}#<+?;mv t=]_wS#R!iToZk`Vfdz8c'XFnI*z*42 3fRN>W\dr\q3J맨ep,|~V~jSl S: IPǵy |oeѓc~?uo1^=Dk~kir-(­nb@P4 @'IAbsff2oYi!!2gBJ0%4j&DH\GrD OO V1\e.Nl*TLaki2 P'Q?%}=LmS4:olguR>{9y+qyOtްV r&bsr˔Q0<޹`*Jt<8-K)BJي 1Fl%˭qәȒG G r_U c2'|\,Um%<ʃțZ+ZÃGZ*1S??hpZz%IH8%&F%z%$2:Ĥs^ZTv~R&Yf2*&B- V&a 2 MZnmkV[+iLv2DSXmUUȈZC k&3$'a5'#\'r~Z)zfQ0eYC@NYepGUW wJH1='7vJghS@ߚ IX1Iq8.R7&QAԉtmBZVz;VQo ^dQҕ)f_7TG0>ω#q?; oce̻!:Ѐa+Qh - c#}`F*4p^>( H x_S7bL--.lV<+9A[ŏ/ 豣,i!DZOݹ! ;GQb:i}#+T| ʒ.vdIFM)~̯|7O/Λ6$77Zoߥ>7$?;U!b-l̨Bs~wو!mAS'%[PT Y]ZuB/97Ri%]:NZ5+J}r Vqr Z}a@$Ԉhu8r-#z_ce.x^x !ۊX~wTƹj.(@]tm2Lت' VH69iQޯ >AGV5TT_ʹY+ytcOUnPstjNqR+v׈Ǭt=]K( ։4&!UzG 7" /8ӑ+CejP"OV'j8.gbL6ķe;_f+nJx+qWdR'6=oVy<~4SX/?+ڳ{Fk3b5+#g݈5n"|{_GGî&YTӑT./}`rpͣ{FInnXj㴆Jb5\J8աXfV_UQX+*VLQWٹ~ztR$I06|/\0Hje6Ζ[p,QXez 8Wd)=LoL$@vZ-&ۍUV==MhZAGv9PvI._}LΠm؟=N'.&/}L)YJmڪ_,OPHJ,A«1 rH.YfV /F=j#{!LF3j-,YgE N^>=;l h3M@d&Nin+"aX(͔Fznaf)ʫۄs`&WNr_mu*Ti0 MeٺhkЌ읷oVi IDATc*.ʬ|ޔIA Т+ٓt:z¬dXD3UJx0T{Ѷ&B3%-)-Q^uh%5Y=励OK-2$\V -x0dw㑗qi|cﴄy DXIw1;ߺ}|<%qwƿ<o0òy=ӺA%Q]dDZ,bV#o MQ2\zDJ奕oP&T%B7l@6L_tX))wuBAG2~z9"`$[31p5hUgM1|'Rk-=nXH,-Iܼ^nW\CS$<8 Ls *JjVkw &Ѳ0즭kݨh?ճΕs7'?/ooGGϗf\beFr%r-UOAkV^-k ~m>},vyjD'ʜF˱Zuam_F'bвb! ; ̆kr7hV=*1V*~r5M:8mP .O:Yp0@RI.` 14HK^|+lZeލ96VUZBg^2#ͤR]=e7?~'/!eJ%c[؂_eh(Ƒu&}g+{ӕpYf"p+1Y4c#ØHsĊӆcSJ|9iU!?ŢRaK|]>0"FYQm̯Xg#>o}R.7&/e{+=<<xdsaJqP\SVk;+]X2X_I$[fQ{R֋Kve x[[><`!9Ġ1s[k*XOt}MƆX/Bg7k홤=S%c'Y'QuFȱv_7 cǵֻDhˣ"R hX Qޡ0*Cؘm.a\Tǿ0]|s/?w~7Ϙ^yyTR"GD r<w*[ Ȥi9iё(B z k5\ 2XO ű*U%fh4z 9kx[m0z/#Th[fwYhlV7f_dۄqLk-B{/XٝdV8Y&Fj0k* IXj(IM+Mq J^+9p}2HIdn%YPX(e`zȃBPjK̵ˀLܕSTcNb:bFE4gꨔT1%PY%ߔ,]:4Ix}M *,X |t՝yLgqARkci|;O1tCx^6!"τtQ fᆪEY%jUm3)5u(H4TF9 Rw'*tDyɤ l*U|>(JMZx3žNH Ȣ d}IajՕ¤P  d&Lÿ"}T" W☤O$'Rp1)M!B0FJ=hMc!Q}?sQSsG|kƱ=׿۴w_4SA!`)fqB4(kEZmUIj=[^ &$VIiz_\Mvhޭ*E@6"kAWZHj8)Pѝo_KlT#V<݂lhFg:[!VZ6qu^^7˵ )R[(xƫ]`O]Ce/Ƿ49VdvV[eV1,8굣S rƊWJkX6eJ 1+GZd, )ͣ|NiFҥ=4A;V<1Q k0ڧzPS_ƔZn\Tb O ؑ2=6~}uXɝ@۠NdEwKvmHd2g CmfJHIdC9gOqKŭ n; 2-QrK\D {0kJHUeb+/(RXJ ɵ 5>*CxلSv=<:d7:bk f܋j衸lHZX8.1*jX4b^ӗ6K-K~r+ V89\-ˊggoeAJ*mzk/ĄGW&^٩Q{lWU*t=]OדT`ҋuEG")_"R䊃k1۩ZoتsI  v9q`d`itkO*|~:xQ `Ĥ#[piB(]ٻ7hBb* <xFE:`R6ꦃB궐ZG?//L'⁻w"O. 0%,p_ Zj-vZLqlądQhu+Xa||?yɯ|gbH/92Iۙu:o]QKZ~uY QB*5bkpfMuic`L_L$hTVlZ1۪+Ie> 1fUxDTfY+MVJ@UZ`I]gg$qx;>ts֪8j6SZѿMh[Qw%}_[eWId}i{Z<@VJZu@y.'>m;E2yH>gùaUIQKt% :&*LV (Y,|DE )ؠ k;o=pdyRϦI]O8EV"wY79PY5W+)k[QͣZ~?0! 65HcHQqά$*H/=:ܲj$&~< ;cVTqjhE2,ž F|hU#|?3t~Ť'~_ޯ/_G? GR/3t+L&kiVv/{jRYkU:6 !,IkJ®BÙL)UZ@q`jfea mhR,O˝̹jҒ V^o[&(Oߔ։ZBkZ|Dim'<6Ḵ6Rr bB`H0az.2mS>SkەQ@EFh``#t6`cS^ /q%vymp~٫"b#$3*L3ӑTQ$E]&JYqS(?;\PJRgfܤS 4Wƞ'UaQi4rC8p5ʰ×h`crWq.û3ɵd! cTg1B?Rsu- 4F%Mi{1仞w'uS7\E3@ZQH'}GѴR"p~ɬ/7)@R8gCՀQ 1]=[ߘ1U9J*,*i@[eU\c!| =.~AK}=;oF뺺zuFo|f<^^DOSIhϬAVL}8n dVz#)ҵ.GAH%q7iU8KꕫMhqURTbΌ\raz7ԤA)^qr N1B2'?TH4d՞(s\.̜ D"ම-pqVeal*,\D*m\H Z!KP>{s?>~Es$c*FP¦^V"QLc%GՃYl%ysdQJ}'Ls1P)6j!WC7K"jb4]ѬPl=5VtRIYD:8ZLӺ YbQ31Sm{R 8Ē'hǽчC^! 2'0f}"t= ~JVV?Sj0OzY~g ocrV8cUG00tbaKb1"/EEc)IcOA5*ACt5V}a`R "'1}zf^ ھ͵yZTJyٓ[!h0?g"~(ƾotbn8JQW]4KY[ih_HLX/VN8sIQ4.+Uw[=]OIڲ ^ #FƢq2t n* Wt =7 "&˅3Vۭ4Aڸ G%0net".4ʼN`j+EwYe$S^,$Ҵ#]5*% 5%9 Cح(Ǵ:r:Jo .ky'>WZ!8Mdj et3rq4XH<}VaeJ!{+R'e+o5( 7PAyr7|p^xTzbf;W['M'0}֍<#s& {yD õZd%67V?KYiJg6" )j_^QNIeC+^>l[6"AFy~ٛI_̒C @^,M62O~tq^xߓf 9;%7/ $0x`rDG/[}o@Sk໋ʖޗ$-R-:I!iX*8GN\7t.õI"Ѩ_l$i礘zAj KBv=]O7 5G')i5JCcU&TXr3ՒM=I?/_|<גMH;wyeN'L[Ijpr Ŀemvl˲oε>7ofUEȒ( eBC;w0~!7r-7 [$?Q*OVf{#k9Dt?6@TE{9'aiu$pߋaΣ5TAR<ڍ2^K3s T}EU2}9z5~q"L뢆Vn bڅXtf² ENK[+bת iRf ĪBFt"mאXY6҉XSR,{6'w~^kM1LP6mI{Z3v]owjqH} gs7l^d,uT gۋ0bD-3rK!xC‚ۡ9Mw B ӆ&`DNEHXEe-[A U0Q͚.7QR:"^0aEvFkHau=:\1~UN/9`j>!`]XaΉrFɪ "i'cau{'0nUT) _jŨCF{tfpw=ewȱ1܍)bj`}H* zqU %-! 6Ooc٤ֽLزNlg[XQR͚ !´7X9y#W䣚›Vѕ4zUU6F£1ˊ I=7zy)JmL=,xl7o5dE+zB*:KTW!-%m̿Ej$ګNw*K&i۷tZ^ oDr&tak%)rp+&MQTn)'eUj@mryI WBRIz942F6wCz*;vijcS՟2$"X6R|GBx w_trwQ=tPἸXJ&qh^u4x,p6N:#0KٻmY۵s@ ы#mm IDATCM,td^ D=hoCM%2.&S]mAYkXQHÖa ȐX+\7r.V=Ыl6r`ͭ[f  +s K>c )}јzx{6_IuXH)qs b{'K`G_;e\NޕcX\9LkrpbN(}oP_Yꊹ'͒2h} 0bx$k#pzӊ}#09=aC^.:bڥ-O E5t-ޗlOE]?ÊE tZ-Fm60mN/~L,y;-~6V~o 6V-Vd8+A!0]PʆDx?ȵuoC}Vܦ0#*|$è\DUɜ|M/V[d^q@8|xeu* Av՚]۴}Lfyc.ҭ]njFSB6wN즄s&do[c!Im\n˝:}:3C-)6)æmUʞoOCʹNf~\`FHVod,:g'VyJV2ozi;m\{C2q1U{`ZbWI;q:fsNViԌ!i@b&Vjq;ڣ.Y+ɦ߱Y̦E˕'?卤pȬ׹oy ̃`gNmҎcS9-<.3ǢraD;8(=|Vǿ߹>P7WxҦJ{ae4F.8\3?8IjRmY\v(kAՔOCuMGk?Ì.\? R]7m uᡡ:[rX_^Oח-u|#T&ϵσ~icqygp x-;o{BS\Ifb8d ܒH1v_5o 7`C6 I[Ǥw:e|}X|o68 -⌤nɲA-}g(7+^]^KMr#Ut_5(@%s{;+4BQ\A/-Ԓlaq_S+Xz5NxS=Gѽ3ҸWΚ̵yY[mjޮ;5m&!dzxl(٦N$ `$X_2ɼ/U)d9G-"Vf-dMFU;I1li_MQ:U!W`T6ÞX>b|2nPKuF}aj>o]%31Wrm}K0l70pM`|P.VQ6L}2XnA;ւ#UyPY8;sɄKs$qъkB˅M"&O-EeK{hYTO^D[KSoiD;5p>JG+!Pͥ;:[o~COKoG6IEe\j2dDžr&W%A'6>AcCnt$j;c%+1AR N(.37V&5H=w*A6LՉEwJ!%ހ~r9o^*|5ҒӾFOͮg?KM &gE 3ZP}A)lf{\6W@*-v4:is*5w!j8~;^2VC) RKzPӧH"tvBjbT:E-fSIôzf23k KNM|L٫u^lWm9݁E6e0$}+$sٽ+!ؕ*웸[K e ƶ)5vr֏4Łma!4&)Gw0([4;hOd!}AsNv[,C8\䁕}{#wYmyeSWZUJJhdB4|N'0Euwl5@LKESkޜ kz PZ ?gW&XK f1p6ZL!o-%\Y\_V'R3_?p@1zkW"{6M->vVHeR5fM C39:]:aĺ>WNIF|wfjΈHQ 9Sz[| _krDX0V0?ݘi= 6a0 q>_G p}W/?T{GI]kUQ8AЏIr? imjn9K;fI>qe0 `~28] k2o>XܭƸoh57kovCM´AfڦDeˤlvLb/6Q>IJ2!Kn ]Ɨzv+Z5K=ba%$g޸違VЖM^ keuP*>]9wR7-0S6ć`Z}|KקAl6v0lhEnK?kԚz Jk"c8mJIP ;Scf,pb}̽ k{ӣ&r觲w,^L0v!)*Xi/m6ے ,kӦcm$QuAq gncr8h4rc)˱zCi-;)B }%h/2rso66:Ac1"1*.&MܽQڌ̦$ݍ)4MWU0$k%z0" Μd?u Sdi-m!-BZ-2aACɛLU/4΁8knvc滳Jh5!+̂Zw.[AI #XfI,lvFxBJ-U^#ZZwwgru_Eh+u4:u}2UF[-tj6d4]IwՁ>l4\dʹj_Hן91y@SފtCVa.勵cHj~!H.!'htq /x]!{1^/?Mcv .I=ʋtL6b/Xe[W'͸1j̰4N.D_)Rà[P%0[)^^J-n>/QY\wx)7׷?:pWgL! ؃Ϟͯ9ȇߢZgֈT$y5'%v/\6 whն̙[ToJB6[ĸTɼS8 WY}*A%ؒBPf=xislovCͰq ^m34klX0I')hT-E [aX#PW,ղ{qŦe`}ŝ4\VMv } MJ,\m6n~u^SvriŸ:ih83H Z%߽;1i#݈=@tkFD 'KިO\7mjhTkx C᯦B`Nv cuUIMOn4VvZwbI9oTsxd̔G?h]N&B^fXv.;m&جaa.@B[)ymtV5SF\$JnE7gl^z4LSDHA_·KM^D8.oRoY&3^$i4=${9C!8m{G"+ 3񔤻7osX Iy>Af-nX5攅5"!( w~;ƒZ݇ws~U!9x58Ռ?g<9|<fh؆-C]-5*ທ ~t,4v̋N#S;\;4 A3Hݙs(ҦEǿ;'~#>psrt<ӏ_.g'6릂/~woOVi3VyTYMˍ9MQ^ 'űl|{crs{ΔL?+0Gjyfmv2$78_pL]LչǕp[{~Լ]owjV*ˢ|wڵg1Ԛp_ڞ^턘4Ԡ=]$(z=-MNmPP`V<}ȧc`2%虭z8zlH_Nj bNT)CXNXܱcJL ?eO: ^ި(Z 5T?IB?[ҡ4M%5pq OQ}GK.kC f wN -sXsq(amJIV-tMԽԊ-v'ٚQ$vx-Z)dĖ$kITk3A,4meӔ~|?'/q;(3>D<4a#|T +~~_K.FeqE!SdOFKyk5Ȭ itvHɯLq^bwSыFVNle 2<]d\.KFժ/o%NEo϶MWy-QuX*۰ivL *9tsf]4ލJNoBlCך^Y7|~_4tproǎۤ&(,vWiFp1)&sT\ 5?1Ә.tO4P-|%F`m8TԣCoя7|bsFM؂]ᒻwJY싁4Fs|aAn+k2?-?e VjicƝNpՅʓki@w)9\]W%wf93z$ֺ(a] ?s,V 7\*tZ>8Ń;mMz\gxqRoJ,yۢR1 1ޘ6;վ),^USiM"]Bv ޾%,AV1Zc–\Z]b{Z;蹰ďAQq.,oS3} CE/ږڟ1n2?c6Ui[ڨ[E\t4%M.\\mҎX|f4cCt ;\u&BtB4ܠ&3I c˽ޥݱ ;+O?u S\s|7K__N4>w z_/bXrK$ၯەkÇ·{N^rQ''QZ]7{^ ,_+bd[;.\-(9ͧRh٩q%rwa@^;u@g[ZT,Sv]}S4JնlQ)"mDĎ{Uo1#a'aKP4[27Y#n266c#؞ 4 nъ0IݶnwUycG[\ _5B'gAwr@\SGMDJwX2St7pqÜd7<|S",]_ qKVWYV;DWph8km26FV,e *|<衝 5H?gge<<仪ɨF#mҺ~ǙMTD,zX[i,mN,lgssm.Fik֠bS_4rGc4~[>{`xi`xZ`lrtmߚR:lwv!`u4ޱd/UGgV2H̆3o9qVgQL.Lx{=깽i\;|:o|83͵_rS$5 }[{ǓOBB"xPYΧ]֛niL:0Xk2ꈊwX,J^dumjIцs~S.Et+Q0m[Ì:ȼ̾taM%EFzPS[^r{Π82FuS0Ȩ Zͳ9ʺ'ôKRq_!@m0+Bݪ%60mQ>pkjB6Fd4(7z]C0:j d4ޅ6i+9%Kz7 /F7L{-~Ui Mϩ'V٢WL78E-ucFD,Sfd/^?|Ͽ\s7hC͌m"Ik*'=xY5jhp.ы='VJc,Et@ $njEqIda -Elj Za;c7>WČaf* 9qlwG#j:Dc&q~FatWy2VJ~ .Ug7'3HWW?Q׊ IDAT.ՇO?l=0+.Oob==XogO9:Ó ? fZNz+?-5jf2z޻Xfr]J%=1Xk,LߦVs#B-%%Jf N;=ʦ~א/uC*|^ov5CM=|Y8moNb%z:giU~ UXiJHPJCZlr}"V0-s*7}s7ٌu%X]\d׻nj]h":9ɨ&8<6֮\xN +8ThePj_O,oNݨݕ$bQMѳcCtRsZ+^{»GIJ}/GC/ K>9]m(U]&u[#`\s +XВւtwS4Q^L֜Jݤq;(+srV# |&TȼKƃ(%On%-=K:O~ƿۿ+vxoe1Go6+$kNnb OqlP{L{eڸ^at8OW_3Ǎwj*BЋyuUѫ@5/ ɠX4}7מ~ވuY!)kinc;CZ)L`;ugnNSXo2ZW\s͚h7REn"/+JeIeԦ &dtmXu=H#V~%/gEg] "##Y.Κ+NlpbYv 83>wo O.nOVI3딇4* +_鳹Vk'Rr-=#`,JU_5=8{5Lty Sc0eK@<ޚ'>w/O~Oo¯N =q7Am.Mn9μӊU^Yk2Y)|227AZ!>o߸Ͼ]Oy Qz5} >Z繂]&vF{ JNsxc2SEOQyü9Yk@KFM:71\"&'Ů'\1o=gFkڜZ5{$#N.EZQCJ#z`YhS[( BVc}OTP[zPӧzש̋[\ X<V:Oq HdW{?s0w^VrmZ4t3E;\H·4xd%=hZ㣨)3) hҘkidEK:1DɜN,O-tZhUDN锔ƤdA36_d3$ ]%\s_vpْ&*k/SHs`aD 9.L{s',n;{l^sSv)~SX\蜷gvZsM̝ޚ ps9vO:zPıAkws{39uD%>f<5P\/L^ΓbEFI Wn8G*?q?O/0Cc[%_dP^S5iAjxE{塓X~K~$pz`MWpzgn3 TMJ3jYxLVɫn .lA*iv";v=%Ѵ}M.TEIKB;s]j>|"?Wf>T1Ui^,ݐ.9#/C։'0h .t_ e87 /c]i|!KA[5[]TjIP˷zƠB'u;u(fvph:gmAr!!;3;ET2 SI#豑6Xڐվi;Tw-Z]1I[pbhE*u9UڬP3Vۉ5 ,k$fl7[=s{TЙl);^xx 5~2vKӼ=coI ­ ^@۬ȸa83voP 0>3^zzp V酣SJCMx .X6"$gR!DK^L'mrC %Ʊۊ Nj% i'̕u#bϷ+,"3f2C (/]xGwԥr=9aRsUzw |M7r>Q%|gK۝a g뵰Z0hUDj.jT+Mr7q{\ٵR y5n=,<+ݍ {$ 4'pDK\D9D%?ꅗvʟ~{/cWH ckkѱLr]wn0|V|ncɅ+O%ֻC_mnmJT5;$/D[a;(g<}@]KAϼu߮Clrm47#O !֙bل+ElvՃ?-Ϗ]{,;}1WĿyru 1  nx$^YeɲdKKrvڮCY3#֜Ei_y?@̋TV8Xk>Zok0FwGcmvT`Ӧ}R{<`W$"F35KWۃZFOgmrpܒz5k|x7Ya6\çQ{64 LSuu69\ ^VY5Zzm9BLZ):'NB:p94&;cbX] jzMquʲb)J<=ܔZ$醛I13LUY~^ZlCuI:M7uEZ0sa~@,W'zՑۘxQzgO /t|/RkR-K})._<|Q÷?'v7|KJ5ѐ~ Ybod7W71tc޾e8/?W~WG?yK>{pfo/Ʈl0_}(Ntӯ Sӕnȭܕf[>w58Q7t0^}*=EDȔ{C)(ke@4n7g5ލћn55'ysw><1kp2bTL?̧ɝR_Rx+.>]we/i*S%!\y/ewL*q{֦֤1 Tהlsnc%,Hn`b *ysAAr$9+4lYq$%H < 0;Ż, ϫ3Ԫ}Cj 57շXGڧy'-dIj}%f., 93ٔs7Gr܉9Y5 ;mv]SS6iy-ܔ܁l`vė?6e\&b9Opr)6uZvA1قQ.nM\fR J 8"挭!il\Qt~ 4eK>U:Y!aD/cBpK,/q5a!DEU7,T <(ŗ+MTn}_%~<u$s:g%˪X!bmtuLXboTBmXp,ט<ΒڋYd^-g,!6b?^[ r ޛgu%jl@]o*7[~5򛿨f+`>_S'߽rt,*|}ga?8li2zn2xNhQgȜVl^p96M~Yb^8]x|X8eƉzF&-E4pT MMj` 4- B(ӊk`*b6Fߖ !trl?XbN $&fVi7)i^ə%fZU{ g/'^z$ y齎~RnaL46cc r`# EM))5vkk$/)Cו\gw2ɵ拉*e^c syΝ/~%޷'ny~O~ƭJ J0,o=h?}ye7D6MqA{rgZap$j"wUvqɭ䌓zn,Of}u^ (qa)r139#RԴj 2E|ŏ?{?4_ч [i|?\|Z|'{|_'O?{>}MgP۷58?g\ ZY $d?԰A1I4S {9. )I*UI~g~.J,L0jpv]lAmjVu'%ӬmˉJ/-W?JuE'*\ҷ񃸺/˄l&93zI̮BxvB1 H|]owB"8葓I)SޙS $Ww/^ A8;>6f[,W/xχ' A|c\&QTw֑h?_\G?? OԳS0,&ƿ/_<蓓_y== {k^O0.)s0gnqdc +]u`1^ɝm- ;vS܉].9B>ZɱV^ñMcVq1M0T|?Cȱ2/cr`ȫ2E7wŌ1j4(ϒ1 Չy~fOA= rQ-l -߮5y`5>JJ|XvDu;7Ed$({Lv0Vsnv.lLE}y CQ;eėnFj|fX1|20F3M7 FqGԕa!(c,ys,N}gGOw_3?g|N;C0m%z2>>~7~ʏ~Ƴ1nxRz8` 'Lo퓩RPNq\[< `3 .\|ԌTFZ܊nGqS 6g.%x|,4,_Mɴ6ޤF\c''s('ar\ |k퇼KIcv;^rG ;4 Qp|[_;ln4$lǯ-\r2ʍq]!A6;i&]u IDATq\U;M+1Xc;KbL^"h&sĖ4Lhߌ9(&;_j6 idy!+L M#&*حEbd3`ò tsST:VJe:m~GGke}{Qmv#oFCC󤬸PD nęqcƢbFHk$b`5qI퓌tNƟ0|1ޫx/.m7yS **.@ç:.lcݩ"%JW 32QKۥ8{w츴ZqN>ǟ_lş~.L+|Zߜ,3ɘߟ||} rF̱s;wǚ92PZ pZJ`=4?ZXO4Y,x΃sV!cMl˃6l/)RdɘCCm8,6Q,oΉCXrXoQ!z찛PƛԽ.KGXyg&AJCx1 }b-D-8GSe)"(BVuj/=k&[k5T^QahU$00OQ9kbа]% ytЊ36X`JbCj6EZU+ 7`]9˹\=wx |ۥ jwFPl%BFMs-v]o7X?MvǮ][rx^"Zr028!G(ɮU>r cS4+կÍ䢬xxx 5`(]PtV!R~<̀Ì0牞YU7Mf**ep2橛'xPI+47ҝg+OdE0ga_a_¿vp0?滟|Ļuhэ_En{'{u/wO}㣃c||a7gޜy8>\lGL}aʗ$~NW _PɷeR[IbNǭD1@kctoj)D=Z(Xz՚J/= と!S.7o\eCAH:k0uah?HŊHO&qKfvȫ؍Rj%Hdhr7`n]kX#t/>!?/XͶ|Pe"{YR|6 \0d*2,V]lK. 1٧SS :=T5 ^3yR#D ɴbNSZ;3o͆p2>O=1wyz'7oOk>q$>OZTdZR6ycQ W +^iq>R]Fp0ޥKcݭUZ"Щ2U+U 3UHmv)]1QE ܝnk6\ۈ-Zj$B*RBѽz=(BRhfZg*Ade=(^rOWrml& j+47\?KX =iqKuH[)Q8;V:XAl+R.zޮPS؆-bl t3}#SL= :ͤWiߤܤ /VH40 j N 64PRqvssto]~c(a!~GM{ɠ<}0欹ıRiMZ}эаXYdxFq䴭i5dz1-sv?K~pg.7{|c5orVSmw'Gxx#1/O~Ać z't:C-I1t\I*9v(>6ԍ?60;0Qykoҋ&fP#w J~ڻр`ٍA踻"{5fvRK1 W}Gx z]A_[~!YVz!u N]fZY ^$#M6aܻHPw `ۖo9LTAswUG:=XwzMPa3%&GRI;f0tp"[q$tZUL 3 XYmxW܎dSDNQ%55ރX4 ^BEH5s/sAGXo5 oM]jm6`ケA5Cw1JTkllɚz} 5YG$a>O0N>}=g|Tmrnj89ۿ< #d\9ƶwϿ//ccm? >_ |22Lf HV =+ Og̓I_E3(vuLi^Y`]ba0m<~]ޫLr+eCZ{vzT\09[<16^S෈}JE6f#DclTZe]b7 jv$Ev^—b14x:ӕ^JeiH./4]9 s!Ju_%Fi7W'k=(/ؙvG+\nMV-m3Za'Wв^'Vg cpSc祖H!3(ܺWVKWHpDVhwKiy˙us7ޖ㾰10L?|vc!ۜ gln΢1i9L *zgZOe+D=W%#cpƝ`y1ks- Ev&6jݵF lp]!&:ɕEOU]ς9Rx Q vj)*p+5ULlTXn>iRړaM6dO73 UaF+[=NayJ˨޸KzC ^ˤe@_\u\ZvBs$'nDJM3F{{ؚjȶ%Ȟ3g{YZ.O`bj@OLE$jTy)a2~kU\+OĻw??!d1L_f~c4~T FJ^|>'ou遱bx`g J3s }fp4_iG6 \pI4fņ = LOYl%A)uMFQtz%tq[+롼R_*s^ MemƸd֮UߨX@hv+g9Bx?{TkMI;!eD,!aK`x)tSʧ\>:31n;uaeR?wz<1JfbQc_$ͤ!#G=R KʊRIʆֺX/iBwžUr[9Mܶh+Cwg'em.vU_~zޮo~ڐHqSRY.!MaU1n(5 Kyfꆟ:=~/i8QML)}:8a|bţSI2A 3IV0_iɓ3 ܋*EL͒Y[dyp&FΎvuArHvNaW$Y+ fC!ebnCOV&^7|*ePjL*VQUaUvfۤeato1'&mрϫa_xLі.OM%XJ' ƙS2/qʱz 39.&܇cNqRLvfϐ7dyr d☧4UzP]عō`x\-YźD4SuX%eN9 v.K Ex'< |9ug{ι l>&nL`cd 5& kvj7g'ss&ʪBü)R6ܼi3o"z.xΫw$q|!''a¬W8qK}^d޾ʹ;k S1Gg XiX0JMs:T-1^tTdө+SsYuh?KӫZJ-M%a@:_"cZ)nAD6N.S ;{^Dp/fjCds%  ``*_S5?NxFc:4 IDATńd5D Y9W~0KШ}L)\SO~6(?sb: nFRHRvԩJPUnjnTwt͉u5-2X)i6;X m췆Vdק$M*يV) r}X&vy(+,ҠҝS|KK[뵔WmJV_~ӛRv]d)wd8M'7Smn w@ChX01O6A]YX-{ M|.ؾhO"=<]ooj "㡔M aXrv`측ͯs_iK$bO}=};~$:$?.)i jQ nUD8&FruspV, sIE1L|lPCD#://&= ,Y!nEwr O?WG0V2+8VibںITdl| dAbj6=اԀb3\ (R~"xyd\4w뮊-`Y"Ϋr{RR3KKq9W8VS' U ߪ^9_uQfŎDz@D\~KFC\=-zb7 k֯ 6D6#KmJl`%z/ Ez7qtRV6=*WZj~ڴlRhw|dgHN㵋$5GxKkK&U5)h3Sώ"ĥ1o~u$/f&iėV٧a-_H%U+'b$VbKUz˨?9OoOF΃rY̼tCĖzI/o1ujjNN7J4Ci'xp}3ag&v΀[߬7!d\V snG e6Wl jWSxPI ξP6w"ԄdK #\fa7RѱT?p W[6F[7V\$~O4T23TC'0jɴ|j̬%()AJr^@mJn_έ]o-WJ\{$^Zif^VGsUDOCK|6 ~8M9.vT\ݨ_Ca nܯg|/a Jيʈ^+ 'yV .~ vY?z5ț]݂KE)Ut*fPFye'ʃ*È Z+ ͒޻mzVZ9X4(M&6BxiĠ(eLPOb{&dSg8Nf0I5*nQ * 0WHؘ!hm x$A!wd T Q8~ !ɻnGEhGҌ; R9B? bɅD~@A=S#R{@+w=?i\ָ#u=ᛚ?P  ={%֊ 4- j,*3pw3G*\:1Qقpú.(t jm%I%F[DձtLRQ"mP AH_OZNܫ3"r4}XWX8@xQ2$ L*Fp$]+B%rF4RɃ Gi."^/ֲ L&z&UYHf-r4L!В=d+lG, Z(:y8\&$O? srIF&Y<:JaA< ;C)ƢmeIF 4JxF21{16_"]pzzuverr,oxd%Hd2Pn *gMA_ {:aWYj(^}8D h~73fƌ5ӰQF0W]Jk l VVqg˔-f*#є # թhp9"ZtXxG_I@ >Q/4.K< <}V<(mWs,Xp*2ii[PGb `@0TEQt l 7u+( *A6"P&Ԛ$HuS`@jZ3V:;xTuA1X :33 IBgMphaS V}#9 OEヨ޵jQVE82[G-XmWM  haZzJDF ;kZXl" apknxuAj5,%>R^Fvj=" ə)^X(D;4 S ? TFA2K} H0*b_U,Э 4:5X3`8x1MJpq&3]"@|u`,A^{K3K9Xl@-|V׳IHGFrobr StČ%b#E&t,+XJE@<ٲ"OۇD^sF/vA0Sgn^fVQӇ0ˊ6h(6@~!pɊ?XC1H6n>%5TҟCDRn ^`D:Z]T82n( 9k*aRC%)3$PR.467=ɫp4[BQX;ZtPs%} $8j0~C!u[P¹(R&fv":3hfPޑ(tRX(JA))(R!`Jsҩnj6p٢F:BQgtLANߠ tsud 0VL]YUׅʘ蒍"b+:8Ywޠ H,=|!-׺<߀!lDKH9b O0НZ4Em/ Q g ,\rѦgrJNUvrqwZ+V4Qed f*!=t`Bk"3FGзe%/FРL.-A!)=@cΞRTBÍiFq.ٍRDL$4ށBuF4e; Q 8B1i-yuP :Sōq "젙/S-]]JagSapPWDG F),][?: sfƌ5ڌTRSr]+ J\hW2X#bB6 ћQPD=c0 E:%tRݘS"0BZȜ "Pdft(AI5iW'}f BCC ]vwDgKc  [,!BS *#a*3JhnZ0c˒k1x'!S _%6 :qB}㔔 Ce!+Ag^/k~Cy/br%$rHQ )܅(US8-`)@QŅ|'O՘F8hYBu+N b rZ/7r=(1f#?Z8V1.Z&*"V((zdqg\Tq  %n7zxjuG舰y)]8n+^8n,5B 8dk3n,M2Ug}r ¼%=vŅA rXWm2ΝIܴPY`z0]}`Qu ho]20 E  ((*s5b@`@l0D̐R.X_`RQe?Vcf̘Vƌ(lafjI*ä\%Sf ( =+&e``HĮOx6"GF XHoU&%{ R;JLan-WTY`)j& sfG[H3ZaTVum !鲺* OXvRD T6e"Gϰ1M*$S GjL dR5pHcLYuhS.DPk9ل$WB,SJ Ekr:}=5C>Tj$否 <xeB>-,!R%p|ia4!0S Kv ɱ^HfJbAN^1EuL ʞ&y(XVEE-CXCQzbgQXvˊTD6Chp|_͜E}O3flg|]R1*h}R# %X䋑2hgA`cLDXVmDFw#N\Z#D5XB@% -x .('ojk`41֟0z(72mYt`0Pҁv&r+2XpglBD\bkL.% `^PhQA` .oЀ 80Q(jV? *5(vc3L.ʮ+BI5D9&dJ)ܗ$CR-OrI@Cbi1 XCH) |Z;zsLUPD&rjT;mBX`G(#_;;TzL(`G+cɸF $bY<論q$ĺf~PcDؒΑDQ"` *d@Pȑr/ x@Z%E: }0%nEIT8:iL%[Rj B}r@-|v3el! <@5v(hu tf'UB?Q#8@UAQXP=UiMg(9~F53fl 8F-Š} )@&<Ca+a.CZk0B|MKPJ=8i$`!Z*TvI0֍7B&/2H' rJ6vPYye CAIbES!*@EWT48 (IrM$ U[)a 4*N+C07ZŒ91>*Z)[` E+4NijV46ɁAd',ӛCZRX 2<Wū'&fUE})jRd4vV@yDVNwhQ*2tt]ɱC,D%yAB"У%a:`O'lڢ(WM:Vn%UM^716dhbm0ih R'0A!&}VyY ErF@´"T+usU2~-f4S*JMD[ި1eB"+ Z4S󼸠Ռ򑆙rX-tVwK#q@C)-e qN5d|.FjI$r1c[EJ~P:)%X)M(0ʼnXI@3{:l)k!\L|ML 3G:5 1xAXZ0ۀt0!$D;; z`/ ?++ƈp x1Ƞ .H&*i Q}`w zkD7%6`Pݱ9M&k(uG`t ;" -1rّLho(V/PX_]CgC8PЗ^, 1H88ifgJӂFkyaj@y!4f^ ̷"(8^xW1T45J5Ю9mh\H x(hCȹrGDoT4&Ԣ0TzpH_^qtKc:U4D0ypl!b* T\DE^N.洠ǠE;VZZ??+ݩpT*y toP7PF"v#GE$(FGϨ e!cC  ,Uh7#:rPfhM.^2{ $#TBjQƻлzN֣_t6T$ [_[,QbJ"^R&H4:D;7= J 81EтܡQ3cƶOJT`=VXb(ޡ8/V]Y.0&". &aXK,CAu8 *Ul?y 2ҵt߭ʹ}? /h, w{H]cEU[:iKP!#Ƣ8hȖs6zG]`ڀb RZ($0U+~!"3.RnA Ge,s0ig$e -#E5@P] ]eXXT?^8XEZ (kF,Q+#&c7l0`d=n-tEI4Ai( =h%IRmB/\u Di"c,PSJ mƀBAae$G$ɥ52]ٝes4nr1SJ B&r'2pL`G>bCk̠oa^=:P֮f CQZb:ch 2l:!LPczp4Bep]}KXG]#ʀ+3 '"7{@;JsKtAlaKFn e.TЈ": LAab؊^UB tD1c6h6WܝKL҉걖8v$C+Be0s7B|$F'D=[s N"+Wz@E0fq@S994X':iJv UҐX`@ ʄN.H /!Frl`:@M;\Ƞ.YQ%G87:Pz%nΑ٠J3{HD.UaXBȷ1G<\L4!0=r hT1 :E hf[{YnCaRH\vʘT1!SQE<5ݑ6}145L$jp! +j#*śa,̾!I{+D6ݵ_(& 4G IDAɞ}@/L(2exg3^T\^hl:R=͍@ҹ8@$p26Z׮^y-2~GNKjPXTP趄hCDFoT97DXu( H(ځh4~[ͪhK"*T/TsRK*AW r7ǠTܨ(s夲 vP]nб. +m)qT |8Cg̘&&0Zk;&C`z>a%ZPc;afq6j|XR CYМJVhtj;PD1)qN[aWR ٦`hT]+0-R624QУrfz[RoQ<_Y4@/ \" M]Y%t-j,:y$U[Et.K."&ĂZ9ңi'Lfv^.Ȓq*nq h`9t !s4Hނ茚Lp>t+N%2"Yr@3@Axʘ8* u3VLLh2>fƌ-jV3>$w$*Mz( }R,4Kё,Uڱ$Q" t,`m1,Y1 kSj}j̙0&t`8HL pzU au YRRʭ" xZ{0;PkIsG*w\zhʀ-Ц(Bef=^+/ UY&UW6AÒa3m1*\D$Uy%뇼ߘ$ x-ztI 3S0H}L!CqQ)@#ep(Ukb+C"RNջ*KH¹!Ӓ|م`N£ =A*pk$7@,qڌ3QLS_g֯ՃGXR#{'q٩ޱpm<%so.'!_MpfWK}My<:s{aw]U{]GAm>3flgz_g̘1cƌXQ|"f8O3f̘1c.jf̘1cƌ3fƌ3f̘1c.jf̘1cƌ3fƌ3f̘153f̘1cƌsQ3cƌ3f̘153f̘1cƌsQ3cƌ3f̘3f̘1cƌ1cƌ3f̘3f̘1cƌ1cƌ3fE͌3f̘1c\̘1cƌ3fE͌3f̘1c\̘1cƌ3fƌ3f̘1c.jf̘1cƌ3fƌ3f̘1c.jf̘1cƌ3fƌ3f̘153f̘1cƌsQ3cƌ3f̘153f̘1cƌGF=_D|vpɓ<3n;[z>93fl<̘1c?3: k)"I1#q̘1cczƌΧ`C;0c?#v|f8ɣL_gmH㘏u<}s<37rƿ4k;53NFBC8@Uk}sT=Z[3fK`6E͌G_{}cxs w>lo/>½{ܱ~s{;{v+9]+IO^>|#{M\`E*"+}=x667qE_|~<ϺZ\|Oya#T&s!a̧?kG^Ԝh;s)T}?֗ٻ8nc[n7}7˯8; ^B\tg܂7W<ϝwށw/x.zy<CAE/O]w݉wp%d u${/aO>qƙgy.v= h=VQ;@K/=_/} " .NtpFD举߿EIC_ƫ]gD{dжiw_o^?q ?~peO>ʂAs;[Xd{S:{"s.<9mފ?u_}-.㞟S]_p|{쁨; O/SV#?#ࢧx~^{-~??K.??__E]uwommǏYz֣@yh~=?G:_zs4*{7t.ꦜ1O~~-߂WոqWO}*>㪫:ܹ~ .9xdQIU"~w߁b̈/ s=!|.ŽދRʣ8_oxwo|3:dz]xwzy E]3v8Q1|;>ꫯƞ={`fx*^Wxӟ]V,k^vyĎ)/Ru{'qǝwK_ҚW p9ϺmdRBlnFw}x׻ޅaVw_Z+>޽{O?5wu^җ/~vWH<%ӿHr-{xe]P_XQCZ4M%eN'0? x Gq5ϸ{ :k'~ Sr8 "\.?9ܹ|+qM7=/"'58b%>yQ\pϯvfxm_ Y~͸{quםtuP㈛oozӛp 73i ;<|=C\Nxӛ~riۡ <^/})~롘 IDATG~o~MMx[btO/{{{?(O>S4o>x }s01mз_|Wwu~~ ;v8iډ^曛 =N H7 =ix[ߊ׽u= &GJaWi{yxo6J0JˏtjDЇw}P= n}/^WANbTrUDp7+_ ַs99𡦑H/{9>}p # _" oo[ozpX=߿?7}.>㦛n7~7O|"lccCqW_}5~}͙{cǙxыz+绿o{N!wIS﫵r;wO9眃nE+9>>p޽~hk$GÃFy^_tRE(_><#iq7ӦNO֊imZ˯ _O})O?n+ V? >y?`Fh;nl`FcwL >o;ГzW-?g/|8{եt'qH;qdwK/s}HF:/cqVz 367nXϺb\~{<[ן<x?yExʥ{9zz4#5So~pO";v |s޽{Ze= _t.pӟ$"n KfVr `?Z[GQbc*&,~gݠ`!k#Z_OPQ,,Dm"3(ZX,E߷?áE]Zq{F_VE=yY@7w^_{v'> կ/!"ox1;<ۿ_kwy'y3pD;>pqw/3'>x:^uW^yE=\)z׻->p܍);@r 34a]i9qWfq7mUxgo|vab >K8g.\t4֞bx;ǣ=8pCg캪{Z{soUi,[mٖmOխ[Z[\֞u2;'k̟7.<|y9yў,P-Ãُ}ڶi'WWucy!Y;TUo6wx a¹u_z9S!w}?9uÖ$>2ܕ5xo3_ضm__r?( .7u`4Tuŋ^Bnn*/p;I3]4BPs=yy׻ɳLܴ%~~=ozkQQ~'o|;K}O>]hsMo|#7_ea7׼w05pۗ؜0yr@tW͛Yr%^Ƕm/1E5{0897̈́X}晼痮{ 'x"۷sÍ)=-6oħ?W\f wشi]v+v~ż\y,]zufYz&fy(DwNwl-'q֭[x\~ŕFiK'\ g8:巿߻&v(|vAqd| gʕ+3{|w[K31p=;4lfgq5y̽_|ܑ3Y1qֽ3$6| t˦,=q)[mUiv+N>*Ps$ϣu%=ǒ%K_U~_W_#|>eq>sV|jj};hSCdd:L<)XzM7߷M;YQ5~` g#ą^??c䢋.ⳟ,\%Ce–[腼?3N}˷Ѷ-wy'9wxU/3`0 رロ$[:n\}KX`]t!̜[nOz w:Yd\q\~m˲e1s֭g=ټ?OΉիWs{\:Ae-ZW˗aÆӇdjDd09۱ك5Ue|bysB@Ee||QeΝ<};Gʙ"|6B3%զ/A=hdbj]s-,\x&kJ*rJT1;A:ڶir)f,eƩv`^xw`pRN9i||9spBϟ[Pу;v+t9S2196l䓗3yKoe'D]G?cd8p޾M6QzT1 L/ءӈtg{>Yÿ|پ}/߫뚧]t1gyzkwg0p7M 揍qߺ&wbI'qbհ]pGN>Lr9'>hs{c͌⤥'jٺid<||ى/?:aaU/8rLu ݻ#s#ZA=O͙3g'KX<7:Ɔn`LdbƆmۦ`C}a`MXg`(n?8.*yxI,h<ʥC15~8>yƍ,Z3s /d黥 UV׿n믿s9믿￟s=^WNA^x!_=W\qseΜ9\||s>wɢ?j^p7c܋3KD8>򑏲z}!O&fj+"yx;~ /buH sa׈ccc~SNusՋ_B7 شiP˿_nUt |~կj^C?y,>@M9tw02rNUU1 ʢςb_|9x嫎F8>J=>wKo}A Q;)wWP<>EM131q]{|EXzcOqԋ# x])aɒ%:Nq9"&LC/{5;S^Ĕ e~W226O_~=K UƟ dlE~|(O=&''YbXV2??]NW 7ڶ3#C>'SW:}O?Sg}#} k_Y?33%3{~f-[u]G窫qY3 ˋ~ϒ%Ko$7|_-L9D9{E2^kxU@jWb;{%;w߻;wuK_O ܙ"D6+O+WןtW3m۲b >_4a< _?p->Iz? }VTkFGnsγfvv7q`ꕯ`ŊI&&'݅|*wFL +l&] 1BoM GEz;;F$}f>_'m&aY E539 g%011;GsfɒXxqW8<<=0bh՜o$.npvl=abݮ;ߌ\l U 2`pVu½ܨu ; 0%7G!p3~pB.k3{$w&7w׿\zEKfF۶X6\r k9cf,^3?@+in׼\۶mo}+)gN_u:gqF9@"𶷽իw~wLMT~9W~*s]B1&;w< 6]MOpI'ѾM~|O >_fێҥKgu#$ͱpuΕW^'nUvngUeWڭAoPρHND|%[>W9eq|BĽ磃O=p,X k r‘nG`>Pj@3r9ϼrM&s TUQ556f{1Bꫮz1cYg;\y{  4E`?~>W~>>9O;䲻Q^źQi4g3p.gͩdl~c6e7#5'H9Ovۗy%?Z>hB !C,s>SSZIjΝˇ?!pgdHwExx|~p o#289} C퟽n}w+6{qe{Tt^Fxsr]P?1/beMaGć,|+WrۗoxHZmmƚK/'X}qϚ,9a)??@pȬl 9Ͱ|'-[?7 F}R۲e˖>0,=D~xZl%kvg Ko9z>53qσ?Y<Ԑ ~<ي]8UApz}֮]˶m[t=rg0gyڵlݺqϜS=:rJ]Xs9uS=\z)[ne0zlU̝7FY=.Ym۶ΜxLjji̝`Ht,?8GZ6BPݻӗ,bʉ'TVN=OD}qPs|z;~'x\u#3`<*M/{OngHz,[#4ϱfΏ]t2߷W6lܲ[ǫ.9F+>j'&B&?Jz=#5rw$q|~,?^sَyAXpF8>'hB๗Ǒl~5q|ǏڰAԸ;c~8>88~qq|a{}{Rg{"gTߝpiϼn(}s[QH{SgHieOZaߟ𲬔sF$V,OH IDATLʅcBeXAGdcz?yI9S :c{?v{6 tC[rc)e$RV$rZˆYJO RRz [wfy\vYWƪ>mrx!Q%!Ŗڅu5H"%ZSIyA HU(DD)@I@T78O[w~מ.C0!c2FDm3N ġZ ܇ɢ%R'XhY]크" >vmGj k|寱~V,=+O;26 8J19QsgLjabf*"&C:`@OK"0 Z7oqhs"BFIH)ϸ$o[! k[OaVZz 4bd=@C"JʂBlY "kfe]®I>SQBm+)DjI̝3B=O}z8X&'o@ݡ#zDÐsTQ EGJYjH@5 Ʋ$$Mv Մٜ6IgLC),s]"Ɇda6rd6 ;8!U 44)k[6O3::J@D*㭰lB$"S-hۆx t<kq zPDW);nÂzPqTJ]Q!zZBPPȠPiy8TETʅTD)/'DL) DPWD@ 1(fwxGO&o3!Nr'y&0̉d xNdW0!QsZ̋SV`ۦTPoiq=a~aN/(*2dÆ4D ShgG3Dy Rbv\Ak Á=cÖ3m(5 H&)j3ˁF ŀ1Ly( 1E;G匢CrC}py @vcDMNABUЂETR"B(NEE ^ Hf=L"yr"E4\= HB$KTghc8!$$;x{ \#c^ Jֆd(U0G48d'JrC+<n>A!D% R!8)xy]7҈!.$9RTBX9#h],G,ɱc@ @v3n0)9]J .n5k[ȱtIhVo q Y%ځ]1dlIb$]U< F_J"F%݉,Uڐ+jsBF)qȁY^, Otp"cxT$![jŃK =M$UKT4ZmQZ4JKcG,9J}ނT8t䖄Qқ3B Jr!(#HsJz:ǑXc@?9!ԥw6=UU cTT*'Fv@31I" %tTa@ 0q-!F QĄlJFe[*YIf 9G{OeH6;9A놷 Rnɉ R&R<3bCAB10@0/ZByY}I$ h#/pB 2BS$Tbh++Wyj1MTPLSIy&0%-@C*dcHJ hV"*8-xh0!Q2>Y*r"ĨTI G-6lءH&0u!p&Pă'x=^uX 3FdP4#Rs7AT4 d-+dJֳhԄ*8 K%;F(/7/̏@T 5cF6AB!  Y' g,J6C<q+&*>!I 3"">(/[?tX}7qiw50IdjBW02)bq1"P g,TiA]ihm|gg$)^"7p'puD4:*bJp+̅J N*^)Px^<:h0Ui$7CDh,ay`"7U8 є,ŮlLuD4MuBt@CeXQ**BцQQDԼӆ]1RGٌ6RJv gsl ֚B9{ 55AVĕPJE? jij5P!]P,dܹ(1*cwԧ>駟{"vZB,j:p/%TtH9lʼnVR=2YDYQrS4.9w:BD+_ zի~N`W@GJDh`NIN|]Dad9j] +Nv%-ڠd>mZƲmy[.eKe&PꅟEBEJ&E4/>(+T2CBA12ZǓ1@!(i^.TUIj^֭[Ǻuxᇩz8J),*7L sA9 AͻRtO桔?sk!~HȎTVʨ%!Tj%c2Da'oH9,s.QenY W9cA IAyUnmE$^~>G?ѽ_V.NRJ|VʳF&aHZZmK†dJh\fĜ g4EC)EgEKgf$5Cl9J&3!KVAkmacW+)̋j,DCY;Z/CIJm~~mfs=u]?Ci* CQQ{r4+wxbbük_~n(rRJ95eSQoQne^N=gV q%srKE|dl^iC 6ckȹ`)@*vCR*̤4*D E+BhS,3.Tȴ3իW|+/~|ӟfѢE{:XI- x$[,m "DL'}Ē]ж[=gCEFs$֡mɞ0"+X\l1g(BW HKF(G!Uy*D˺JLB(i3B9=׿ _B;s?2`difjLXB\pZl\ 1yF|f<Ιj) 9QY@=Н[hMSDr QQ&%vkRNQ UȽLqP J̎TZ&Ɗ6d $-䴾 WΜwS5K.='J L%y)aVd)ewrv%@J5^4ޔR6^2_)b'I$7`hIKd25F[ksar [&'Kje!2 Jf\0SDl#E`K j_5VQry{ù˹'Wi*'$ Ix.,' @ %+4ڢ+w q BV$%ZsѦe)'rP#bdz(4#xQ q,*䐩3fӱ2Sa3R4 tiP>ԧx3ɛf}i͐ +P/%Wkq* hPTˡ/!9P`R|RޖBPkJ:ٕFĝA!G:z!C$WlJ Lr!+ ն~kuy73I&tcƈQ4!CH"fJP~D U!$4Z!$bc;vb6i&>{yX~0ygϱw b d sc*k/>'g`W*GwMMx뭷KfB^D^_zj¶Lo&#_'%Zv9fq/7MI83F3Iaɝn!lG^-fQC(pbɐGQ2t8ѿ/Y|QzuBId"q7c!-)q*gOϟ7;mb 8Lc㙭 ڋ3'2M>8,83prjFjX*ducxΰoI/ԍ&79o*^5!F*62 ˲]aL7Mg?Y>O?WWHqMsx\dE|3 " *e~\<~[)}H[D+BV{kЗVڱbG * mP㑌JX sD(fX}z14,b䅚+?WH.ӫ6vfKȪTe"(l*F<5˕Im;^I/EЭ=MkFYU|2Cw)Ky!nb3RUdfe1S1g&BײO_ i/+9,;`tn4iO3fǰֵS5۶pN*y#HŁuԌ3اRpuks')`\|@nm}^-3q(K΍%Sp&;pO+<;G qꩱ9GL&NؐBvwB\#E0r}9zlvr d ⴓz/oYPu'AqU䖟!l}dޣ54-"@jB3r_u=6!5ޛ=|_話`s # Ec;“UtXxzlS~e8G8f+"7XO  Y4 `Ӽ TAJ_vL13? /).v'3M|r7{6+}gܒu|zݿw?>1>O~W"(psR1j/3v\p_xE ab0"nD%uؿEJoc=uQb V!廊%sw6ȞP`qx@=uoszI)%O]20M}oo}z183a^TU̶P$L?lf!H8<ǓŴfa7M*Qn|/C)ϫOf-%r`:j$`G=Hl1JQw|9%I-{$8l!βfHJ 94.~*H_(}㻾[o}24e!W>~:($Gמ<]f)+q2Z ESz~*Lc"Fnw)TFa8dSdأ@wpx0AJX>]c*SH|d8 @-EIQG~ S8sf#;p\s+?a3X C^ffK6-J;ayzakuhVpnG[)iVF2%5݈fD](>Upq{▦A$bkV8* m#zcRs5__R>*H̖ڽ'85,5J1äR}TR/Y&NTyfS&vq)ʊ'3DM}*Ww?,dZ/\,y``ۖ2h"ޚ9lM7h/of>|7||#?^ofC'p.4fZ\~()9GtA' FFdq,;MNdq8?e7FZ$֤Qem BiI\)L9*Q2WPc쥌(c,_?/ſ}xZ5/?nR$7쾒5g>rk[Κ:IKM}S%Dxv$;ؾR++ c5 lO= 4>N{ȗ0@46zɨ' kr)}]^~?o-/_|^aj/0N29Dtf5.c։8Vaq}Jf\4g%ވQV)t._TڌZWGyja9w>`Ɠ5"8r2܋R7! ~g?E7Q&oSc\;ܓ̻46θq廗k\$|MPQ~Ar|ؘsvd9&9* CRR=\}/Iګ1YIfSdJ_Vt:HfF[dgrG߽)%x|_^ާCk52?a>==_/*For\&/HCiErˇAMFAJo]WeV-νLCr5fԅE(/[p:o3 \1K~~7 $w 6!^?fO~OoQyfvܷ"n.&NݨqqF~^x4Wh Eu꧉2ZF{Hf5Bh~>eҲ o!*޵ӷbZZxPg_{<{|#kPl&{YiMO^?x ݌8MU:_,:h(iDn`aD[l4f63fɨH)S1 &/_&iO4N*VW,No,f*vV2l_d_jqBz_|ɟSzxW \%ʙnDx)Kez{1Rx||+XMh69jlR(bz9 +F&Y7".oκSz]r^oNoj!FpXÝ`Ze"lg~?qv/y1w-.~R:p^ٵ@=QkLAdIfq̓۱X:YxTJ9nPkP!&`D{~ dFX k ]_= K߃ਅ滾뻾)Q9]Zꀈ/Y_!3Az7D7b.M^CcA8V,[ѱ(Ar^ql2z.4ghz}ʾՔSSwUYɱa9BZG-z=E˷KK<=IfwR mVRԒR۱c4r(dTGZemOsPgq榎 XoWY[Fވɸo&Ѿ8B4#Kڨ.uf!#6kcȝ*I3 (Lfr뛧"Ju7Vi oht1!p7B`aO53&V2O<ڪHK]mdp!L^IȖ|\:ZkqݾxɞkmXzF-HH;a3׳#ƌǮ(qnzvSӑf(U~l!CV8CmJ,Ouq¥L^D<]ev8-A=yJUy=O}o ??7~7`Ӊs`)^4Z LS72=u*c)!gObuKi~"ɞnT]8mUEdt]Mf8 ljI??Ҩ׋dTDPG69x??`d^ϴxƸ/M3Oo U"Ζ[qJ(Yfܥ8tV* SK1ߒ4=$qvZB?`  )l'xr˒aOzfocCl(w@70˘7λ:~/__;R NQ%p.v'72S^%+";NN0r=1WU9޾Qߜ.9 xrqomC,Xp%{t2" ]tYRJv хs3iPf2:սAyjGL@HŐwv[d?"8gϲ`+.z;)˯f˗Ĵ| w}1Uٟw'nx?$3T"OAǝ>؜\]{{ق{t8h\DLܗZSFEhM,E֍5HF0rGI;T]8ygjsPBv*n.@>k09-zyۅ]|(.pl; b{_p[*Y?77o iheTmfCT7kC.%OR$qY=TNi,l40f,+9v.C4Ѝ=p|2M #=-6xNiX˯yPs.ҝ/wX'3mF)-Q$%c<S);S6nꑧ# o3`6rNyeӈ6;~&?F^Qv }9Xf v !4 I߂i{K;}#_  ks,z9E)`TaWqJ 2g37q(i>?qƷ|1Xn3\}Q;W6Df2Um`3j;-sdQ2MZ28\&)ڐLe)TH60˚Y `=olBfĤffIf]Iya__5|׊y{ |o0G̸dm\i/‰Ams "ӌk 0JëD֕;\dMAD0`*cBFcuڢ BMw`[LVOշlk+y7q _H>:W%y7~Fۻ:1Y,ea2~xw[k?Mܾۍ)=Z/0QRd-X/gtc+;dM2L嘸u9` |j'~ۆ `soDsV|q+~J\/)^o#GWD0ͅ;Xc2LXRx:zddOx,ٛ4| b`~, )gۤͲ[1VR5VQ ERQ$OC" U:|OԷ8\96ӯfAR0+XVyJ!!Opۉ#YK>2.I I7h3BL?}y0oAч E=]~.A=9*4{ JqĽ3F*= = #ݹ~-C$V{j1M!]Щl6 =:p3&?:!NL]1qz7JT IDAT.HrMr1B`,}Sy4y{a`f)E^l+G=CyNRdޭ8ls*)~yrt[ٍ:8zݕiAjQu}#{o3]%w=f#voN?L8[*6qVq]u4h**ͬ!hi]WYi:{P6'A=[WwD{ܜ$'ŮE#UWr̛,sD|ϜSЍS[%5SOn,λbR'27;00)dn]U^(w#SinmR_:5F!3 +$"[isGE4Ml:vB|Na=$YpxA1]!ƫFǃn4m7 =JRCܑ;7]>eKNW0\wT:Æ",.읝J)۷d[,3:y[eqɸ\J9ل+kJWJ4ԷqTbsU ?گxRA7_=ƎrÙjdaCk5UO@٩NafhX0'?.D3TdQB(`su)|w}띷4 yRÖxG7jҔWW./aSkYoѾ_|2^$ʠ#@V'BR7NvKhkdU!ZڐX!3Ũ|N4Y;P/g@ZmfZ9tRb }aIMULZ Z}Nu݉HxTuggף=lG:Y,11:3/z#ڈ;p.SGov2qzu"=ߌ%6F6nB\[(46,G>jti٦0~ܤ鰜D *s{vvNA Q#28C eM^ ÎLn2v'TχkKu$gؐk9XRL#-%% )2}KR"OU#VYIyY\D $Dk=B֔hnӟ"6T("6ih:(y<6K-,ww [J3eK侉g]]7-5%4>Ϳ&s~[俺Kn/θJKl4{+nT5h?緻.4rs$YGvn{O6EI䩨r>p>]p/XG'2?LQF+rd44:=XZ`Pu7 񄕉L{b}T/#Kʣ v["o'3ሠvnZ J, Bע[ʻb>81jrݝg*هF9U\9tJj[ưjGZ}K8WǺ$yŨİY,k_yٖ=*iO N.B4Ufc.qy\j0L)UL3~_z\̡'d8ۃwu 7+'sۘN[yE@dR8NUJNUq_z E1m:[$JLP3:lP&u*uVE)ݝ3W@_)T~6!Oe WJ'+rYSi %UzSK+ws`cbYF#$WiCb),]Q^y8NrKxw>RKU #Euc˗ʄk64;4MC{E5[I'7,. ˂[vBLMq[rӑ6Z˺!8Uj:Pt[^ENg?}Y*E`%ga xͺLjV'5~XlBȖ C]`d*majF_1_ ^d5)֪ |N6Rg,ӽ7Ln[{f͕K dWQԹvE@i;[,E+Z7fS`E(ũ"ƒS>d'*{˜QQNJ4+iꦪmg~Lؓr+C:Pq!DnnnAmIN:ǣ61+s&\6yLu1.Z!ԥ6i7%2C [d]^yk{oI~żA͗nJZ눳*;v {+[Nj9'󑨂-pfd Ҥ͔S#qVwDp:'*.E5`G`qHY$|ryS2! i|#Oad3nO/䱄12,m9P)4` G >nFGJ^.ekMz.5Ag+b9(kg#0e0L{yYQ1ō.Q8Ş}k^r%2YQWٖ5hLG+e&IO,_zw͈cs>%3TO% x,ScA2ZeLRf&nPi M5.بPn1S~-wlIS{+yl{SR/\'!:m7Ø.Ӳe\1R=Lܰʇi(F+ID+@w<{ͤ,+7Ѯ U5Sc.JDr }X>5NrdH^ 2خteڢ`̋\ Ԛ]5eC˯}.ڗ kI6k +o:VJeJ !ֻZwVZ/TP06Gxl\? ^׻55:~VOY%ÞA֍f Ox=X\Hn>t:/S{X AY2U[q:-3D L[d NKLaY]IuBJқ6w3]ʴDysg >)?J-TMz.h]qJyuZgߝ r+njT[ɩ\WT$D9#pWnއ8?l"nLfN9dЂ1UUN CiryF*j%>|`3>7򂅔8yvv>(66Ɋbv3y 6hP=q3!9$_Ynk:wZ8t+r,R9IRIɌRoX |'t_핂nM( Z5 91;ksLmD8ٳ-'*z5U?).#jƎ!pq0bŸ(H+x]KJnt1u솕3bSlFh!O4qI7jk-ȽڸʹjWQf:\x25#JWr&PyaC#5Swyi2P/083LQLZ^:0tS\myLjù^]ڰ9ŌeW*3Ҏ SGBē Z1k\t7.2 *&5~%aNlv2)Yxv)-wnX3{#@ 77x }TZǤuu^E,yA?uK1n\Lr$ca0SmƮ%k&Jƣ WH7!rd>S>+Sk6^*϶>(*~{spwSJ^lZ!dL2*z$Tm>NӍLhLA#>Az5Hz FGӧn} wϋ Q1]g~9{߷zewfsHIC4FM2`gYƈ` I Ade{<ȌYRJJ\ͥwWU.ss9U Qou9~]Yq$IDrw<Kedʲ.١&.b' ӾQjI#V+D31vZ,#^)doT KM# U[o% x 7bQFYPe\im.fyZJMҪ ?6I$KDZ]aTxwkbŦN"P9; :֦'P)dРv\ek\Kz`TD-*NczlTC\Z.z8pZYcuFw~վ\I+8c7u3[$ל3(Y(5SX?*6agOXɱ]TGc7?NvK/hZpSDکk)6jȈ&;4b%ޡVoa4I Z׋T5>AId!BJji 'VjYjBH` x5A@vY_x_BR"s]Y[TYj)i}(J@*Kː}d;8p&gG6uݍV{e_alc(| E XXm2J4frV2-9UuK4" : dMY+\ 5P 5PkS&gk-&0M,q旣x#QFgBJ=쓌og:Pn`Ej@5Щ#ye9Nr9a J§9Ha U.m6П/8ߙ462Wu[;7dRsՖT8*J"<9yh'Fc[8͓KR/z1K[Q \B2nAHe;)Z)!H4mPR Ԧ08їzHT<;Wgv(NM%H&VV=3UUBQ"V*!'WC[XA$/3qgRMkHTO#BO.gReb" 2O,&@]g WwOyWw]6=.Z1+V/!pV,obF> Z1> A6mZBقVIvhRE~vQXъ6 JNaR ;b=w١rҾ;gSNX(u0-jZ Zl VkqZB!)G@JK| vڭq7x+BiryN) Z)4 _]6NFBbr:^z,6 U6V/Rj0b@qiq FW }tbmds;64Y 3'icD D3e>3)rwe6OgBir$#Q^^SDv:|ɵ[^#B%.%'h!kɢtjjmrt H./hr-*-0oy{YtDؤ0fd(j):ejbXR|3U夳f5t27 % d/jЊI {mP28GX/~-xlFZïd,,,2Z0ʒʢ^&r{&KQuMiUpbCj-̡ͭ5_,nX)j$mHl <>9X>aLPML鷄#3vH:0'V;RۗBV?ͮ Bk5 i6v[f$~.j8 TTgYo%iKgM< ֖.7y깲lCXF(cnp'ZO淟bЄ&G RùSpB "NreܓD3IRsjn)9"y (- k4yT^BI (MUjlS.Fjv5 ֏qIoHBܐĤW{4[ct!T=U_,x&лHId M R%J%4)g,-D(,Qr_Y3i7[Ȟ!1 C> ~cr'v"U(*_3xbYAx ^xdEqlM*S}:9B-r} /Cg?b8FsG*c G5& .eINv(+xy)QmX:cd_F2H&6`9!I\m7e[ uF 1h+H 8M~=ZzT|YEWb摋g9"k6R˰4zQU,5X;ЗbʑLt)Su2ΙmՋDFn%%ķh(&!nd;p5FOud[%0S%!0zyW(9؅NZBFkIvʰZ3~vtٲLRJ ;.@CN JHZ+D&Ykr۰(.;''<"up,~:9DjR=hJ3[tbSvt/"{uXכO6FkF(gl6n9ȓ"HRGR'uWIvTbU\:z\Ilשra<Qrkhd,5 c>HX"O6si;@6[r}PMm9XHP!9DdI7/_FQbX942,F5PvN=*lKm|J9MuEf.T%ZiDSl?IL%ja4M7)+9/T{Tr"ŰEu\X!_ي$C]qQ8Rj<G-IbTz޹zͻ( |mz*[p=B$KTeGqRgkTthM6m2,9}1{#V;$!}Fe 99mxSLxlάR?SAG㾋5d ,\x)y*WEדe.d5ViLKBvCY:Yέ/k&JUkueRJ_s\P3"KvYc+E`}ɞXہsro]Q(;"[uYS4 2Ym+?8~BX 7v˱&KZYs5R#hIw7ǁwqRAnF^#Y+(?&φ-be)=/}xߠdO.̮,!As%QbKjKSt̐]%f 8ZMzEl$-bt\{ CG㛙FAJqJ2pp y̌㒡l=2F6nYSLSxcdgBw*Fjـh7xoQVBmM+D%rxcXmܚ!djRÖw18q~f[Itbb#ImSsZE^b\%_@{B҈F0ȠviIX {3n^ &ZE-9KP1G: @V5LRں2f!tʝ3Ar O?}׮o3$Ɣ~6F>gmFWn~M UbS׿ qqDGK&RUs9rm(uL|YF[r9KK딹xEdbI{ç 4= H]Br0A"mNhum@K;bI4N0!Em4t_iLH9{^Ƀޚ/4 ܀TZ3 7nSY}Cf}m765fWଊ$")IK!1OI,E }?UTW27g`bӄT[u-FjzJ$)DH )mh&\=X'.daS?BwPN)4JpXӼ-bo;khmvV-"M!~o(Z7B )G@GeFR(dm N0ߩE5VYښf0Ŝyכ톌d1F>P;/I5ʺȼfT-AjL8ڋ8dR}GG@@ 4?GN ֟{97%66QD@C}05ƋpRwg@6SMeֻ/ư4APHюB0ndu,KPDZ,&{'1lG>} c +'@Fe$m%:S[٩{rVsHvtp}>ߊG4/$xÁ'd{*_}񇶏XJx4"Wh duDLNx |s(J2XXR+FfXdNo#cd//)OOXIG])fU Y솚iV[A@8ue<$2Y x]KH YlM5Ş5EҔ17v4uWܑU>?˕+[VpBY.R61BtB;uVjvp@&nKꄶ;Q P';_MK6 >0?嵯} {=~WΜGsK'e]p XI.2sM౗:#W&Jb8-s)"EƟPSpH!5X!d-$M䢁!ђmy- !ƚvbmlŋ&t,̆njV_]J!t)_8Co1=~޻p6'73e ."j?}>.8ꄦt{oa7} )[9JDB3ak6A"gZؕY86x  D3qnD"1bHëJ)/HdɤmHc4$F6ᒂOA#~e&\[O|qzcG4+R˼d{k_h?}>; )Lo>/^"1ͫxҊRt598c4h(7|pbJbnVS=[#%lun}}EKȊY( Y2 13ɣA7#I"fveVs1xBG}fU`+xb(7H O=^ɓ,^~7⳧X {tyw93v|g6L,7cWon2ߜz,;'Bк:ׄ%(L,dّ1ZH !3!ڪk'vrbA6GT["7m;Ydt9 '|L4$+m#]1ʪLa5~{s>w#GGOW ˯ʽ8i𜜬C^McOcR;+uu4+,(A-)y={|նcH )E,"Zn IdD:(Hje 5~6XDH1тzI9(g.9ܽѣ=.-x >/p~ǼZok>xp orJ#y1GV}dq jGSBPHM}v*4bٟ@2lvkB+y<k/9JPxX]Cp#z\L0Ʉ噽k81&])Ȱ(diw bPIN17橧.qUcSp^'ټѫ=Bwg{+ogWgΜ#nlswgI纎 $J`-<ԶL.;)ϟvVgi]]FRkCKm,7#Aqxx{\PbPF݋Uv8mjSYXl4YEɘ^B\2턾i8T@\xSJ1u̓a-~J27coc~?rIl»7h99u0Se?k/]~dX&RbG)iotkcҲ ߣyxy7.P1 E@4\H[,'1~w78y1oW(>u7C C[ ֡M+9"iƘٙ)^hd&`u?ڑ4~޸6GMa\{{<p7BS`/<!_K|;41G:G +>Eܤ0 -!ܡrQV~R3zȶ-@Kkz޸伊JfN ~?J IDATگg oKa &6trɸl^qJ]m%h X٩-(K~2p%^ koQ&3 |\ҏ . ^p.^YJu4U$LWֽ۔=F~]{8`uvf}4x8o|Oesa'؃|SOJ #/rhPZ=<d>Ι3g. }Wtq[mey6?D Β媮zUJ5W2@)oQZֲܷSkGSo V922#y\p>#Ϊ%f}l~- }>|oxǹw+(#79qbҲ:*v/OJ`g{,V;w)3L} RrQzW3R\;CUf{0Ij\v;=#`xfYb9,هgL{_ظW޽Eی|[o3V9y|}p_칾2a{1Ε1H -u&4aLfyFo1[+zF~ upkW+_:nnٷWuBN5)Pe$SXDM{,YBNO?)!Tٚ-8A9nOWy)j\I]tJ$!¶ⵚ 6gcOa:{/p&'ka2Ͼ3p^|u%I⍫tqwm;G__^iͣ b<Kd5pg?|5r&7s9w~w-y-g꛷Wޚq3:T++9$Ϝv43"Gh,b1,le,n[rmf>q3'a/ZP%i;0NفO\ ) >'0=?+^yb 1{F<\~& -\X}Bu[(Lc;8CЍ z{69Ϝ?Ęeߓ|}f:4丆/*}ߜyG_|Aa}qI -#cK?}'wOc$VRkAĜI^CGV 9c Qڤ#jᓁb #*fMF~'|q+4Sn a? 2.Ӥe^}~&)_M~;+qBɑ1GN*Prq3نsMlhsωC7nظ_[ =ʡز\]gy(WP8,N0P]n8N8YM_w29CmF頾|r6z7ZtFZ Z{ f\iԡM&22gosЩSlLY.tv~D0g875C/ !lǫ/cw/Y&N*}n>~no7X}<k0LHtsBƽ{laJa9.3w󫁐'O< -;$/Ԫ@-W0;wu=%,Naԁv6}9)E{dPZ%+9Ͽ7S(ˑswF{gOp/ Rù .2N=gY9UJl &۳[kW8\e-8sa C3.뉟'0 Lu#!!8EoNæBd43t[6^1pPZg"gcor[u~4UW!l/ ̽ LVv~@u {|{pHW]Nϖ}k͍]|=s?ȓ(5N0ec{eXrm׷pO93+e* :VeV>rt++0WC.vɺ)XVS(@S ف˴?f'K3h`\B_%ȩ7 ]w _e}2/޽O+•M64g7F>YˎDMNcçG67ҏqI9b97_)r脣oż]mlܛsAwG҄10i0q2dUϚ%B`x0'&vxd?9n#y6׷]+ops33Cȕw=#{'>6-MTzRu HFgH䙁Tz798o\`~Pvv|-ncop|,gWNX6I 3@/K"]5lwRpoOǁ6-9'5vG('=ˤxMiL"h2P]Ys}b^WLRd@ ]jE.y?@f<~xvΙ;֬[COIɬэ 8SG/s]Ο\ʵ D2GVZ[3ldI{,-toc׸۬\Dt}1'R\xZ󤀣a6r~vkfE _W:V#g;7qH[څX=G˞Ih۶V$vp.BZ*ƟE%C~̛߽=ns>=ZVGS5 o@SkļUvzs´-{}ݭ%Ot|7v}әW&X%IH)c!nl1*QF@#a@\O]dcwmE?zy];o."-|'ym!N+5n(*@l @~c_{}à /l39{mݘV|-.ږ.Oеʽ7!T-,q=mWDȱfǟO'ƓI9ʈ2֕j&y4YD:r2xNYa2x@u{ɋ)toRlmY[EF_ז{PU{8gη=O(EG,Zc D`$A`GvAbȒ%Æd9رL:(QTdl=v;{ǪZӛ|0`}{zyTG6ά`UNi=r%aQ(;VWo[|ap@nxktxME^83np.q\wns<>w9T=E=}uxʹӫ|{׈p# JH%^ƞFMZeiMGNqeѢl~))PxI< yu4dpF`eEX:OҘǣ{O7@XpP釾;5)$0 dGN$tci>v.y)ѱ쾵Ù>uLLYp(_q|`f9Ŵ?TÒ{*NΙ[7paKx*+M5anC +Rq*Lʥ(( EwX }1%v˹oZ(SJY LA@B*=VsmkRvurP4%+%!zTAf=@I'XTgiX۞!=x|MCBP3K5?wc_o}\ߺ~-j F=6 {{{S SuHDLau ;(UNYzd Fjk4V%ywіL`pm^Hg~}Ŝ_5MK6[ZY ȿo֎b(7XhљI3(T2w%Gn.z 0P<<\%z + ȸwg|w8eWW%R5q|4`ro,B&WȮZuW暗#G}Ƣ0 $D9>v '{e~?r/w\YSAP%&B:R&*[fv1G[S//_ fOĠqC5ԑDT)5)l7NJ>)|(\3Ͼyb> R0?{o^6< ^Wg]?My>T/{ܿIdA;9桇;wx "gh,@Z" ~ vnCT m@.SbW:R {Fwq32_|avx/^HT {@%STU gDOtmnIg2,y:e#k"*! PRR-QcuG̋I;^3Wlxv6K^zAJˋj<fݾWmn`t9n[vwm5qAkh9| ٭ҚPUU%K!R'nǰ*b;ُRY(LV'#dRn)ry @LYnZLZel 8U֚(gJSŚGJ wcCt-Wf?]4,?͎u--:w|԰\&"RdF^U[~67EVMNLL6-1lRV`s&3LJ^h#&!K:l."ZYO+6*M%! {~|;0's{:Q(QSvyt\3C."I+6{4BD+2i(ku Տ f& awe^kK_l豨!)H0Ko?kSff2k 4g<' 9&ܷ=Cot'79q!ǒx`3'O3(zOMl|ARWeN,5b03JL.LV)I<I*HQ!FU;EљnbB:OT/_b .EDҬ[ois1^ܺמ璛2k< }__|ֵ݊!E$OZl*-}\cL»@%b8%ʥވ sXgӨ \{B"tR1uAQȊjHE#ZsF N`0,[EІ!v:9"h?lV9ipWeUD)Cit^Iάt7Ҵp^#p[`*yaX'>px~FCvP,an '>1.1ctApLy.?tϽ*Da1fP-gZFƨ*u'@ܯXt`-͕[[[,eKmJ<)_|f;cb&ꡣ!AG#??˿뼷kFKUp&=z~r[amJ.u}> s<~^AkEαu+O/>_yfR@OY%HJ+Y-ZCIuDS(W2),`xMl=[{X or͓z%h 1ffNr/ ^#nIbo 4B[q%x[ڨz#+_i{Q؋S|2x[Z?s}OvXv IDATW<ՍZa}6W`(R!1m*&ï j@+j"fRo:H:!Ҥ:t]F~M}.75opb8 SxW͉e揝Mݳ |y㩧,8hy}v Sznms֘2uXӂV>+U!@@ĴlДu9:%xg=N2z2=[VVHlH>bIQY®b'&QT'6xO\ Gu.=CiՐL4|=eQiACsp=N}}^AroԽ|膢|oRtc7"ċ$Q|hKݴtESseZf!5HH"biPpj}9_U5 mY5g.q:gKb >ZІDp4/ϙTN<&AK 1H^A[T1&SDk3K"^iߦPwwykjVyBSD#(%5ۜwCe8 N0lgo ͝Ƴ9?/v 0 [{Z|Hݗ7w#pYBO2yc>sttDQдǹZV$5 7w_88jזV Jeb~~C4_Ss\uz6'NF&u2?yy߽35"aRī?.yX2H3|&a?uA)rX,Qyl2}șs#I2"q% # ٛ<\'2dɭhɵ÷&BP>NjxT9_= ݠdz[N llR}xn` ^{(k1F!g>w}TE?;龯N5e2pTbȗ{,.Yfl6m4#Uv=hGv[þXV]TUp7mi\MttE,[4CLY><[iEә/̭7(KIHph=5Ѕ\ ڵѳ׿M B;LJɭJH{/obW?I-os_+vs챺rb4TgdUT fQR$suhIeoy0W A&H AU&4s;$Ԅ+͂=l $ *PH ;˖uD#Fnw튨fDž(rc wl8ϕzN O~1p S-~6ܹ{GO.'ܞTM*v][3#KIaRMSh۬A)K, :)Ъ%&jE 8G /?zܸb\6 #s: ݵNbg&ƄϜtip=HQXJ T}#ob^}{o@3ΙC2yFH *^TcH&2k<S@ѨLī:u@R-̞)u*%%B GuZ%T ⻜ˡUpO.c}/li͒hF:1MyJ09X,nN1ۇ]d(47\ʖ/>3?Bȍ뎵Ho-"NspC !.DTISX 0XDeVnqt<֙BR 4/&EefnJԹU: Dx+D'4-y`/j`>@Enb V1W[W\RY ,?r&FjEhwEV;?v[l=KT!$CǺ.SE(!K~钺UJ@/rM;iբ)zeެǼ~+ۊsbC*-<͢%,"!:VaV[t]]3ϡ k? 6qaix%jC&,Ӻ&)E*Y4 Eo/^6PTl~>fM,N0(U>Sn^yo`<*5m7N#"`XaUEH$!E% uQ$8b/ElC7ijivJXNؒMr۪Ux/Z]赔q {mXIܧ-=(*E=ѪY$/3Ģ)QJ0)>p$]e>YG Ν 31P{˩<%Z*Т{˄y7>_OX;b r}.:E Pc$.ׇS"4Uu~oRCT~i[\ )sk,TcM^2DH JRȢr~ڔ[e=FX  j"%s+K'q{rN;><%*;::ĐZC]ʢ+VF($IamȅE*3 zqu-ȷC ,e4dMC * efMsBlق6%bi=B$u&P݁սpV[zJgrv9y ek?8_anlWg?Q6" 0U-PBzx]BTn@S-b"1DJTfxj$T/١cc) *L-ضE=w❛5wH'VƋ'jɀ7s|PJikdt~[\O֩{.o37e"EMsز{lX! jV ɤf)@:ĮbA5ABZ VWMVqir$D-%l_`2.!Cج1)$mJ(F1ךPmg#z+= kcqLN-n,uu0v:cZnYtLk=+ l0i&-nĵZQXSJYv$O"ؔV4(MFׄ`=Ձѐ霂f0 ?{ %wwfc<(!?iM2iu| ëZ{h!z!(4&B%[0}ZEbD'(/bg63E1l-EYali.AE*:l* fGs걡^~ݠWAB&:ULJ6(* TUaDOXO#:搨 _},L&[ 73#c(Bj'+yL#̺H("yԣ'jOʒ=xM4B%ªW[8[*USbHQiR#Iat&\[c3K գRY̠,ZNo??ƚ4 LJ3x(H}a5Әu1Fh̢5$6O'G/; jw8K[. "$R^b&'IT# `%BT^mDDpd.ҞvI F1є\$8n6LU6C~|T` 2WVtS0RDjq&P@<;6D0:pM:1zOYYjWqbϥ{ŧ^ZmZ=CUVnaf4 Rev͌t*xe(1#hН 4+}RY#>TH8&s*(L9YPmA 73Z"6`orE[1BB#Sf9U Ѡt[Qe @Ya)lϐP>5Ba[ČpT%l=kIɥ-vfGh22P]g}\V* pUICl)L4'Ra>:hq8(حp%mH)r>T$f5GbYg=O[we' } Rf#b2Yx`?Zf}RBa ʊ4CF7`ROR1+l&5V6}}# !WT,1;nJMa `tk=ֆ+ *i?eycdP7Ш:/:t򐩓ұ$q|xD5~hMT~I^|e^Vs6Z%8Idpa10ah-VCi,eB%}EJ POm-Cc*`KmD`>ѫ4dK ĐP&(͒],-(evYmWa$;tf۴sxhƒt 6+ز/&OCNT9UT)$gPv65@- >E 87"/L<:m}[7D,QNzA"U(4 U*(u;}bX<֞(n:*sƹ s:*D*bY{fblҠ eOCe ǎ~YQ%I 7`S]-A[t}blP@NL!zD"R:!@T-oor NA IyL8t]:zP0wE[PEV0b`2U%eS*z& >fTZ|T*vj,@~ӗz$QĐ1k֤Ɛ"8pbRƚ#&x #2XF՜+J |byidIt~.CrC=$\F$о#g=@ 'm[㒐|Qք'b6w'a_.2VJĊ”$%ZP0[ЋQ(&BU"QP̊I]6&EY*2hbBk eq: FU4ר.4iCvJiIC<ɗ+tʓ$iHZ8ǣ\"$2+$OD O&OT3 SKӨw7O1QŠe) ]P lbXBTPv9bPRA1`/]":hQ> K9( mm'&ϪR~AOE6X sN(w{\G-'TcDx@TPLT昛g-͹$!GLiF_-?ܤ&&N1n2 !jWD88=uL9F{%Q]bYɣ?IBnhOBV݋vQ,w zpMgn KJko3C(j M 2vɢgk6T5Qc%,ƣ%l{&PO<:-3\懜 [pbmItL9 X:NS;bh@+L.H)aB@LeosYv{s}f)6EQ,d(r,J,xD860+ov IDAT+8A'F؈8X#YEӢ(h-j=Wu xsV>M(ܪ[ =4,?V=*bxb~:Ұ/ݜ]BY3V+-,[q_|!%21sFfRǪ!{oERHI)!2\eȍK-cfl2 hs9^ RsgZf%4a9C DŽpȮҕ f?C@:w#y~C`BR1fd#~&[IȤ*t{PՉ;CWxϫgE#Sxap5LX,ÐHI}BBvmZveH3ܨ9Qo_jHb{?iڂ;/n'c"Kag5^Kva~WJfBUoNlkՎVk'$ JZE :)C|qW['|b_bsyN# 0 H)iс> M)2E\N< oi Ur@-Xn> 1?Xo~y-_|9>.:0 أ5D=J[8r#Zt%ZXQ҄l~ٝJf|ŵnkECVPudkfFO?VjsaɯpQQ@D^RRaAeX%-$8B;#XfrH|7yi`53P27 1U<9}q/~<~&I~U:L`ڝ`ܮ$GTF4lU3%ff:<R`Y~|S=tk,Q{?[-P-z"/wfZdBy&{h~}{!^~;e{zE]&2Mp<b @aHF@[gbJX1&:GnS"ԘS"F35 [ ay<Î[>|7O䱷rbuŔwAD#~^zYnV*Xb亣zqhH"Y&}?(?>]n̲-ٝ0 0D\ )M  ?$LhK 0gp8,IKEL`1 ) =y|x"u0dt-z,tUȡyXBV9aW|~%?<1p PTbC!@H͙K,mY U)byw b1 BՙD^ZQ &t2:1.)w=ќ[! M(Q4'&>p!v 6g& "əʄ-һ2M{ҚV*6l5G_d b#FCy-O|z#\=h$lZv<޷#C;8 ZCh50,`[#a,?CƷ}&_۔ # yZadQ ^.i]%^_{ Wo1O^xC"td8a޽W1[dw+4]ٲ\9UD$KXhhNQuD J;*o~`w"~4 \w<#K6e`AOgZh4c\gZȘ1Q8{Z5NnX.x;$HT:ૺZ|BL0͕1~F#r?3?D@mܫwJST5͇~Q2lYhi>LF3Z#[F,3XH0#yz $T}MtҾxG m^nOC" (=!Eq\:zoEdB&|@>?Ku*0#Z,M𶛉}׏O3zEgt֑cHTr 9FkW%@%P'<+L̻ ғZ蜟 x7OFckXb3Lu~#ZFI`~o7ZTX^ b[SH#slB9q1iwA.;^W3Z[gp_/5C[D1jF G3k\ؽq˔VB@kJoH;V]VnF,Xϰ"+P#9n`o\̙_reof [ARl(k~8쌮S.;%oTƤJ,+f^xH,^dhU"b\*siPf%jO ~k{ėV tqCɑwbvKdiD{r>PXT=d"Veou]:JlDk$_Ǿ#|g?h!0kJAxBX蜟.g,$quHJ&JZ q aYંuO(&vľPGW0d֫=خb=H f g4#JGcRcRǭ f<W ZYKg݈U)5eDč|)D ( PTe~k–b[xcv24iߌq!(U*MP*Jjm&^tV+Ӽa]FX DO$ x|׊ѥ*MɈ= @fCpU(tG j{QKhTTͥ!haj/]rvqЕq.6yF8JBYW6Slyrd;p2_VETiDpk~jR'g :MWܣ@C$P": cM;+D2Q*O\_ PZI8ZG]Kt]b5B:gJn\֑D͍i\(aRjlL&ޠiVLsФ.ra-Cʙ!`)F { PJ2Li6jK{sLjQS$COvhJ4$,TA{$ͼ/~TP}$<m9LX!h$ L&UDP] \ -Rfلt]DPxS >(("7"J^ZUy<8E"sZi tdQӆʈ)]e5+?&ʹFiF´JŞP/*ZD[%F腋I)93NI'Ё+o.׻3A2@l5Zx| r.5h>$TwvG>ubh~''rDm yպr~5s0ow&㋱rg~x5 MfBPѝ+o却BqRȍwp8=DH1SA]! 3!G!ALD(Q]^9ǪPۂ|1_&K23]IHM)!/* aRX]NܾsB:J.{zUBwݶ\jVw|r@sJzmR1S"P48r&rA;Y=-4^-J՞Tvl.cCk{O90Hc^F'X)bCye 4/ySخ+ĤJ\7""{U6b *NN;~/oFD-6F(UiՊ5ȸ0.y7~2%c V2b-د*çxoY"PKdqUX" Ӹc^C@Q檘N|I eFȻ-5L)4^E@MfJPsFLHDMDQwuHJ"Q]B*d&T;-;{HJoxʣu똮OHHHnb3'ƊU(Ѡb<Y*^YeN7s,]W*>'Z`me./ir?T`qvܧMv"Z 6AMHQH}/RTIdEj]Uk뼥iG-5ZlL# JnȀHB!_e^|j1׮usfնq֛ʃ\ƒfz* B-.TF@m?\bԉis<4Nd+$-bTDHf 56D#sF@lʤV;LBwҎ*~0W̤HXr!R ٶZanJj;su#zU9g$V?:rb3v5AP\±KHT)*%Qd`-je^c'}V1-8ƒ-b=SH1Q-`46"Ѱ6P> _,qWZa!&X]07!n63BF#D 3%ɂ,laE^d4(]',hVANZbh6x6l(CuhK6E4I B"3 ݻS 㦲fL A"*Ps~뻎c.ܯ%s_B^+L5A ځ|A̛ ]AU0*-x?aсτBttWܗLi,t DԘ0XGHklQh*SƮ(fD@$:s|~j쉸eTJ`{]GnE~ F ݌9V$%SJ`ٕLabq9Te%M~󧔜&\ 풋DN 1 'OdIX@"7tGZ[L j~#AgdoOZIE $E+SCOgGa]J=a1c90фJEueTVЬ*PSvt ێB'cg'W8<98]dw>̿8 {.wfXlALAѦ6%6/M*16]VԱ@оcJkѸgRcW H D56ޙaMl*I+}WsrhIQiNjQ/ryPƉqN8:^0lDWޏ?yVS2jx0-?;!J_zEаV!% I%Q%FJnD1o7-AcQB~_D歲ɻ EBD<'P H1xBHþںPZN wpPo*2eARU`ŜGJ;. ]@I^>>FufcLFJʕT6U}0kRE~Tq&sm; IDAT:MsP*LiZUetjmB25 3%O&hP֡T`۴-&`Wa&44ƸszAҺ{Z"ϙlp`C7,΍ŁQk̭\~Y.f̅o}mO0vLl,Fo)'7UU Rq}६%T~hodhܯc Iahh8pt-~PҁjQN"ؽ-cO7n(Uv)rvq4rs}U#1orNN>9I\;a,WAD_a /O<7nZvuRzmtKˮ:!T!LhKn}*s1QmfIKW0FAΑͤP5 d 턴Ͼb`džlBZ\-O>D7ӘsmѪdzN'W!~WX{0ڒ^:E+LK")vX_=v>G9s§^!xu>gmF϶ȨgB!ZB9K6534@uґǎ[ >4$ B jCXС c,CˑW%ZgRQ( ĩ[k< OGI1dAiJ[&ZXO>[n\lf޾ !)#F$Zͨ \n7yPWi뼐xiُ>9Gc?yVz&hL" Ev-JO0zrZ6E݆SfͩL1A"*5\Q!Dad!GX}p$!]"k_؃2ýr[$c ̓_*gO= ׈M f8jXo+w, swHӼ ʋRlbI"a5ry>7G%~68;+:h5*8|U+I #{(-S-jF^=/3K&8n|U\|I]B},lWFL+u^nŅD & u ž*BH$l%fDɈU<_/h^JN14Vٵ)uk5Dqz3sy9ru9rmwu#׹ s*4l.c"xl33b\ ;!R}pj{>VTaReoXid.;Wgd2& BfGS =%LU'г !@+!-a΢wԴwQyJH蔣̢[`Vpzw5mآsƇqHiɍzB_] Y^.W_gQILh}9lw̺e9b&V$`ԐY3z/ Tih;*5B5SCw :Ќ3q|wlhL9Qr8P^u|ǞG=GR*H3Z#5l+Wk^f;FT'j}y'Wܼyta"&LuϾ^鯜ǂ5e΍ 0qXލ6{bXs\|}e y Df)5O7\"T5ɧ#wvjp5G$xR5!-q- G zɷ;|[(wy}wJ  6V.&Bh=)[c5xz̿Jm[b lkBCL 1RDiM{͟)6ZJ &L~h'*kL1D Zh$ަ|zQ+<9!.K$ilyV7ʼv%ֻ58{05Sa?F̗"AY@bj="7xw$&}>Sw<~Նnɘw&jvUH"1uTHވYfװ}iͨYԉҌi5pgH$Fp8vؼKB-Vb]K"ʓ8:.==hl'oOsr1,W/Fqt Y9Jvcaɯ|eex=u8^ ~QwW^\fZ#ƫ\z-ny }-h>P8t_ ԤvZȎ7jG`Qߔ,BGYəqY"a7#A3!"X5c *`I& N(HGjxpvՆՕy?Og/-ł_}0gw*w)pg_w&~z3OB2W9$Ww;\mn.ŋZ].)-U?bQhkHT^DG$$]\01= S% %P"DՃ:s;w ܼN"eٍZ!DU.m8;[Xo~lƞ?~]ޟ?Ľ ^n89b$sZRa 7bīQי T{Pm=$={Ox8y;7X#ylh<+!N׼喥n?_Kx ~}7x_+qrm@UQ)Ք^ d3LsPq.lf^S FTZ%J,)=hb_Lh싃:ՊF"]hH&: eAL@EHythpӬJ1F\{Qg(@Cyb~(3gw/{z{+~}?'?w7/ ?7PZ / ?DJ:{[^yO^poM)iKL ƦTRnA& c;nӎޏU 8RS,_aSb7"=kgi)0 WM<%/:Z2yQŨ-xmf\x{؝UN/y-G62}?!!:G(D {B"ϼpg_:̙Ű=sX Yٕj;" u?nKٻe}1k}ST̥/\ǐ ;8\<Ēy"%Dʃ L":$Z461t7 ]Su.{[k9X4DjJuךs %X$.8(fϔ9^4SUBQ?Ԉv֞gHh[R ExRQ[hvxx{x3\sz_1 _y?+7hޫVqQp<|rxv"iORo: #zt ϶q[믪Na]= eL 09-4yk@ &Қx*dˉtM9?VUz9ڻKgA96rI)"-W=Xvgj, &)<^>ag.'=YA3#f4 wl}U9"cCts8B+]2Yc]Μpm?:^߾tt95T|o< J{ et(P8ӿ#mdf̙(*\fQ}#΋mw. Eay|bL0+?pÍ}mGלa}˻z߻c_u~8n?.T E ۶.7\6lәsl4U4re. 7-لpwKI C]9"\*>)!¥L%Mj'zU&s-U4^(7[ǥr; ,9@"x۳w/9s|[@7èa[ ['~ⵇӿ軿oƏO~7<{ C S" 1Rh \=R WY{ggϊGzyCNgcWrmJ38O3xX(X ڎI \@BK5RP:QfnGE`\ FKW>Sor uaW1QYJv˯<[w_n? |Ï|gsU%XFnoÒGLy:[y`){ K.INfؖ8r.Gqܬ' Hk0KltmĞ|"gUmdZ5ò4BSsev4lEy{;ӥǍ8p{>wNݰ,Wzth|Go? ~3zR,X- \щ M>~?)ncN1x$zK}"@=9XҌ QV%.̑iMNTfl? |o/1$[@D!&D6^mP2L(ʩmW <k‹yx<'.y_+|-+.y盔o)չe㙻GI9TxkVvD˻6#Us<+l ^ˣY~(uo$;#ԗ&Guj %%?8ɪ&Q[0V' !Jj'gLNBJ!<KМo,67>q{kk4+>ޛ*釾>ٻ3&G p>׮yڙy΁_!ozLy9CX<{܋"`@qܝ+ἴtP&eڝ2DA131΁+JzٻhzQQ:r_VvA{"в1>RMZa~Cp_.9Q,=q]q{ڨ#ɟ9ۮ8 zΡi={z@b 7@̳7]{'+Jwt\iU[B-n\.D٧mΨljM"naAՄK/"*iP}H6pśG/xi R74o2_ ՙmahaYWTJ9i|ăG,47}O|u.?S|ָ<;/ox#҅~9 v,H| 29.R` Xy= *ՍzZfdt hqِpQ[6T,T<[TELsp/gnxqN5+"sYڿ/Wtcl#{:lK_ǯa.ܹ{c?wDi ~ pV=K L>apǙx@`Y . J>c+0V`];ZgD2h?a8SLZfqkxfu !],߃_֡&e=4]v'xRRjʿ *7ːT8 mo,=p|_|{wg0#u 8*phA/dI$_KyJȃ?+GD6l'JO߆n{Ƨ<1hÆ)6 3> ᕫY郣\adSE(7Zti.T|ʫ1 > [glWx^+w_ .zDZz}Wμ`pasWV~ꋈ39*.K9Nyu4;Bik/g>LL4lsG=EPBgEl6[QLPO\|a)0aU;ʞLX^X=/λ>}~17>Ͻw~3?25v+=N+_>iU{3u>:? sK+ۘ1j^dtWb,fj ؄Sm0ĩ6xr*9F!t@ wP YXs6H}8_492Qs$A\u̠sFPG67>׹s/T[*/~aj?7'~GJL,ۙ0|c+oyt}zfrΕp8N&G>m4'sc VT@,=yp4+xi02q)\\n4)*aS/mpc5ۑ-)a;(2R V Nx^\*x*:(]O$:/77 6/.>k@=Ax׷,vyNS/YfAlIg#Gg %} %,;XP!X \Tfa`TɋϼQ|4 ,U J2Һ &-/Ywh9C |T}q^8L|JSڅ_3?|}?O(>JZ*)}ƃo^9=ZRsQ0 bE CokafH:Es$1ցքaߌ1,[@˟A MG.'lIH`-ŜGWFQv[2i@Şb^7DV;0Ε N#u|8uwCrh\G:3TcX)C]FB8^\V=]O\lܮ әμnP/fT^>J%R. Ü$>]L8n.>,hG$"WټaN $c Dq}reDOlr`p2f6QK&Zm-ee1[}v&?o;rc9mە5:v>kո~-;]PXH[pYYG*A kDtNrc IgɠJ zwfIFa. u!Zg3epJJ9C=ՎD-P;;%3 sN\A3%t}ǯ]#yP({;fʵ?r!8^]Pˁ*,7le7օ4XnV,3-PZYd 1 IDATEN`1FFv͔@iWO9{JW" ulM#'ҦʴC,JV RG A='^cbl4[UGǀ+vZqWumΙ=W_"/.W~ ?߲7XWycnonoӧ821>sgflA%\ض 4[{ȩIgaRJ2@i  F@YNJ6aJƊuJ+5sLU"09l^Rk~֯?[q~W7~o,bl̋y{ _u 1q܆szp1y|r6\zk/Orha }>y*Dhgpy6W(clViK0SwvH,}!VgxxXJDG3 Bׄ:)G4! cɐĨzAf4 ]P1n='mE(%_>r0L+vNi_[4WV_yC?ȦOغ2V6KFSkv;'(UaT-NGv\lY4HEC}U2R ̂k2بL2(#XG!8n35=4nz2AQ\mY%OfXhPR5 wⰊ|y| /9 <^ݶU94Ab(:5 ˚ F3u/PƆΎrXz` 3ZP JLr~DF`C6gȁƺ5SY!;׊{;$ !$;7g):qk?^5WΑoKȃw8˚.J!,8ņUbH(͑CeЄ*3khVAaeUω6oh(מ/P!Ze`2赥LYR9d`(E)C6Ny 5Z5 Mo4<%K|_~ Z>.W|C>]>>d ~^"[JwacqyyP19Ukz\. !HM%QD "4jq@0ۀIq&wzf& GPvRv@2lH[`mSe=J%Fۃճ~ ߡydM ў"U mT,4VR1m[RDT X{coG̝{,^ ( FXdQ: [,V0',xO&w ×V!Ӊ@0g{B z%J 8x6KkÔW ö*(>;mIwo={ ; G?CA85<+* @J`ǠHʤC"#AWlЋngԠxJnʖg BzC6Iݗ $\|vȠ#vq¡TbrZbs!фA脚cuf ax>C=Ekbj5OcTVl5JH ,bUeYN9:kh$6 r8q"R!I KgH}%5#YyN(XteR @]v]*'AxphkO99G A<,~H#QOO)g=4i1/X|ˠD /J%z .'nzRK)ܽ;3#H8^.upNm}PոYW&iZmh XH3Yt*&GF #˚"Zi@Th4ݟg}[.BJEZҲ]GңR Jc2l=7@rAԲ@L**%sQJBƶ"˺p~OeNpq5R8.։e]3[(,+A;ǬF°Y#&OQ^XqQYb^Y}f)v`]RAe_i.lKGn4 QO4ZBFhl ͈'E@f+V]>kTḋݘl%y3:&zFWSrڡ֖r7Y|ʕh?p~_wp`ESV̛Asml^:.#iµ⛱btu-e"%Zr+Z((7 Eh#6r3mN8ZV|O jO5#lJ :wLH$&0eOXZ̲! 5tf=epHB_`(ZGܙ&޽w)1Z ޞ!ƶ5*Õ#CUWK!wWzΈQbՐͳ^BV(FKQV ܣ2Z9ԊJCtɡGkJf"7 ͜4v扺?;יK%ɄB R2\nsJY+Ȗ&R'aQ4[?QkJTD&:O2,%C҅9aʆP&^UɜD=s̴ C)sjνK.PZ28{{d"d× i|liVK8@qzj=RiZ2;\oEN=¹s^N(ꂋ{K<8>,`F|a(ٰ| }`˽d^ʔrdl3Tީu9(> JTG ) }`Fal3Vc P:JR&\QصI&%=}e$T6lSPE9cܱeN36aHI5Q]R%ʐ̃}#ۛ=:/< IFJўOZ0tWe?JgV%I}vq~o%ӑˉ (VQ:;U/օY[O[GDۮ L:jX :%(TUψN)L3VsĈQFގ$KD啾,.vty΁w"*I-3לg\ >r 2֙J \=q}?o ?8" ]wj#Q&3l~@d&_܎aj^BVjq-ccM-b=T27t!C1363ܙB"v0LYVjŝTR8NBlY36.8!u]4W:#8&Zqx. YY'[,$J4 g3 ]y䲴xe05Ր{a Z!qʼnV.lEJH,(N:.japb,k.3w0_9\)L>PMc:cf8|/5IEYm68zNa{ėݒP?<[ΐ+[wy" ኗ@,-[8~`RgFUMq5Lu)V.؆0DF/AepM 0.b5:#Kޡݻ\i/gVKviP=, cK#|MxUim8: JYf0ܒ+9l"Gfz9qe=_Z!*C:͒eeHP$M4 rTh ~f3d Nrژ\-j-bؠg~k8`b(VFnyQEhM(ڄ6Gj5;AĔ/Y=<Z,o}D\$7a؊Ҷ EIr!|7F@&mPCҸ{Tͤ`ЎK}g ca,_GR!+ hT/JɵYRVέՄu|2sx&8 reb3.3 NXxK)Ge[KkNj4&,:`8j "Wc쓏'Q[1j1F)Nr$ 86$RbH+٘i63JG%ĩqyN@bN'1+/?d2e>ʍd1l109s10)Yi1!cSE2_۳Ѵ%* O[S1T9 cVFP%(Z88L.t*kZE$񅍙IWz9kE@K=Z.ĆPJQqYn#𐉱[̻DP%(ߦtt[@ jmm4l4ls z8^N\̅R8%se n2Sϸb$ot0Yh%zuͬߗ>6zH9Yb!p84G-8py &M9XH`C,ې=N֡:3ZJƙ:&7n%V"б0ܥ3Z]0GX8o ;ngJ8#"yϚp51fmx/v_~FҶB!E =]Zb\1 Ry4i%Y%RВuvJeczeBpڔI,"ܬ7ԾQc.4ZQQODWeNd ~b Bxj95xV*U u*;velFXYlޡޢ6}CUK} 9(GЕ[^2 0AuPaY|(P`cwcБX\ :1R 6ʭҽ6AtCjvC(=r Ggٷ}WdV #VK1 IVCUegҬ d3 >Lػgxlbd0H,ÉFL#ѳId^c%]O6'ޜ1c{V5E:R JAPCnTR6̇fdC`/HΔd{eM0 UC@cx'aMz~T3V…pFx@"4Dе1e - 'j̩ 3I'&IJP<Ƃj"(͐PcJ -;"nU'\Ryq@Jab`ٌmh-̳2fʔ!ơ̘_q@ez*ˏ0aU*Ƣ3QwqVTw~Δ[JG$Rb *EDA *v45}5D_51`/QFY,{6s'y5<,;wfΙ3|ϷfR$]PD) 7X p ;t]GBpE7yxr/2$$}oE_s@H70orL>{F'k MebL0i+ DsL"Q3S~E(S::3鄕C+|C'BR* а] 7E =doy]\Ҿ@kZ445#MJ,3)m"H+,\_HViMEB/JFЬ!\ "a4nbRhZ_*c{(7MȳptߟxȔ%yu8 %סNcᇊ{ ْM7HHzItqda(i!4t)|=C&? oaa[~"W+<v</U0__e:~ЂnOSM~^v ԔS}Y#dZQJQV^AyEecYkKAi 6߁ϓAV#=0x5k9"SRR Lw‘0eeYPs.شq#͇:O?]G .50 أ۶=z4 =~;D"3Nu)F'2 aY)Se_Uof#HSٝR,vɴ_`1crw@:F:u@@q\+4I'ѣ5z4`ݮҭMJ/6C02^FJ{upۚO ;nT7nAzՀ"%A]J!tyd&LPlWB:|e=(E2 2{C)EKK3m=E&ej$P~JMӲ60.o|8di׮ .w͛իWv"u ]G)Em,FyYDt 7'lܫR:}qF})d۶mIii)fJwH&K~~~KMhjj"HyP=555TTT LRWW?S]'''=z;?[˲),,h7]%ߥi1  0=ϣq+0 9wt]5k(++cpu_O8oZիW3qN'Cu?~*_|dG~t⏘={d}yhllW^ex,K.{YA"bƌS)>#ƍ; .>l=Z}Va7jiÄ{݋O?^UUw;G`ȣ0Mzb?v,g}=Sw}P:~uMTUUyg466!=)%w["MMM#F *Ʊm\+۷xS6l`͚5|(**a?'_L2;/~s=wÆe H$̝;_#<5 X"Zu-UUU<Xq)O<drښ&'{_EnN{/'<~`B(7mcvq1Cd̙T_}0HRL1ru]-SPXO{7 WTTpg#P\R H$eSJN2 3D^~=xՄa\eܹT!Juu.+ QQQA(aΜ&k:l<{<p5נ_é՛e˗g^~AYq8og`Rr{,+V\§}F<.B^y?UƭqS٣''GKK2Bz:={V1h~mLӤa[ml8sx(*. GhnnyTWWsgM&&~/,\ [a٬^z>++}H>n@ڙ^.2zV$ ˼P4661i$]w͐?` =pF";l855;m7zKs&=zVq¸R) àOG0q"B!>^'fǴ3ॗ^0 4p _ ѳ{n:'8w̘9¢b_Gŧ㥗^0 * @ssyu]o_lيNzY7^x/6m{aYg_dZ.Xr3f" ߛyb%L; Θ6¢bϟ϶[xWxW^'%i BpWr-پ7x)%\w s1lP֛ ?Pߏ/ǶxzS(,* =z@Amm-x H)п?i"Vu))- }zyƐmL8W^~5/<~viD+9s0C㵼+<<_mhO~:t(s܌8fۻWh]7&p(LQQ'u3 n\{*>szSO>əq饗qA23?,^̖ca ^8餓9՗?v,3g"e-c|,>|,"HB*>eB,XWdFG?/fHR<#Ʈ :DYy9RJ<ϣ___K[Ŷm2H)%}K"fg5ӆaPZZJcc#yٶbFg`~ q~vptݠ7KHE޽03/r,VϦ/`q4551{lN2sJv: ~SswLgXQ2Jx,^۶ou:8|,۶g}HSږ7Wp#Ft뙖GgM۷oGAϪSYQMͥ0fPJ喯(͌޳iؖӦeu5M#zaoƘ1cm՛yyPϵ״,p7oLɦ/O(**+,rsr,Fzѩ8^{M;S2䠃d'D<(#l`Y.\J]qƴi4440k,ZX|O>$MstVF{1SAAsK3˖]}:[m 8lݎE]),,dÆ 2!7'PZVN(bƍ՛)**qu]먨vd VWN˓Tٓ^}9+H$1 r4zB0sQC]&8ќ^}Um:bh5tow˖-[X:rCڍ?MT~3'%_mӮ֨8p GQYhhh$JQYY%lڸX8'NXm۶KMp3NnF?>ÆN).)[eQyyOlG u<ܳY-}z{j׼P(|@II h=z'?=< ݠ!n)(**?T"1WqF|A9謦;SO=8H%O~Jri¶mV?46`̘1H)ٺmJKKRRSS5/)e(i+u\ mn7Yض/ ;1LJRZ <+`=hyyyDsrU\r%-[!C3g6hm{{;;ϘI~~>s"hŦ⬳&m-ǵK0M>g{s.ܥ|*bŊ9g|Μ7T*ŠA5\c=FcC#vZ'sYŲa0ctL31|p~4y2c|B,:|'|ͷL*o悥K9Cx_b:+/l}V&_9gd}]ky)GJ@gw>?=Ķmhqo(Àyڕ4 j2 M(37%ER>zjvICaD?[Z`/Q IENDB`qstopmotion-2.3.2-Source/manual/screenshots/call_gimp.png000644 000000 000000 00001726356 12536560630 023632 0ustar00rootroot000000 000000 PNG  IHDR8w(bsRGBbKGD pHYs  tIME *!X IDATx}wU3smTDB%hl%FA1b' ETEi ~=m={ew s9S & zF BPH$2ݕ6lذaÆ 6lFB8vX@ҵE !v?ڰaÆ 6lذ.09C9nV %BR^ip!$e(@TQaÆ 6lذa.r͆uo4Es,0 2@ aÆ 6lB^W$adRQfBÁ@@$g"HR}^E0E1:4Lyu6gP P_!;RR@))ذaÆ 6lmB'N3f!p8WZo.^?z۷ovٲe>O>w( ,:t(BHU?|ҤI}[ń EQ+V{uuu?_e!Hqaj͆6 BmeÆ 6lxf̘qI'y|>v\ذч6m!B) s̩;EQ8nҤIƍM`:t(Βe9Hx+|gZjՙg9yd{7zl*//?cGoR}TVVܹa׮] `nw #ԙi%K6nܸz5kּK,X7޸|r?ş~mjkk.FK.ikk;ꨣnwN;KZӒ%K׿)S^z%v1p }j|/\19x xǧN_|/PJ#I'4|p&kKg6l).)S_z!UUU_|u3?S瞹sq /B![_~O~Fs{ᇏ8n =\{hl+wq'x"Bv3] s`.+wV#L0ꫯ~jkk 8Æ 6xm۶{ Ȳh[o+,++e3&oܸQVWWn:7%766|p^~: KS7e7~wwB瞂jun?+r&L&ߝ7yg.\8ye˖)2rɓ'\'|Q{W\Q[[f͚z(NWS7y 0 @)3dȐo/ubժU{  zf'<_s5Ǐ]vUTT+(2wAx_wyGmrr-Z3[n%{챺:qN]=X8'|rȐ!LAH$/_~+_xAvWAm۶mժU0v؃:&L8LbiA͞=[Qcǎ3;hnn.Xӟ4lذd2 /|GI`0x75 Z[['NOvWVV k֬8q"8v3f444{ׯ_h SLa;37o?rHq֯__YYYQQtҺD"q\RŁrW[[Oϛ7g}˧Os7x#FR4U8`@ y T\.ה)S(ovmm-qHdʔ)cƌYbŴiӆ N?#TU/6lԩ.}G}`oq„ K4}@ pESLaF9u8>Kn֏?8_Ƙ1<_w{ 6~x衇V^m&L`{Kmm-#/8e˖]xguV# St:{5\{-X@SsygyD"7oƆ[z^{?|755nmܹUUU@(d]yٟ>`('A#i'x"!dРAx<#F7o޼~ܹs֬Y;p&|x3rȱcʲ|׳裏F=f̘W^y^j%\bvĉzYf͝;w4MH$no#0Ə?x<Φ=cƎEkLW_]|~.Q,wu /aÆ7TU 2jԨs9N!s09sg}vdmGoe/?SO)2gΜ1caxĝ?x ~?4t~ۢ?{nuK6m 7<m%7nܸvkf֭[kkkGM)0`Yl2+34B1~O%IbZs1rJ8zկFC766¬E4i]r%=(7<; >s|ps-]OBN|MYg͚H$2%\ra]tE?IbX,^ְ«RJEdOyhhhϗ/_~I'{V#p8t]'0uH$7q\i&gdf`]! ۧ(6l81x۷o߾(R5w?RPrq3gd2ƍ~ح.vmNoٳg/Yr1⣵u/EQ6˗/?#ϰjժSN9wٶm[0-[0fAo{s7c AƍW___QQiZ8ᄈ>n/O<1a„H$'=s]wR)qo| cNm}#;~饗ϟo }>SO=U[[;qcbŊ3fpw饗⋑H[n O>d,cFYLzީ F0vnPs1O + t_P(37/bĈ'|2O~E=s3g|G^y5kl޼!> .| q,z4Ƙ}mF̟?sxoϚ5+ =S6lV?eL&/^`yӧr-Gob2Q?>~믿^EWWdBs>˗/?xvrͩf>fÆ 0qċ/x˖-' ͚5KU%K\}w?'Yϳ|՚̙Ϟ={ܹ?ȑ#_//?s?|SrQFq߿aÆ_~yݺuǍ1b̙&a3gμ1<Ͽk&Lk>˗qhѢ nļxsiL#Lӽ(&LpYgXbرLӷ Snٲ[n 88V_ѲƩSN6-_B(m?9nܸ)S\{p5j̘1MReeewqǜ9svYTp8^~_|xD"fATU]v-{Db˖-fz7@ 6lTUݹs)RWW[o}aÆ-Y?~;eʔӨXpa:޴il߾rսw:6m1cƕW^y)ni׮]}3k$_}i)!_[;[6H׉Ix?bW? ֭[Cg}ewlMӾ?|gTzׯ_fM}}=۱7nܘdL:ZT&Fx<ܹs…l,YW_Jʲ|z0Ng(9sfo0l 3 - zgꮮްaC/#ٰaÆ 6l6<̥K.^x+W\j՗_~OG\w/q1:j ,A2;w_|;,2}'7#|?u|zo裏0=EfͽD Ȫe!f!f]Nr@Q~Q J(я%J1 :3L**/+,0 QS]ݛL}^*8 @s8r.˜N#?u,08"+`qS3:{."1E1QBJ"0H**. \%aJ @fbVql`EX2R)B9EG!(BXKַɾɞ4B B6a?%^<}sذac6?0 SbBɸk 2d!+yu8 8~8a'ͭ0vIz)Bsu=HY(e&h"!80 0[^VV&r$9N$R(d2SU3ľ`D2 iE91FHyE)M$xyC/c].W0T: BDBdo ӲjZyYYs8.W(JcSi$¬Jt%.=nm IDATOJ '[0k%N/'J쨊2, UΙ*d3SvE_ ;$~=_%ۦJ`QŮC6=oi?KTQE'mmm^O,)pb1 C:{=FlIR!.6%?z:voz%~~ V.%9.01zjmF$A+ 斖ښYӲa9,Gc1!"!De!nqmmQPL)e9HQUU ݴp>iZ,//+39d2J!jjj(R)9Xֶ*B(4SXt]oD p:~ I֣O6 #H0$y<APSܬjZ(rH.LFc@ x àc$ԟ 6Qus. kniyLM# %nJ)pkkFCg20qxRvi>B縪*Da$rM{zwP% bindh4N{^P($467+L*P[Kihlw拊5t]QW1Np"nwFQ*+*#|Ue]%hqqI=I$3;N iiJB({Nbi!Bi</,c+͔`t+^°< %󱢺| 0A;d 86b{SSS--Tx (8-iimel!J#RАNEAPU J0Ƣ(ʙLCcc._dud/]E6[ Fq)A!viZkk+dCS(x\Qv2!cHAH$%l `/C-J&00Ű4@մd*% ,7æFKkk*!NܬiX,Jz4ٺ?u]ohlLR<L${.iZ2Zc1#k0:nKd*ڊmuk-LF"d20aYw;BXz=({TUmhl۵+LBRߟD<"mljڹk˙-_]]8Ev4MK&|M(mȮfj0cBJ5]gd RLߐ! ֖_u3itHl~U[,L%jM'Kd~$;1>- 0 FmE1;$O$ɤ$I`0557) "BHUees8,F%I xlR4QnJiKKK<gjx<h48HDʊ q&ijn'?B)0ƦX,V^^L Vq\mMM25MJ`9HBrY*~{a3.Q"osYYY(lf'%ƸRL\b^' y^.Rj`G]]1J1?.((BɤEi#NP4e1FcL~$ 0 H$qVt\lReW}EUfi(\.]bFn+H!^ܣ[򉃎 rWYQ!*gE$IDBEYͻ.3 RJ--L1l 04M#{iQe.U|Rөi[}$EQSl9YID"QJtEbN# -~XGd Jһ ( 1% r:xstZbhmm~DQd)q&q{,l݄L&{=@Y(nN0*+k)(-5BO)- d*1v8ƞM6L+b^¸,jbdYEc19f'oeee!x"HUUU2ܙNwdZ ]t= 6 LLRQ^˲L)|Yl҂JxM< 1yn >y=Vg;0qH$g~Ds49ͳcY214h؏r, ̼({4R \8QȬR JMTW3+2c\^VJRdٛYö2pp83="I$b~X?MG5Vd#)>`}~C^?-1K'bS_%(Hy=^&%]9$.0A}E$W@O5 hi3taK;{Ŋ*¼v6Zd礷AT*x(Dɰ}?JP,E%##LǛe&gw"TUUEb,XtEc.$r9d29].EDy=kWp;[iw45!T4(/7e0>v㊪XlJ8tpJ#(&=l>ן8Ȫr{(ɬ Px0 &ϱghw"'>ًLFeEU)@[[ NML&d(,wU_/I(,V)t:UVTE"mHY(xyigdEɲ$I3OfB֜[1dmv){AEQa!gK[HVeO[ dJԌ% uoXFw vnfFR @0%(`4/KW k2?D;U 0Ԧr|j:LQ 3g#+?%m/'*߯i TUYκ}r `FY(,((VWUdwX|]3NrS3y8.+dE`-󿥣-F^Gݖ&`/KQrQ @,5J4VMCdi 5gzD F˴Bvh,VN QdyG#%˯rK|-<208$YKBd2*]$+,b"zֻ% 'P0Ƶ55Vo'%Xr"f՞:/!}~JH?%׻;٘|+wm(!W)C 1bO=ɨ @Б {IRsX9`>*eB'wHE*1 CtVEcC`u]cIvpb]vobPfe>k{z&_JRkP i7 m`9YHMәFL&20ZC918`<߇u]y˶ٰaKz۷~rZ`Q(82t0Fke_[{!;bQy$gx8V yxza I6b^c;tٔn¬p=ٗ_,gJC}ケ(w@}.^piJuxg)db1]Jxyv4MI;||X//y^$UUYأ,=Na1ʣH:ԩ>8Vbu/aNhRP>0 (KhU6lذaƏObJ&!(Q{|'5]$9 ]gA@^;Q2 4bXQYUUY$ʎyQEQ,ڤ&=O3V ߧi*_;cl˴!IB}01'CN#P7n3%ꮥcRF 0ƈZ2Kj[lذaÆ},3A ]UETUUUMUuMoOR;P(5{ؓ^{?cZ?}AϖwIELF63[[cXdY8pN *Hh ХN2[ M@ DQf@]-@f-ͣ Ѫ-KA`/⋫!ڌ,,UrT4V% .φ/(n(7*q۰aÆ 6W0 0TUQUETUUu]!70ׯ`< yTRgrE %⪫U1]i݌D)@5*bT(x\bq6u]FN4. c^47DQdve,|;K(wi]fȲiXfTW0=Ol€8@!r )l.FB;e/̧pXQ8Js@ 0K+qMBQz}inX< d-aÆ 6~s>!E`|ݜc* $aPJ ]Ԍ{_/ٌDbkkkcc㡇ڝ?iֻ/vcL&eY6 !E^UeYQϗT0A83*`F,c"ExX iZxx ;ȸP(dc1ZNi : ~Y (X[%: j6Ӯ#m%=9,-vv ܄ah$a~ٰaÆ  hg6)@mVUWL\rG"ɌV:!HzW u|e@m +E=hia]]Ygk׮7x?yl]ݴ]RWx7 ķSJZ&I ArN. X,JSXkA(hK1M])mw4-NAɨV%I3<`5/:ғt~9xF _DŖ]-dÆ 6lG} Rt|A[o1&[wA oCuQ֭3CXBЖ-[ƌ3mڴŋ_q-y>e!HB߹"+W&RM!Eul\`Ji0edk躢(skqJ1bBEQUL&vMFkrVY>{RAK?a(銥v& =RX Yj=Ub߂Yv[kÆ 6lJ^KǕ$8L4'5S !mWAY?3|ɓ'Օwt IDATkjj:C?|%Iue*//g&UUEQ8pUO:uٲe{m>Dϟ?{?Rtɓ'7$E͡RUo6QWYY 5557޼ TQQNiii!ASeDJhfdX.pp{s8\oYU!3ͷWZ!FYvPv?~z퀘Г<((Dw@)SB`P<Ł9r2t4v/DrN^ :vlp%;̈ ?IV4434O{l7noi矿+C7/pڵ+}|ҢE{W ]d!@2 yNfrMU'!@)+Vz}ʊJRD#830Vԧy敗\3<ګi*Joƨ-AI(э#]׉a 2LA js݌*sdu l3ùu)a$;m3_"T8RYKU[J4] iR= YT'V|>U^QYQYU;`[oni9C$Ir=>۶mceWTMMM-3bE>{X"f*eҺ/⠃h4 ynf˻Y ~ ꫯ:tI۷>s=L;WQ`ڵwAt_}TӴV546߯-A^WT:]`F.m[h]) ??Yݟ=(viaBrg 矿{--:(t3Xt~}3q!d>Hd[XJ=dV$g( Fz`!zU9Y=YN̟.߉NVr\,HE:]p_ b<6qNSǃtҸO4m >^4\.Moz^c%3Ya<;$R-Nyp0g-ЪիSig}vyEeFmŋZMӞnj,Buj1.+N3NuMӺԣ:N6<cNUUs,.I[Y:`:1B(2I S)ҍn:L$ILςik!oAP%߅/K^w<شcGv,9== q&[r|%QeY|a<Řyb钺J#6nXOt B)1 S)럂-N0UQUr͕$|IgqƖ[Y LUU_=bŊÇϞu^qܼyo|cEy-?|>f0L)Mppz:-cN' nB Y/3UWl9[qvښbx^0YZ;6l+.FJǣn{<~nU%x~VUOB|" 9؁0Mo˗^'徹(… ׯ߰u뮻68I.{W1;]`׮,x'^uUC adI<7IW_}u˖[ng&9~&MȤIoƕ+W|ߘP&_0qwz~0N F0ެk׬=S**xI?Ӈ~xҥgyO>xW\O#m]UU%N7XvgDN9X-Yd~衇^dIkuWlE#Gj6wؑS(yW^}!=H$|ށQy{&S JPt"*HG@EY e-IT@Toյ(U׊e-TiRK/$$3I&3wf}LaL@^;gs}=9MC3 zcFi4/<{ɰa: OйK'zJ<}I.#YbŅ=1#=#311AӴ 0pƍ76(骪"B4V=$ٳgYRaLnBYb#>*Q ,Zݰ!111ƄKԬ@uu+)-}_[DUVV 8ydZlye ;0p߾RNh:tLJJZ-(In딕="US愄gx'F^٫x<ϸ~,\؄YBJ%1DFR*6D$kb!/;ﺫu3gb2O?&Aq$|gW+sU'ڧ֨\ecH`edd_/_{Jfff0<'%@G'Ovm@=@ :4wΜdzڵz}?x}M>ԠjCϿꪫY9W^yEg}dɫ"5PM:uNMM3`0𢇮fڨ/}._v魷κzꔫ\)Ț1c9:UM#M 8[dJKKKMMMMMMII%j;7d1-,\ã SzI'ˍ X @P$JD@" Ũ2 8C)D'BwzfPHߒ:#-!(LpKGdDʄRH"-LT=֧El:5Eݎ?9?^|Z{`i+8~?`;DX1-[M*WQQq=>oukǍdzfTW;6 ?]=8cGo,}gN<eԥ'gyfmcƌ8p`[WUuʔ+7󕕕LfpijĉÆ [|"ܹsU'O|ݻw4)ΒlZ7gƏwm]u_tl̟뮗%xZO>O?}wfڭj2t"w:ء>s'\1q!|6 >ԫ|Mͦ?pumSSsGμd1ㆫNe5kּვKo,bʪJI?׭])oi+~Em/PF=wy՗_m$MﯪrڠO߾~a 7 jb$$&8QRSQ#4?3bp;~8ٷo_˖-cǎ _aw~|>l6rlJ}{ì[n8pƍ?磏t:g}ޮ]s 4p>)00Gh֢bq\b#YR޽cǎݵsG 9sVB9~0?ua)J L-=,Y;$lao AY0gXZv1;3KN]tܦjeqc%33X-ZhBkxNʲ-K6m6|c]}`0 t:SRR~;αV#zo&%%E '+td4(+h6[:$C45%nq1LNJ( +27cL4}к¨RYYi٢ EaK9x"}')+++Ba'qkDQHD6+#I*'G`@@"'ETCQNYQg`d4 ꤺln"iLH#^Y=Znii)FtJ|0j"˅!ؤI_|qۥk/#d:6i  𑔜޽{ϲefΜo?|g}ۻw3uIQ'Nt5;;iy'' }iٲeb GUS }q}~w'O66ц0†`X ԯ_.dn;*\C 8~_}ԓO n?X] u3EEmX1uEdyeee8d$px<aYlG M8Y5"B) #&t3Da4ҒbpukZVY".FG-9"64v[ӴPZRD)f2‡Dho#;BvTjO!'GuiW UU۵k;g7\SSCt>w\D~2F^RRRYY4Ν;oظ?y7C1!n;p}'ƎЩSVn]w K!7f̸ r.W+*\3 L4W[8>5j܄'N|_|!Sח.Ue[1}F7QS#1HӴ[fͺ}2@"8犢HxnyIoЇWM$YncT :|+*,fS@E6j6!`p'Oso%KbeV$Fm9C Lﯪرc N80JBdY6MUiia˹$IUZ$-f8d2M4bI\ƛxI'2䧵neh[$ x0kZC—=|p#\.$I:`udasHJJjVM7CJHH=z8zŒNӴ k\>TXsNMg~MSX/a93A?lWqac񔕕 .F Am6[JJl:h29ԔH-rzTPB %,R]72mWN3w]1 ?mx9Nk8,b9elټy/jJJ_}իl1,326mڼiӦl63v} tfddWlڴIQ]vYS֭.uq玝ͩ魋Y~ ;]t kt {٥κӯMJJNKK{#F4QT OHx`h d„?p' o}-Ǐ_zulOl޼ExTUKaQ=#FhV A1wu'"^ycƏgO3phlc䥱c2:tko^rj(k׮]r%r`Nh~(͑3&$//=z$3#i4 D @xz0MTyek#B29z5K7pCjjJ< 2%I$IĊ*Q,THk|EQ^oMMMЃ@@+v*\k6fh {՚Xɿ)In_o}i0(I&D*@4`(,6%c̜ '7%?EM~쐕.ED0n^42 B!fɐ3rk.[Q~]tʖhnvm^qղ~򊊤쬬0޽{׮իj4p-[A}lM6y\=6 "TTT8ѡc;n=!!`0 4x]۷o'$'WVUiڻwA/ucZssn߱c֭iii&.(55O>=55UsNYYv-ݻȲܢEkMCtѣG7sޯ_?aD2? IDAT۷ib Kb#;;O߾[lxtl =6#۷o箝;wvݗ ־C?ջW=.yjJʆ 6RکS&zkۦnkPWO%yӦͥe:ȸKwٳaÆkM:t,ڥˈ×r Cٸqc5p.dff2rYfmnjD @0hv%"%=٣_~ٸq/ȏqةSHaegg@ݝIIbvӣG쬬&\7mjF֭[w=`UUeYNJJy]pЯEڷoN97 ={tyv$Q,vcLknĄhJR[0\ֺ^a04o9Du#\[T##'!r# ,~#1}IŢ:Se@a](!p랫zVWI#y[$춹sW#Z4GEZ6< u)3Cm_$D$n: znQ=V!Gnz'\f^wg͆)<6#t,]9HF‘Mybd !ČVWX&_7sS~S-EsP4q]]]]QQ䭏~q㦟>$&Zrhv&Rv\E}Z@iiM霅B ۷b冾1$=zOmF-6Z %|  ꭭ҒD?FY6,NPNv~qDCQ"kkEEĈhT>0\b nOkzQ׍n;@V"jGd"!_=xs=y63]{^זOG׻@M U!96KNKC=1MlnTdQ@Ԅ7;3 SATXb,nQ4D <ݓqR.+=՞lY}NII2Xff 'wUUUg6q9>ѿOe6xzoxQ7cCbgE H"; Z)o޼$??o逿琪~mVv/qS_n+/Njs_4uΝڅJ|I.wuUu&zuOa✟(..>zDӴ[v87TLn2>3>۫Xp'!J}#~r;)40 ? %&&y~U6 L83Ee&)N->AUujD=;"TWU=|PUqE@P  ]Ni?pK =%GR(9U! 9]2G@s H"HDBQdPJ =$?S8] jiMxъ檣)5Sp(&}WPǂ/l9YRq]%NqSߘ,Vu #9r5M ~ʲG8ۻıÔ1sA.~'jr`đ8%zxlChWMZWI`tce7HWW%XGU ,4%}$>f\f/N]~pa(0.g|5 "A9-=B::SH))&/qNư`]-\i1l w :$==]өNOwcp8?"q)F@|!&Ih|Ϸ&Qdq&sd$Idibo\򟧮}cنcRV<`Qe˚?159STJ39SV_Y=zKs/AU=ͪ;w2=Y&գp'OW ?8Wr_6{lR^} wueG':JJRRRв~핓;z! P\=N8bo& P4HQnj2.>ܣѷJ`0x"GBShN'7vd/0`А3U+~%#.7gD=-[Acozm۶wyמmH#XFD_{a2cJ==w_yEٞ 9gUU.Wޭ۷imYcO"!C{Աӏ+~ԡg$$$*D^~㭥۶ z> Bn4 gj0( 0? 29{(~vj_cDY/s{PfsuO;hipGa8=z^ֻw={ֹ]wnѢž~i$u~Zcl E iq=~Ymwu޽{.]_'бClرcWMɓ9?p'$$꒒Ғ@ KO#:DzzaݺV|hB$B)%(It/۳;eARY^fMN**N[#rD)%nK/@ [pUWLH0jQJ~?doF_>z@ 'ȁ 38-e)=UhKQU l\/L4^0*兮ϯl+H|uk@Y9CB" Ĝ2Բz'( JH}a*$lWiheC!@ $CB1t'ȳ:effֽf4{g~C?G禛n~kb6hss-=ڵ ~XSLRpfκK-[V}iMMMtlhы? `t޽>G+\ $-55>gL\`88c6E45@`0ѹ%D%Zd~0Q,ђ8i0tȐ+&LxŇh4x z~?!DӉ:ݯ׭b_gL{%n׸!YU3 uλ5q"Pv(!1<{H5d52iu:`|"^gXhdLD-9i2Umw5SSR+*K" )X vնagK]t&ug"S."`gyɞ7on~-ZX,V1vON3wKz{ F" A @ۊڟm.YGFz?>;ּ|_/k!U))N`}BsC~PJH}(~#YֈWhdeav8EhS0nB83%2FNrd[!p0Xݹ#@@ 'Q*Yo>cƌX,oJwY~_~as$n"r!ǎ<{i~L]YiIL :7ܹ롅 =Xvgeg=m۶ݼisnPagω [} F_}jj5;wΤId2Lh6B)*>9`$Cu3gzGz=jׯr# c3?=LFPbbbxN(KfΜU]]}wLfLy^xo߾VUe-$[z}O9"rTU͏|Uէ?!F"⧟}T+}BO5rә"svX!}پs"s;uhZwBjOa#qE?~,-5Ԝ3tU{Z8m"GwrYλZ^ ™/ٌZG$PO.==ch|۶>9ܽ^R8rNmb-6o|rJ GgLu}N^q΍F&3#]m֍6u-Z\-ߠsIXOI; [;o2tlN0Sϋ&H$V^Dy4 c* ŵGDʵRȰtr/V1o+ ,nԽz{[DaD lň\\|,==g$%%ɲl6:h٢l2=RO'11!hrt> /,**,*ZpUtz<,K[b\pa CiJUG}xñ}g'^#GƚҫSBo|7?͛&OtJbʲ\v;?+-wر5_|죏?.))^ p8p zh[0~N0a|097n`Z$I1џ~FLf)n[De2%5^LLޱ6oޅ=.,8at:ݯ$ٝNK^]d .[vAG|EU`_^WNjIM7c&=~qF5rG=~,!{( %mX ZjWqW>K&zŠAݧ=z ɹ{ ǥ`P<|56{nK0#/y}~,sB g?6G9cRhut vDG9B_|>RjE "vX߿w>é1 93ΐ 9g3kc.;vCDTJrrj.}ǶeVM]^z9]s1m- ӭ={\v${ㅌiMU(Y/sQvv7o Y(4KffeeeD( N: u0V!+.A@`pzDݻΝ;x,XC|pg~>i`0"`p^{},ˋ->|DJIᇏm֭kUe+O<?c>}`$Y- {XPژ_ {Z,mZb45C'd&#&0Çp "`p͇y͝=gNBBnm@ 93>W08XVVVSS#˲n/9Qrرbח{VZKJN펨9`Eyw|+B4qʻs_|q߾}1-zΙLXX fYw- D>o%4ddQBB4M{{=WOʜ`ѳn4u{E'^1a S&M 5FO?%!RHT 4d啕nUQQQ^^~ҒǏ|uE)Es !_+O2n$ͨ< *|>*55JMo 쮭!#FѸ Vu7^?ݜ`xO%^'bXs3[dǸzޢl0z3@#iWN2%% !["l"k ;c))Nykj<3rI֥L0'[B'܍d /_UU]g>hKk!%9%iiXۑr07j=k?1-sޝIΤ&L&!2Xܲͧ7qs ۭ ^QVvrt6dfⰔLNcT <DLLL6mZ>ᜫ+(s=۫w0UVVjuQwnx}|` !BŪb(H1^[H{,~ѣG_P0gm{_s4Mc1c]١cӧtӍ>4 {p%IZbŅ&%9+*JKK ̾u6Gdɫ lᒿV` 9 !fiF,CoGsjպ&6#E۵ IW_ݶMe>9sںL:d_3ęL(IK//[6[W;Ō IDATqzhӦ;׭_gϞ.r8o`s]'_e}̹Acu B!W^Gip oNw@t& 猉9ٱݢ1Yx i*״P ,ۋ+ _]" w2!!aHܣG  ,WAx q_m6 iGիAh]^QVSSjABhNHmv5?n)>"z=yo$IZ0{e3&z-rs2쐈"&''͸v-30ޚ8nR۶mEZDrxJ I7~h۱%Cn6z ? (4:ĈnH8dRU'))Q}ž!S<*n~;EMEÊYmo:AC$I$t:C $.|wxii:%%`ʷ>bSN'I`` `8Fi`?%⚪& hòN`j ?+(KÇ7Nr~ʠ{NΚV hDd]įons8@^9+/S\9+ غu zbycD:CFg2u;W9rkjj`)Ïd8c]wǙL;nw=wϱA+{:guU|()'A\ PH؉mVPWdY.-->xn$@&S/\Ծ`iiMciL*[=k( aT<"t}\O2}ُ[?^_2|Ia9GeܯlBS ,hD'X%jcxwٮBk9R=SMrb r)* O3o]cƎ3vƌ5z9=f1#2æMCQQU{Ci 'Nl1ݫgVV0J4D ,ۧ4PD)eYӉW"ݬSQAA;7zͳ[AQ[i]nҘf8 5**zH:%YD6IODJ\`(}ÑpKd FȔNJ0Fzg!8P~HCgL#Cd\ rUE zUg͔e]9?kq3!d21,xx<VKQYuujKڔۚXƘ(bzo6q`|`|M`vD T ~[]]U^~򟯽5n 8>Q#TVV2Dj(4-==С^/9٥sW!}bS45N5zȑO'zЮݶzbЁ-ӅJ-)+9^|h[z``5Jul` U՞§~g$I?^5`iy+}zyoC 2^F jg_ ӯԞR5#njSJYEEE=tĉz]YYYQ3O<8w޶Ym652 TD,--+>vĒ8{>˿f┫7WwZlĪ@dZj~~s8+tBHX?9@ z^s|.vZ^< pmIR6uE(#&+S&XY.^R'{}A CG 4TUQU?*#TP '|AQа!s޺ukJ>48t(Y6m9%*:{hڟM{Jpc%<8ga-9tnJ旜qͲ mϺYrf0){Nɹ߫m߬%{%$'%6ir=JH~!QiIɉf! x<`Ѥ O2BǣRqUK6$8Ɉs$`HBO9QZMC&9RS}~ m z囏֯(5^'23R7o)EdX.@ͶNY?c ÑWa:Bl~Hm}t3IgLez1Q;̕S/!t y+M UA)W{0\4t2M&Sfffjjjn'sWE/>rtBdYDD`BD)|壶neԈQz#0,I >Q;w)(gXsՔ%JH2o|>lk!EJjCZl"n1Gt>yhMd$),\ M&pB˅D(*ERXU._f38XT$/wU05Q}1Nj0I Q*W$١( p}`2'yl1}ra^p@bPļ|n4j6 J7Ɉ),"~\WM&۱( +!/&Hr@bTr|4 EWHܗ8PTD\W&QRCc7$=|>r<0 EKnjN')ZnO&pEDQ톼|0.ƥ lB @e%DCp L&t"(`ON'QEKZtL&t8BP$y`2DQb"j$9 v˅djBHkg \b './M&Hv@Q!|vC^>5݁E` ;)r|4ŋv~LFtcb]?ut|4XA\.?L&pء|~rCA$$C81Tp1?&Od"vQܡu'_'Mfp:` d,.vPQ 8=/1ji~zp<00傼4BuybBWEAB+rcA>CQQr}hXSPBWCX\7l᱋SrA~10(fl{-p &pBaraAMpŠEvWBT ϳ14pBngq!W ,zX7Ԗxχ.?f#8b|s^bkWmHQh P VboOAl&Nvc^B* q6 AQ yy`4.&t"$&'8mLpBaa:P|~vC^>BWHhMp"SELx| \<0aŋ!@ h )8X)X|4?<r|4'PC*,*,Gcݡ.G RTH}5y`G į_=`e G=z4IUL&@n; Ư2Z !و@jԭk9lvD@({XUUӦee`s#D4cr,]$Uc!!1D|_}c> ԞAm|뫟}#s/\[>^xל95^aBDB >-ͩVG%LZULoz= 9 g&tjHvoHXRױ'Y)~81*2 4Wm~ܪ#*+x5$I,Y=bN®_S'RFBT@$E3j](&ŷu⊜N 溮_Q?"\d9*B{(2 "L "vOπIMP`qddj+G۽c~99L8rJHVJ eH%B8E P R*e PJ%r@D1$: PBJ pP2eiO93&l%9'Q.HP%@(R@ $"H!pP$*CDN(DPԀHTB4F !@A p5ZT#\#$*K @@΀L A$ _!CH֌#@ Ȅ G A%HeP2BIf4$p#HP  Ȓx(H@h@$@YjY'1D@`^W  H a,S@J RP 6H%$Dnr!K!@ch[B/ c"2ŬJPHq5JS#)^"T8`30"@LP% ΩzƹF 8 qHAc!s9^:"Q#$ rd "H2EJ8GTvneY8 PgDe8RY& P&0+H P 41!R0y!Q@8`DG B[KH<C^DuHdI P̡$Amd K@Dr["Qʡ`=1*,Λ1Lp\D=TFNa,~%94 HR(Y7YFrLR[i L~hksc$i+A3`L6D F/d|ND d`G{tm=yWDxDlnn|C[.H_-<'g1oK;Ѿ)/袻kskcϞ=W\~Eygkwcċ/磻 {"*r~|w>9O`t;< VWW>|Сs9]tڎΝ׳ 7|37OڞϸY!|_|#6\#mwG[VؿoZG>k^uZS驈NڥL^GKb~/͜ / =ᜳݱrƆ{εctWO@`HDxiSL(6Irs{.%e`h&2?:bJe>牨BPP|IE>/~_v;_{++??˿_w[yL1)|lNk!($ݡ}X EFY>kDs10(I@i`2X<2SE8F<7@k<Č Ɔ&W/)=Ap> A 3^ě,I.\b}b/Ŭ-,8!$d":X  Hrc"H)%h6Jd { 2N3!?kblHg#}f CǠ f!@C$*)",m AfYN!`A- *Sc; %CC'2 0DsgVK cIȼ[Yef7[]W;1b0_ɭRR@,2*$ &3 'XEP,$@3ha 1Ɣ۹h^] e%Ă5Dhp[P`QSՂEE*BQ49LwI>(IJˎ@1O,' iB Eu)F!}Ifkף}鍟Tf,_&4{?^twy'~qs?c^"Cv#KN`vYwಙ=Z*;vܱcs>6#w߷|ǫ|طo]w/xOCʤXJe~[lߜD~hlUL8څ \ӏN?fOl6;Tף^-S-i+ UImډ`1yu|tbl_q99ꧽaɚ̉/sDk ~~jssy3oճ_ׯCڳ/F. 2-d݊kQ@aTnTd~Kh`#cm "+,2r^G yI@f~\SC JfbYzK#rVCRɰ|e`?"[(ǓD 5Jceɚn 2w+?D\N< (hhft.{FBdBEi'ludU16:,ȳz%d0[&H DЦ5,WUYN9W sDlD3'4ՎhYOSN'fQC`MzG4Y#}l/rK\"z(0?oNc^!^zCD,y)5 *#dY'+P]m#ƼJ2ˍrWԠ5J Mt>;;$ H9FtT0Ckw_־Ҿv^huBt*מ1Vp_&sħ9EI݇) FX5(BVQ@" [@)hL9q#E^,40X 28rU]m/L܍ry$ВՒxtPRHUbv0g4{aItA'>0AMuyY&3Ff5fEID#fu€P+!Yz Jd4 21~, 6{ #e/*RN•lBoNh ԨI"3+5P4Է 3E~0I c+# 1Xd:\٠Z>XL+ x׽/|;v\gox޽KCq^|מ ;nKZ-#3?u Rqr/?~kfz]#s_}_oÇ{# c*?r}c/oع<m4՝L?᯿at۔Kh`TI;NuG]$WDjGf^1}g<7x.<"vرd$H 1xVHfL-dRp|K&Zɀ4*$D@` ,!ǐh541Y5A YPNiF4BYQ`p2+ lИSYMYb`bEt`NYXO i>&ea)A@dXNXL5 'yLEKyd--X-50Ӭ8p%T<5m²_dD%J"[BzuH&~,* ILEQR:J:C( 0JNRGR˷IOL T[B""ZRB,Fzy6*S߂ι:hkoͲ`B"($ά,'P/'ca|zjﳡ]EcM&`v>pcG4uD#:(yP/L蓐1T~,?inE-|>{( P#m"/F:&ylM &G W87MwD-2DP"S?h|Wkֻp,.z].O&$-KP0-pzv,7/wn HZNgVm3Mh8%ll{I$LBD"7F3Y!Bni4$0$8}QXďؐ>%[ozU) fvァJw S9|{u(?33zڎj֞3Wؚ Syc.EK6˶~?qOOllll\{m!ѧjLI^5!*8Ҁ0 [ @3D 0kfp@I4$ѻf^edFY} )u0Up!R0aE)s^Q[ZP"goU+zt )O@*Tu|= “N , OT'_!I&R\b{d>ַ^^'?HZ&$}U'Š.€R4}@?/v{Ԓ0Dh- r5pf5uac3fO Pti a$D2@x#2Yok,F1Y+UӐ *x 4Bhk\)lUc+)TUX"TӉ혬T!\*2^U^r?,(U Yije'w>pZhĽESDYvĬ#$~2M̀0^MjC>$ "I NVsLeWn;y٤`'>%2H,Y%+ # g~H =YH }竫0Ԧ8uӵ6 i[92nadmS KX0vP1THAGX@ѬQƐS)D$].Hv"kĴ v[`0،lWx ::!N$3瞫^a~o|\?NPog>O֮Ho3|> Wf˷|3 ]-{}ܜ;ٽ;hg>ý}DMpu}_ܸO?O|kqgxuHC  W}~1i~I[znT:]KJr%^z$qтu&9E0a)4]|З9tskyox/=wс{߼H)|H4!Yt j9ױڧ޷3K@-j+rv`(h1oma0Z),] R,Y{WtrUeso侌(7œOPTLMQb 4N!;h p(ES\_,ZQ@"vΊOybZ /*C@7%bIdT,rji?Y:>I}&I,,Nzc]IIE-s*0 1V>!rԦOڋzz҇av귫rU5Uu IdQ/z(Kq9 IY.`T$KEKC#HDhM^gSs!2*Ik9'3jgeFIJtjitE"$j";|?3ȉ'3S*VVAL;q'; h,iV!"TwARv3Gޭ D`䄡tr2(~j!ܺFGO@̲I[ .D޵ȁ]{bdDn 2p0fitbb/|)[l#9EAL3_v Xo_=쳞ԧp ir$+N_iQ عc$4HnQ/{_]WڵYvpef+{Y]gmh>xq =_:*ۿڡ56 5ob*a__YX.|dz[|frΩMq"Oz M@9Uwۄ,Gu;kkkQPǾ9H aLrŰ@b(i* 2Z0)؀ m 0Djs3WLn 3 X]D #1 h B] Pn<-b (4,&DY 'Zu%bhA9Q"CQELiZ&ݕ7ƦgijsM e.j $E8ኀZ6B4S3adDTd」Cӟl"=dNPB fE%Qd4Ji RA-/S=f$1(ӘdbJ% *M|$e 5 R4dafQé4d6a@z+X-G2f jjơK&LkuW5BJTEӫ@ (^iVE+)۰Lir Ѡ0DΒbQFNAZ`2y`9>'lTGycp" 4lhA,OjԴh@r4E+rFit ck̮&4#$WT(eŏIkJN"t-̢uZM_ &C`w"{!A?Yr6B((L`44cGwdc,38,5IQ0ZC6HCb%F6D#9`jf q 0Q\5Q>vHT(zAi9giW91fs!j nI.V׽u0 /yK>tS״=c玝_rf_n3mN3p(%9OK; ̱f9S?={җ9 zFiQ 5{R$xą+z1ӡ{pt$ ! 5NTI*-aM 3v#'M&dFWNf ̧4!8r4Tj ʏe4UjP LyzhR( `:LMRt̂&AlPº vvhn;Xe:f%C^,ӿ)mI]d*lz; D[t^U3Lʃ\ zZ/XIfu(p6@ #r--:2MUZ-SJULyDeAܘ :Qؠ -Zv{`)&@<@H-M -^AQI-^4VʄXeqWX,$:eSux3jvsX}eZn-\het d2Lɦ6!]P/5D0a( e'P26St r'1 uғ%X,T} fNqS*# " T},\.ub!0fPIs-td,Wק4!8:ǜLvo>MVaվȐ0f>_Ӟ3ϧ[r֯T1K#.|ٳ.\X_ښo Vf;wܵah1fbo`ǟ?~?h]W6ZDDeGkο݇fzd0x_'HZ<^:Awg`*pH6k=G^|a>:4k[VMW#0ȐYӷFkL?}+C *AM8 IAn2b|vAMUgTB8#2$7 7ĘJӍ>P,q$5kFΘKdJT-;O%“EhNu?9-вę5+ݮN>h9O+c3Y5VH,]|Z2$}P +d΅J g oqr, N=!ۍa& VŪ,;LL)+T2yFovlUrXZ0q[nlVSƞ4V|[p6S&ւNt:r"d5@qɓ{Is`KFΤ'*)%~5O K GA.Pâf ;G:5%zM dfk="MSCiOF]D7`]%@L,;}ـt-J=JzbEnOOC&yybE]ug+tDVex0T3Vm6kM fۘdȋȴ>^Q7[gY3nzAXiWb2 k$/ ( !k%n!e5 <ݍÇɺΗJWcD8JIsqqd0LGjA@u,CZXrR!xo}^zՕU{|H`z!o-VX=9JgZ֭x GW_?tPˇlĉ==59;*~NGPkis|ck+ֆaf[+/9apƓ%keqڮ]}i/{փ>`mmmݧr6<[[[!Z[YY ɓS&UqJs;)NnLWlWH֦6` _>'\Q3}mˈ\:Bt\_TXǷ\zdq;Gȍ}SѹJDFDS@p&=܂uP *$b,3`V̱7EF*El41 6PfιJ LFUNw1ŜfXn, tUXa K:SP$3j D:gL5C^\3Rd|%9)E~+DU AMfi*ŕK2ne!~A:8'+SƄ.l,e\ZaY SQm(3=ܢvTuiwqխ6rQ,`4/ T~+D_t`@)&])}Q↬ pdr[ֹ3Cped^}-'x TK[,?f}uP:cQ@Q~eo2}] vSYY-$K[⊦=.XhpЍqeQYJg%s]AU,.f͸`x4W%e2Ԡ!VK"_pdN $pk5Y7PZy-{dZ-gcLzdH$#Y QA1rnh),;3- _% 阌lKjM:h,ۀz3'9bA3Y~xZWCtiT9\ьhJ`ŝ2`--(ˬWL&6,-]xi$@f Ln2]c/6M3s4c5?p#/Ǔ?OkΝ/*Ȼ: aΝ7/a1z(`8sumT$fK}r'm=˿]g_#ε]˟Ku.+++Ϳ>}ݛ{:Qz/Jڵkݷ?766N୷zwlmp\v ~% \SӨLUa.{,wb9#q*N_$-W/& r?ioo5+;w?sk8p`^p8)5MRl3djC(59=/CZbẺ& Jϊ @E !1(6fseZ@pCAl IDAT;fOd=fF5w`FEvA(Hiu6g"' ѻ=7r/%+Z/[,fۡXL4#Q47L5eC"6VAL\ݝ-`]'f(V G:1{ZE%{ +^/Gujy4&hXaI@/;PY#=L`m( EξDZ8ljysؘ${\sZ{ F4χM7DBd cjYԣނhts(WMp87͍oy#;H,x>iOW7[ꫝVq[oEݨw_]mis.}F1n.Xx_uZ_?qg/E>nl_w[ܯޞ={ڗ0|ɠ38G<]} 8롃_~go{zs> Q#i`KÂ;|Zs('cs-jԙ] Bpz%nKcmnn;st_޻^o} a%hAIG y1 ԍ8Ɓ%6 Lg[٠6,(KbbU_YݕPnRQ dr\F*,y QɔGX3ND|J3f{bb%a= IԁOtLT݊(d 7R3% <8teK۲j])]LJ^d*14!у>-,Gzgv j`a3Cգb1Oo~eyl~s\_ί_KO븓Ruչ'GzK>ϻz_B"i׮]Oyww>Ę@~榛C=w>dfS쎇)o'<Y/J~'|Ip4`/pld[ ~tL+cS4Ǥ[r/>j{b'~K.q[muMHR=*f4bO[g#OLf[(H6`&[pi=Y]FPctB3eR#~FO{XD 74哈iVӊfo8LZ$'qu/KN>ن)%,N1N=KzNOq/Yӧ{aFhɗ羒z SM:faȣnYW=EtNI\8)) 'LY5M{FG]nCZ7%5 0aKޚ,w2,e&^0\y25 QWK0CJe[gK˵qu@ڢ'6,գ~dD4W NauiMM3THuRTMeєj@(fU...̴9[f=#&a:f*koq AH\]aL)%!(DWeILn*TaS"ۀ>S"c:@] n*}F&۴e'Y d ᓟyAiB"“m[pddFHDXEDK+)ʦUGԕ@r*%Ig(Md$"MZ$2kv[*Ij(ݛLBcݖ4FYK Xƀ%yNKy쥏o:x[n/}?YDGoo}/Ul^%z_ᆴxKyc/ǟ޿>A+Oя~Ԏ'&:tn<84LEZosҭ? E[jX-bX6SGEKMFM T>@=J"s@/%tNb̖.f7DRT#b.6Ò,+"3]M`ڒFQ8UсwXV"ˈ"+׊>v˦~HdtdY'U Kɠd=W$j<6v\drx]Iڰ%s=z?L3Q3 ʁAKaYҤ;T ʥ }3 f{r<Qi͹5ҏc^%Y@]P*b^Ur_-Mz3GZ7E߸ZymH,+ GI pKz[$!UI=ԡC#]j)|9HH)JqҢ>O{fvNiu )w\JԴ7*q2C,FSdFUT&Fgm-0 i-02m-2wg 1d2 Rz_R8mySw7Y$T *XաMX`[YpIAUrM>xfϞ T?_lMSײ+t(*CDyMQ !iX2g'h-fb &慮_#dFkis/zõu=gqᅏ}{a+?=W nV{?~o v篬Ǻ؍ӟ'?~_sճz䅏tv#_o}~E*`oY;c.} #O}b#.9DtfCf͸;AWMnu1w0y0MZ{RRCA4 3 jT XH́ :-;iA JyX,dc!q\E0eF3E &t,]+ܤoG8f!0,rFZ Խ{Nz0"}̂3YKn fR1 X)3bHJ؊8$zK&E3 ``iRl.)bChS`pW'y+xΕ7џ?׿|p>7'\q_Ğ݇wZ:cu0 C3\/'. Fˬ,r?iSqO^۹+<3NQ0ϟ+o/7/+N17r xo|7ЃvC>[]]}ғt׾E/vܴr]c/z^|]g|>#GOy;w 싾[.bI\H@c羃ܿСl hPht^۹ڒ B9r{ 'alOL:is4rV:.:mbdSHrtFI?Lyp[hd Z(\4OJ! (oԚ!"F!Xgѥe`#d 9FP fT:/} r:|, $ٰݩiMCYr"+=ݠt{Q{J$SEJnЍsӋ80,RLꇚJx0`N*S .;z ݘsj"X:ZȂ7:2p2iޛG~We{Mn&LA02$"c 862Xt[mU.-WkuU-v ja)"00O!sp-%5#\{Iݴ~YV'\#7cX,FZՂ}%鯰!%{n6V=C;eff@j5 \Za.weܺ-[\eZpo$Uh˵^Y4cr 69&6rWgfw;Hf5'AV~f)rQ=Ә x 6NڌD35=q;'=9iZZ6IͭwRSYz"s[frt:BVbnR@xJgbj=aNKV|ҥeH~r|eGdݞt+kK.2IKmDI}"lh=}j?9w3wCin>"6DJLHP-P gf $,Ͽ0 D'ɳ>5n=8r'O}SvvvF]O| o<߅FE]я~<ͿG?K/]g9=_ަ0n69^koűÇpO[-$={]po[fXgO.ԝnnbBt7!zol22~{Q}m9s02qm q9q;>ձ;S|OWuB4.f6^7Vފ} )UqWk Iu+wep w6c$]1а/KT_Te)_qL#y92"WDͪ?L ƙ NDN*<.Z4Vb zx]&%Y ɼ4fΜ֭rɢy k~=pN; GY%@j I̐7B&k%g363OK>X N7x^xмl72wZ.O*0 F#[iXjG'75XFlPfǎr! 4]ʀc2ri0H2d?1-fa 5"Y9D-q8fb mnVV- IDATQ2:6T 9b4NRf<ˍ38q 'زȐx9Lt+/ y*]- %1KLa8^|N ׭rc'pe(>ub^UXFPE ׭8햆 K\YY6 "cYaB2x@niLo>jׁ Lv"LֱiW#ѹ`nfF0԰J'QRډ 3X)HFp![RȌ4f:ͱcf3@o ZVѸTCb9њV)IZ$ceNwI[q<{FSPͼ9ҟGmt>wcwww|᫮_]kTHھ|k~5ckԣGtl=I{㍟ol;w~v;|Cogf;tM7?ws朋ϧyțvdnʼ>| pGt[o}E{SM,i^ o{skͧ]3${]O<:A,ա+seT,{GXt¶<q\q)oN;EHDI=[sx32slf\!WDKͪz@K%o*τ7& eAUW\ҬZKݾ^LsD07^BabstCtMT 29bzIK%DmR ҩLU)7<`܇й+@=&8N+ .[! ZsR䥮M KkDLۂ3x#ِx-9^zcD1T&^uі,tFgkhK@ʺ 0x&pG~‚E76/kL*[#Lmy1U4.KitEYL[+L}<[VbSY AgM;xZ1cz]aYt/A^@fܚ7 DM3 DW.VTdw7D%'gfzLRTyX:!64A֔ {.bNZi3FS-"#kIY#=$:\mCx>K +-Yo٣~Zj-'ij]5a%,.O"dm2KATn(P]VIGK4+8x-923̆t[54W}"BCGdO9y`6eYH%l)nKNۦp2zӾ7wugu9 {??W='=鉯:tᓟ;7~79r䵯}s[nȑ#__W^cG]W~ӟ~b3W!|{{5|^ޒ}׿O?_{\~?[_~W|5~;O/9tez{os0<ٷo߾}W?tͧQXڣ:W~]/xĹɿO=pTf߷vo}۟tK=^y^:VϺW|w?s6Y߿ xٟݏ{ww>!pJBuW0b{}qDaKcc̓~S}^`{TZi_ g9yLΦpT7w=XV SV\ltbJ&,kVkizJLoͼjm|̔L5}2oV۪^(9Vw)}2A: W1۲olU6x+Ct2b(*# eN%a3%S` "ކ¤%`$XBL[=$ هl-cUiHtfSTzד!dˮ[A a -;iMBfskrwlwn KMD4v̜ t9z. +H "]i]tu?`hnciG#‰F8 VTAJ z.uQ ENͫӆ~ 2tuKh5ly5:3gX20њb-ͣu.ߡu r/3/?_~sg3z˿ܷoߋ~/}_ w=w믯U2e ''Hn2V@\MΉϴ?jYkRBT["RM w%<92sDmZJpu5(O.vjT) ̺s1G0HEע o2K l%ńΜP)YfW,b) ՑSJ(W}) -/ Gog" z.Sߕ XA~`unYfhf/db'a6+Kӛc?t!>AhLVQ:0xXRbgr+‡x_Pfz-ɬqR='NCѢD8IODL 0a9*j~itvFW&2db[ȄqiXՄ(ڨDLRљ 4ur*_w-=~vxW_}?}뭷;}쫟/xo?˾_w=y{_}~6㋲Q~k=u:˞>}}C'\&Dw==Gv7?[zpF>?=СC?xͷ|W=c؅\p Y\tN*#+ѯYy=}#R嬳Ϻ׽.<|7\^oַ^};w_{G}{>`6Zq3?}3Oxu}}׼4l>9_zɗcsyͯ!0nvk.COdꌣE[-x-= q]0X17+ϤWcn^w0[^vys MrO%O0D|?nov.!'L5k6 KNtVxU5kH|8jKTD $@(-YIGL0 i &dB{մZM2ʋφ1*aZXfm2kH[^ t54=#Z檶T,@Ghpk6x%l6^o`k9=T\+OD&7x`7YGA?g-,EiE%}';gbL4\.1z3ϴDK4f^sAʸm.25R '+*{rI}׃f4˩AI wyvs |Wm&Cs7ϕ:R~t]F@<¾ʟw.bڠ7 `LKOTn3(0=vFB{G"2رۂq0dKci4*P7+K Y5䍆@`&5£JLp)\l ֹ&SRvzDA>hs!9:[dI( ]e bX妕`H~-ZUs4beNZX7P Kp& N؜150dF2]iKnȰ}x8y_d)(#R ψut0޸N)Hbªy. - axrSIBNdn Zl%`,Hœ$8EŒg4wN=K)ؚY"l9ִ Æn%|-.C RLcA[CI?Èpۜwz$b]w_n/?n{Ӟ??_|;nƟ^-wf=?^җ[h>t#?pnO߮L'J#sg>y㍟}jk@0>qnMv+|4q$sw_v.yG_~\|zjtPeСCW=|ԣ_xԕ,o#Zjrm7_oy;>6 .<8&=U)QW$#""wK.£GכȈm߾}/~ϼ[n9#J)]ӎӵ6 *MreU~{O'~vVLHI VvcjsyK_{ggn4|htfEO0{R۬Aku[, $4os8DfdDL]=(XU6t֕챍VZDuDZ5/qNE{E )QrڢЩ?bct? c5VbIJfgsq"@vvT9zq&B'Q*eFOK4ԋ촩NEӓah[\󈒱iSk_kfg,v"gsPah֮7שkz,e 0S#~{]9e˭yc+ECdJf{zd[r=}+n ºF 3 {JVoX{`JCY,ƦkR_ZGKYgyI!s7@U_纡GaФs{BvHJG;)v)l]24-(g2 =,VGl8b}h_2nH\+Esb4גXn Y3~\wP$%Rgssa,2To2B ':庴} 4^\LBLmϋ/\B˜E9\$-ݨ@ ̊%<$-MYSˬTt`)7JwvFzn[2o%1_x~ag>yv/և}37\x:ur"]_{-vvv;sZasX%j/!mBлƬ:,6iY9q, $]@ *_#݈iĘ!Jϕ#p׌ĂZr4{vEya0T\-?b) o1,]!UjmtM7CjxA9P-B1mPΥ V<`f"Xfmr\֯"SCkz}@V(TXZnHg2):(3Y9D7‚I׭Iw[nVH*@1+Q4%h;%O{iqrZH? gyD?~;`J32*b9h. T=B2E*Hq!ܞӷ-k9)F#\L=,̓e 5E^OR("^؃>>pfyiZg InV÷~u +wEz=zT<{gwwz2˿K2yرfs|8pG^"yo7]]oNpeKɇ?wO{w7"El}̣O:n㷿l[~uٝi$Ck>qC>k߾}jQV4MѨIh֚63fv7o7ụ{E]؏,!sf/:lЍ)}yq5Lu<^OJ?/ȝg,|WcZfKN04ѩ!<_#Y R/idaH@* {ֳ]T̢&`͛y+(L7 hb-I'ڱz&w޲$XAaJV_[͑$Փ?(mϓ )ӽ.j՜vPmؔ==Lfwt RehF6B#tQ tumD[eH g&5ԙTaM\W@Z Dl|} B,!&;;:y4!~D,;\?Q'6rR wɺkECX蛻$SK7Wk%Z Mf{ eTSW~ IDATwq/E X2ߍ^I76KّyUNi?(wvl|9& H$#ikъ^'e'Wf ḞNR4[.%H,[3*|uS;C_?*kV2" ];ąL&2IVW4ʹIZeWv95)%P09`Moss401 Db9뿈P3+v@FnFXFh@j!h()ha2Of \e ! ,H" hu Nİە:o;8~wH$lvh -7ۛބH:\^mOTo/gNL<4MӴ_/?zODc<ÎuCl>e_d)Nm"e!>7G_mYpfTm/q+7QvTON OӬȪQ9?kw5O@#@}Ҡ>{HE 46'S%!Д'wi"!:,ᮚkMƦI!!5D% /&Ϯ99yd4Dz(TgreZE'T]pY=_`ay"H$mvTۓ,E5 i讹qV=6k"Vbye_()IjP]F*QkUuV#5vEkW^£^4Aփ8:;tKԣC&Q/g E]N=>CTLVQ$e${F/qPgdȖ0n>jb"0;uRȨ 9R(F*VrKTZ4BBs5!  Yv.ޜxDAf ˨;od.>U߁lcSӑ-k4d$m~-SEUC=^30ED9ݷrgԅw.L; K2Hr&ͬQb"VQIJ5UjBsLȞZUtd֧d( %:G´uht΄e5@DW 5Ds KpH3k^ Ri .h궁-[ -1sZQW4~j-@kIf rsEe6&EٖM0ļjDv,򃊗~/k=Tߜo|#~ooCGyW.>_wfE8N6s_Ý# O:p}ϾV贛C5}ӵڒufriE;İW͹&olr`{bbBјJd&[oG6. Mr;VO$dEFLQNؓI@/DtVU"%WAY36dlG&4z=Q1EdDSaͱz`^aA3yrR:3] ̨7@y]Тo\jN>g>G fd `H"3+ձ-\*+NE`ذbðRTB2w+ޣ2KXW v wВm;vOjmez-JiC"?vMI(au;a}H @D P1iý]JһáGMv ֒uT郖PmK|h*_u+}v+.ݍ3^pֺ|̈LE ,AvECc&se~%A }VrfLlU)S4/: KdoZ < PީnҒya(9erB1ܺȲ' RW0 PoeP*P֝SI{K?|QԂu$sH0ŃDB`d.WKJ&=(h@˄f?]+&OzNXlB6}V Iha͔TWvK oY{w4p;!2u$הH-%-s $#[ЙT<$q+ZM^nd`Fe.)̚S737(,Bq ]b'ã0ZK6dlhX˹#H),Y|L/ɏ!}q‡ڢVʝ~/eW~{Ϻ@/(y38TNw7(5-hWaǹ]Yd ~EN ~/EH&TY:}R#NMX 0,0=j5^uolXn΀{ "`g >aѪ:=orzg`FKѶ0TBc,CM4ZjBzOQ9n2h+^+qD0S0'&쳕* PC4ٲȶXFi dx0s|Hh6G4Id9_^ r2It%x>O.L{K&i J44E9kix74;[g!re;P?XC[Y;0Z=H;k}Zz*8v!b'K2W[.U( JL5ӽpDe3+ %h,I[e@SY*"5R)OӴD|e\_E!ەwB*Kqe*u>+!v^+Ǻ9:A R"C#du f}Hdڣd~ECG`k2%{o/gӨ|t&=ɤJ=Pg)nnjȘkiǑLI8@f)njr:2(/T\mmt.J^1/j>9<ϧ4w7~~~i!ݾ5҃6g!X%GJ3\1¹vYEWV̭ơ> zRVbfDΜ`q6v/g$j*|D]}SdvJGhvl0~2fo0}JρSsBҍISLJEʒ˚#BW$ SމlA8T;uB~aT,AvVr+cBʱʉB䥇KaX I1ͨzK@2sf` (q(OחMFYu45plk>KBCOY}З6Hig%ɉ2;M ]&{+Qi ;u !}.^v lF;d,T#hFsM6Uwm$Dp8u?+,fKW1`5Q 4)@fD<ϧ~ 9,-,fj7.a[8tW%4G̘iɦ:bŜm1-"hSw 7VY7z?m6#:r޺W *RmƬh'ɨD9{G+ճޫ2̬M˰1k['m&{zaju2CYW̅RPK*]}Z Ho[t.И,o&Ќ00pB6fEXvd9HByMbdlƌ]K$Hb3ژ T\eM߇ szT`.^lm04QqK(V*Y@ǫo! :C%PJMtV"BDf%O="ʌcluS,u !0Z&Z'ym @ۃyKfx 1hgdf M Z0(] /5tp$Y $;[ئ{@c33d0,o'Q2&aK٭ݾ,L:gt70n'39,ClnpجM%RZ0,v i^qdg_LsA,:KQm}I}bZ"֐$2mB[w hxF t=& ãDSa _ЮYJSCҝ:n ctpm3X")s]~lWvҙ hn*ۻACQ70:toRkHChmFaܶh}`\9,IR똋 \xי[@5Css[`[W-JS GZ5H::*:cAYu!ɤ岃Ug5scՆap7q m!pnd協]K2f!ZcB{nMySd "u Jݔn@uBĄQ*Y "vDr\hςR'9 ˾؂KDX H Qtz xZ-'R#pPdznOJyb" fTi@#G YWi"-~iQRwaygf>J`~6/ND;v:`Lfl)p}gH0w|ƋX)~&%MIʭ/[T)i]Qx?7>%6y>% ]ϢϞhMR`9a2JkI5UD!iPJH< ss 2XI(iDFn;zS8gZ%0tx"IZޖĞLY4~A= ~.*TYZиœivzw-*blfd@^1K^UM6S^Viˌy5Gz~f(l Y e:$8my.ٻEמ@Bv2hUW@gq򗰌u-BSJ>vfpLQp !tmòg-eG%{z Tw)s4fqŒ2fL sq8.f6OΚ9*ƊZWrX'oZָZ6ɰ5G? HmX47){*D@6M MwBώcΡzpu~hujϚUnM77O~'>yYg>mȸS籏}=ʗ{z?/OE*yx+;C'V\Jzl[ѰB)w\yԏLE2 ˭Fep`rf3Ikl֧Nz0cHClXnFg%ߑ/ eP0&o[o 9{OcȘ7ḏ]ٙWĬySXb拊wu%T44#Ŕ0yi6enE}!r /G^./hf?H,H;a_kb(NjF P(Kkp&!E30[U5=`r\:;_T,KN(4b3 }YW4 :JƄaQ>WRʑ* =j7nmfLʸXb%=aAd/rֿi J|C%NM(Z*рtxKKXHLKp R@+0]Sg$cQ!9'ҥyqapJ"G6 WuYjS݊ ^=QQ17Ӧf#(Dkj9,_<$As+a^e';_$Iy_SQKebv$ӋBߴlckĤѶXf)$M•`f aeJ D[iFe:dֽynd.ղtGѶ ™ lIO`uBy qIi5},CdVnme41al5PkN37֥\~}gخ6|}s݇$KVtxa_N-(zf-g;I#(DJ.屯ۏq4d~y:rR 3sc]}KC}y,XH13g2ըlq/jZ>~[3I.JKt+> kp D ^u.bs ֚m*rNH(U!tnaMn6\wl]0T0%༼PK @ ͓HDFMGϑtfVE]y|\#dM!;JOQ MP59'vKYg T1 hh9cKYzrk\cQ-f,&V! m*ݺy%TUmXaMdf-^ېu gS<(+3Xz&TF{n6_-ý˚ƽ~*a'0y%bád[trfJ P2f=X9H&-s9(BW p5H.F\SNc\9r;%3 G%V1+D'ʾEHDPnڔzwz Όvhp8%XK HBLVNF^7lhl 3C+&daweCOH;ڬM{26,3,+`aΌ`0D̛f}V=>۟n;ݷ-Mj?IKBwiAaG2m˿^[ Jd'q3#c=ܝܩUFbܦ.bWd%X 'J ”ns/<[F+CV:}L XaUl2ӭq *$a`#0LYvYlլI?HSHmNkȂ&'ٕSE`Yk)/jE05u֫`$"SR(pX],N=)ݱG.ږu*pJ)F+r* ATP]̚Fs$d.9Qnk<}4ݻ`_u鹨+ Qb=桌Y37Xua"Ր #{0~^Oq\-N3їQ @4G%'܈4v{ݏS2 \}Wh#~el RUBi}1k!jJL-頹 cd7ӫa-[TE㱗P% i3Awfݍ>%3[va!{쬹{,0N ͓mR,Y#-*A^dY7T6ZPaL2k(2,^S,ʂ9~}lN,}Vghtclj"%neSA6HӘ6D p15 3_*{>Πzo&5*$WS3[[_)M|ao>~5?]rAݒEď菽-oڡCn;xjN wFD=++FϬY-[2õ5I?KRy5Ұ=4<{_<yj!XLfmӵ&Ivv2"ݖ}bb\)#`Si[nO|g_if/|s֎G[$H-lݤm5`͘U{OB F $sNerf9.1æ.n}GOv]No0+uIZKg*5įak8Ȉ.\fqC<̤ᕄmpלB#n%tWnMڀ8pcETԒzAIhx0H}ǘ<&_ZJFDY `FD m)qY5LT.ʄzI<[=r4)&u>fypL*Lcdڃ&HC 2"pV2h5b)Ϛc.AI $8O+eA-(DGɒ5AYNƮO*`Ȓr1uD)NĎY_FKM[TDk`%$q;9=K00]\Xql=wY 7@1+{r.f8b5=*\Cgea1MO-61PdPT{ YkbvI J / fTV1k7?N̋CHBvjS!J:"f0=BR.VfK8LM%13c(RoHP'Bfͩ H*B^  j%2,%" zN$>\x05XHSfroz#K k}X,N>}]we0fޘ dWVoFwλ ڏG}Ruuue }|:k=v_5f݋(]\2cn/t6sۺ!7~3g-ǫ mq'/ݻ6;,"ut"s )zDΒpbA[HA&Lt($12M+s.]SR.FO4k)sH/#IXJ248WX&G3=ʣ-xEnJ*(Mt:;vAA(S6LA0v@GDĪ^Z6Ф` .(QٰȚ;R"fR0]y{lꗪ644J\.gJ}}}gg皒:f^dI捾]WD$dW(Ziz~(c^ r?w{O[uqF wZ,7bV=Wc'[к7aqСC/[nu„JxӁdQ+.}>^M{Y+u5Aˮ^~o{ֱۏҸڻʺ_k~ThWoQQ2 %cN:Q*]KVD%61x7 fo SH y>xm&[@Pe J4&`a*8e5Hȓ8& ]!ci8lbfZvyٻ4ԦWϡ0Eu[e`sV-۱k T{TJ#D%*)a8 Bho(4hpLNDklEv[ANx*\f(K mze|9P"'q=繛HP pl"5@vd)\bm$B ?P7i0IVƉEb?VHLW^H$(9VS1%SCbF1!}̦U6QV`f2s&1< ^Q`KW`3 <ӳf6lO?[ޞJ KZoz}􉢨y]Yf]W]u{XhQXlhh޷zqGG62s~Dd"ҧOe˖mJV:vSO=w}1L4i7PmZޖ̞{,o-ϡPX֧\1F{p/flڋ qzg[?AF ~+TT*U*s3fTSS ݺp`i DTG{{ͺ|T(ݤtޜwnþ`mu#6}ihtbV*t~W|Ԕ%_(a#FnVD%,t# U44gjږ0X "Mq㾯EBET.C0۹vb _( Q%*QJT_|LZjIF¤ITr0XM\"r.ib4N`YV*[,3)8!֗ +} ɓ*f]ʈg e•HEL&-mL!<)|dLO}P 1Mj*$[LgkKz7AbpDJ^D. m>.VH]`HT48_$ h g6ܫoꗈ7a_~/^׾vs=nz^M?pÍN:nkk)wT) ybX,s]cLҹO:q&s9 >/";0˾sL㎯_|/|Ͻ~?[o@|\*ǰPc%G9NT n;V˂5A^p~!>Ϟ}L?=ャ[ww;޽Cx_ ”>r*r˳~7榆ͷ39WItq91:v [[[:wtz=< -Xh֛>ŧ?gС5vѣOVQQmt:=׬πö>U:?퇴gKzc/Mu2L0UV4(*QJT]Rn\س J^J^bc/^˫z%䕕ɋxH"f t9r&Ѯ)\? J)']WƬ戢,6UceuM $P;vb-j"{RaxBN8 p,= 0OPR _ 8"Y4⼰b"#;G8xD8M)g/).QNQT"$bX@88G{1((Kza=Ev>>N Lѿd8'Jq9kJzg297wΊ+T+ַ({DrwB!o^ԋW(quEιR3UTx7Y*Z DxQ}{O:yE[f΄w!fQD-on[кGO{wɝ/T?Ϙb/k^x}~Ku/k2urbmM#;|u9GUE' oK..r3G#B{{7P(>9/}?=kis |mt窪dªZ޼ŶyϜEr1G^C>[?{&Jݗȯbo%1jh%3p4*CJTĿJ.s፰Q>Ι[LQ0E)QMD 2yU85G#34 l݄f1QJlb!R،mN)S 逓 E7+TD 1eHAfI eubwdvF' ]7V6^ #:)UUU?'nm+:̻~zϴi|-No>.>= 3נnۿ&☈Z.mi4^ktGouZJe9{TT=+QJT*C(nN#+kI/TdBDHiQ")#6_!̼IT)VFR' u&!c]I%jԋ`B e _͸qH "2&IPRVYL#lתATyi4CHDŶ# .*=K8qJHL'ffS$ rTY1@%X#xN(JPlT&`3%Kȣs?Q;^{$uuuu(t>};;sm6_(DvA|ѾŐ!C[~a1zk555ݗ8 r%444{mm+;EcG/gwO#qwV +]MM7Mt_|7OSEI_+.j-n6W 52󗷧#7_C.oSN_>l.g^QfQ*r_>uQ+^Z-|/|?ѝ'zߺ,b"dRwM]>]{ܖ#? uN]M^k7+Uލ՗?WYf7؂[kM"&x$M xQwp]i}LT*ND䥗_3o^!_hhh9b-wQX\UR?=K&[\5??~Vʈ(NEs>{W+a|IE^Ǐr˙o`Ė[Ve2ϿhDbK@$"c@䄵N!D &% '`%Vvb@+Jx&s%PfyBU;(h)($J![QJF**pb P lxaF7q- XH"xu02FI aU`&Q:T PVeSԲP2.ثjRj"19.Ea('WUr9XDUoq$$a.n-=VgBT(V4)TN/j2j& va.zRwϮj}!o]+;~{e+:?66j;\j+盋vcFfNӅ|*gUUխr'L޻m޺P(ZmR[qu!̴fͳkC?aGol7fw_H6 3sC;jV9} Zqp $Z"*HWRwcjlqWϬW/hmrl.??3rm[o;o^KK[zY|Y?Nx͆9smlz%*G;mmm{׶l zԩ˖/ׯ_>ȱ%*%єD*l014(/4A6؞d`T)*2I"8EPkm*6 1#EsD^ -5<y$:ʉpI+ ޔ6ID"Qy 9K{X$ $aPSBQpMD&.8q#&RZ]ff]O?/"\Y`g#`"+𘔚_ʍ}5Яrl 8#Դ׎?dd2LqMN}vڐAtͬ$|ǹ|m+}Đ_Ϙҷ&?iM{GG:ddp*͛w-N|Æ:G.ouX_Wf.[~usn=hD$s9g 5:M8gg~a{m#vIѩ;{wamu5?\p\:m"NW-T6'uvMU~CIr*~%>SGGG6Aksss{Gcz+.;Hmmm/^teˊR}]X*UUUQgggggVJU)Ng>{?1R v HGgg.KR Q.\hNnP1l34.dҥR Duuu#WXJG0QYҷ_ ^1cv۩K/dٲ~ǫ# xŧM,+!V \OL DJNJN1!1> F*jn$h`|xrlE<%Ju İ 0!2jGT"r5DleJTAYXbyTEAԸ窪$9 f03$! #b(>8@~6LO vlBÊ8.^%+PhPR Tx6#Kt* Pр#-/RIV{`fUu2եǫq\*?/zeKKBUz߽ǎabhZ9Ij(۹[~؞2u 5L70ww͝;]K/?wqg):iON}rOʌl6ۧw/Qikk3pe2ZS-ɧ}w{'xue@i;GlـjjjRԺ1i@\\&(R+ɹz'EMu^{~{`Ǝ?d_ޙ3_pAȣUU.;o77{6xРb^|655?wYkg||c&O.KB#8 ]-T}o^zg.:dP[lȐ!Bs5dz䕽"b0SDf 7u&RTOa D0<)쑃!$'H"S013dYP6bc Y)u)E l905NZz"Ϫ5<93%/ ('f/a Uhl% I_ 1TCڠdP*BIg }U8"ACb(;DrDp !P N(1"n"@d3e΂bKW&~"J/_үBA\mBۧOKG{{Pn]w\z݅>}k lnq+ڳqEEwQz9qbɫqklCEQT[[N8鋇~ßλw>`},X~.[v=^vGoM6?=wE 0|أ'p_9Dvܿ_˘ѣDt*u˔;;vҩN{oi쒋O>}5V^zp=.h]p߽.vtn=rD:b]5vКښ+_=?=7~qd}LS#t6eUUUZ[[DqGs@sSS}]]m]m[[ yA\1Wi%>Q{"2z(">}%KL>}رG̳=E}Dމz&!vfǪϪLLJEmAW@% k䭁LBIȚ9fA̎ Ib^.V{b/(Fl|"*C`cV@U|2!O 8e%"XPs *:B;rvDU)x؃ 씉T݀98S?(VUL| #U xyԈ2~6{(1H&3XÉ{bIꃝՋ䉝'P(n$b+bq /;Ow >]dG5tT*Bh#f+UI9M5Et YocDT*6NEW DYNcj0^MѵFcKwLTD|w=l+n[I4KzJUx1y^/1FYggOᄃ_Sw{%ovs345557w0nܓS2qB-1^_OYGc<"p!n̘?>Xcc /ِ5l6J|?,[,͍9RM.Uk%>i1G_:;;yu _%J"3# 0aw敘P*e5sIADLLD &ll$No@􋉘n$(HᄩjX0qԓ؜Ĭ?iĶHԑ:gtj4H$ U23Ƈ%L3,*I f|(YXٸj~r86ęèIT!+O> MkLvhM@H!GTJLPD(JD;JUxС@57T*ݣ~M?x#q٧⠄[5SE %JY`6Q$=BxΙn{mF)1飏=l͆[1ql6{ԗkg38νG?_0a>+3Q6=;{Lǥ|`*a{)J555lT* uwL :KJj>A\B>壎>;jkj/FڙV.J|y9l. _=Z _S]+as_z  '2l}` /qYK+-4Jҭa %l%ٳ̘abZLD 2rGBldmEb 4hDzb/A;gR&HRfNb«"sl-RThRU '}qMqFB&G@LL̞ h,&CdWs@x5ŰFB`S8aBM`Ip&\cSUDlCU6Ulj*5u^EP+6UG ah`P޽{_+Vpd2Isϱe8[~_†lvԶΟ-5ȍ][]]fw}v޽{U&X(r\:t}o~L&ESOڹZ)"kiܳ"V9*`v7ѳH!us!zƤ qPNșO[& /ZXPk'0(FP@.  u ')VĎ@bNKDmjc. le0'% ©( THQ&8p߇dBP%0'"(b!0)Qz3AYYa 6*JS&qHT!jU@L{H^EJ11!"Uu@)+8VJ0cj(+) xn5M~Uk/ PJwDEC ^WcCAQ禴־d"" owD1{bC9 HDŴ}J`eˊ $qJKʲ=T $ g>)"^%Ʀ)5 C2zFKbC2{"#IR"zɀY )a +.Ԝ`T"O1+R)2&MZjT~h .b P,*ȱDlmmɪP Ī,R@,D>Zȋɀb~aJ?On;o nvj}<*YBԪZQ %}sW:zv)U&*dEsS}E:::6?|lEQJj:ǠzC«ƢL(BSJA]Q`<ē2"g"!)̰NoS3 DU$̭D̍ f"fth*F'VbrL6=J:Iv0!"%6=/X28v+(#&gjVp8W F oA" UcML^D|"geLp0 VrJsoЛ0æT Xum@R)T69;w?&[o'*)RRw9&'*qֲ8q*;2LX4k+mm؄~ҥL9*QU9׫qɒ%5s!FQD(ynQ2{ʊ)b"RےGB.DO,{ x}(<:rLR>E1X7|i!' U!RA 3@4ܚ @LɃ(@D̪ 㵇' (RF,+! Б(C 1bMK4E@,L6*"SCD1'j(LYbazRfEH9rtTA8Q9"ev0mz5HyGmCһ vC4t0I9M:Q%ŋ74Qu++GN. 6Q DDX*$ߵkD%o߾UUUƉ8Ol,J^] V0ƥ0#s"&Ssafa`6WɿmÕW<)$S ,dAPˀ S@F$CŴ uP9y!!pP6 uAo5V>(, Y3KPAטCAW:\7FI/z)@hz1ș  k9F+XED ޽կZŇ>Xb̼[8;֨Jۊ~T,ygNWGq)|^XRTq`;8Q޽M/ucj@V`MlVI*QJT@}} Qt&3{l#~+ԫ 'ekkpý@` 2 7@ f qLb0V( )o r.@ B&, "Jl/J$jd[!o`(jBXj"܅"J00D E`FY 8&;^DLIlV8al oLewD}Q}T&ANƬT* 2"p@ F2,6IWQFlkO))fHR?6l{_^>_OޯsѣWTdR'pIgrZ IDAT/3ٶ&K:ǵU߆\QD׃ڪ *ž-[\"/̜`I'3u5[ȭ$3?pC߾}m矷INFMn@+̊ý0W'k%*QJT_^|G{iޛ.,qUd>\X$LHDU4)g6 P'Gpy+H<,]yU`fDB2Kpb t16iA(# s:B0 &(T"ʤ؄B웈xXV |~o(y~#F͠lB.u0ANJE`l*j۟J #[2)sM XI=e"DIJt6QKUSܹs_jEzFU&k1466Z\.Wru獬|_:T,Ph:) t\\2p#>7 vvQ{{#<2{K/Kx9s[o~=^)}ڴiwi'W"q4jRHٶT,QUJ̜N{eyG{"+DJꎢ*:sElxs|6>W=h]θg**[weckjk.g+#8b"R,wa^~nC[Q}vqҋ.:#ECU`E 7ķѴIQ'$rAXDAف&cQT NyST_VD%>"Aުl2r91=dDɋqlf<U=$t)|!^[,ܕ~ &+  yS59 O*XIGL\]Ac%,|>۳%3Ҷ[~?~o<LԞ-چ~o1{LpDx7 R*rTE.r옷lyg.q486>L:=|>455HUUՔ;~xǔsZ*(ZIv5s.۩U ʫ<+QJTrUk%xKHF(T Eȩ Cs7#1U( K FAF0 1 d<\"c+ 4̌ 0 6tr{"A^T"OJ$9Y#&fƔÈ4CijaÔU?jN2U>JT*#Y Hٱ#e( `EMZċZE\nՒgȇADHUyܦXW^8qYFQTS[[,D)wyS]ve/W_+яrb*{>=+mYX‹rܣ>vI}KwE$ҞX#Ps9MJ\6q!_q> CӚsU_lmm0dȐӧ>lŋޝ7{-fUAL)Tj3G 'ݻOJ.Z8ʪssgfgd6=ZB ̀b))EE[P@I1B@ ZɆd-3;>w}MG \?o?P!w ^-{o.ڼ&<{tۍr*ULU9f'I-)^9睏RPwNCڬ544\9sYƍؘfo/S$ ތa}cnUML_ZժVZ_ J%ih1?}E YXղ8@`IIUoU^DM)~!BO @ Ur C7*- -8T+s,CD"K=Q> JEe5lj%Ы k56e cbAg0!4q`xHv G. 0A%ٌ fG1 $(r,k229jr5N0/˧?bq!Og2b@O!f_㍛~yO_ɜp Wbf1s.󾪃Ү}[zUrU+!(ޭ]fkkkkGGG.;w|j̘1oFm4gΜ1cs4xFSE+O* l8ffaL*R٧"YhU< stDℝsDF?jS8PĕrK?N5uI\5R|(I >t\.0G?gSe@ 嫰ߊ8qct`jUK j(/$bbc1kb'$%S,j|{s޲ v2 ;L zWubg&!28-,KKj!NpPGD@"$MHp0M!2 &<>Il!LD&:axrOE {B(3G"C=9q+$D*P_eHY\Ȯ!]99 m3V@ [.VXk- *ZB𣫯{}(3fm>e!Coy饗/SO=塇` ̙S(ҙLn@o;r͹~=7q_6_0`@WW+gVs\yܿ]LO$^q [9s B88^t477W_}QG5}뮻V~;/88?r58>plvmǫVU֣bFbRhLplk!ޓTxtFE0[ #Gb@VCV'HY(:AY`0]͏7iIĘ&wͰ2DYGNIBԒ FZ'D$B v F>nI9&*}w}g}'=*ɔ0즛onk[0~z;sfa_|>[~Wflzzz;ip (ɜrʩ;~4im "rWN 6iU? .j>pkk}*3jo_ln֔i͛]^{* ˣ(ZNDRs<묳FןuoE^8v&j傕^ۤι3f̘7qu6~3S3:;;sUo`oR=.v?uuoos9RT*;䓿S3{]nv07=.\{=T*3T{ /%fVZ? .GĤP |[fQ!\]&I&`f6eDpDy&DHH[$"¤>D(:0Wdӵ HBB5fd+#ǀGMծ"._@PONI ):FUS")'(A&be28b(SmFiuԴ LR κ*ֱ!3 cgB|o(s'l/?2$ϯ|ZZZ93reM6|dGVx_`mJ?oZ6k>V#47gpĺF=ϼ}-fAsC R*WVe]4zT+XLLS*+7O\#3PPɖPĔe{%%qmig3Q$Q/&q3s>6Z[o|=&o.k g2{Ȑ!seM7_lmftG574LB&ȼJ#ۺ+U}m|}Нvl^{;oַ~k]vٳg_9 _x⌧Ǐ:7r7>+9r̙755s123< :};[lX 3^vڹKD~fo>nܸ_xi_:3}ƍ;~˱̷zaæLBD?/2: 0n^ss9g\yPz3?ē/z/km=ZjUZTf+ af,X"O }ك vw)"'F)2iJ9f핕L8][ !ogAfI˳)=)NYd(b (W=A@C@5fxKlM Ud1&L);WP5Z̷ȫ eJ`KC 21ULI*,YGqI@V8chEY|hYfñ8v . -fe vB80+ۚÅ1G篕TOjzPXoUD.ئNPkF3LU+.je~[O<ғkȦ'Q+J|aŽ:ϿZʷ/Z{Ѣ!LטWDN|anSSc.5hԣrI:cxs\I+JElO#iĜ''m 589Ν/ۊ{PHlT*bazk˳P`qIB܊A+p“xZD &L297駟f.0喛};klt:}=_9O~bO>|=;/^bq+?1SN99{=T.]uչ>|OzA֩Tu]vS_WM4}n5?vʔ=.|Q;X,J|g{rܪFgĭ>baӯ+Ju|Wf>}38UjU(~rPf'0T!1 5WhH?B\cp IDAT6&#bJ"KkH b!/+y@L "OU;"FDPY eEʒSrJ$ b!#H+<IU5 Ww2e>M]ut pXG G){bo "RM)yAqR6:L`8j&#Ns`=J " a1<VL^yyX\a\Yϥk^}>4#c܀+!ɤXKNEJֻ%NND:}߷mwbC9'% Teҫ#o~58Yˏ;|۪kR/wlӦM?pUK%%{L,PQb0LjIqH81"^t-j ¢8g3X0[]v& 09isP$,bRS cxfu,a(UJl(Aᡦ B9Cò/)Yq0بn!'$!PdƃH| !Aı85l3 S3=y/$B`RSX?F@aV( r䗅.;cVCf$)yFekYWZ3oSڊGZTZU;;;J==ݣ@RPffžR h7~ ^ػ1:O:xm)U?_v߽\$9"\:6_aU.W60%3^zogm>:碨e4yvG&Wcp{vf$Cru٨P3r}Hwwĉ*J}WM2ϹK_uu}}}}}#>; 6lRz$ߖd:,Ee7Lî>eʔSHӠ!C:)og?_7ݱ\I}n;oϣ*HyBxuQ:bVՎκeLK.zӷ_]Z]CXkmmbI[jw/鮼~ϭz`n{|졻MhʪDݹs/io71#xbRؑlll4hyH6-|xbF V*Df~ea#;}ϟzʩ|c^bo@;b}d';v?vQG-l;蠃1n8fN=O>7v#81|8A{#+wޡ9lQT*NsP(U,='G`xWWs~u]~btq>׿666:Fy衇Ӟstr\&裏)T喛o|1˝wcVU!J Kw7 3_&eՕ9?_*ë" W[#@$ ;R@%q`%01OuC쉔TU$.6fe Z`b('. bagxFE(Q+NY0X117gAOXDXBlؤ*16*YY|\ Va8DNJArzH  6ŶA2gz1yǷr޳4khOX.zCǕ*,٦Ɗ'L›?yn44U]w34nMNdp[xcC[cOP(e([fc]=%iOz}nB!ݽpήBƦ͍֡ M tj!"o9gan0(kr(]Rq"khJf e@+Jp{v*UMMMTt&ISD7UÕ+NebQgUa`U3N3J%KQ5gd憆L&SɔrёlO{ill|N^ {T5Ng2nZ)\2FQdAt:EQ;eѩq\c=(6^qyY8ۯ\.[$eRZj}T*u޻t.T*d)IT*s.őcr d~%_{됐O<9FHZ=[ xw$v)186YQ̪/@vAnp%pv#`C%l1`BJJ`#" Ic n55T 2<{=:)5{b|(X{w؁-\SBoynLNUH=VB{(؎@HJ ,u=wI?GTT|R.JRi7·|{ذɸM[~Ll8W;!Y{TQPADꈨ1]2p5_W(F'm<OGC|`.y$lV\a;l6,`}477W+c3=r?\74674 :t{Ǿ!bf= Kv?yݲl-@8iªT *y`L)J6ώ`3\YyLUhǽ]]ma8޽{y>Z.ĭ..aA[O|4#PdOiV oRz!|Oq s JZ" `,ՑّA=.RVOI{aWug/,]^,WreGU*J%ϋHgg%K(=SJ_"WNLP1'4]]zAkI W_B?7{mTZgȑ#:{~U̺>;;;8|xoe۹~Ͼz:L}M\Z?XEDܟCv@mKAI" :񠼄˲CPIqUA Il!J0 C;zKV%IF1 98н<Ӂ%-%108?!V)Hiʉ$Z*@$ڠ0 %up6T0`\Mo!ĀRx1|bi9"Bf,:b ],uD)v']ܜuvt("/4hкЙYOo8eo_FgR*a:+TVo $.*lAf&k$4ΫdŵgJÅ<>w ?,0`U[ZVa@XJØɤذG,N0B!&,`tՁ"hp3%ee! %ARI-~HE櫆iڢI`$2L.YWLYp!Yج~A$$ R KejZ|տv !L"b2U$ |7 L숅AޠN2#!"GbI. =7q 8l>SĄ,^\9[W[ҋ{V%"K;~O=V-X`̙b%W2ypX!(yBRkUZC,RRkUՃR&8"a8&fn % "C% ;k/wUc -fp@5GH Q  M\7AC})Y\b*r@c iΑqQ8. P!6ck$Zzkxk&&P2)Z,? lelaY!3\/ώbbȱc'Fփ3KbLa҉>̛7o"ZhQ\njj2UWWג%KٺŋY@68p}ܚ{_ OCyU.N-vo*޻Λ7O[DM[{PGd&DDʴ~5p\(PUja ,\Z*HLuucƎd2uS)@C(q8LDQژCLLHX"NW#UGB"e'OB`e#!f8E .{ePQ6H yrez bbzU[]8Y$1<*y@*BpF%7ye uZ"eѠ RI3'AHD  QPU>q%刄)o[4K0ŏMW3 R_CE;Rı:`Hs!.^k6ߟvrs>aRQ_ߙkJT~ .C.}2󵳿V:꫿k_S\.QmVÆ{Fo #h Τ H RS$2?$yXL "5ܠfclwu¬hA npPM $(ɽDfo/1 ꍦ%UlV ,ez0E'BS)(ZA 'ƿ"DX(&O8o滥L4R,τ ,Tr0RF)3gq,]'%Y @ԇxY:oQWgQclz\:ތ/\.}N@2"+<ZWWv3IGι(ZzJqhJR.A)1:,, -I8bQ;kUZPYbf:;--VZUSL]]ǒ+S`Yp #fXˎ$yTbSl&$J$`scө[ è((:l^nv 'jXOXœ9g `03"M IDATzQJ u#N#>IVsYb$P뷄"3o!e0c2aj&;VCpHDP zjb8bфe1u3vbƀgѪKh=^O0~;+OE:{q{vmwG|?-OZ7Wg_КG T ͜_cvǔyy 8q.RUW}*IФf>xG]}P_H+|l!p؉[0N:ګ•Uj^skVk6uK!S uy9\ ɒEC>*I[l6VbUBW`Hք{ 0{"erY#"bWbIybQHSe" " # (,b˾6dEU+ąL.ٰ#b9t)< 48&PUi +g}hPA2vN3+akb~k?uwf r_T믺jzwwwCCCk/廻>B9൝EJ \1[s<7s棏>>6577أ)Wʫ]k_Ү^b] 'O=^e;钡#6^VY}:3?}U-lqDIhXFi]PHJ$iu:qmPZժVZkU;Q(I,[Q$D/lAnvSp 5|5EEz$Ĥ/1IY4*#A4dB!U԰DN! "),! e"x gqn@);̬ =#JPb jp#&/^h`g}k 8a6w 4L0<"K .VSl Lv@ u`ر2dH' 0`65jfl6KDke*~i>[o/{;{Qj_P{ケyzGyj_[WWw/z$#Z"")O^)㚍w\\:>_*e3r~."~ذLfP)V*"B4)|'tW*sxԨ5s deVUjUBhUPս:sU &KDhvX'9$V*pY@ d_-aQ8 D"f=|L窱^$PzUfT) <%WnD$A( +RE%0 9hcP#e3"? +Ԓc"vB*TaT(qMuC6@PrĞ@1܍t!1 G{&+?yMk+qǂM@Q*zzzJbnkZR <أG &-lKkIEmM74dȐ\.ܜya:&7 21cc-b >E;/@` 2bqX}!VM͛G?P)I 3jq^55VI²9d֪VտE(b1] ̍MM]]Dd?'%ËZ#1|"1Ȃ (q2,,,H1ŎpC!_=kCPPtk]BEղ&ena"'R 1e˦a1L7T+hG$0&MIVIITe+hi  DX9D\/jM&%(_ i 1B!n!K"b?l`v5eN;D9xMR}$Jծo+L fBO[6566̙3gvRy.]ݝ BOOOT,r9cU]鷈ipϸI[?hQ猧l{f룾J}L6fzTS[dǼW?OoN| ڽX)RY+e_R%.?g K(i=ŽɱDSoVZuλ0 cqΏz-f7o^@]i6PжH=> &a5`v !yyg *"q8'p] 2,PS rf0:8݄Yl* Dd+fz?1iՅ)&^$:!a fa` &!( q(`V KXoB1SDmRl+9JlK0?s;% .hDXȸd!3ƪz~ǕHX;X(xزVB@#x2 cqq%rkSssRSz'&>J:n=p?<3wY_꤭kkk{晧7>x]w'hZ3\w7L>_o{~L-T`Q:_~⃷|jbӬߛEe]?-x\Z˕R{7vl:0 mmZ_ZժVfp>EDPWˌ3Ν6m:>Yxw/c=1bĈiΝ;[̙Aq@Ȝ((C<UgsGA_~zUk֊"\OIt;4xy^.:JXAt$m0.r1Hnρ^9+"V2oa܎PT\F^Ir.&`:G"DJF32\p =l4Qڑtv_߁7"!g95 n{=);*"Kuv_Wqcǭ]v_ڿcͷ8sΜ9ЇN9ͶZjFZ_;ܻz͚و?_geffi~_ v@'jSڥgO8kI~)ݞ{c6 ^3Pz}e#6Vc8oK.7nܺu\pyG~N=-wq#{״i{{;wwyf$Nsg?tio}߻׬YsEL\r!\}5_7.k֮yj*9#8oЇ>Cyo|c5fS%p/l  %.jX[)!7*K10 NĄPUA ʽVfT /(5B kg@G:Gޛ"H]1y`a˫)D )R1KQAY*a œ  U3 VdHY&zS5B!< xNjDy1sI6%(R/HYkrl76N^oDkf=ʆ']Qd){dycr6Ps.ѾJZۆZL|}^|sjmzss(P4衱,,[=3Z6%_?rwm߼Q{&$ZJj+ѥqt Z}[?jL޾pDm:_|ad p8c8|Cy_֖^޾Jr7]|lfV՞[Y~ɽkv~tĈ_ŬQO_W\q-Z8 ^wyN;x%%]wݥX h0gqAabtEbF#hG%R䣩R|CV0+0Sz'4}#7&u0i0c p ]^iayW b:jfqڗEZN.,D:RrۤL5sW/V&sc{7nH&{zzO8SNmhYͬ!ͬ\i.7ֹ疯z\n J *fvݺ_3c; tʁz^ڿ#Jg_$cJZr1~TV]y+@AR)|02p]p pbȑW]}ɓ;~ty+KF~Rj5Ww}C:81,_b==zt1yVKuڑzq-Y)WTuUwiۼGA6cb;Q'JQq9#r I( !B)DRa=H^ "pP8!afJ )S 5'$LQH3QS!`MK3 DEc"*w $ @s KT}2ܖpQ? F&>t8`FI nap*杓`)T-s #(ڒ5=uLaFFDbQc~m/IPkɝ|p\SˢnWzՒp6?%ظNy~ЌC|葮.S?nr]]]ifYλnx[޺y2RwܸOS/oЖ]/׻g[1֔PYr~ѢE ?C7%l+|RVFl\,w׉[[[l.m MBgo1 UsWMǜt҉W^uG>O'|ŋʑ#Gq't9f1}ѣGO8?wULMՇWX^SW'֮YwZd<vwc#8bU{1umԁq@̄4)(Eh`Y*rZ(tf 14-ԍJ"YE@Hq1 .+3:ZG^NFug $X-s elp/g`fTOS,)^bhE BFГzrx8IN,10H( A t 0ąIa 0F 4T#q [gDtQ+phEdPDZ$JB8#MѨ}f6vG)q-\+R0T5zͧ:=JRT4MӴevc6m-@^&_rG?qasђk߶|ƭC)l!7MӵMk$/N;}!.&U~sWeJ A9?IR酀JQVr21uz^[+?wvSY.[[[o|I ,;v}k_;MoZ|şcͲo<}Ĉzh\t'N㏫ޮSCbfSS?/~{衇69b^/b!y k*!iBћrZhb ,xnф42d&j)3RqF-k@JFExDઢ RD}@ JFMhFF%0CTjI^AW Z͈L_ H%'Q'ق§95_TL1 h% a OTZD[a?cB>.}_/|mmՐL[Gm>(%qpI>oYF9ZY)1zRTru{AzS{}07n|Oww{{ի[ZZ*JT*f8N[oi N[s;6hޟwؖtz3&+Mzo(WZIBΞǟ-]}U+6mZkK}ŽXpytֳغǎIKs540dAJ]၇l'xY,zFµ7<'O|?u{38묳O(v5?|%T>c9&6o96ߴ ʡ1딏csy3\2m^|cE7)K4'P1"!HO\h=2*f"1& !g5 V bhDxZA BFC !'F<8{$P2BbO N(&t6Z0M :FP" ^0)js5g1PⰺWDaI1: >iT֮^& :,{[Z\%6ѼWS\iaWShV|<Ր[*f,WW'mgzUx̻:45{o~9o䨑B !&ͬT*%Ii$SDH?&YT67H]{<ȣ?k^0Om= fιٳtǝwt?y?wIkkkX#+>0m{?@ɂUv4݉l|&(N?!LH']Ts$(Kwfc80,|jQ,`쯍:V.[Zo4̟7GZ*uHҴ0%n>h>h/0^PW5F j0P QCciUqL)" HHD]{h=y F/ #jgh"QY}8OVȯ2aR 4J497)C uYg8,.`&zWB]nʲ112,RW FPBQL"[sM "/cA`]zWa3`f1dY 73Z &0^>ϝF(e["-~Ɵ{U.#B IDATzVOof=Ȃ gzǙr9MK``ʕZ9Ox{zήuYҀ^HfYb)M7굕KU'uכci6ShZT_rѧ?3cƌe˖ԪպWDD$)@e}?2-HmS[[ڄM J 6YP5Y>6E֛-!$w[z~QG-ޞ/MKh[.h.&E`3 ̡ r X؉)l$Y en ,k;E Ђ`PQ0Ƙ 9@J`a5L@70Q94),uBwI^`Ȣ* 8J7}8NVWoիjT(tN!R(f-i$m/!&UUNga1BV&aD|MWQMԭWvT+բKjy=5qy7ޠ^3Dz\L3 %e7(p]Ƶ5J_5|aWW攫܎uN^qG%`5kZZի7nkĝ;F驴T,IRis""|;aȲFhs&i2ciimK3KJjozMDZ*--hlۚ\t٥z>k֬gͫ ,XP)RT*mmCmWcSPh5j)LNxp"Gc8c;LWy^iL^fvq-EAp:F(NU$d0K<+H r,ADL~H2TdA HRkPDaE,1Ց&BT F.fBD ;6rX.fS"a:s D)(* `J /© ǏL3QjP( ϑFo&`6_H]\dP<|$WyJ8+Y 1m5$tX׾{U̘UȓQP:ej4˴y3oF$N=IKhhR4wy\M2Zϛ4wŇMNDrU38a@իȽk<&' ܚr*,Z&jVR)jwě^j}ǯn<䚗K_fiZ945ϳ<ﶻW8&4M$iNmPMrر{oN 8HJ8xi+Z0jf\2eזJeĉf7($IՅ 1ñ}b,WM<f kiiQ47荟*'s@HB3PJg~{cǁhv%PFkB UISjYig;dj[SOgUi}}03hxLp ^7C{K̲[[\N^?e#t5"%=o.;nIrO|լO>y؎ҪgI3O8?sZv`7޵`)#O'-Z0a⤖lKHSz03h$Б y@B' Ak#VPMI_;pG$՘5lw+!*a.4!·#6g54s#k42 Vg p*X(BavbPT0EԼ(Bg#uErx0%MR8G n> p}N 0Naq #<1#EP|_W_$iޝd}Ϝ{{v~OM:u%o%cؼWeymQH2$C'w0IwY2EV=1gsΘ= z=w>nY2wqF#<7fTyݴj+=:g?ܷN=t-ɷlo5[U0#w\};l w?~Ƅ6:?􂓧>2wc ׿I~6@#! `ʾ[v>xϱ?{yt3˽&%.e!@ez3;͋ͿԊ5}?vB\eOt7V}SᚼWE (~xrs8|q̟4c˜ʈTvԒgg᩵GW(%2-}lծF8,u5h-=`sv6qL(eVtV ekz/l$p4/.9>3wvڢ&#Ie˖ȣ_ 5o}nj:?1ñ_>³FvSw9i[tkjT "V! fO- H"]BkBO5H*!N M 1)lK@3"U0* Լ1mbTuzL#rQPGIX~^s (`[X) f3Tʩy8yn/c*ר`IPygVv4M9TM⤃fF%.\=`/d@S@LhFm 쁛~9ژ0v[t~\x>+@7R4{nIm޳>~t`O5[GMa̪Uk;t+G򇞚ߒgoϚR8I^Jdu'WunCs֜tϮbMO'V_t_ӏ_I{U&uX1X?xu>w4FO?|r*Me\vѪJ>{޺J`K| 2rLd;n/mlZD:I;Oj۾FhJa11*Oo `&ܶtAP ގLQR)@)t$Ăq! z;Ty 195YsՄbB0xrR` pAW<gZ!HS - $DCv(_&D F x %bW ZQhuAh*$p$0z/f0U4$U]`;sE&T'R!ңh˜H)57&$MDe;/F F4>\.Զ1oxss5v:UlcFm2}Y<1fpϚG.}KV/uXٓX ]{yg>~2s9aѪ_=,\G-Zշr}=FOvWU;gX6y|[K)Z1P]Zqw/[o}imm[ U66rsg}6/r 1/DKYH%%Ӕ1U8fqCKsɌɃ|d@BꭀZf @uq˜ci8-"AODKh$(xZ.;Oq" +\`B; - (c }DyJC2Ph4W 3SQĂ ™9ԥiFzxS8B JÝA)m(կA=a'D>Q}6 HF53YWnWVjw %V]VJQvNli{\*4I׮ߩfh^w [rI1e'mXEJˊ\U>?axMO9*ZR)Фo6xk=Yi+#䴝;|͎-%'V򑥉{*e6/}5mG JM|b5:mha)™i[kх'ۇc8c8}[VƱ:~G-"7|ի;c99{-̛7{E K.馛:iӦm2Ij_|ޞc=nYfFZZZϟGVٳg~￿o:::.JҜkJ{9sfGM74o޼)S=1bW_=vŋp wܹs+V,_/~gL2u,˾/_q3ggxy~wG})evxއz'>ŋ[} &V$%Q&G!"h_E88$(E!]Q l3Zx 5`v;F$#q& 1X9|+&yQ0P6ZX&L;J@dtt(|`I1ec\G3 QV`$RuN bjQi\] beFڑ#\3 P} IիW_p/k~_y#Fx|l}{\0mڴ;c̙rԩS3s&O}ƌ]tф _ϛ7/]{~69wϞ=SN?]wFY_}`]n=09(u y@ф$Kt!muN0r߂^:BgEMB&oU48REEA5*AK\ 5FBOg#f}J aa5RCjH"̛yp)-Lb bCp @I 9h bJrGx&bU TÅ90^]!kw@^^rjM^jj=Vk]pj/R[t3W-^ugt>k՚]=z@f87X.IDFhxn adjjmw$+c/sekQ{)\i 7 +lQ(>\$M7x ?"~` nVC#oCQj8`ϡm Lf 1xbCw!z ݵu< M{޽r>6pb\k~qjp݆, Y(opP=psЧx$mCTn\M1_v٧/ĝ']r%/7}&tz׻wNM?u}aU5RSoo]&2ZZZ>?GqcǴMy"}5jV CbZy>Ͼo;SO97o˱`:|zM=FѴ<+E=`pX74a5e~K1>ۨk)j"" :SbJUs"y@Z)$i@@4$H$z$WIBa 3!-P6"GO .),Ăc a1Z#z_0n~AP+0JdЇQJ@7[3Aj(FejFk)13zJ AS1#B Szl:GgaZM lu訄Y}kꀫW79I_W .[G㏝>[rTr΁P,{,C3vyqk%,J$̼=j׊c'TkZSԤ[ llsΩf/ jJ4d(QhP!DMS̼Dh 8O uCwv;h?kb(Dn9N%7IM*sU: 1LD͌*P29rZ{xz z)$cEk,%)rR0O-&DIYoWM*@4$Q %E(D YѶ IDATv@ 'hf= 4R &"O2o$$yg% Z)Qx`PEJDQMT {.O80AT@5g02!4:&C*&݅p$lĈe<"'ļ:"iN >a&D5hfU)Dl `jBsLHQ3=BLU7+i#qP)f#Oa>Uj3Qy \щ LUZ-I Z20o 5sX'u!1$ D~v@hӻ?_ }#Jj5Hy(ᡗs?5ٯQ`,`@#sͬs>nSF(| Y՚@??>{F=aTIΙ3kmݺ{f^}ĈUY |)( ]4_3zmYir 'om"\p~K_pϛ:uYaE)jDm[KiA!pQbbR-VB>T8#l1oE=]B) ЫQ jHQiTJFN$*D"aÍd 3îMS $ ČB: p{" Lr!RS:(= S"8rZ(|P̼C5Si05! 7zRs3s0]"f)%S_2#ysӴ 2%I{)+,P-7$%,Ui|8SgLdNjbaAJswZQrK'}`eS*9sHiIJ%L,%b@Ce1R20wƶKҚ,֭kN;'~x[\ׇGy;f?'x ,TK-ZhҤImmw!p&{;pn/x{+_wfR<_vƍ?gY5z|?i{eY㏛ /7~}fYnݺJO.2ѣhyf?Ҡ X"1Q\5$$B zBhE"tT *E_y7BLiUKAv0J53 Ij*A @렙%DLh̘g4r7 3}{yaU\ɣ IY~sDcלhEt}Ƿy.|sT\䁅ۑ3C{xT[Z5kEV+tD[\J^Ug )lVy3Z%d.b `Sx"cRRORr0O%$5X2T8S"QH01"(E+EJhx{޼cTbI&bhNaf91Xr zzsLEɠœ$Af%91B85]6iKrZ\b&y$t|.91 I$ '&S`nbII,38MU)x稒PCAD;2;IsV ˃e,RY53QABab#q @2M$WFoFҡݽcKnMP?-}MLDIXSn ɠ*Vu^aT%7#DB3c9tHASyJ3O 3$мB3B\*ާ2z8SD!H,ɩD扦¤Ke:u E%s+MhR6Δқh.PF,\N#}J-^I6Z%B\j"BuWع$15ʧbRƵPJӒO^$gq饟Vcƌ Bcƌ Aʸq?g?ٕ+Wuuu>t뮻;_K{ソ6$ιp35jd\ 嵯}9sozuaw>'9qDR8qg}[ސeY ^mGN>o'ַev7,:q]rgi*3ftm^p8:jw7Cp``[o?o}sԩO4iU>6 {5\]՚ڤ[AKL$VUpQ @iDb:,A@LT(@fZ{Ϫ]=>d';$H&$@DNAZ@UaZuVXGgkL˨FTJt ҂BuZ©o5ٟ] ,y3[nɗ_wΟ{;ܗO9zݑ[w->{=wvG>g|W ?'?;?#/?rw8B?N?s.~x^; y{Ͻ]s/}[='Ԁe̗]Mz?+۞{=Mq}xU?l>_`֛ː4fpYx:SH<43&'%;9bAp<)I5Sd:anPK,rj^T1&I $6r[\))n,a:(cQH5 dʽN `)ќ]2+q `lv8vJAzNVs`0%1]>uCmhX`I2ٙNp[8&jH4TM6<5hunp )4Xm%W?{E&`p}B6?lR$A07 [ fb͆LR'*YNB`WG)'j aEJL!AI0p#'J(|h!zÜL)lM6ULHTBM;%Lr hݲ6G- DrP&2h=Ԉ`υ'eDMLp[crAaIf5>9'4K9޽5-2֖W[[[^ל(3QҞ={wFđ#G_wݻHfÇw /nL,9+^Q>|qg}???\Cm/[[[???7YM]H޽oikkUj׮]ۿef7UJڷo𛭵XVU }1:[#Gy_UO N4xM֢ۚomqnQl KPuPD ̆WAg%R"aұ %**~PdWBh(a/"E&(ZY5F@fU}^}}ϧ'?xW!=y3]>|e1v:[c^Ȧؒ|ߵ??-=EQ~Vg~׾眵s>Q'3((: b23daDC:x!h g9"D# "}hvj:=dZG{d(9JL ;hV0Б՝2ʼH(Ӎ\bրWjXF r:84N-hLO2Ғ:Ր60β)n.L}\GC$r/VZ6"DN&L2 Hp\ :k< -Of@RӘQAf)i)v P0M}ٌ,: !MLY2ʪ|ِzNlHL! I^wwݻ738P?^F=zP]U<GO:xw̼{?sg Y>V]-da|s\( FBQ4-*MԈP!F#D,1L8$I 'HLZr7|,!ʭC-bЕ( 8hI&$mRdƦmLYtYBN6t5kR=۔1#%4Ws4FaUϪ{JIVq+ Mj7Ù ll= )rTg-t0z*7o?ԉurbx^Op}_}v2x?ki7Ɲ>uwu| ^[Oǿ|_|ː3L839g>qϕOy'nv/r?<~ԑ?/mݯ|6msڗ_']>x H.c,>SMHIA|M8azT46 1cNtS#/|;!zGgfOxZeҔ9/fS"]%bKy$2x(a*l/c7V@ 0e+JY3Ѳ\2Ü!%+ͫbna4EzcJ){ث0жVSfRQڔ~URH|Ikxm#Gv\KT"Ts2e40G$Td;ͤ$K5UVQ0F1)т2UU ~`PEmJFT o͂LdӮSTʌ;DYW(r$L؋Rk7#Cz"r&`6L:ф)D6u&)2hf**pBlB d1ޚ `V5Xب9 @ഠ5]v[%ZPt7ӵRF2itϯP9~sy~ի^>}kwřx\VAa;s{r2?|" ܏6έA(1/kH5 0pV\c ,U~k3`VˊH?c&>HTx<@)H#=k2 egf*jamxaLBDa#79(4TICs @J6njU.jϒؓhr-i43yF>eJuTFB%sg4SE Q5Cʮ(6[פrO]PY-~ wPRo+/=wOÖO|:s34[8}S9KozO>o!'Sd?t׼g?nڴs3 y޳/}yuܠ^\zœ^]r#.~X\_?:;-wbh<^  >Q X9ާ|lq5VgY>4lDA$ HQζX6_ tJ 2IY7.SYSFhʔ0{֩gid-)V,2Ufua *FOј2$)2 pE idc[19(E"Lfb#iPzfY'v ")$GG: 1U*7T;Tꥑ )- b9b@Kz u鸠Y,fvًV&Q? :Iה2;6q)%7MD]qa%G?tQ[|'sξ)dM3.Wnyѹw|v<߲G?75]ŧw~'{jdy}~7o|}ڎ TVcL1F jj5rثDO5w:kn;vݷ5c-=s.(M0UT4#I5XFL9Vfj%M1 dN4+c9Qka4dtØh1*KJMRrqLh6 Il3מ,Ԩ'AIE,]^jܘ†l`[ǢOg@Xz IDAT2yjpoY^ې`Xj᭕M @fiY([6Fc%E#Do0RݽI(xF49$:tK&C)OkN&Ё402)3@h#X^.vnhbXlV Ɓ˞2<&cp"S6sL"4*z2Z#,L,5圊 -e3*֭{]fXc M.^o+b'Z הÜ:KceO۳;n۳ !*[[[rmv޽'J僨GUg΍$E/Vn'&ZѫK'%FX8*#M(oȀű|Km rqĤ$ύxpWjxeg!N&6b3ǔ%9&$%l̋9H6j0m7 C"2Yn͖ϼ߉dHỤǞ}AeI9$6VBRiHpYxԯSחpBS_w-oym]m\rIm!6iZkR\.Нc.3a׎֫?_wc_B;~_>_Ӵ_ѧ/+b^Ko?')Oj\O^vUgwqogqMu9Op2>?g<}W\rdFŒO\@n'TUA*e/2%kSrīkPzYvޕpz B.`.0eЌ) ʬ0m*ȸVm2d xhVH*=Iu ͞ɍ z/ŝB[V/PX )Pi]%ڠMD%L yH-3aFg2W^0g &24S++uOUYqb)qZ͛*CI3fg{l3p &9]˰;3<2+%)1T@4, +$)x`DFK8iIYFmP0F:!a 򠙁92SLb݈zUnJLaKEFS4h6]PbB Ӭ+2POtXsoĢղm-f^ЊLKeG"F"2\ZZC]~?嫾j{Z݆oƘWsZ9pmy^gD3!7|wzXMzp|#[n-|y/ց -{}Ӟs.~7cϙ;gy-'>}:A~uz.xΥt}}ˍ7'<Ǜ }ȑxk}vlC)abS݊Plw%"PD1 C)v4AXl2uGHh3Cf%wb#%Xu!LtPRd yY%ԐJ3If;̉._(V36F gB:c+'DL1bFPCY3Kf%T'kz$M4T?,$5 aJ/##먙@b Hes,L:UYVDf00V8P6RB*- Y?;ؼi\`P u1 ZKܽ%"%zPi4P"&94ZjDTIYtdÕ& UfAC*X3;M}Dd@D [.[VK3#0!fV+mJPPLs+w1Ht Z HKk z={lbkV6͋t3O\˜ s¬r(}zHo\xW=@K"w'< {N?р/WbcJÍ^sIqVߥբyCTV O)sD yT*̉b>6^fߌZz+͎f#^GWgD e=Crhm@g&0F6y>Q*U;e Jeߌl |LHY@V6>y-`߻xөDJk׽몫?otM-Z3^˯>ut{֏>=Ow{-Wg ~ȝw;/?w}qЁ;v>r>}7>sO]Gش#Jp=^봏ν}\,4/q'wᣟ5{9#s97W<=?o]zgۺ뮻%Y[&,{y²[+\V&藟-ۤgq;fgscEeYg@i`-a&yf38әaI-9Qe 2AIE<)W&Zz$0Xd3"{PSMQ 5pmJ2wP$MO]J&J1` $KsjmfBi I3ʨb9QEye@KK,EԴm3z)L>֢oVS V W}Ų1y׻{[<1:u=hB`r7_~^%\r덷q.c?Xҁiy7qڙ{O{*C[6yGFo#v,^Uoẹ[GYZ}W>zkkku9}Vq=;ߏ1b ;v-O=Y~[z@)kb胋w,W}ww`a@r?}h:'HezܒEŊmMDS\EMKWVƝH%橬ݻ?tھnD Jb )72#e0έHwb][m=WH飣CZ3GS@*Ș4I&O!>R% )ZAOt'z5dO% sS *;Ɏ5&td "&̪ k :T NYGi8":7aEL; aVҬI-ˈKtpM=] Ne)`V&^i"@Dza)_eSDO\QTZSS0f7dٱ g+c *H9Tp%%TKe)0!cTNRz*t&Z6E4 w]f;,Ft\ 6ȤPN(ƈh1yg7i)WM;3)WĊ+mcnz,SN(&.n[:AY09iFn-al(}I`9Ω0!E[o/+ @m\0ZK\L(}T%j l#~4BJ!1f ["d 觐&DG1{a4gŦHXQ +Q#>[S}M*&JQrMEۜ*aj$+\Bc$x Bl`;w[\A1LQ9$*Rx0rʝUUJs8jtȲ)c6윺P)oo{pMſ~E81Wgϥ^uk~G/׫tq]O_}W ǡZvp}mmo[듻=Q˾NҢ\gwjuC4sλ?sۮWa_um7*Kww_'>z뽟ͫy]ݎHŎ3a. K ,Z[1JAd*zZ.rJj$Qٖ{==Vrc5 #&Jn-3 l~@I%JƠprBWA c=+Z"]K2Yp2Z, W MVߍ l8~6Q2`!MIJeƈ,( #!GfR^yJscLuDeB,"$ʯj)L9iPbB!BnQa]T`N0$B\TPz$EawȞKId6$bfZfʁV$Zتia.3 SRMk$aLhtBf)f`P&JuS $SFdpYֈIo( S&V;ERZHӌɍWIAV%OHU%[w {ٝ|nH+tQ㧮SIoEcO/CicM87~1Q %da Ԉ~|Q*\2.03kjbl0F/kL~9j0+:a˓OrXrcY 4LCl\nM(is~0i5 e2DZ*̆j%U/Is0!kd-dxǖ U IUqX|S !cYYj~g<_LS=ʛ޷dֽRrI3}}<ޭ- orZeFDH:QO`B[߻x.=dsQ} 컞omk~匽g9po;Zjײ<|*([8.32-@U^b:lٲMbҒI$:̫!#  KYwG|TU/0viH&s+5HE_b $MIr3Ba $S@ؓD:C#Nu$\m9-D :r+#Y@Jh%(3[kFd8Yp)eX=Hp44apY-Ѳ!9)!<0vؐD1K1Ǵ”q^\Qi]Tc|/DA3024V%| ACb9z0YfZE4{h%BPF%5fc4bݚebm=Ű3ĆÙىu } `3 Lꉬ*L`zBZaC==%q(B+AbZM]Bc.fYa ZVs`ݴ ʲ26}(P@wpnP&beⴏ(%^[7nUX1cde̬Ƞ2RHR*he3åM8,3 %i2*E,'^ZjȊyD3Fuf~[4>x½_VϱCbqUձoٳ˯+,qd#;ڽs׫_\x>vٚ9mOmD:Hb=k^wG_y_틽h#XiQeޘV}3!sk:#WrZnlGB7oTzpm$Zy>5:['N}ip*I$ Ko:($tA+kg'l`CMլZG?23̥f4L;L3\l0e2"DxR"؃Vݻ2w&L ̗zΣ:c?mds7b2mtܔe+akeUAլbY"{P6CDb"lSEik&Mװ2! ߧXOQ$d%>,P.DTvB#$d8AZ94US0 To cb@y0 m/#0ajLئ)K0At)Y=V2oK ii3dDZd2N{iPPJKi 6JtUv]|G&bdHR7HK6cSfPH#'pJhY ZJz4M7K!9IN萐)$\uy/>RFóHr;Lh425Z/scOҷmNk@ ӶӤNFPGdYv@0qB&vxnDR2qd A&^$GFnHnen[wmT.' q,Zk&0X`lapYsT`"lL 06F \ [* P2(E,\\y@w$D@6#塏#8H:܂_k=לs{ok vTr1A(q+~iʳ*9sԯTХTzBx?WwGU>[wxoyg}>if_{vྷ<}R4*o(Ǟtb(D`!ZJ)s[qq]o'XU-1cL R tJfmTBd{!S(mjV,GǬA:|eoVA^3Z72Y^ɈjDہ.F% E#pa9vޙ xbxმ;t^@'7l\`})l`sB-Ӫ"= O!+%qc; k3>'Rvs֖Ad ~,), Jh 9X ށ `O:27pkhUke&K 5KZ#YF#Ιpt FqY T7l'(P WRVl;l9醱D4{FE (F+xH&WHdsx+}Kx4$sGE[¡}TRdJLLNDi]϶dsD %,l63 ٸt@IUd3 LuDKjJ"RwFqPP+hswEh`c[UrݔfΚ8#4B bނ'ĬqSM>/ mpVHAQeSpKۥ\,ę6q^?>ܑte^Cc?[:&Y 4Չ:f9$#-+uS/pb#^ hJzq[D;XDue_[xZ R]$yR[y<ݹCl&C21㠇$FK'b3G* AݙuH1?i`rzZ9*'QX/`?_U a ׭0264k,S%3%t}!2|f1:*ҭKsp]w{!2'nr?QDB(+*:7qI3Pi `+@8B6<8m1HBNK.e84Jfԡ蹵[C;M1-#rp:X gV ޶@9==I9 uOZ1$FET9g '="bmD(%Hۦ=j%TLM@ )1,y@y;b'6 ޷ J 4 4L[!٩.)Gaq6 zT C(N̚ J=H ynA#3 Uy?E‘f'$£tjL2c:! fhʩ.v3^?Jvߓ{V>Vpƫ=ضƶuV S>($rb"gё-*lg 5^c" ,#$L ͠!e]\zX2f03P)Bn&gG?-Wi{bv{´X1t%leW2F*V9n-֣pBKO#vql< Bnh>:rFtur}1t: :V{!W=VC1%,a²Nƈ,q"L*&/FUE4q%n8 2ߓj|۶ FX},U +_[ B&P3,z.IB;Ұ^l> W :  f~T+5<bV2PF8CA,XYR.V*1IhIVTcznΖ^NS)MSf.9Z7~YPTh8X4t pExԯP8*wkkZ;=dػI~gy*EMNID6\Lm筢4Q11xis١tYh2;RP @(d;X7 yih,|l+0mYtw(!-ɩe=@=IC,ӂv{qP 9{dhF.2"1 y dXJT$G0 t&M  Sk,a$$𬚃€bX[|tPy-:,Hq2*ofT8bO̤冶D .HrD&O`؋ A1o)CB"f"1"Crf=h1*;4]eK.%pn+RY3@o3.`Cވ UX_{A8?pV6=͙ dvIYYxd/؏/OOu7#/>q[wdx|w VLy\jnV=洃y%jTh5  bmÈVH*8¨ʵz:s+k̤F;Dj%W8֬G?HP?NX2(C@exc ~J24r|X06  uцڦXUcbqqM ?+ե8c~z%'IVCe+PDgpF-a"ĝ09sa0" \A Ƹь2$bBBRqRElj 9R xSdTY¿f-&4KbkN+3\͒T25b/3 GiE4,b#[4 ,a"3d9@wnBuc,Uuzc pEHdK|඙+:ג,SiRfY2 C!]QGP>ky8Ke+ F1bKS7x(bnNڢY]-h6h@IB9v,,ᴺhqU@N_Phacla. f2"4 f1}kmp}35}fF <55Y87Tr!3rԞ֌(`[ oRH<A3Uam/oX=1c7qE1AT`PQIT˱?2x ^g<i}k_w=ݙW]z*x Zw|qCXy=S1QYgߵ\b-2jlghwey/^|5܉Wdf|XVd8iaVλZY2Lbp&yrM"ŀᄁ@PH8Ζ:&=iGyZ+#mmY%{yzzM/z?=Q X'|ފ.Gˢ$ؕ"gB taȡN9B( ^ő}N$v3[Z1)BY6Ld 5d% Hz-{{ĂR1,X[ʠ iQmHA}`4\ `.f.;g0Q8(^$Xy=!NhY3HX-!СALHs1AAƋ,؝s,$y\Yt(rYHћE;?r^dN; #u3 Sc@mZi%[A.9] i1ɪ>d֌KaZtiL0"%"B=^լi[f&Hf@i +QW ^PQi'w]0fi XTE al2|IΓLH+'J I0L9_C|˷|>pݾ}Wo}[=O;㥏{=/{'< ]wݵmOU?#?zq '< x+_W9o_k___}S||(Cru0j9A#c"wMXΪ\ _Ŋ 䕌=<ruZ?F/kwHuOSU^lV#2E fYP_7%kZT2W~޸<0`\;&˻ N/ Y{eSph$#G3]߱πB$?AGD_*WC NRdf;p"=\E+r `a*ZԦNc=g 2O;]Rywsk#BIfnNbj_Ebi%HSt34HJ.X$BRIm#*ZRU-Ϧe0A.^ʐO<7mN-h1{7UJ$ڳ @P^ɹwN\uʴE8cU[\!OIj}Nz9*D01;ϱ<  %= =DbI%IA1f@p2x"Pe3#Xp,¿ܞ1P@*Ddh꼐Sas_*p~tޖ)çn#H-jYAp%VnO3Vp,B@@fq%$ BPfX\aÅvv}6Q{kmRtb"jb@6\^}ғ{ރ>x5踼GG~Oak?7|#7oo^_/~-oyK-W>33c}_//o/ZZ1ץNgw֚񝽚1L7ݾ!=8aoهN(Ea5g ;x:1߈Ulk!P$h->R_VE0.Bˆ@Yv2}J#9of1)8b ,QY@XCx8ͼ>,H#B\f]@4)\9aÍ|:&`{M&$yDԯPYGm`K{G?t:t(Uq$ē+eLo fV9dM4̲vfg dl!rqTU!3VƭؒIqsȱc萢O Ĺ IDAT>ab%n:v2>t7k2a2 (ܑΘFd :c2# *F؁Al,J1O& C3"եn S]OҜAB.DLb̬8c_rh=u C=BcQvbŘAk`,X%d1I'"gfP,G'݂1끔; `z *͵a.#Xm3S20) I;i2 OR&wL[ZmvLD%eO cK6L54 U@liujárˆ{(VS#eψK3]Xb\2/*#G-Ya2DL~y=ܶ꓏{^w{??~Ẇ׽5/=Og_7?s^m////_wc۶ɟ|lU]+=G*˩MSJ%k`k29 B3$*T@dOG?Q=(O3ލڏ, Xc *`hć;Ƈ5Dr$}wT;% JlV w+Yk:eK1⹺OۅFCitA\{v2#(~jaA[\<n4r$Z ~8~̀i@I|Dŷnכ~1&c{⣟CZ3?Cr۶g=_+ʚtE׸}z Qq2H kL*xC>SܺS 1~'G$lc e$7PD0܍^#f#8m3PN&N:FJN]r.fR +-p(u4"Q)C,E(|FlhĔҀ|a]m/{+3)~}x^x}]^^V>7_|뷞!!l7>><\* *#mbUzosEmkeP,jYBz<|qLqI1*lȫ08_ -#m,/-4Su" d޴bo;[:k};"H =GƑ!vd8 Q 2AZ[5Qg0msR:@ ^]0Ҍ5"ԯ{og~mx=p"]n>?#|~\v?e?c?v7?kJT_|#qQW5'QKd}|?G[Kox=>|;7Yo޼))o{OKg?{JR_Wӟ{'G0|C_lڱ|*J(AE_QVj .{OejkJ.q`DSQha]jH#؛@Hpcɶ=)arT:0mE v$G !wװ5R#JAga,2eo5-fѡ*g?m#ۖ(0"128y^rF<Dh\ox덁{y.OE[T_=as"nS>f}_G(|?/g~s_=u]P*%@@B =a.c>5S?}ԧ>|sOO<]\dV)];1+~W|}=g}O?%_ES?|qMmvLv'uN "LWI;({C IgܺkcBe'"J21yoklfD 5vRp["fqd"6+EEGh_`1"]3kwD13%5Ӥ1+Qek& 2h$3 Y=;":ss2}ɐ6u[\h;a iF2TfFNzomNj՝,,֩dӢm R'"<ϩR0=@SyG .Gd!BtdZaۘ"v:N1#"zbf0NlF,Cq^ʊ~e`duMmHSD`m_`DBAR"|dMt.$̙ q儵ds"˘0^ӭKk#V֋߈Gu>p,%M6e'B3,:P"|_k_%#Tuyy9M*[>(~xI w}^/º|?˿X[n]/'7% :1c9!JL갨rЬ&q%"\F Nâłjeot "\Ie^R+DO-)Ye= ŕ&AfËny.ذZ= 3Xz@X#Exq쎒vƣٰDizv=kBPd+L;K&<~q}Bz˿~;k?|w7zNt^mϯ2]}Wӿ姛o ku췼g~/35B`sFDr[UH&rRDrIwh[@0"ť_Q"f0a{a(rPӀ1pwEMF$;{cD`iTj Y-Μ(YM;tn;Q ;X$1-B@4vqvh!&@Aä jN``*:)XnEP2 6HNE(9mn)َLåر,BfYH7ܱnf7plcF BM)G5#'/eu5B .ik0[ &Epãk\qowhӪCv]w}P>:D搼UYIx'I)$vx% y]f@2p8!';8x,xGdX -U oBWa1TdC#R.o7P$>&G"pU @ත/:{-"(eM;6d +z }yV@B @ i QP2@xt4\A5ZtzB%?x}׎-?'m?exo{ҳ%w}~^9}kwu8Yr'$!<gygˏO5T)$y3da>xʡeiǫ? ;C ;fĄ""TAYɤ2LB2Rdm;?|`)stY!!$g2%jgbt)VlwRjMd ?݆A1rj6Ȓ֝YdD0B%yEwG"A2ڏGxzP]Z 4#0Z9SJtB,މ\!DTEmnG:;yF" {־4mG@.%l@"~“Xclۧ((6#h DNJ51s)g) 94`W΍]at[OpժI%# 4ڇu)Twz% QGyfd`r$)eD7.$RUt{ SS hW27ӰP9l#?F|'yw#_ޙzVP;};[c3u؇?8??o':lw}phPIyٶmn| uy.cV12B0krjln{p6Q+"t\y1ZHpi;1GjC.qBDz&qFlId6"](xtdK:JT\ :Q[քsJlf9D vQ8 Y'2$ &h0Uӱ D"``t0hg ȈḭctFqА+g0ӧzF%vSJTv\`V  VWhgKLhJ( AK,s&$0A~t*L%#PjJ%!%U@0%zR-wFfD!|fcPeO:Q"XCcHE@efÍ Tf ŀ}Nn42`Z1/Yd1+GD|foc =tkkEDOѱ\~2^px &jӼ0/;9>8m #n\O=Gć F(Ȅ]*%ŲX`k2|3@N.B1U4G_ e IDATO- h7B(,kV['%6pL%B_Bk*쑽7L`'-cwܿշ'(TN|n?E˿Srٸ;GYHu>? ]xڽCxvcnU>nƫ5|_1܏9Џi{n0g5>׉ g9WW Ln vC9K=daW j,#е*nDΡ(t:v'{oLES6*› X"AY(Ⱥ bEr4ٱF$Lf5 Z,"P4Jt+ ;H>#J9!;/J KЛX YUH8szm,WS2aJ&"xXt+/Gqț@?w?}a;_OP?㏿Gϯ_/xOO~w4q|^G>DS+O^~ڶm۶~}傝')M^oT sU 1Qѭ"qȖF^v7 (jw&yv=w=? x҈ IA}U\V'-՘-x6m'H-qХ$d1*Bh[tRM^4B* #'H icC] A,!9!MEBeS0i>c;Ay+=!b8ݢ+CN:h`pΨCQg;dLRT)8h"! " v;nju7 ,"i%4#%@DYH w=xQgِvGdQ]=(cDS͑MeD ]^ dԞc^*ecB|Xsqoo8{=g]PPH{v׉ľCj-z@NcM:hqV4HMnKquʩJٟxͷW~]OިrgoWqy?7]o>y/q+gggzgooo(kx{.w>vf~JV)d5v"oܓKu}Y!vgg8QL7o!yDd=L2Q<^f?zvzeK&tQ3’iW"9eC1)bv(oZ Bod[QӛddU+x8x`P=G iD݌jTʪNNB5DY,id+S2&OP'!Z-I P 7#b DD͍ǘqJ ͶFpN(L"C1"VGD8fØNMbPuGl7?  s?PX%"@R+؍5-,sùB2 cF t8)F 523U]1j܏`%t%d c,L3ԴDͰ`#Ӝ6 jPZ20p>I2!i-5FR"@"@-(F=. `paLvqܭn7+z v1:~ϻ|/K+X} s|i߽2ݛ{WOծs޲}˜r(BQ\>|'_q;*}2wHؗ㨜6l%VJyEnT2WఅKS܉7)Vq_;%@962"䩽4̐XZ];Bl]Kz~=y=_?FӤP iO{O.nܘsiW"W~g?|=_wϜ]{a䖸zիW^\%c+g7?w|qyǟov+WDħ^ޞ* ||vleWtm  #虷Q8t1AȰǚGǂ0 iikw0sx4`ŖqDId[*BT268VFm DbHrdq%N3.$["g9 0LEdǂ@pBÞf]:.&rHӦbF`@9@+F, #%b8C$mAM#lϺ-_6ce`1ZA{UH[bQ(r0"'ڀ rG`ؗ "MaCŹUVY:hNT-f, % #b# :w*$ 3aZ2tGRI 6"BȊ2 i sl tHQFz1'"= TT4APhw39$ &h٘۴j( JD=Hi FFP&CmUľazbr2!y4Q((魐Osdx(ܮ%zzZٕ+W_r~ _/k۶W#`ċ%@TV2"/"xynw#T I#|v6xKScoىps2n,ɂEO {]b[xm#I T)ѕ$J$7qGLFd0Bß* p)<G@aZH25e/՗;j4=[^Ϟՠl# 'oAc*d5 ʢ",E#Tw'!U[Tv$~| YJQYq&xLKP*9і^14 *Xaav;=TYdڛlp$[O(;T|+~`d3 Fp49䢃2±6#9OF2LbPqVUxvV =:D!V8M3cű W.$nܸ=}uc|M8q43J%_[~r-'u[򖷾x?'W}W9qsg_7͒^}zi+Xn'om\Iu{rbg8C^=t>,jO.WDUO"EE$h"n(H^]9~)'# b`P#gÝ)[0}O+_un}}Bp8u׵Ws_vömlp8]]<[_պw q綿| oin>)8Y~6VQH#jqrR@%{*H *c?764&Ԧ`!N0P8%fJ&KdiH&DnMཎL<թ3.qȁX{+{ o$Vap S% ȦI;\}9C̪Luۦ(B bB6ܚ~Cy{뻾땯|?neO+^m7~_59;|7Lɞj~5.blcObG ŰtAg)/@!R-Zc}#KkwlFWqв&'`6ֵQlbPiAR`)c e%u|K<>eO [#KU`MZ`~\jK:wI[RO`aHbs9'c=5j+Xdh bǣ'ʯy[ ^rJ+I:jOK3/lGSƟ^`iZp4ӯ\> Opu!{C}"7ല؛D%*- VD gț<׮0#TRP$!| 5ʄ#BY&}Poy(8 P[О`'#9Ĩ-fpT)BNQ #hrZ@cu?<mH*Gtdູ:f #Y]UgT h2Y*c{mTR0TF4vD(h ~W!$uR'P>BX,Ag˨" K;13p V)@R@:٠ yzT@>ɌUtɣ7\+%Ps?'WcO 'rK - \A3dmm!^+z֭0|C4 \Ds X$=ڒR!!Y,{hsh#-[0 raa['ǐD3s/TnU^We//oo/yի^UU]ry{$?򑏐| ^0ƸЇ>$zg;~ ~w//g\OÉFۯ,-Fg͓\oφfUFy򩥵R PF<#1µk'uQ KJr26eƓR f7lpg0+x}>aNbP5Z+ P$N&&qPhD'OQĘD(IyOQ 跙&A0] y3\mS)G<)'=D~?=HYާU))ߴ3u+7U̪qq@i9bQ#c36>K!"gtrpiq PR&9mĶi#pkILys͍ :T@]ա9tьU2 ١ĊuТjy-(ɲ ;R$TFkbI Ʌ}D{Ϧ膀`Je1fWJQ,K>,:PyIv$%EZ@ʭ FBR)(ЉboqdA( S%5ي,M*Gf 5Z{ ]!LEE-vI4丅ˢGP8adr 6LN)9Ր5PЄ܊ UfL2 Z6$`1RI)dg kcGѡVRCb{70հGХt`iQC&2. q>6r;&m&Y3qb'*9hİSEw6.1[~^׼Moſ[_׽uz׻կ~W;~oo???ܶڵk??pʕO:|s1%o|D|xw>LJ,zv/әɊRf~3V`rfy͆i֦X6"2ݚ> ،[d#'pk|A46mH8YEC"Z jkk65{6HjI# - @}gf1[G5A1q,pQr"|Ꙛ /yzLvM˥Mv(lϠ٬bK^ԯOTn/g@KcJ`( c3EDZ܍S 1F/#Nv*Ϯrw;PAMm:@b4%a@a{oi#0ueZRl>ۙ'3#]0c̼P.F &!W[.fN쒠ʁYNVgiA.mlպd Kq>2 kDlNޛC4PzCØtu-JArCdQ CHdabاy%ْv c;K&ưkUE{GFwuE*d5@&``cр$ 5RC}|I: AA%"fM1Fvsv# f,Md5bडsִgFGvӛ1,,P37萕V$@@Sb<1',:Yh E֬0 P Ⱦc/r' RjߏKU{y{ ;/ß=w^w+>˾Q雾툐7_k>yыm Cל|vخ>ōUu#D<SM8.USO̹[Iv|qY8-,{|wrսj="xxZe S#2.tDis?G>}闶 ;/[O_ qy/k_o//{56WMkeT ı,["]1ltɆ)p妶V\bV`YjSpȥnV3avt]5/"J2,hĚ,qʶ*+Dvz_t%y]U)H٭8VlkӰlΫpjCF(\5r[%OYB X҅ `' ).꟎}Uԯۅ_6Z &$?I2ӞAPH bJ`1Mu[XAxjo0b9!pmVPX8Fp$F}NI(wwǃ-|5%E+:^![HA`ZjH;,m"rWw@= 찐˵`lk'6I T6eZ4;N R9.:}9zQʇUU.XA9)j7;,p8 `:&DƄ91X2ddYxX*&pUmr n!҇Q`zi 2a {Hs$ C&Q!"\f% g5f爔9qHxĴEGo R(S6SL[GqGG$P* xlKʒD&Ag4sa,hVjɰb|R&u|Moz[3q؏W~嫞xׯ_\\|^߼o'|/}K|ׯ?Cyͫ/1z2ionHp.ha{mW|ş>?'rO+th.2yJmdajF-vZ-E"~9շ0Xч% b\KI8ܪ <#BGb[0]B{Q5æI!ͼ#= Or%X+`9V^VOe܌~#-ʘNѝ1. 4Xdsb\/pM}}߂sv5ƭynt/!>~GBvQ2p6!14yOmjLZKIJiK3tczUCN 0%2GA}pi+6G*`B?-j͹eRp ;_؅p슓8F!G\$? 2`A.Ue<Ĉ"D sZk~\]JUr쳾#-msگU=gF +g&09ˮVk!3%>bjV8#1Ԁ&˲GiDQrg T@ xOLSQ5CBAN)\([%5ؚH>M.W,Gy hVGQf!DIh, $qJeLL1 1=(F(H'@NƎ0MڤP]Ԕ\8'j6CL#1lt" p&5AF7!vr"U6YtA}#?z;;~g>G~~W^C_onnm34O/G?'?ɟ'?яɗ_~n [/+ #WU.6 jʈc֥\Н6(Y/UZ_M&4;Ф-z㝞b120ijDS*F,(RcC!2,Ctb %gwg0꜓ QW 9IO(E-B,tgVG9GJ; ZH8Naa If`VlBNpd ̳­YbhzE*lr5!DE#m; gB>UapEj*eܱ,$8 dpB̐[E dEf@f,D31֮jPbfcc53'r؁ 8 GҜ4'H⑊ %҉ 9p0&F01$N9p;"vl{uܞv (aO7ƀGn>E +Ѐ,?{ۿgg3Sr9|>OTUݝN9W_}t:O|KgϞ8țv| ߛ/=%?*m~IZ?m*8+gϤIS^U~.Ơze-Pԯ-  m@2agr"ѹT<ݗK<|ؙR(q_dGXR0d]^0K &X- vz'-QnT+&g+Spe[2PGD\۬Pm 8LR>qw*QZ Nm0]Vfm^p{2*F;HJv8G3PM1ۈmz8 4bVYO,zFW896v$zVh1rFhJ2aGզn34b>׃9afԚhwtjK2eT16TT;2LB"iV9+rwj? nq$e]sdzd@;'#**@/ xs&(šC Q|4-Fô ?filGT}H "MF+By̩ hHmůA2:D 'aoZ{9%[|l`j~D N+m"`%JRld*FD0&}; X#xTPsmlhBxA[27efy S`w_AX77/z/ճgooooo ]|;U.J5?if.IfL0""B`^"Z8+1Y{0ڊ#m@O{ f rSꄆq w< bɭAGv+]ݶ&t_.xg"pNұk5 ;~^΄Uf"]='&CT{o[r8/]eu7$nMMlf PgL(|ϻ{?t<6Qm_ʈdI{w7l ۱_+iMyWaBxCk`In>*T[aиF䐤̊j{4P2k^{ gԑ, -9N)"Q%z3123b +7ó3k ݠ2NvFd- )Уr#6#ʠ*0ZHaVd: 1t\&BVNdeDC(SInN$TN{:s>n[#[$}G(6S+<%6%1ɜ_=}OPT)1BQ 5GjfAW?yD tKm<'niCa@#N)i>:EIrӭ߆+l( T _lY-YZ/,CPgыNF\.moyhkdGKB\PͫԃVWґad3:*{|y~Ov?<"nK3~DڌN%]]HtW gZG6frf$ \5˿c.la NHYA,tKvzdtb3%W!LgGw'çz*3_?SşG/7/H^|c4:laӽ-7o>0syK*(<3J\eѠd_Ͻ8v7bߔz;- } YrF#=&mY!66$suV-;adyspKw?M7fC^Zy*+OnQZtS{ƚZ3K4*/R-sͿLvitD6R :i HsPTGX$VC@:6W0yd@ wvg)`:!zKW[r˃CC`(c+7刬M&"[i\ߗl1ids0_a A efǾɆԘKD+*yh Tɓ{ʗy-MtxtX`'݌>wXP7P@nPb,Ɨ2'5EDF/eXX8@teF=`]%g/3j ,NӼ ^K<py^v\c͐ݨ\.q_Pyw;9 /*l l Фh:&hIe BatL=[97,$&\RcS`ګ񉏽ECiPΧ8o6O>ym3Ws*2fN0# UE +1䞙D8i򩉈@pvm>x~odaW40 NeDTktE\FT$ wn]4A+ a$@{Z Y D#F^i+D QHj}哩kALQQ.T䉥f=*wqu7":Dĩ1ruI: . ~):e]@'mv;B@yi dC_aE&jazWL:]Ay[3FAu[_hP#R$*dEMvM'M X!U=l3`l Nڡ[MzZHCSS5 >$5 j;$m GLhoi03fj=Z^#9;0Jr}0s7(I8,)y; z "Y+' ŴyBTxƷ|˷'?G=l6_~O>^R%1,=`mL-FaM 3 c+&^NO265k1gVTPoP$0he{U(viE nf<r~|aTP"KA=;xd+۵(Rөi{>v]`Ӛ:@@u:{+@kR'ǿ;>t"ZVX~?mU9me0! ;g`TlꦓYkIX ǧ3Oo;?Y@[S)m_iŧՊA)HBX[CElnA?ޢjf,N?b  `+ݘh1WRzV Գ`T8%78@0poTTl+ܓ @ 5^ 4`mbFFx!{c0M 9dR]}hHVY\jvuՎPA S ;' IDATZAf ]mRu9R;e LTp3 Caª'aLۑ83 &F5tص^4 3IxHJRDN1s6B4h7.163:pB:\@ v^bk]ĆV|r7բ=Qi% L ڨSTV^T?V_\v< U!7|7|~˻/דܮqؑ=цc*2ҢPn݇Je=kCH0f=MpUU e2]keu݌[y *^u :@Z^b"Fp_#6"^%x C5פ4&!#Y-h2yvH#qʹ;U=F$;P!ysso~擿7|k?[Ƨ|oe͏|u*Fq_% cwizK^Bi#˙z"TTinY(h(f7Ią|^}0gs Y(UG52zlL0*10%'L2C zJZfVt 2 IiQ&i@@j>5'D]Pn*dVl["Ez^ޡe0pޅ`RQfEPDd+}Yicj ddk8h3A*mGK,9Lg0ƞ-f[(bf!`km}xsV13DUZ$]dGX.3@ ixdf9Xb2BGҨp`k'Tm浙i"ሐ:wڳv4=cП8qIlK,CByiq5˜)w@uʘ!&'s1T):G[a@V OSexzrf_rm~oz']c4fC #@FIN2۹EXdc\$0DA jI fpȑۀjY_`r⥳c|pdr:]Dz0j^~wϞ^|MJ~ H G RP6hq[έP7o㜀˔3z)05Ld)ɤ" <]HӞ}ot M5XDނP[d)hE)#Hu9;@zYUwN}?G?7:lXH7lZc|qȶFw}enϚPTdhJDπdOid%3%ԝ1l^,ޒՃb',C{3NiDUC5rKHs9PhdQ3ܔa( @"PIš66dPlFpl@!3J9(#PΖGM 0!L0("N6}*7qp{m3l¹D\p tr @9Y Z{%] 0zOdeHq%a$*n`"\``#;n5J*NlxK$wp 8?_?o;?#gOүc7#7: /z泜x s8 HՋi&& iϛY ظ1g`HdV'yRsG>C3,H,z36c:fu X,we)n:UȕzB6L'ftQ:+0ѳN07; b]EY6k9mBf[mm81(fɜ9$'guq!%0hL.}JM8I<3;"ĕh)Jb$U.0sJuWP@`:E\Z< 'b餳ʆyQCi_ih[l햟y 1ېy7q pV۔0& 5*3!Ĉ.k u/6 ؚUIZ+ *.^l#4RUJ@0T} pv BRP҆hVεsC@xQ}4dOo[l @)P9kCe`G2fFqxz\嬣>|e_bܪZnaDn*I+4g9]i)q NΕN EfcM3S2ٚ ҲЈN6KX t8@B *] /Zd.}a[=t7wd7ic_&UƊ<$z{UZhRpk:q{LT΃4=1en\m5G_s_ I0T.DcR uK3ԟye3"aź#% M!qGCMlC"P-þK`ˉ`^6#cg< ƣ/i yQ:!btNIH+xX'l<:",&r܇1hT,[\l>pf7! &f \ϗ{GΜ2TS$ V%7Q%Hsi>d鵼zCclNpA[sF.@s󸻹<'?>=w⫾O^N)Vy^tۺS>\yCTKYRP: Xbnv:Z:̤p3Ov%ڽ#ȆZŎ5a6eh 罨yi%J@-ݠ33A1% Ԋ/Ybl~}|~=\ Ϟ=d/x=2odٸ#}9j˜<,jƈ5A56BIHFwx"13N_+-7l4\9v'7J (w@R t[/bzGVrݠ3]$̵(["#5bŠc $4/tYaraÙÊLC$+(zG\dB-4h;6g"?Ө<:+ljЙq̓H XSsP"-U1X%0,$lepBC@OFKΞtb PJn)ÁҊu[ˌNNTKX6͎4EyGeVմThSrA .2JhdF!d\1cKD!E5-dvbBYy8MM£%e2)1GQ<8@li#`;lM)<1-$c+-,=yكvmK/4GEޫG瑐 R<˻ѓC5-jNVM 3  Q &^eOC:Ѵ"HEkoduxz3oOce:j(*IfD>qxr[<]r:_rql" ވŒ`# 5 u+k4}tb& H}/K,Xj k ">.7VVD.F:w<Gud5VkzX1wFRU7K<W:/GW+9\)ё"I SÎD b5p&3^cˁp[Ā4c(V0*0X f/ AA@ap"zVK/1Ԥ1v\ko/_P dpȨ9b$Z(; :t)DQ\|A{' [[q8|5[ۏss,zVhB&"*;SBTDDzG 8Pd_&MS6e $X )Lmi"i\{Imqj h0%L,ZLOv f k b1|BE !ungi ]vi޻N!8Q&teabjmY+~vN5g Z#BD͙lBo!jkuofd>9I۞1#T$N>qs4yH>0K;P*7 2ΌSz{s:6wܓϽKv9WQ5HlSgsܳ,_QĤ 1#>]F^5]ȚꞀ"ae@Dt$WkGVwD"ѣt) .cre곯o# #q 4CD)g%u駚"DP]5~QJ\i,J27yFRb,h*ׯ: bwXnlWY[{Rʯt>o_g{[NjŔ,lXL ]qsIBpDD"ojO]3EYdQA {P`$bVgk;P5̱rxql K= %F` u?}pˢ'2E14 C,_]J?{{yUEFDfVfVelXM7X.mɂvj3cƄn?[HT%1i$KH -[-1a`EePYȂ.ȴiJq^볐5uJ:dJ[ҽd@@K+y 2-3ԕI";f|}Bt{*^B"JC;@PiSygH54,fDV63Q dNJ#=a O#I[eiyF00 emZ;hg_9F$24>p{ֹ%DNnVY'3nd;NHsHtRܦ gž`"f/Q14JC|Nob&äގ.a2.R_S"a e؎y=4!TPlS&iYlRsFFd:菀Wք" p{PpBD,1R/|ˤNh` A:H%j-K,5+jlg tl")F*$s,*lDN ֬h͠ g:i(L+1).z J+.@ut=<f!:pafA t-f L)*m}r7Yezk<4`Wxu3*G }9L" 0-GiQAeL_~\_߻%C^S 9~G:Ï{F0s kE\wzgظxi:z `N#AKeHPo !Tt ?W?uILC犰d396kysoίۏNܟW؈TB`w:_`O7 ,dfFBǂ__6Mc b S!v)="v9ptt"M%ID0)U$ZZƻA=lBp*ʏKbI]v{>J$lQ|r@PPT( A0f0;EF ,Oɧ[WA"b2f]X$|ZP*Yqdիr 2Pzc]Qf{ݜQQ\Mj8J=C{`8>EwI-N|puaZi6<]8 CxeH 6ɿtSJэ3T[mMK\T lwaPJڎU"e'FechHY.܀6d4 A#.I8U#1;αI32d"р;خ E08tMk-E. a>Va` *"F2&̚ cF0jvfS"y#&hC}*.Mh- 78IG Bv` IDATO ͭDH:pg`f9b9UgaóBx]H$!*w~'?z7|Y, @%)O{WՉ)ifUj#K]T1 pdBN[O{?#6:n~<Οy[ks杇}Ap*b&Xx5HpVzZQ],pYlXJ?I!.2KI3nr]i׻KI0aP{R;C0ҊgYF oxFzv=+T˦ޫKOQzq}kVBiv4*'-3"@ۃ1#׺)\DW KFP뫛'_ޑڵ6! ѽ~E )J2W!FR֔j$IU5[sƼ"J)8Ti d;K*ؐ+ (Rb#[mF*3@Cpk\2jT=;׈0@[Gwc4RH)!YtU[kU4c!Ó%fF67Պ4HUᐳͯT3T~[wg!]^"(#k?0rR<쐑FQLf.e_EFIK-gGshW|V>[OŊ0E";fal 8T-x;X̓[ 8ں@:]@lglP0)מi@nFl|{x}~ugַo|.W)=IIHy;@3t4e6Kq gX/}xzΨI!"Xsޜpwk}zz&vÛtz={-#ζ57oJ;̕f_.֊Sl|PD! LIhsq E&mrTj+Z?+8XC!A˿Hz<+T]>땯=#۝.rަxި, ' ѷ`F*B؞') N8;Y"QM NʍǼ ^ؠ}L9)`)%# 91pN *Z9Ae8=b1 ;3s9P1Fmpn$ِ0ip`[@dA(K`ňDŨ$jYH6{2{x J`2R2-g4-QrsnLb 0mƍ2$lF\! ʴ]Fo3iq(8aEDR|x?'7Im^+@N<Ԟ@.ڋl))(nD“ Hc*JO}ۧu}CW:3󭸍^{/}+=i7_/?w8FˑgvWcçzg-PܦW FY3\ 뱆B TDV\$˷_m Qp):B0oۧzV1Ri VPWs? @驄{sW8۝BӰ~iBغ5l5R1bI^;D> hI P 3۞erT$%(DQq1(Tjgk ȝI: eYtw"\ސ2F,6dیz m (5xs&f:8Wx0jrFQU f7wܱRKa1y9yG7J7ug##8b, zλRLѶ(kb.D *4A1o;Aߩ'_x~>x|}|so>x~›SʒAD)=D}?ϽI dG+^Xf sN88r+Hҩ{ ]pFgK,"5(Cu:c $%rTll8C= D1']!Wg=c?*r%\wqP2T4v 7Q`61%{DDX _EhGᛏ}mwLc&H$bB gcth_V8ei%5@ݖRm4[ZrDV'.n-PAG$2`hE"4mL7 :PpS"E08i6QGRl!tpվGm f2H/[Qǎ$BSD#;Ūs)udjy`!Bw K1w'"YE0+:&89f*"f̰U+H`KՀJ*X]HNC$dSX !"NȒ֦7}Ȁ\D199`Lo cSƎ볯&**O??IJ:gW~|O~S޽ܴN!8 X୭Rw7U `1z*^\zKZKG #㒂IFYRc<~Gw_{53q'9_z xpo|6OSр ?|w_'6erV.p^ BcyH6i0VnV_]N!c.FI*foxG.O.zjyײЈ 'X7踀Nu/P[ݿ!"N_'!'LN! ;0 c#hUi%.;2q $Do<^AV""TYD W#ح}M@#&9/axp9n: 5@&(0Ea㗺(E0pcÀ;(de[JĮ $bBn-`- i15B{.*#]5%u.h5q6C<w ږg2ˎo_tOEW#H澹]#MY 2lM݇ؿQQ#a Cn\5FDIB*;j5%-iaCsq̪bF(Qr1mXWȖ3[T1CxKE@w6G yfUFʊ+}B$=T5ՒC+噰#i!~g~~w^snK/ݹs'">o_}qqEC>Q˜G^zx}Γyk>uնÂg&81אƋ56_Kn5$ųUY757z2۶`O<۴>^ܞ{6&%5r߿TFA!=&H1`N8("]XdYb -E3 VlQA[#F6AR\DS&[!)y&Mg,l$B2`ïP2J0{ؘY{0{ѝ`;yT#Ȁ JTc^" !`xyN(Nplj!a㊙B yfp8;2&8ME(,nCMJ`(Qa8B񻝂fQb[78 ZP԰.8RvЅCP1']CCXi'vBLіobbAXdkYs GgpV,j%}:=a;@.+VdV3$D`$Vpj d0Z"x-`V*Pa(+3GgD&{Ȗw^8[\ŘgfzI>$w~w9~~w~7̇???/ߙ56AKQ簡;% ܽ}|T0imWp[Q$\n=T [Uxgԯg׷X7zc_G)vd&3ڜI$`ʈ>32)Uw% 0tDbr5^31*"6 A5Z›H"eX!a4uv:B'GDhh4NH0P,r.˯b1ǦDFUH![^1vKtXήNtlȋ-1P)Z'Y3V;A=g?Oc0HW*&"%$P/e>'4# \tDDǐg3  C0 v4@$,,=jLOpsTDn;O~Zѐŵyjo҈:VlF.)C9X# lfVCDC9iAv}AJlqQ<8Fɐe}0 _w#y6 ??#?#p3 & 3R:UU\u~5SC8C4 Hz;T26x2=L ̞tTitxxXuw+÷Oyn\ RNXe'fs `o?twlb"2 ? ҳ7lsg,idrG$@f:/*)^hR,z0ʏ2EN4] 9lp|M{~=*>0_\||MҶ3=3 թt37!HT)^Á:FR/ʎ21*&\D&~֖E-7Ϫ)JH jqȀȰީ02JNV*G`m+P+L/ a_9N T .c,ԉ3rܒz NQuLky-ޢgJFb`"Vo3bk`ktfDњ3'>ڪH@{& p[B#"5j(.[He HVXTY;lZIG( 1^PULD'յThg݈b < iL\ ZӜ aUQvK!$%saБrv0(@5hh,=ҽ@.E嶸Å"tf33ñ3{qǤ$B? /I .l:u94Ο Yf~RU?~D|mGG_~ƛg&y}}M^{W~~~>س&󯇩=K1o780@|ū^y1Bmr9|ЯjZSHj"]~~pllzwMZjn0\lGIbikII+ښ %uΘ\]Gbh5 Wb?x= >~}܃$JQ fg amt*\ŌMtYa ,Ffuy0"~ V0-cuveL w$1<ҹw F@%˥|M+)bd)&G$02QHa{HJ vpBԓԴ.UQ0@cvܞAGMQ0>Y5m)w&@2מgC݄o3y}?Iհjlpoz%̚ufLp0DK7D;3M2+pd2JS'Ft3ܯBওBPJ!IlC){W RL_/?zOt/]ڈ\_ɧq+j1;Lv%tawբźUGCY O$dOa/ r3E!Q \\ׇֆueXA6‹G)Q]Jίo/>Olc|:Y;nOUtnm$î" =Cq-8Fڳ".* 1 <|w|CE̶(bw$?UnynӶY$2d(x 9h% 33bֲK-Ըhx-vN*`u,  $AI!eG1 hlcm$}4h˽Lܻ4`5,NC̲֎Q#y@ egpr@Xoi*TېAATZZ=qՂPh!zA\J:2 zdhY.)&=:2 Εք(89'ELŜ8;Z%-LDp#1覠;&Oli lcv* {of] IDATfDL״+Tc "2R?KAL+-$һu=2eRL$8]+ڸ\:.)n  b0OG[???˟g뻾># _xcoo=sU[o}S޽M^s1P` s ga6D-|fkZϐ$a6e7p 2˷ ]$sY.+#@4TlR&; `vKĭΙ8+?NzM0Gz/&A#bbi,\S;vx{W}΀p?\,04GJ4Isk d 襏=QW|] ~{8|-/-XIx3YbH!$lԡq97]3;b =7p0%S|\Aw}atzY'};AUplT!"FɊ6$<3nlnHYaRDL $Kk"CT̓Ȉ&uD$8ΠcLf1b" srfDcŋ q{b(X`]4b5rlT1\n€m)Fglibn-^RK)FkFM۶Stޚ082ޤi)L#fC]!7g< 1 5Ty"5AGoA_2K"EB`bͲtJ촮b( b0D̈́ÒԮb >3ؑ 5LN&==xyXUg3 svٔo卛G[rGx"<V-x/?ynhb we'+YDmґ1z˟ᶋ1媞'"f\aeh³\C$<tٔw #cdd0"P܉'q.>݃I J&r_A˴mգ fڡ۠M)X 8҈h+_z^"[pFsn+\^='(bNrMΑ!>'V(?x=*}=w%֨BSΌC8,a`V,:c:$Y62Qa;\]<~|=|(H"(WQvO,ܾXكdK<+ h8*+[:I"JxC~@[8H ݰ)3"/lZ S H<%(& wp>L$2!آ33$oqspswp:B ʠ6[6%+,`t PYl"Q^L50q d([5rE;!t 4ƛʼnaz.:hb`άAph2A k>)r]t*loo1kc7xݻ{dy =!C5NWͷk<æ{R3nnL8aA*D ry\fAF2.5n2W j15{GF}ϩ Ds7p 2iW0%!ƾ`)PBB1/) *?D-R ."%"l01譥r1={Y{o~c{kFQ&-e oUX鍼>|rCsҘ.Pə$5k|f2Ǔ|0 ͈@]餑a羚cPy~ꗿB_H&y;%yJ@w Hɮ歩n.[$-/*A.`Ɓ,>LJ/?/|+k${g||7' hxeѹ)e+|Ll"4< F#yHxe\^t<^X_,[<(:ΤIؓ Ao)ž, vsyi N41  g& N顅aavbN_Be4 ;a;$pN az ;#)tvBrBNٙN[Gwi}n-zE:PTesL'mi6js{Kxao @De=;DWf ef+fhTrk 07B@+n+K4 P8m Oް^Q Wz yd56O9Gۊ !J];7˗/|/_VUw򗿜gg|r^[S^|u#Y7CT̃w);|6vDmj2 3+lbQya1{m|e&:CS7Ux\qao#nwm(rzNt{% nh`сqc=qJ<iQ. C0 '_/3mĠx螲07WP}+c??ޞ^i vH|~|S~kl*'۫$Qz~y;wvmKliENMV ya}D +Ll$p-~Q{m !پD׍̨:(c)CxquC*uY6L1dͻd $^0`Qhb aS -OsH$/^Y~55ǵ"Osoėf#sP[xO$|X5BGFa&R44JyKw‹K"#Eþ2̈6F\lmi<k1A.(.]8k$h\*\L"a\W&ab:XQ[z tOP9M2LΌ\#V4a%fD|L4!1(QQ<74I8 ݺr x@I^nZ:VvHٍ mշQ_G?w'/OvI?S?~7Wwq6?g6Ϊ'%v& *\6zXNЮ ؞`MoJA4 /Nd 3qJFVƱ 6UF NPR`C:nbGNPWYu:6°&HHlw\RAA"AgƈyYtf)+Dm^WG^0Ҡ`3~mfYWJ_o]DwXf7'1ڑ=eM{f*T???|&~b}կI60+W$;M2x|<4ƍQ'a>s?ϾwX{tU%ݴ7`4S3H@9Aerc,\`i0VRND a6+9'f΀g?֐[ͮgX.Ղ:Zڎa$)_g2qV Pd=Z nc6(M˰'U(FG6Wdha.Y`35)Rl0pJ/*m) EJ0t̐-HVa WFȜ=F79`_,ҩad:WjŁh9hfJ f)nbMŲ؎4*ș`$ mh*#Qql J6A{L]x)RZU!k_?'%=jqyFb4ET,]fo Xخm7} /L_x_?ѧ'4nwߥHGܟ^t~BsX7V|WK @Us G.t`m>3ύ[>ЍݽAg KӁYϮf.&pʼn mw$NzH0ɳ֍`,9 A2d5-u֙G3_>Z;+&"^=#{BFh۲n$GL$B6F,,xfb[4Z9< j5\\q\UDMzȮ|Yߊi^ t/¬OKYmZOtIvIS [%P@(b']BV2x}C6/뗾13SP ^Mԣ;5if#mȥF)ܔ^:ۗ0ivEuS@B0Kk;0֖g Dn6.dQ| 7IJ$O@^~0rĚ|YwḀ<'1z^V"sL pY"yQS^xƷ'vߌ+_KEN=U]8 `Qb$3h$E0"B@Ĩ"aKl=y޾{\cuK[{e-T`IO 4;;L5t' T[Dm&iFf= 2;wϸy^|~}q~2 z#gAKӍ{sWNУK1n'ɕRC֛;n&lwRqњl ꋹ1 ^(TH v?#|s4/z4G%W%cSs=OܸR Ďaǩh1踘iFk?􅴇fս_bxóC Җ3U`͙ӱAm8]lGx+{MFb`3#dQ賄{<#PaU7+!aLR'{Y+A]V?8E P " ԩDt 1R0W_<N/!e{NG2gBGqr50` DvMIB–'L=oD&/gxp 4ݺNX聸xht)R 'h׭$S+0ڝ#s>El X8 x0==$(xl-%f‹XNuRV/d5UBi   :-IqݰQ 4MRr<%h”g,FbVq-Gbh s0\Tn,[/),T^%~"6Dlq ( z`* ډvJ acӉʹ1`GEP(:.LRdhȅ0ÆvKbU+3 lsnx !vtȈik.Qh ~{55X 0+@;8kD=*fT7WD%f]+eKOՕ2K$Th0(FpjW#_~>.ToZRN$B\}"qĴ䕧4_v86]aΪڹw(SέоOho$؈8}p7Wk_@VxsqRJ鰛h[|za*ȡA:|a`U ,J;"Jyd`6uMwF qUvXc%U1DF0Xf`+}.7?[O?ŋo|{Ԩu4-{Z@4O9lbr˕cLFG-Ŭ:x,m<7vJw N. oDA#Fې5>=,ޡ` a0U1{̰[ɸ:\2Qv4$.GFX|&ݻN>xXR3grG{w_cKI;N=i6;;r濱قږ{>_)5b(=y~ JKGD Z{I7P V,݀M!9,[⡏sX2vO|˥?M`PfVn\[찋$LC@CO<N>QC"p+E)XUU@']xb$qZ\"+NodMZ"$;yd:A`ma3la&ylp 89 ^ѽBXR|<TcOA8Vf?HnP<+@NB!v7YHjeꡍMyơ@vZt IDAT/'mYHhE"r& k>ah:=l;۫8]Ye{] 6|l(~;//?O8y괸BLIrCCr6qe+^T }Jr=Avϱܩ8J_:Ova+]#ݿwk_m*T@ܞ _N+-of.9DjdJFR$EM*wtBtup1a"vwP/?GY`kXb.{x- %er()w[(p˦0Y+cӭV>YG )zt2S(0wsEw+i+rO:vXl"KH~?o*wy?GOmѫW5 v<=-RՈ2r:¾eCQ8J*iSOB59L:{V!Eb&-:v8E*IkeHNZ3[E;ib'&*cf( W(ppwYt"@20 L*P/*Nk" !:rDˠG@o(%,x1"GJidc4nk"X\ݸ])adUӉqe7 xyPFW\7 TZϜ;`% [3~V|h߽xϮͧp{57 "`a@SvV %:CdrOBgI>HjN+" Cӱ5 _ȾV<*+6 )I#$.F.Gb:sYѠ`HӘgR%c3uQu+;©pZ;rּ iy7*F_6]?gMWJ}iX|1O,ʛ|+'UMb͘- :̭kPyȟ'_}~D[HG߆;h:^(U]!z*~%Ą@1M9KLASb]#]7Q?d5K7 /kig : ܇_w Ja,O, U$0 e4Xr5ßc^~}WbB_?姯ݭ<6OEPy_$8` #Z `Ǚ=AȬq@J'(]$ɜyѷ܈y|;qf}qC}LG0$"W1lS9Ls" R68Y0Qjl Ն&st#ʹ# 8GC1DSӴHu&mlK9'x.D`؄&?{hmhL)L0^ ƟB<*sJM/I0E#Cƺ(ƾc:+曘#:VJ7{1>U۷ӳ5!g(AŰMĺ5"SqYzC8kb9q| j`MU mq2'cxerΚ:RpTYW|^}a"FF4~8&_'Z< 1(PCcb i &KmrqB4N5bC.ʥg!c&wy3ڸP'Dq:EA#A3[J /4Q_lX"?OW^w6ʖ=hzX>8GsVMII'zxÐ7F6ݶ1؃lT7m5q] Ƥ3 Gb:<.>}W]'^ m*Buɮ ɳrċgڢENr>?U /;ĩD9|pQ#7dInZi a,  1ie;i=KtA1x}E4mrHބ_LfAd; EgD%"tu.M$5q"I_>ܷ7aTGo0Ym?_T;g@5D` \lG5Lg5yԳ%ap4sFY`./yG=Rޤ.Y|;Ͼ_3z[)rrya6!wsK$b"g7T(0QIODJE,gHzګa{6 鄕5)%yEjZ 6$ =p%=daG1orS%w`'i`s 7IM4fcy&)h4HL!uiekG`FR$:K=)5!2|Wq x)ej@0{@/À Du"$_Q":k3 C;?`|ï!ZTd2ezW<ѐd#53gH=?3W^x$ g0Nx}{טxt+lrj@-p ޹尜jXco޻ۚ]}c̹-u A# V% I ;HDTA$J%qف1 T  )"FTH Z n9Gknd -8|o9Xꎏ7 L1{T%ذ#} DKE0p${5@Tfk`&/mYA)Q4,i[|f4_$xTPY~ Yg_F 6׉5AMK !p 6Z5їR; !e1D$D $O+_5L3mI*״e_YfN}.9t+q4" BWTjDfp.H8*mFsؤฌHS{ʔ/@>0(RyӺ$!A7Hg"ì,1Oi. }E ۡD,e)@WJI –f&yl-Uƃ [H'Ĉ32d!֓=R)QzwҌNzWBr@HV4Rf$xɌ.Dj1G(d,wy\QPT%4;hIQAdefZD:edfVjB 䈰G(-1|C\X͐F9ZOCG#ZbvnYV![i0%2d|,``>HN2˫S̰$J4 FTh3T>UsզRmt#+qr >[TH60:TՄ9Ɉ^%w~w~uzzx%_%O%?I/aJ]08 & ipqxy,L30sfT^}b\O˂u`rwgD}+{E-2$Jd;XD`Je41GWU(`hji2qy0 ҇yEA~2nC;BM&\rDϨVURSjC6ZaRFr2|F"Е'pU>ۑ4LFm%i`U"$T)R$Ip\WT{=xrulľhޏwF7i^B!'Lɺ2|&+9"F0id׬rvJ崪pPIJ dD1n ehd֜ԑ3x9>'ÚۊIҁ.zj2RRRΩ@V^ʅQ"IJx HZk6DL[m @-4`8Zڰ#1 TB6V'vlGyi= \k'8?oo<¬G NIY++S25[bI]q"j]$$ᓆ  fTrJ^C9`Kԭ IDATJB_J 0y'O 4ɜ0@c^|red^\83g_ 7%+<ʨoj1::>7$NEF,fhV jH"BN2ZX4tY'0[:OWE,>/ñHͪ[`  +(zhI]' KcYčYD)1a7o5;7(t 3 s^jk^"F2lp"`Wvq.E@4M7zR|?q$pGyts*vBBzT rZ5J1 G-V:O`~dq b{4~/;?\Lַy _Ÿ???oJtlZvi۾zy{'۾OO7 C4fvtt^i:::ב^賟7|7?G+$OOO/\X?_kvppBg6с Rjb ݍTLK =i:!Ji uD1!`БeqD$XIp 2ҐSK+2TaAJ+C3NrH-18\bHT `cH V*/]Ea,ϺϹy/cuhX+'$W?kSO01 IF3JSbfEwY4(haK%!!U1I8" {R$Ј5  5TrcbN0Ƃ.EJ]#@a` DKyiߧiLXJtt@Fc=fjp3I] kGp5IV f9pO̐$0 HaS2IVZBa0* Bk! Jʕs2-s"sA\0bLIWz*I.Hv؜OVyfΧ!%PT- }ʐ2d6h!`O$UJ*-Ԙ4TM UJJѕJTΖdDgI6Fͱiex+dy&sWSXb[ʣ=!;Mj1%n[qLJ,8߷z@4·8_^Mcq!;)7]"#ƌR2"dXQS/av9t=Yy۹/4˶}9Ӓ0O!)>V]P=P[)[PaEP`=:o#@)Fk*=HW~٧lB/Eooyի^n_sLW_CR{<88%U_]/j=7\;O7wƯ_oognw߭~ \>~#p y_nYw\>,H!Nd'(Kb'7b (5]".Jun{}`O ~>vy產i) RHF(#LΆȥ9M 8!BKTAdŻPtLp8ք% ɲ7&ƤQ=2$ ^[%z%{-Ͼ4}[Z؇t:xm7\Z_؅ XQN,RZ=1KJbvTfJJ4HC.L*g|9b 1:*6\gC\#nғ,7v֏ pL`8{Chnm\.eKKbG=ddÝp)C/EjNQ "" Lz 8R*@*p";`NvƖtkx.AL̮3б5$Qۮ⠟m^7WcG{t"-Ac:Fr2]b%'AmD;`.2x`v'"7LJm-)-nUYWmf ͍MIepe5}5CMl=JœFv evBm22!Ca4XT-Ԑ++6(2 HX.Վ_:%(KqQA nFeXqVl]**v)k"]I єW^ jJd`Y?E/}O?7}Yק}g2JC2:a1݋?%CZ1j@eQDrenJ(Kc9le퍕E# D3De_$ư@ncb ;r*Mqܵӫ-I.ƣ\m慘2er$0s-:fػU`MN[ʴ9%.ʞ4DޒM={bf6+p Mek/}3sXBd7'7>[xE ڢ|''Kחh`WqÐC'jd>ArJ <:ݮ 10 V v{ܤyVtW25sĥx)P"Cf;0&]Y""i2[>$~ezRQYNkƖ)e ̹vNrke/ /`G~c?|{ً>GC%/z&2?w؛7~8" 9;)^],,<> E@>Kɖ*@nԯPQ=ڥK"o~ᄑ/y{/J[ofj?__y6q?)OqZ7r˻~OoKn{^rxxxrrgR/A//nЇr):+Tup[aA2 rRnei,wDnw;g䵦dl(>ŀ:hs~f6ib(1ޢxTJ~&p)0@f@RbZ,펗,vrn+3Jf?w;i˿?s=7?,wfN2Tfm|٫^kW??}mgImq7+N @"^d|L>0Q1vKY Rj*%mV,T;eNs$ a: aDee zab3L U#-d#^6B]0:X!!b?E/~8{jP- i'z`;_+GWPH 0R2Wkm2L_<-6bTJZG!XsG+dJ&J>b#ʲ,7>+ IJ,W_߿/g_zk\7s}+}*b3w>rO/ٶf#LY4z"9R@;FO9XKm\WV3b+U!쭎PA6igl=@j9kK^;)s}3s$( yq]9xN 3FuP0Մ$Zzu8I3jlff Y  jfSҒI4L9KpLgԕ/Se9gaѤ&:5fӅ#WO?tm>)M iT°DyEp7&e,EJF-R swΑHI#'Ô+KP~pF:[\Ma& {Wߟ?~ _n瞗%%_җ=e/{rT.o}s UVk_믖{]`y^/ڵky?_}'MVէRd< Wea|%?jYȝG;7>?ſb6)ΚvyjJq%{V%ʉPdhaea㰠:EB~1s $-BKE+tޝBdٙL* + +-L)mCL"a i%"DD1 ]|_ŶD{dm^bقzxtr.0E "&&n7V &S׌67`C"l-.#˪+T (YQ:?ΨY|jjBfRVXڣ6bOnti)+ntR~#rN,.A & R/rpLdeF%$B'7"H,9" s;9_ױ<3et%mHeClR=[ﹲN`E{ڼ>Zz.?oknkdKc1ţ[^ܓ>CJ*#TQ=s7,f 4Ĺ*`U(Q ْNI5dT&O(2r9,֓ IJeVs?i Ci&CPh#' /]%;lN z]fʈf!XM ĸXrgqtX󛢀5wNSeeO{Ƕm0ёN4hfeJO⹃ljPd[&K8ᝫ+73Wh#`< uSASv]W0 H*OFԴsO(}KJvz}8~O.TxބAFu ؝?[Sć=dy)SO3y`dX-raySEH˕rZv%JIT &FʃR(i|P\ B]?45̩QHʖ6FEy/CУǗOl4GZ#&j΋;(KiYl!~OC~lrr}?xm},U\ܿ B -.;K?chhO` ]MmTeb㎱Dg$$eYlp gFdM*Uno; *cȚ-j/VnGOGLY^>`ɷ<2!]>x8P"CπEbwO4Be1w&n9Mfލ.n)D0)Ё CXn,#aE7:i5*ط j.ϐ.BF+9i!Y֧,T֟!01"Tt!g@KrJ, XLXw7zk0rPfjD1fyS2I .Ս1t LB6f-f IDAT%`],Isiۊ# <%I pr3 _j=eF>}h$*L8md:H{N/;I5ev)QZ D=egԐ{E&lIM@wdHY"Ɉ1n9ig2 s 3J @(L`[xSo1}yl3_I7\3۟OV)ho֤7̛|o>|G+3aMK^HH19s801Y.C u<|s,G'4[[W?s\{'<-!9z2.<0|8օ)ƃM>z2}kGc}6K^o?vt۹uk[$`JP52<,qqP Lt&QCO!-JngI-SHt! K6MDTc /[R4323kQ"C5u&ޖ q4ͨMZNo3fVꈹ``Fvp Dy{ HpVV3ql|a:yhm 9D Ev~l\miMlTXD`7膓9܏/z45zbT˒P<XC'# _\c6Nk TT#˥=[ohgԯuV|g19Ki\#Ől+a@F ڂP{6RR,#3Do 3E -!wm#$,6:ќt>DY@lƴXznTbSۏX/VpqBQ n?x#WvgnIF7ѓIer'HwdmZfX`hU<+@O2@;$ +3{z|J0Q pUmڲPE#(Qd^)*X -Wǣo84\ ANW7',j@,K컀uRGT4=VǎI[s iG|tCD r<_9@$˰Y72uk{v:W8i8pbs`ʸU]cYY'rڗF˦aW"#[UHqd7_yF:[gʿaÎ?vWR"J$"O3@&R4FBB k|ٳuCF&4-1+`*x+콲ϙ>ç&Pdzɔ Tj/)2MJ)30n" y]8%Y}ѥlj f@Кe*W7 aN ,N5!4щI+67SA%)eN|K.PHEafB؈Ȥ K,-˸)$"S1a[C+tVMւ\IH9-3fX/4v<9)3(=`:7Id{V8nb59/;~[VE7=w?#Ǐmoqߞ/a,滄p 1!FSޕ bMeՔG7yӕV -lwOqzɛSnOs8MW#l=d} i\y;yˏ.N<39ffg4%uXP_Ϻ/+z2 4fd0R B Fj"L1ϱdhiun HҧPi==]g$L a<>O'Nu[TjVX,1HMjaPe)j]+Y @m}[MQVTR}T ue\.2\T.K|#xFhKߦU[M2Io.~~G8tʈM6xs[(,Sg{V K5 k~Dr.NjCU mlA!@TYj0$-OU*!4ZDjH+ Cͽ_}}}9o;`O^k5cUh?s~NFv99.B,1&GE+(k2-}ѯOy/{x԰wͭY=_0İY.__=̮%TO4݄EjE&&!jŋrb>,B0g2& 5r?q='E*0VEh-4WyIu„1 L7JdT2&fF(9{VXޔ"5%,Dc07Ј`Q/иeҷ= I(E^DR. =bYYUe 'vg6Y&A䜃A"`d6_33M2̣RCa.#\ G:G@]j d=uǻ}E5wvQh=ddʊBWёj9S.QՅ6DⷋAQhAFc.hH4k`ȘͳP mΧg^H޾?{x{7_w˾o`#iv+ݮ_Y)Nl'6*)• DKJ4) HjL,j1L$z) A70L0*>q*4 J GH0n4'+dF (E\SWJ"xmtIВ#rd  3<&54p4&ڊ.26&!fFvĹd(aoQaDX*jmR" #auDaҝ(V _L3c}9IMA`cy%0E2aǟލї*I4 fn\vsr-q]q?70_xGŏd $: CKfVBA7oz;8^]_nڞͰY۳g~bjNPH Ѻ}F^VҩՔn U┋#$JWP¸ttVCQp7=`rL=Q9WP5C51XBFsl1"!9Ԁ9c;D݈0QX;GYXﰼ^ȋZɡjpu) yq+NeMȌ[ fneS$EC%`ӂ p\6]>sD OXXݜpklB$Xl7h0ee6 fQIZ:pחnՕ2NöbJxw=GW }Y#*]# (~hdJʁOUf$̐y2Ze2s0|גh'{CF2gp 籘x,@܌G /?~oJF/}ٗO3^.>ERFɘ2ɑL# 4KJ9X̎]S.R%"IԡX=]V|~_d7 /]} Y̮ݹ\R yaqirEt yr2C)\dHinBzӨ &LDϻsE|f,vdt)Nbr1ђȉagIJj [U:dӠEK1kZꈩCӂ*!aU*4K)#Ɣ*XDS לy ^P>A櫅+9:J9q3yav܍K?p$pi}~'rux}|ކQ†2jW芦Ɉܫ+^7~ן~*w 4lLfi<_~|~n<2L]g{3IٹvzCDH"@,ʢ@{FUEb0w$tPL1<3cTڔ¯=ţQv5W/GRP-Mg)y#Ń9(ŒTU$$,9l 983=/JBqﰼ^ЖET/ݨƹ(mTњMJe*C#ͽ2frU/]rJ,Ԯ 3/b fSG UP]A5d!SHfrcXfAffVɛށTnK4@ś_r:c/чʥ[bWGjE,4t+eONUhq$9561O+S{ɜN4)瞪#Q'H76h^lLE] 1 HL(ǶU_UD`*&bɇf5H(J:(rn:U SʌP(6ߤ,,Yjxy^ggH@L) :qs9˥D龫"R)#ƮƸٲgj}WU4v3x>DʨK~Zø칷(Ν?}_>>zuylEf9KgD(h׽asvgawrϞI1vͮ/ݔ)vY.&DDdVdDKd!1AMXIjJ֛w)]XhEm6p3HG&)]-Vn ,G6XN@%K`sIK4/$--S4y{Y =Rd>%lV,h  蒌ޏtj̻I+TR,bه6ImeM6ÜQ̖.UCZ;L`1[6s&5*4[`$DXahkEγ&WJ˪S0.'iO^>\w;dg9@OyIλ=^^L7#F-~M wϴlr#emvhv\L!/,"ZRDLxR3#ʋ Cԕ[\QBרPn߾}?dH#[va3}dY&CbgPbUZ*hѵ-U[(@嘎 ,Bnis"#Kj* W "&"=i ЀAIJ* p;/&Lw (]Zl'_d *@3KBI &<ԅ&>E1`su홳+7Ghkhv azn=߭; ;Sլΐ 4%CJM\! YPF$`JYlLY3θOR5@˖i\-$Q mMIxT59%VO_:/ޜE6gaWu=x soYVMW.iM4N|7w@,Ҵ>E񵫇{Uw>2 8"B y7tw: w&`_ϫԟB#}+X,Ad{^swP&YFczP%&TfM odVj M(U,1vS,m%-{-p[nsoelLB0)g^0WaWWhdM+*XDjKD$sR^z/zaW^Ͷj`-p^|e3 g=#P"%3oT Ŕ.'(0st`w{}Yv,KITG,^)ct7-0w$ BQٲCU@2VQK&%& 9O$$ Lb,b-fjiOS]VAʊJ3,l!򧘠Ѭ) %.Q t.i4͜^3EDx<& Iim#b\__fG*&lgt7 {.#?FcTL= e3W!caTY3ЌʖP[Hyuh*a&ZBSK 7ƩROncڤu)ZC hň2,)t*JOXD‘&]0/v7J-2Zƥ8@Ȭ!zxP*@Ey-vӕa~+W*Fi9VpVqB};8<觽}.VDZF@)R<-QsV\fȬ+)xAP$ZH{{E GTQY ؒE.b}~:s!1#Twl3nwcg/0ٲO{i8v9j;&a[i`F<}k_7Kd7( 9~GJg/'nC?7lǫ+GhβL(! &k :rݵ,mrM:&E&uUJ1iBASB9DNJ{[#A.ASgW R$ Czxr2͙zR*Vh, JyIKfgW^SZ $LIɚg6`CzP_n2tK4d;B^Ѹw_R1|n=w<=pXK!$kL.aIBKk7.Kt묵 i\<(8 J6<)a<{G*p. DD"o'ERZ $ΑֽWP3T}beb@Qa!"A)ր lHԾwR-bi̎Y`- r1\`-#2\ җ;*fi C"Ðy͚cisg/:.] F`fif~A!]4,sn1[e8jÚD3F66)%1|VHs^K=^'T@?_{{]_'fO|{7͵ֿ "QD$ty[`# J$(F%:vVP,E$Ҙ4y@U"ANvpv Q-木L6Bp&LtM4&kr[/l"Mi-L6y; tq2J(54 Le.m" H 2wnٿ7/1B>O\~}Zv=K_?8??G>׽;%ax㏿%/X_s>gy|^//O M 3AI&UA @d$&t2GLYZ`k.,G!";0%T\ZiRf$E|(w{f09һܖRP\:(XdMt}!:9:71ˋnoŰ;6bk~z3?^>s?ߡ/$?^4u^H7+n%4Yr(C @ D0eF5ܝn7ldTTĥbDE4e"XwBRS55 ;Z! 2/Ђ2FiD>tysT[5B1-J @̂뤂,Ū2S&&,m NY '%;+gTU[":lB\: B8`dm/OB_(9X{W.^;%^ZrawY5!QYXFF}V/loqɑdk53F/F|tfjxbܠ7t+H󅦘@*nUsHgFLS*Pslzu1 3~`}J G XZl=ug`-ݟs7P98<׼u7q@u7{ $$m6qMT~~|A>hM{zA?uZKFCA4W'$[[雾髾۾~~ࡇj 셐 ‹P缑eh[ؘRakZƁU% syêWXɢi4F%)w}qypfdi12yD"^Y3KRH=ݔObBILR)4;><Ve 4ք%i,Vbm`bTӂuE_i;ZYwr/^W~׼7ߋs`&hbyxJ,8Rz!SaUUTBdRAF*% (JLY"*f$~>~'Uf=ݹYoi3ԃ>2Ý+_a|~uF@e"""[/8a'4V˝mvr7˻~ዲOXr盓yzvss<}#JWJ2}yv~׎yYʐhAt` +=P3xZ|~ dfjnX8QӔRY,ª5,wJ1U"EABdQ!e<MP^˥y f`"[Di2E-L"+26JacZQ>D%H@3{.{녫T@vg̰4A&( p]; |/2UF|Wiʣ!V5h.S)i /4ixQDN(ο'dFN؅>+G#JHX^[H_-T SO=umw'z?Ї?x~אW?5}C_߰CȏW;}OnַK.n__^կ~?OO]v/_~衇~~mo{w}w/7~7^r77Xk}Z_>O鵈)kUm'TV4T#s8Xs#ChN A(bqh\z k@>)MKZɜ:B4γ#RM $umvLR"%7,s҈ƄgKS'$zV C-]ok?g+˲OCXntx#׮^~gfg~y4guhZx wDƲ?NKiǪTeqy:FOsrCԉ=mZ 8sIY r!M]^%L)ݰٵ'gnr+l<kjƪ*U:RY/CgdiZ(C*Ny1͙QN[g$Lqu7^)=lѶM(P3bD3)GA`z~uo /'\7~W}g_e_f??OÓ'SV+{o;+a~Z9& YC\O4=yz[ܿ=%ؙr:v:S&ݺt(Դ|"Pvӄڞԃ0Y Pr5]bS|̨uT\Wʳ˲0Su춻N7')9Na`nݔCne2>qs0T=~ORV5{(գ#x_QEc>y^>.h lƨmb2Ymn6{A0Bެ=HR1/H$]bEw6,8339{bSDp,+WaJ_LS>i; ':~m=-HZXp1jjXچHT"dX$qvq#2By!&;?72ŨΉET# Xa.|uu i޼ 3i ++f Q'7n v& JgX-Cl2֌:9 4mMns `PL4g?[ޗ%b),1–~Ww "wgrjf=EHuI4D"1 +(D95a"Z+˜j9EػB%2Uz{)_oGAի#/~뺖bOuگڇzh^όafqzr >־WW~?EߝJ\tYի8O{ /}K~҆a"@r60y{`f?~k_{OkBѧt'Gq }:H2e EVSSx Hj xD ir[;HHl :Hr Q8)&HD}-V D[˃e&HXP3l<(Ady!U @*1T-LKFH):~Wll;qۋḃ˥K+_/_>x Gmt =X}gG͸y#ma+nД`Q.7﫛0l zQlSQ2P*<{h]t047+͖X.!5]if=?[Y㾫}K;9<}w{%6U T#J n1-n6Z6w!r6b~G[7u>}cwP!gg5JoWN?!w! (N z1;gq&ZۡkLX2{`۲Ƙk9kpB0 9XeU~bLrb.yT)*TQI% BJNq(BQn{Zsas$%%pswsϽc|>3eЕlhPݶT4A$]htjsk Ret ^dRH-u ,DVYZ=:K%C\#L+a~Mr@Oo?Sw?>g}6M~໿/||K/|͛IH@^p#qG>?ώ=M_~w1p\ (!SL '~K)G/ '. $+3?//UI+iI 54 J)a2f;(Q膸P'ecvw$B QHYB 1̀del#dLdfq$$BvoJ3fg2;RD 4B6T;;lS@ZZ@B4UbbS܉UY\Jw^lieaf uuuӏ>ypFIڭWQlk\\-4"3#APٻJh/-"•)ѭǞAClƢ,ҡPŇz]DCӼ;x7MT3kܺmP'y~|WZC&# 7\4dGgM;m%S`I`>o<G״W_ݞ8F$MֆWʽVg=1+ 1Q@AsA @)s̈.3x2qp: ̺ۖ '_'S!JA I\C9+ ty[N)mwmw4j=\ٿrz gs##Zv$A &^uvV^,VHfKAu\֔࠱}THN IDATA\Kt-C@T#N}5@${rTƍ}x6 kE?-f7% J,!jF[aK[w䅦KmіGW{2sOEõ^ܾ};"~GݟG=$ۿ;{Cv> O}/Kڵ~>𝯿zf/??0M/GtuO~I~z#ȏ؏={??pٛ]=u4M?3GǞ|-իo,_ |%0̚@(Cs3g6?RYM%&etGS hLڼ7`U6`nF6dwX^S&,#Vh!42vјŘF4N nqC$ŵ-)є50D1ocXgr؅ƪ)5sGʼϾ(M=AjX vqoffDN¯}mI9Na/6 G毱+TKgo'Mv|VUQ0I5"#h,*2@ɇz-NsR-rrml{uټ-yj)y3j;2}a:"_cf_}W3ힸZfZ8 Vko͟93ONN~'~꧎6>1s߿O~޽OfDއ?:DshsT>~?߽{_7 +/ %d%#ehB([KȂP<*ͶDxYeADԘ>H`Jrʔ؍k/>{tZ:H-A,91A(IIymMY$Zq8jw}>UPd ihR׼pC>ÉDB[ pf>`La`S$wAvz8E[Zmuc17xm9dzgk m3=qm%EnwaN@yZᄧ+HŐ`V?+ʊߡ\NWm=fq"58x`VhMf7el llgu+7]IT`123W&KhǶկI+ּ!,vʝe.$ͳJ4ѐKJdufK0˶z4z^<~SH[vB η5,:@R0\Hl5k.4T²/{ X*,sC`%i0J3dEZt, zR2cX.%@#{ңDhfOxf68hJ!30\D,6.vj4A9KzmѧUNgTs2T!.2ֱlKX%E>-#'2H[7%rB㍿=??Zk>-3-_&}+v}vu__DDnbg;1/i^lϧK6l9Cdj"2H` +f-eC4,)p-k9LLBe>xKo;(K% &BsH%\.AKhȴl*i%pK`VZ)2;Qs5nܙՆSϼt#AhBHݮ&51]'n ; 'uf׭90m'ٵa{c>8}[~?9zQb!ٮ0tʍcw0\aά9mk:4UOw[ɼ08k$!J-3 ZFK!΃ =DMm)@DY =JH!1|Fm iVۜ wie]FZcՈLXDa^{X 뵯GNO6W QYXʇ3^$Jқ \{yUnVdS :aNLdtd-C;9Pz3LJg^.Nrr~!lۃA AFW_q8:ۧ0iu{au(籫h!=F}Y)%3tr@KOIQFڲu-Ef0 3ܹ`_XFhۦijr ͲE+ȳvS;j" NJ[FX.=^-> zAG] (-%3%rB+E'DLpAY._>!E2.nL=EhJ՚Yls55[ŘLB(Sy$g0ԳaRtZx!0v\{N 3`s]Ms &0 DՈHF/c`KCgV@#ZrFxsZ24OJ,2!k[ݗ9O^9ZXCS?[{f7?=1NUjszϦR9̙)lmW~p=q{'pwsk~_k:GYajYB؛WV/{ol?}O\YӮ mMmjmp7vV^zq{}Pgcq?ݹY0ׂ2+8GFU&(t"GReuޤMjXǟyCEmۧH3n2h˫ yZ 9ne1@jg(vk`0.֧13DpOSXt$eζ"#uרp(ffFw!1GEBK=ZLNZ)fg2ZZ/頓}/FCa^*8ĈP̩Ů缷y*.4)E'HH`.:.W荎 $0OMLsS:9sI25_/WPY _7I/BE³Rp,Bzow|)'zϘ!0I-)Ra3{P" \&Y@IlhV'-waJq d4Z&8A ] -m"ait!gŐ!5zp2 K%-,;ĚQ6&VgX* E5RjD }.ڱ1WIOɗR/*kVp?>^O6Y_۝&cy=-oҵN6\mos2\b%M<3\Ӫ /O|#?N?96N8ON9RbeؠP8Gt /{,#'D@`6Gĩ6Π4HC^ (g+Cl[d,I 餍,a.$;eWkI{wzcA&6jљe=QPL'9QGF[3S0P0"YL6gq֌/VƧ?^ ϿWMUeYJͧL\zJ+؃) B 4 )R R$w3Č\MiV'=q;`V:F U07.~]/% 3xAf$`+{'|CȀTf3^PRә91sڔ&_5.[ i{$N5fЄП1|d3zLȎlD}NK6T7l6 iZK4YϝM/oyVhTRgvh!hruq~1sa2fHf %1mq]R.W;?ǟJ񲿿ڗ 郗/7ʓ`CB-)BaŹN l/W4U(lJ=V p&V)8EZ6\4 j;3hagK*C;="%.2g=|vxo?ڝoW\ΎNw'yr:= &jLP "$)$[tT΂uS17"FfYhX]WNg3VD!3QlFIV0<[zf}|bS!rK@*-$YFEfT`hQUYZںզ:)_w׮`j2[i5g RZ$̌@UD\1CuFaػ޲{W>|}㻾a|eNz?X=ڽ49P " hFTJ VmNҒ5)$/f-#빗cn؞?tW^ I/Cn W[PSB !H,a,Rhٞڇ'{+{١H|E`VΞghi]+zb+7mWVQf1,t~;ŦMFH3X%!qj\щwZ-u!UxV)3鈍u]\j\mPV֓o?w<3SK5 JHB\!AY}b=sfdL к;?#̜zyHcBAv#/u. 7y"=cr=h66gӘf PJ2g Jswr 2fCiKU#2Qay=9k둵׮=-$7RF%!(-LJ(4FY7MTDFzNdxM &a.(+ S1 ðࡺc/\{˝^8~ƽ(EDz}xa%` MN;>Rik2^^9k4(mxt;< tGv0PoSbFw'vS#t``%=KGo>C=q$8'H~o$̺688؋P֞"5+-D5 a }㫃 lPiF+^]D(P@jo{ֻ93[_ YpUlOxzoAQrWKa1y +[\+ʺA̠nA"3LpZ7- ӄePu2%rr} oo䟼ҋZ߉O?jj^-@s}I LgKm^)D&&f* 1tQI Co}-/ȖQ&`Q0 |",RD<T=;jImw5wR"DȔd'zx|CuKgШ'O<{hB1dv#u&S&9u*kȗ5mkp|M:7̆$3S'44OSNw?mlWʽ8ݶg;|졺wվ`7=kmߝĕtҹ1N+n6 n(,:Gʿ{^yV{bpEȷ'z[!k7ds߃ %0"#pZ4k,daX@:NsՇڸ>nOꤚ%w0"dٶ2r0 izo>}^=0A2 /g3*Ef2BْCjRΩ׀#뽛PM'/ VP^£H-F3 Es.5,́6w6Z[۳/Nq|1c<~m]"a+d1b\XiV7Mr\BH(r]7KUQ16; s˓c$N yFޭoTW`2}L,E,TSWdwـh3G?.d$k Ash4_i-0r}xq*O2*┾ɝD;^iy燼7ZG&Qb&*2ϯGaH 90q,]ffիGN[D/_T++q/+IFbJXDE$6̵Jr T H#-Bű<- Z4 iVhNms>]jkx~!F7ذ@) jB`+qG;9hzrgy"۽8?S̊VN+3A:H4  HM`jPdGhH6y(:1^rx.כ=<B(ܮ])WN) QERd\_]jԛ]\C7ܔŊd-4[%&\p3 >N(f+[#2t^-V(xJ^Jm=}=5bF3w fkf-2Z BC>KwGX\Ϗ\mZMZ >Rddo7[]7{-B`PwJkVRp.gƒгgd;z \yzNE53;6r>8\(TP)t62Sl鑌,2!+$SPCsY3]ǫ4!dKma;!SL"w*Ls1!"AJ)On#6 4dpcb̜`8e3DCm@eyR Cs#2U:9LKNAWۿ#?ְG Р-$_ksgMiG)0Sm7lf2̀V}r7) B@28A@fTF܂K)qJal( :b8@3b%Z9Oθ_`@Qw{G-67~[#Ir9#+SJPFM+-$Gbvh)ϽR8FCKi7HxRdTD jvȮy7>;| &ff ! R]ZBY *33$hN/Nj=0EʽKhF{`[o9}^~HZO@Ѐx 8*M/C@•JQPy*Q(/brNSn9 Q–%Ԩ߭s9{Zss"A{k9]}P=*4H@¢e ֫S=ڴN`nCxo() ǕFR ^ m5bݢE29k!Si)7{ 2# &- [ZkDkNNd%(o>Y'uw"%GѺB\,W!lWBF`wot (r[taן/Ψ_gSY| WdsuK\3+$J"3eP9Ð&b2%a9xV>qRzsOL'-d ]'لpB ssI[ VcUdZXV+(c,l7jCIbm-!4N:BM%0n\Vnnnf .)l%_KdIDI" #G3 e]M{AlL 3.;ظBq %aF$`d(ӳwWr $y/aYF䕽Ճ_2 ЪUlӴ;ybQ=,"jF.R];Λ~0@fo,Mi5~EP*8o~u\*|w\>vqw/'Ko~}fs 9y'E0 /HI(] GOM, .g%܊R:Cw>q4됯H&ABM1DprrfO]+3ZrL3Apw{:)݌@M0]HS9D#H`6{n޺w~ $6RSɔɛ>тU7 o$W>|DYvN!ˆ66@X&o_GOE $D̚RW(T EM2سE4d|=CJGv"@ Gq-{hjOݸ1Yrg|"aTj4Eqhy"LHԂ04GkKk&:5x#KRHJA325G҂uӥm~~ah'%M(P"5A4̡L\˛߮?W7+rE`YٵgOmn$Ps՚Qwly+WQ4%mL%M E*feG˻z'^39xe 5p`&z %Ύ<$T\dzF3cLq^ʮ"zݪq}:Lu6 fiwޯh2Ӕn\ 4:v׫QDd.eCVg!)iӜ~"o }/-4RRYwFmVmcp,KI7n;ʿUyݧ|;wTɿ_w?/ғcܩTp:'X(=(O)jhMDf% I% !txKx3(0gKL CzFOFwF fc +egFC 9B&)]kr :]5!~| KgxY,QٱR$|:Lއ\,1k#C7 zxԗ|u#3fdXlE1%!ֲh)ϓ˥xr\|_zΞuMN IBhhGR9b{\z2 b5%ݽI{'p@aiH9bwwW |Fi2t.-K# #svǹ3"L04mObô@rijT 9Itz Cn ؠSd^4e9p5y1<=SuO6鄳ӲSṖzww`8Pq]7֑${ǐf,9pDҲFDq.fO72Vj5LwLKZ4OZ!S@:h@#YJ)惩IYN\P9Ҙ-;X!N9ǘv~yoc~X!' =ŒLn^S1`g@0 f`xh`3Kc= &|+n_tD#Ð" d(D=| /=o.xh`"lE&ZB Hz&TŐi)cf.DFdt2R.w۹DP)<48>n2%0*̘4&LYIo &H G5Y"P>>3B2I (R-}C4|޸S|Ȅ\4Mo?U=ʠa:ٽv{:d)J][5)Lձ^{/EJfN1s*4ypiśOqۓZ03zNX5)+1a,c Dt>q{UWwh7Ntk흹6X[0R0'@zmmu0te>& iCHlDˀgmKqC[ηӫy#uX{ }>O173"ոk>}dn;y43cB#{H,BdTsvVԩ3Sݝ=O \da'S޵Ǥɜq@esKYB`H,R- /hOǫHs #"{"%N ]-"ڦl`ȂSVY&PR6 "XH҄Yf(H!ApdLq{*zt]pF:[>*]l^pV.>$O^}S˰ˬyQ%=UL (@W2"˓<(h{Z3SE&]QPG@Pli)10B: 2p0دz ,+M475#NIExC={tnl@SmY3A*3WjyI1En} 6[;qd|9|=w9eZ*S!4jQӤw ]9jʌHe`rQzU.^_suGB4Y Zڲ E"}C we&kYJ+e.X;:4M4 >f@s7'S (7}Fֿ=_W\x{b1Oj#.<{zk_'} !2)LfD8,+T_ Col3&4*}JsT'  iqhqIpp\nݾxqO9t: aɁ9"؄omD3fZWJ2;[άF-\ԙ+JlbsۛC7 ,KDj1&vNĶQ''v f( PVCGw|UdT5):R' )K~{T /)@b'j4W\%fy"7Λ{S30 ֜ltF?hݼMQYʆHR$eUT@gHK`R &CH%Af t&x緔i33M߶}s{37o͓ۍ>/~Oތ'YhHvU׶* He&y?wԶJqeiRD ʊN&+]>_7mFpҠz \Xw&ۧoKZ3$y{{7|bު9^Ǟ<9vupasL:aTl[7HHXRhRS'a5$ bH2kHSݿSeAWBȹL}8X/ )= &Z /V|,*Z"bsV7i<~/Tq<_F:aLW5 ڿqҥ?{3jI?{H`)ŵwZLӧt.A} IDATbNDzD;)> =seA-0R*X%F.>IP;gmWOW7I?}Kj (,zqL㈜Rк0}O fr)~fYф橦li2ۿ''0AP0Om`-ڱl1o&ԦYYڡ׆*A,-3dd4!+ȥtl,0Y̻*1'jW$L3X.T=_42(%Iۚ!,0@t:[/eKJiE}q- v!VhHF`DaO5λ;jQ(F0ΞJ-)l1Gibz^UW(,ل!%sT@#LVzwpd]"z|d7wtǞ;=t3u31 ijs"Z&D QN$I;d G",CYi}L,Q($y \|ix\Y~ P9<<w7WΝ;ww]˸㏿ѷ}˝gЩU뷎0 ?m/6j `{7oܸpb۷K^woO2"{=yC=}>rDٟvڏw}n^<pVʧfiN'4FfL2ExЀ }2tDc`ݬ4Ա'g4e:=TĀÂP"­֫=t 6| S* )M^@ #dJs1*dd=+W+Ӓ$hecD {gab\FlT61^ WGڀ2پʪ[iGEj׆]Şxv|mISJRFEfS&2XP QAɉ)dC ro~l\cX!1AeN@M4Mu ID#33\{.pannRf")+@ZhJ&O/K+"M[45Ֆud$ȍJeIM MHS ]J̴ɔٷ˭/UYXFx~q{chmRS22Jk,r}(^(L@su3JumsvӇe4xN]\:XX־Uk~~vuu:n`ZgRGӮs>_Kùrv+IlxpvJXc1qsh;4\լi(Pr3@:SN(y TaFq^2XXވ-hq`胡[\J ݎOAP(a#as8S*3]o_"IF3vGI$7OS,\va;4hXp wэ|s٥RSVAj)OFC\i @"N }ZSduw33ҋfS)agIiHyyG]ۍ.8j֋*껿/^6᷿G~=>pxxoz||}7}{rr?ۇΝs{oۇW\y{y{]wowx^Ozw+SD~][}c[Vu ub8~8w'??7~7>k__y~~{{D)eه>؈-붨Gęe.T[0eLy`*#9Z E$#Hj(4>'9$#ɞHDe 5dYdH`= %AZa`X1OD!W)QxqqQ Y 1!3Un BK$0`VU^3&%GVݭ==̍7vw` l5ѐ9#9&USDbtU׎se07LpN|Hn簮>HL.8Or)Jx'w5>3mhRX2\ \nMk6$ n=3>WQ"PDqeeD%#,K̓ްi9EM4I<w2̩ayH+n&^7+GֶiFyzSxƍmv~ >lAPAڰc3:v 3k5[ݽw=j qq_Xƚ%Q(-K1l_F@5p`zۋNkbn=f`9:wv.z 4!StWR CNβK5`a`! DA*%速{ǿOG,9FC)뵝?_劔dT"yHT; 1:L׆bZB@(Ax7$) ܐRsNpZjU`.zi\Z(1$남$Zτﹴ 0 iX>g>36*e9S\Z6T+Q1X` 5 6̖et2N}ŏS4%K;M/ſegԯBeǟ'"[;> O//Wrwȏ;Ϳc}~{/_[kkΟ?O<أϟoa}ѷk|{k_s>skr+_i}>^^in'kyꃎj>ٜL흱-/z=?s?ww}{||ɗmo{#|W|[~ۇ%>_1_jWb0ES.b4If@rP[Q P 5 @_r&X W( c P)Д!.*USl!44 FDe+HhtpTn mʔM߸Ԓ,J(V`@N)TC.mR CT%A8ޚ-\[\4Cp{حiݏ(0i0!#Db$fҢVsk h,`6P/S7cv[916)8pDm0:['vrXo->`*hۨnnF & h*MR]LDe怉UR ͭO!`= ;OoOPiJRL}$n1\>2Kaa)9k0``$Pe- w_g>ί!K5wP6PT[QTi#T5 0Ɯ#y(9n4$CeUlsێrsZ+BxAQ(u"!5Fz%PztkV:q v<[/Dh:ej݄nRrJª[) 4c);ay>p=DCKPRn$-;"Dcא (BD]"p;<!M,2&Aqv9$el Ɏq< }/^)F[װd3=dFSكzY1PdF !eن*^ H LD.1P(){C0hP˗Ψ_g돐~̗w߫_˗/ݾ}4M~[?G6s~l^o޺տ⅋4{_~xG?w7_MtG-f܍Ov'ֲ0ڀw]YI^T"O.m6 mOxjzp =o|Sj ߄HVkq|&OvnHd3V38 9d¨`mYx,2L>ݧ4YC(ݼ|pB wS*>-7BA k4#:zOn@Vg)h1CL[WM%bOvnS i1s|Hȃ0pَ4rZX"!._LY[sh9Ua -9d ”j{PW3sVd!+D&<AM HQ%H ILb͘LIY9;sZڍO0za,lCk:9vҢf2Oerm:N c(kZHYkBҼ+!ZF%ZGÛLs1DXfcḂЄRN XEUs_ʊ)hQt(\I`6XVQMXs۹^V;Vd*m0:ѳTǼ>ыa~[{2!8r)l^i_ƕM Y&AVFwwZ 4̑6'} !3-0x9[/qE.lh3jnG;#'/U9]&=NCzƀl]X1@5 e㢈`=RJFyr(BҤ;)[4K; IyYîog", O⒢(Iv.?[g ^uYGF63@ (k*E&Ah-܆eY.L57'L)n_"?.E*w]wo~>_| oxϼ ox7[7oN$i^o6w4NJM_-gK$eBp<`tB-.I%$c)Y(YQh;cOODq1 IU jk4sғd`OTJ4$2zz +(^.4WKa7y"fkMIֱE>Nmm38.+0ss=MVRZ06isbe6oM53$f[wLȓ{CJa2qff&ܘFoQ2dSa]skIFFQ,LlUMATU3LfډsOqe{Ia;M''s̳VR&B1`~PMfܗ^{ʹ24 ʤu 5dН`zpxiICxݻ^17hU1pg$sxMD!!eϔ2ǓAVMRSr=;8)ZU4C&V>YuiX-h6hA/{okzV1}\k}1G؆ZrR;5!BTm#HI "H(TO%$ӔT+h1||폵֜]vlg?{\kι|16ĕ ʺXC>sNII+PmeQBMTիuti=/b;kG>j 8DXB %ƚǓ؟^ ݩ6"Sʨlcoh5j;F <21[\:E8\6]r9"15`F3VPs6J!@sT 1|1ݼk&: @؀J[s׾{Ws).9LN. YL~.]FL5,<ܩdЅKWky"B* xV- yx)pEZP9=;/{|ww-rͷ=o}7};ÿ׿[?W՝;wۿe/K}o}fз~˷gOͯ<n}߻{Ϯ/yK^v<x98Vλ޽y~7MO>OOU7o~wmo{{5_5Ї򖷼%/ ?/o~ǵk׾/ Y*hkE\\ JXZ~>FTj@=Q`$.JœvɮJqt!TSf2P6Z%7udkے:<R$J!2UaaźOz9zPn,T2׸0Ϋrꪻ+KQ!({W=g?i{܃me]t\g8mG9Nentճ2r#ꬁ7X tFyUc! I!S>G 2j1ć[˱];EU9(P5:# ]+jbVgYw58laA=XwZ11 h ǣhh*n(P [9C]R$`DJ eah"OosqF椝G&B=)Ș}5.Y̦݄I{gH\ln];<tKdyk_w~sW6Y=Vgv *@U[pdTK)żnIS SV M(ZWA.mK 7>I 4v׼#;Th*N(Vڰ1MJ)="HP%k2| F{.Z#$DhL=h4bMXe;uOϕl8pOQPA65?ܛ/b z`7{iJEޏ橜UI['y2 ~ť{U= ./l@¤22Ij("7,wC5:rd[XxBu+=~ek'}9MJ IDAT[ZƯ|c??y~kwT+/;0k8RXXyc)~;e^{{* j=V"%ljulq7f9M'7\ ^PAHSE{Lʍ[G4ddJ!r58_LgVU pt.EJ[cg!ʒL*6@?IPDE]X ؟'>~1r芪e$5AFBCp-͸#a.qH)(%4쎔U9E%a8B54h,mȠsY &KjL2hK¶㖍C7N>s#QC9KA@\:51r) O^ \Ahܵi>m3a$' (gtWV*cJmT֔USS vӥq]S+9i6,@WP]u(f[ ڋ?'kkeGV;ux^,*wEL JCD;kw_t?d e4ˈK=պZdѮa7ȑ$^#/X#ɀ M=18dj3:Ǒ_Α:xYBO)VfqMmeTa$6b5)(CR !Tك; 4룸2Gua)&aE t ecpŅD7_O/ϿUo{Kk}ufW!O[ lVǏmbN` HVS~2< n:J'Z5G`1a,',#a4<"-~]O]a@}}?[[8W/lcZt,kzOl+{N&Ah㔸  * g0h5z-(tF4JceڷA`tgW͑U8&+{U_* kY\EBcZkup8Oeh˱q}w657DF?VL:["@Kyf6@6JUY2^n]XX.4\$&+KlՂT#j "MdZW'NIvQs#JI\:#V.FDhDF!:+]DR}y0 8jrJ0"ݗe&$9ҋLDE@ul?Mve4I"&YND"S.a+A0ᲷXi26S .ģ/D[UB lz9UpI\}.aԊZ>`5RƫS]a ReBd9[`@2M!TC#l6+ea%}a}|'ʻ+-d沰 43R˺ u(v~qv'KE͙kgkqt6}vHN8#O2ٮl%MKv@Ǟ0*68AOvq<!|0;+bd1-X#-8hm6[I1%#PN-Hɓ]=F:@L#~!4ƨ4 DHD U[u-c~׿K]JBǐLX,2EBU!d"xٳnrt@FU9Ued[34'C0ڨ,1B q>B_+>W_ړ?["/__W^ˡ+_>#bϸc>+ֱ/:2CeoЬwf2 5S(X^jFYBf~O/juK33iҺ\εj!:{fl,"Be \ÆCb6q`#kIj-ckfC\]b%CX9HC-Xt SºWL}toMBf$mn!VTM:}ddu cH"I@e(/v׮ON83P΍Ǯ]\Y.EwJ>nƘ+X.@.u ՗' SDjZrs0)56&**aktΰ5Hyڟ^rm R&SH%qfQ3QMeQ"m2@(&F;~OOy.F F9 d+]5, "PFtmw}|c.l~ܸQ}ׄ~CO:"هbҸ3u pdZ&r?*WL4f.FtI,210 -\˲#jiFllD0¨~]?Bzk_7Mc?z?~߯߫Wo}޹-}΁?miL,΀^U7ͺLҘ + {V2ʚl++IbJ)n锰iQʠH#-bX>Uӊ,e,ٙЎC&e6G0]K BEMуX4BވTebo?틧Y0M :_f>kνg n\;f!}_ w0v *DUc1HjK )YwGOzZ져 ґk` )5Z4LY þh=@}KBdʜftM%t99\(`Q=FM(@Q*j MYk ~~9{ Ľ@3391NA.vp+-Enm6(h@vCRn>y/"R(Mv ;A9kX{Tk%"N:QNI>ԒSUY7f={ZQUʗ{=yaL8ZXCïdf)–0N)*8^Yy\%qZ}6)嘳vWf K&Kũ`s n$G;EPcV .v@KH1#~& L A%Z-X[Y y3org{yYOkuTc$`^GX1ݳCtᇁ%iTF'lj1]`&s M$G!^As" z9B*Wi/Ϊ/ ^pPBf #i_;$ƪ`:B%S=ƆۅHR&T8&f/~~ogk_ŷ^v,3o~ݟ~7}?[%OB.B@H}V]sR[31~1;Nu ;54Y[f195:A4va+Nl64.+Ѧf &}]IPyp{'8d_5MPӼDn\mɷuX 6ˮ{ [=R'bgaD -#JzZ,Z,!i@Id~,03b2 Q [+3fOR+sbl}ڴb02FZXqXq<nMw'y/H_qկϼ_hGHbz0hTj=ssIx^q-/!FՄwrsOjMFΝPĜRE #h `gVkBhG@b]a16p.da Z#$uuXh^ښEeqeʱ(2>. ERՆG==y$v! U3:\Yd:fZU)(?/$*A$jr;Sw9OԞ ^nѦ OyKY^WMwLQUJvL,rٕM\$p4 n4޺#jn=;rѢ%3z) )}X ǻ:Z1~]z fVzR$0lvS宏Am#q(bn޽;~rzLwg D1 6BF4 i{F06)Cr6VVy'5Bdn1 4PP1bǖ{ߋfEi*U5V=r_MǥM42(1Z%;d؞,8E)I7Rc`,Q\i990T(98,>`2M@43L%@i&P]*g7=l.)[<_W V*\|s[urـ<*\ķF(ₖ{A3)xLXDEih#Ⱦ!_;n CcH7)UUY՝Z,MdO tͧK ; wV#QUR/q)yke UNqZ& %ϪO7v?g/S9=׾jwkx v7wgיmN!@u,RIS-/:ÌS ]ҙȦy`"ƫr LrFDH8& 8*‰8;]Ψ$16k5ԐA=ϴno.nB0rQf4IpXcn \}\쬭+˄-r!9n{7)E–C@ _R xe`dMٚ^(~]/XBrY_?{|֭[ _'^DR*B\=HH`l1%Ƹ>M@UkY.'(sC&_FnPڽ׾,Sl G(`g;eigdZ6,'݀́o&V4R .Wf fPT=KooI{}~kprn%.7K?g7 ~ҡci\QlVG!܅O[5NӧN3&J dnYiZ9 EcT!4AnnJ5"#[lFtآM81 ю$Rnlz˝.э5r#pX؊by!:4Unx\Ad٭I5#\]\ژ`vvh= !)4g8@N@\5-Z {C͊]K×9E~}wUKd7^/8|:ND)- ZRERu8t5.`t,UQX VSU5hvʲ  }pyPζ3漪Sփ= ?^ڟ /eE]& R#e Y嬎q=T-b7GkM'do Q,ɺ,D< AA +ȅncx g+r@HvÉUG$ʣKH:#B0cLAטaXY8 i{`lV<ey GQm$'n z>z;8zUPB1{iP\I$G8sɗB9qw>A/kT&_]kPyAIJ IDATo?Oc%篏}?Ӈ51b+ʏKv B[\Y5V`)Ldc z G\[ #kz4!QEjVc8QF\/Μ Z`Y]T=]FO J+PU`c(UXar$s>f qs'??+{\;~rggDuz> VLV0EaƳkv57K hfصI&  olP hnH DK2PDw0j ,U+Y]aG뤖4zVrQ1rPCkJ#G""zP0F[ !6=z[p; lX (-P_ZhHj7XY+M';usu,}Z}  .O.` etC7 l0.AscÅ o&pcemO|[gffZWʃ~? o&/zGݽC,+;ƘO o *Gs:&n6Et-m0 p+GG% }ei63KRjó)s@uy+خBnLa45lU.wBaYT T1Tm@whNWh‚ɛx'N;?~=fΛx 7?NXq-mUMi9G-uj6h/QveR+/x>Yi2$WB9b)vZk J3 #JNf׉ȶ\tGhb6L -3!ڡb:!zu17)5,fӾ N&9w-o9s_uˏp00TFMwcwH :@7A`GmN@%Gt1 0q\usZs叹uQ6P3U*Vkc|*;-5eF3I*.Nv F\6[¦:n#+Ma 2Pv:-(Nr#f݋JtRu]4cn],'E$(rX?jמvm'{dtxt4'KDoֵe]Jûbdbd9 AzݔT@9TDfSс-[$i4Umb=-KnCA ȟĆy}]\"Ch 7xj/J,|:yQ{Κg崋I" $7$ I j2FOcIJŕ٨#|^gKD `n$maŐ|e¸u9*# #`dn-!9:gEP4S "1/nl[.$颍rQu>ToteWY1)'|?/[?5BJ٬GfXH"ºg iAh@=ںꍲN5K?b)L2IT jrzS!0*aF3 ~oԼg&Q@>RԶ dT |615^{ۻO>ᣮ݉iu}z{N9?$ΝNL ءLb"gOJcKB(OT_i/]ZNͽJ.V9=H(>iY#MERdS9@-)4W+ T2GzcǾY4g dZ2„O "/YK|PZ'BJ.]{NR #@LpeVz9;n_V.KFF֓!zN 9U eyA)#ɀTcXQ%!@J#-;M A!H"Lf1FD1`!&,ho hDrE[b]"pAl#`6)H2-e0o%0i)n;=(nj@6@Ȍjh<8F$܆$Iɶ6)NIH<_K.R.߀B)wON>"f)_C|S"8IQL3@C )pai!D2'K*%ΐ>e>K۟5 ZK@B X"l N*G&<2 7O Vx'bf]RA6%Rtca*@D1u"C{3*@w#N?魿ݫǧlW'Y~eO_-PilhwkbP҉H ղ8h٥IE ,S"S^Z(U`Rmf)$ҋ#cٛ(? Q\-JB$RO{0Ñ-dً,cnV\bV$E[=(?[.Y-adUW%ZPrY ҫzH#Zj,1`#M1fȑYa6!1QN)]ٳV6CX 銌\Y X KKӜ[D[<eT7Ӥ:q|(מl")# $n={lhfP-HE^+IOJj)S(E rQ Mѭٝ*b4Rh d3IZ.R.BXE}o|Oa RfJlaMtBPw#Ndȭ`xBӐ"[L2+#A_ EEtR4]&e")мZpY@"Ef¦ F넧s'a>BB% StJ ,Gg/~.Y+s~.|ΖÃ&RPeg$%z250QֺcG0T|n3\vER[$vֽi戔K s<0V,Ibn0ɜyZ &0y:\a(%ݦ3S&& dZT"Skfw98WM5z> ebkͺvчu\knŬl j'IL,prlZ.U33-)Ֆn@҂`EM5wduHb P:}t2qyµi﷗cWRR1g4)q4drebf ;$%@ђa0<]Ud *awp < -J0B\=iVC}t0Ig@ 鬕Y0ʭLډ6Fp \ hvc' _/#bh("mX!R Pۻ! KDE5w`b*CSx\63׼ynn*e\ʮRT=cp2$*= zj{Ǚelnp9rn“Pnt`ȀSedd$(QWhdٶ3rpMC^&siD /H0kkV7dl\ z g8`/u֭- %/yi>Y0}dʹ{eB ZHQHsDА&Jp;8RLśHQ 5X׌5V3NaE-#t 8E8(&4w@:($G#d(Ec{!ݤPjʛ_24XոQ((@12Y0-.g<w/3?sA˷n./KD2a((l TvLeK/ 8d:cq/۔i5My;'bV]Rm{NW##K9mi9pʛ QK?;A©T7onVZ +p4ę1`>A&uV$ mYnwÍJR4JT""@ouu+!M^ɂHv@YQ8ճ9ܬwf))deDF,&`DV*)Ob֠_7\FgҢSeJ:e%dU4Ml#S԰{UP,3:L%,TYGTGa fccsS)e9 u0*D6vT¢r6yi*Osd(q|@0e l1aŧ$1C@ "V N3q*ѧ3 fNN5s9<:jA ev $ob {["z뭵uZ/:?l8# 7Ԋa#G1q9l۹&A6ss $Fphhd|mDž% _gg? IW^xv?ƒdDv݇5?;;췿'''|ww8ܿ>%o}+_ʿ_OOy ^~zJVdތ`"\k0 `3vy掲@-혐9BQ6DI7Yduf8wE)}w~}= Nu';< =[jR˰Pd詐nuFO adbe=D!(;D $JsZS[O[6xSx3͌s= qy~aU¥֋GjYR>`r5Ҿ ,ljtI+*moϾ/"2"O,/{~~ޑOWUĿwzz??3?cf___e_?=uϿe/77=} oO$)ˬ1]E .UP R6Rn4IKLSD:R,LC̍"r$*k%Clf!7tIƔ"Kj $:G=)Dl2̽yTa1LXO5(_Pu§zG#~&Zt)V`˃DҌ#5d":<,Q1O>p$",4Y)aS5@ 22RzyD7w}/ǧGGkX:ziAj2Rd-Vw32`EcH) J%f!/?}T9RӲ$r_xPH32,wfnEa֖FdhE=M=zYdsRTdHV Ya\=itQr |W#Pݬ3wbSψPOe5A2?Y_o1l ?i*;iQagcK#j 0uY9i&d!c[ CiM ɐP'eũP85ԙ2N_)n  y[!"P0|p`Q0Rm&Prxe\qmk]1*aRB-3g={DƔb:0zgRM@J-C')#{R}3sC`Yi]#FfiSɼ.nwv֭7M{{Pizxȃ>;;c/?::Wf6fAnz0MW~W^|۷{|3|}=Ͻ7lyIx3znݺ~S9mwH>fu*ͤ QfiP@sDnQH pDd3.7k#&Е(r@.ZB&M%:@!9AKbORNrn[L Aye4r#6Y3_WW=Oέw޽u6Ė.Ö 8a}K/R? P[‘yPvŃ؅W2 eZX,z`ɚ{1N4XXJ*ZtD h DD%LhbX2J OJ5sdtv" ۾-R[=fV#2c4!{ HSs@dXB!!GLBd)-8Py]h5 xC,Xԣ`Nl6+_q4R @um?`&ݡ0eIG,pJ?6ӰCc d0 L0hm,4[YLN9')9H g.f+)hC1T@0 ,=ɌrjX/D,S3F f7'`G&ÒT RHs3 FZ'ڡ?g祢jWKDfwn/yRU !S4` 3 N'-;$!ѣ{y-pjmm0}H,k3h @+S>‡ikpX/[W-Qlܙ𒠥JL.Mc5 $jBpSllsfC e"P6=-3IN7h`q%?9w#keĘyByիWܹ߾/`׾K.=أKE/~͛77?GGG|W}տs'q|BѼo޼J S?S뿎ɴ^׾կOϿqK_җ__zʕwg}7~޹sG\N~>g#$y6~T^> ȽrEz7Q rСl8q`R"%J1D]Edc߰@+7/3z9F5dTWL  i#r2UɈZifh}VŕzZx}v x atp: >GA ͝fۘ":Z/%u5D? A$RY 0ýVURJ <^26OIk!V/485tBc*R!Ќ={cwf$utnrKB1xBn a~z-00f{)O4"YtRHK53W0 @=`oB4gJ j(u]Z/ǫ_+f/JK/h6m662Zfj4#e HUw#,hf2EFe`Sbzu`(n,n"L']$a(mÕe@HR$)s!ønb^LI}:c42Q"mNRlqPO j0[-D _'k"#{«~]v<<Vk}ssU(aJx^R$}'?>^oC/>Kߟ=adֺ.˲z||Bh>?xGi/g=YHɟ|}qh_y‘qu}ʥ_Ny?ec!Y"HO֌؞8bH5,Sud[ 'BKD7s Mc!%ūP^0t4C7P"S ZjiQ Ƹf$d y ̌t94 gfkezs4a oAciQ[Z#WC:tLǤL˛I{.qz3lWlK3 Rup/ݤL4{'5hֻ[riӊ[)E}fܧZhPOɼZgҒXҊyfޓML09PDrz7I#Xm !ca&k^Jhm8+! ȶl( Y 6\ED7!-UY4rD3ѣ)Z*2-zd mek"SѴvwDC|6 *TB]ݢ)=sL(dPZd w+774PtTpc-2{Q$zS,pYlh212,^`WOubH)Lr$`a-/)w`K;^WBZRƍ`?Kf0@Ң0Ӌqv4jsv^̜b! 0=sI P p$ tٌ~uKvdR(!oi)DUri~k׾'k.qownkknr+d.- ;=(%Ͳ0T!|GbfYƭ}C6RQp ;ȸ$5 @IzF怍$eq&>Nf,[?ㅟw;Qunu~k^Cooom~'!z7nE/_'<}?'%?? >Cggg ^%٘L{㓸pr cF}C=.ʸY?G$HlJ14-pǩv^ lxW[W I8qV/stWBxٽ1[>9Cc}ƍSη~>噺t03J*3T?3> 5_4(\|xxOH/W?9~W/~;w:怗.]o//y^o~'~;;|//|k^3ʻ."H؏ _w]Y~íRWb]V`q]'zPSdH\]XIkwr7r XiȢ%Kl̋aQEK`U[W-DH3t(jt2߲$ 7RrR`7Tˎ+1Ϸ5LwL [bvڢEwed{f[Z}i}9mW^!.ݍǷquҵ&6ΊToZ3 .سJl5ReTޛږebZ{NUw*P Pf N JJ+Ԓi%Q脡=)`Ӵ 43 9q\epsϹ:.e:\LTuι^k}gBL f6*1O1M  R,`8 1B $%9i "Lih` =NXD>[;wKJ>,6=kGeG9 L)plt?38C#r#M-Yfc70`Y1Kweaamp0-Pw<Yg''92#`IƑSٔh.}='#=f:աc848gh`&3;1hbMlPu}o&QʄRdY2d"+0%u|0{I8;W'ש3^T܅fK3[UpqsǮzq/͎K 2b`mՌ\ l6{mS/|3^:j^5WЏ>y'ysT~}c???~G~仾Ξ={"Lzwi?O?裏>??9sf{{{Gw]P}c[[[;۽J[mpHe+;x|sOyVe`JGMta^ X=j]m}S- XFeZ"nd-Nri)-$ҺQ|b0ZJiF+`<QiIs)S$"\YF `ZY ψ̲k۾UYl@K&Z!es%aвQ,A>)HT“ S$-_n2CJu{~rlouPU҇ڂe)FK4yJe0a 6 ÖLKm"hp 1CD95l$)+݊Bg6 HGi}≛1F,#sCa7N"YBde2uzrLE Eϩ1"3ѤYb0]T4DCM)kla-6{m`z&`n{L6U4$@卡ԼQW}Ѳ>,ɑ {.T֋X!<-(n%ۜXHaM- :P Fd!& ( ɢh#t *LgHJ6&*)9wH9U{ΝzɈ_Q0v? =]B;Pg)$X@,7crum'f37eZ6ѕ!0r,MC6O3'Kʞ^C 9R@u'uF@ T@Co)ر.WD|+W4ŇSi? ^%k6ͅ !Dij>SJp>S֣l}Moh{I^{'Zk8>Wߪ90Mdۿgore0:ށ#*Vխ"ͦ7}p¿yN+_=y{>FX{_-X`Nx ?o?z{{}C#=GOo}N>c}.Yw(V)2a)Sf sՏyiX%)/d&2 Jeu04"i Rf و! dHPy!/( e1p`F2,ּeAXm3W"(fsHq0,L EEǦVҦF H#c4],%gMېM0ű pSכݒh&Mt($lROh⎨Rl\ŦRF #ܒl ˦ ́ɴR2:2ĥLN3p^9YI )1X3igfCٲ£8HU+%3d݇ô9Y.MHc%aTC`xm6 Z@*1LYD+UU+Rhe 6}Z * l{7=S^/+˟^oIjYh&BdV2&ɍ5|JG#AE& ӫHEp}|~#sgO~E/]~j?+My+N2+N[T.W~Qu|5yO7':_/2B!䈴D4 Zh$iu`tT&  Mܤ 3R$ [Ae-0JD2Y>uSQqnG:r@YFv~'( rcJ C 8U4Z)M )@6AvSGT7U3Y$"eR5#ρgFU 39{,-}_z{b;:|s`o32B=1D'vur2vFS;=02ّ\vyfoEK2frIw:f=!3)GCѝtD'ff=_6!~߷gzهJQOR-ׯo6wSU$Eɮ8~efNe{/>򺲻=¯^tp?.]ݷ&:s'x)u 餣v_>7o#l7lտ7/?KYLbJG^_aDۿ׽.3ޕϩ捜㤰yL#go/$<@ hrI424$֧1T*Bu->Pp"`T`snЊ3$aj7' f9*J uy,MNs&qq:, 0Ii=DCny͌ 餌4dc51D,<=ݦQP@¤$nl#][OG`f) ˛]OԆe]j+VQ9fYzZ̾PC 2gȆr&2lQeFF")"$hrIb1uLz -ܷ|nӟ9w̍fbket++l;;V[wgZnnfZ@d,ڠȞHR@Xl$f*g]%K%PJ؄qXWnZc?V~2sryfӟiC_~v>S=m!)n --7-qr̝4 MZldw,ىblRaVYo;|?[O~mZ5*ށ'iHo?:C{я|#[/O y8ؿ 1EGܽܪ?Iz͐an #lDA6hPfAlZNnMHIsv"-4Ixvʎct͞ F CnF<5ML͂iͲXhLB41RK ŧlf)N+ؐKa:m\NPYYkLc{VNcr~A XgY3oZ R3Ӱr݅mDMr,NHA(椣FJq_,JDX Czp!a Y3ň"K43ClfPk@~vvS JcMzhm0~F_=sTbBBv}P#5I2#{T%RLEO]W2(=iF#F'Bn4J7z^QOfjv )׫fѴC)!;N~dmq1Usl-xcݿ8K^ N0efz)Lś*jhf|Ya =TBDC)h-`:ΨJhfY` @*!-Hzi],\b%0 K3IFBzpgus( KNl7CٖLӁlc&妢 nL'IL52邧<ÕjHePDdެm/cC5H^҂̲Yn㥒l14N봉# X~p!$k60@'ʹZr4':vZO |S׮6J/\Hh- tf-o37c%7O:p'xe/{3g~$3 ç?ϟ={k.\888č %Kڕ3^&qVkƍW^/3g*kƞ}ëWe/;aRVkOGg/A-o!;a{_UOШ$}<_{sN< o˲EKy>yޗΤ&\k6;b*54Sdl60[RI@RPbHxt%p }?\@;UWEЂLr޹",dGfQ22 $3:$aSs pd*9gs F3KkbRd4Оؖn<<:oSشQP.4V4H&d@]NN(yL#-&n,-\TVTz}Z%o4U&2x]@f̈́eh>t+JQ"iVkBwoV!PX$yΚdCE$RPJ4zYo Y  #Z' C9K[/:H^; eCyhK15d2վ=KnaDv?$) `(ۯJL@ kqenʏ4y3B҅LP'Fobg|&Hx)N攊.9jެhNǤr̳t|jt[-wf%0Ou4%%fH!8Q)ChGai&u`ΎhG^DF9Ɨyw=LB/XJԦkK.]lkҥ{^pq>W\ok _{7ēH.{{_}x|3)h<{R7evBlϺQQ|G?ѯH蹍 \ZG&՝]dJ,IzJF2ȺRSDkQ"* L)2P̊#CH5F2 J`i6>"j--ܬ(lPM "Xi4(&Z( S \$(x!`nIۥ/nxE}f&l8}襬(3}2`lH^tSV,,m3-wI@keWn^)mj(F.OnutT!d1YFʚAM &TPX,6bmRKTaPဢաP 0/zM(kmVkŪ>:a-QmJT۬4S$H-Iu Is; $;m,eUwC\%4%ξ/}޽{ʱy<`F(w/MΟ_麽t2߇0e@b t?ҀY iBAG@m"ٹʑ^aK%G&1&-pJH#ia t@G 3p6g~ D҃GugD %L (4{ _} .d*D2 ̆4 Dv0 U0 va+oiWk׷f ~A ])uvܘd0IUȠ&fzvf K:jEa?pti f(~>zP`A@b/:z$rsEӘxyc5'{ ef)sBgRvHh23{`H3]i$y|x %@/n,q[F[~ G'iN:upp/^$Z!"N:t…ŋ~Ky|a|モ]|ۛZ;THz{.t"߉; 4M4juioC]__L/>7YMoſhʙg9=G~}Sɻu[sK:S_D.>]6}.lxKT3sPUTSa&Y-fErw gCdv$ȌE)>e; bLYK3&afݵv#dr1:f!͂bmEK40~Db :{Y85% [sfQ8jQ42hL4;d P@HX.CLrDF5'WBp$ƒ VK8ᴻB,9R #ܕ0h^J2[NPs"Gc(fH"L l O QJ lj"!nZj6L-J%HLC%7n)NfhI 5ш,PIuE*'mb@Re.3f1*}g=IiLԐM d(_TU-ˢb!Z&`M7Y| jsB@.}j9'E *c.3[$1(ӘCOU$Nʶr̬NXRܙ4ԧd`K)zF(֡@TwKT@bn;ψ]}}t8=Hc3%B6KöT!ŮАʦ:ǫh(~d 25ZH){ӄn)PhTUY\(3Rs(ǜ7`QJRՕ" R2fGz讨:bJUXkZ.)na=JDXwAp=أ0J}oޖ E)NG&IZ$Û'<}sKv7;Iwѩ@[[[wu?Cw}F;88vڽ{~>JOZ.Zc-}|b5b43kSzs='/\5M~_Cˏvmoy}չ> ϼQq_5__cAr\,/&a/4 ~,WWwD*=I ev} htKE!-l-ڴ RVE 9X\B 62pK̰:(DFp#%(( ̀qBCL6BRs7 =5srYjAh;:.o@ K3i( /)& MM:a\b2 F7 K `0X)0!ZNtόt, #&84{aQø(60a0le*m1NK/ h4nPYZ"N54iIn@fmf1+u(PXJRd*)2saMbXFVS &  Li$ifriY< fC0ZC׆p4ƄT`3v1jDF"BZFYaݭ}rXlVE5XumCh٦ SǯuojDK}x{q~ eg^˭ѷG>qVeej RSPFj&j)fr!2 5!WE8f$I[$74tbfS y 9DY/e%ʜHɔ  uKILXiSɪC"4m/5BH 0dqm+7̤.O,qZApf2P)!]PQ*˜tpe yk]4P;Ƴfʛ 8 d*]!"(~G3v5 ńA2S&"::g3TaFLLR9l~)\c&!{K-]J)|N50mjkzJk… o+e{{{}{kO~3=Pw=Z_[˭?ߟ?X7_eC.\'?y̙ϟ9sfY_xIғO>yqomo>[{w/7Qqs_A۳KeT=mQwﬗ𶖳r Da9ӝ dlV2d"I2q\ a]&`Z3ֺ+(ʄjrwU(F`D=>(&dhcHDX/g1 qz"fit[!\4#Wݽiba\QLc+Bvˊ#-qzZg@t\k{Xls#hMTt u0yAcJ~}o$JDn?9K_w׋Hvwӟ~dRnX ʹӻ?xtsY۾[~>qArWg/_zuoo[$OStO1ܷ~^;>k?~aʯ<ϝq>mKH~|^H9n'OBnxPXRs,ШUTP&OǠSg0@Y&!Ci`ۤJQAa(b)`i&!ᥧwJnJM /,fޛFݖ]y;|ͽUuq$Z$$dPbk 1##4~d@Ge!&1͈C vH N,: @"  USR[ޯ9g5s %Qdq{>֚k0#F'td"ݒM#-  P wa0-[,ddkMfKцr?$nXʽ2dž R5wR6[6C:!CnfrnX߳Oi`3!8shnn*1-cKlSC` {έ4wT]:Y@:Cb؝~ÖE1"F3cYJ]Hx&4тt/(hɝاc3DwpRfFZk(-2VΨ43@"Ң ЮJo#m)cr}6Zёv=ێ+(N{K˽WƎ)-,SSvy|-|FpeCo_̎Np=7{Z'zYjWL Fӎ=[irst Z&4!̃c`4͒聜䁖DJaц2fe 4:c~<1s07ן$䐩@ Q𮬲= o(iM۹˼V].hSb@f-4^ $@d"#U62N;#՟fLce ׾F*3e#}*Vך5 &1@R5dDKd9DAI䳾Ǻħ*gBٕFQNf*3w yf=ԯ?8<<|G[#N#oֿ[J[%}ܜkg>󙭵o/| Nj?kT *u2YϺ/u2^c=7e/zm/_8ϻ}+_i|*O z_~w~~W/_?(…v_{3G vQ#9,b#8VLTtZ ZѶhX+ 7Dh"+ \'U 0*^L%H=z DVH6Y`2LaQkNh4 $=hߋ;~<u9g H1,"GC)1=6H/?60!oq!9 #̼ t~3Oۄ)q6Sk 0(mV}'e7fJbF .>9XD#nK̝NRw#N=D _ri}56bz4Nw b$e m5yɋRuy{vpnݝdq&+`%[aH.!ڮV}nf l m6.~M,ͣ6?pޫR}G8ln$4^|Í7Gmxcj45ض?p{򴿿rNBʔXѢ̞hL2Cf3Y%f`DI43HڡuU1I^8g16=ˆnl`,VүV BD9}wlBQwFUTްG6nH<2OvC~edwKȴu[|Q*>G [eI5 ̌\R&:6oJ&BA]gT,FknW2̊\, }*͏UPDb^"BT{e5Q*dZ1! L@UT`r3Kf5<+gTSx?Ka:fq׼?R 1OhŴfx͹}rVNxeO+5>]sޯlM7=G~]yba:|Ɏ3 T%X"^Z{[ (<d02ɩrq+둆X2X@NRLA>PssJr(1BHz[!i@30cKk;U I4NdKh'MDͽ%)OuEZJFu -Al 7%i<]\UB|gWn44 0ftgs'L( K !4l,IQnC-LM^EV%w#,F$z`,)#C `v4ڞsL&}`($0y]۷n/}n8 }|wou;ihN eòFpפɍY3ng։S u`yHw',p7_!ʺłK#|FP!xO6 s0ٞalU9?xh7 8L UQ5b9^䁴rdI%Zy\y[ @tN )D!gxR]ђIHc k`b^_^_?cb4\`*?JIV+j( '"`;UAiYA74Sm60c:~pۏѫh|z "jL)eZ@siemh*Ŕ~X$,j+u+/Uɺ@#3*? 0,BV <3W 竿G\]gS .jӔt͹hE $K 4+NXZ`G+W]|iMPX?]UOdD|_{dُNO_B{܋'ٯ}z-kǺTD 3AJ֦ /aT"$d!"$ !6Y yDU&PylȰl5jnt.c! I֤H1 M&l 5CI)6k4ԗ݉>x`׶`xF2ll`G8j4AaB)I&[ 扉Kt_G}{1kwjw܎/yߛ664@ -lXF<gH45pgۈ Ucd]#s} K#1Ft y2'yۡi⹶tǝ8" !EF<9tQ9tk^?|A&7DSe%Usܠ&470[n8@d*KK'45PnlD /C%aziU#$HK{RÓlP" 2\L2ۖfYb.4uyCW꒧d(((y6s$V|#ԡ0vQ@1 C̳@/2L 2X3"duZVA;gI-bILdo%(Ui3U7rC ٚ~+Rg'E:)+fkt ppq4~]?>яYj17$e9==-اWF4(/,ӕk8Kfψ>~7pN!kmEdX6LuxxTNfJ) 1 %6_F*5dtRƤAa#\7w8!4klNd$ɲK0F'n<ؖ$z 4IAD7 B8MmLȴ(6L[4H/j#Ӹ|~6pe6mݚN#(1@7p1ĭAs }-#--Èg}Ġz/-@Zt(,%;[~qk_Wml͑DN|_zbҔ6HfM0ɟq~2Po˛ _]kj͜鲔S 5Gk^>ѬTirHf0>A)2C}邷(sNfb[8]m8Q~${3jR-R =*LRdH" Oܷp8bxK, $'@Of*9I254xLATlY}~PbN\Aëla"f f R.Ɣe1DOB* hj3#hrʖel6R) s۸;#:b69sb(]ظZJxRV""Љ!h-s!Ȧit`\ox@ms9,RLM J[:ݹdo>XkdxSym=BI OF`tmrSf: nٞnXK]d0;G@׼_KzlǛ-=ͮ//q˷f7qη-fb&_&y*$xkWzoo2x_y+_l67ŋ? {Zq]hrTjLwLT|j(Hfi$1(РֳDښ,$=MgtHIf2:0UtS RR4#4h$%8Z@Z%G r-q<[ \,kO[8Z[:25:2͌${SRv`IF;& Ζ|뿱no|mmdͨ̈́=ipae%i斉tj;.[* =ͧ5L9,&KDnڍ#Bc}Q,I~|oNsXKϡ /{CYo>C\w]Y1K?öwx #Ii\S@K{(,RA\o|HIlN#$ŪH3afh#4RӌLc sLS_/c u\>pN;]c4 ";MMCzwZ>2s̙AxI͒r4_C"} VrewR945> ӉOM;ܜ2T5CQFҳK8Q_,kFP ^ɇyl$gg%i{}.eĴD%F (ʥK֕:#dURP#z:Ck\5Z 䪓YVH986uQe+su g_QdʪBD'MEVMwvS tevyL iE$a8w\ϽB+x` f-%/]ߌ5NON6{׫O"ix,ˇzHϟpŸF}ﳟ?Kpfh}Uz۵@5 j:?{y=Y[ɓ.\I/_rJ=;99t<7|s=Óy|wo;''>BuWc{ΐI_Rhن!-uk28nT|d\KV\ n­1aZtYLj s66Feܥ6J`ݬ=%^nAo m{X捚M$r,c#G yu/οo?x&rYm P IYB[dbHa8f;,&p͔Zp6{q-8cifx%Ac 0zb06m30ȔF*ް \촫yEl8芡1z"1FB@7p0O6 y(qϾxq4a7 I?v?Kz.r˿y'c`LOc1zkt0b:F 'K,FW0Z4 :&N#Kfw i |F6vA6"WNc$I6 ws$h"P=o 9` șt7hC.`ڤM`ȠdH7x4ۜ"4H`e9⸮Ÿ~<3]̍kbNE&,B=M̰lNrnܻa9^r޼aۍ@墼}GZ1X-kcyMe%%[z7i@D&q_imy:n$,mE4> IDATxl^0< &(8uUJ5jYEk>D[$H*TNgYe \ewVL=#L_K^[xViRumlMrY[n6enp]FWHn6sGgk_А<::rH'''^O+eY 7x姸G~7,K{g|g}g~;?Wht}BwW]қ; utt~]w7xœyuONNONQ R[o>]7ǻܪB"Uۜ}Ϧ9nsc2ssL999fk 5JP38K0LMk=3[CR9/o!Bcۍe(zHܪ"w 7 wϾ8?^Gn1Ï=z|ml L6fqo~?rh^ќF: elSAJDV$Bnu в9!5yDE}͜ai#IFkm/ajs0Ll3+ԍ$T1 /aY.k LP9U!a#; frF(2@Pi ˦)GX8f`T6,وaNx;Ujx133wbӰJƒ8 TQQP̰i2 3t;sxd';f>*}\0iH3 s&+W*Sxr{uu4"9}Hz_pF/dUTgN!Ra0rqY_?H+IA W\YURQP`P)Y D@Y59@;y P^=qe>Z[ˈ,e6z@M$ϝK_{P};~nv~?7|7\p{? ^q7ֿ_~[oy{wS9@h91"2׎^{_?|W5*#ng<O˿ħwoo}?YU_UsϷ|˷x#ҟGM ?+br3ˑn6sk!4of4[5P)P"JrNF8ȉcq6) 2f0*p&1" Y "h&8҂IDr+3̭yS ӑsqg\i;SYFgDLͱ5jdmQ0@ѩa DTϖ{>-{+votviypM14@TևK'#BD !ؒ!Lkn@zt){"qvd2z] G"c%em3>6Ϲ}s-ݘ*?[b4ľ&wf60-Q9ֵH([ܑ990j7rhan@wŒ&It Ml#6 Gg,9Ho42P['ܜjcZ2[NelD:cba=B -0dfh9Y'4W[cv< An%+"J)~\?Cݼ7/:afuHڅvB LjԷ1ff.E4SٴfFs`$d2Ĺz!jA]hO dY#wvڒ Eր Tf&ಀa *a$!H(NAG2$UZ9U3HBhrgcIĔ,k-d,@4ndz\KFe~g?^hW#OJ!\鉒~?=͟P|#Z12, `jd WhPy4l"PT2sCxҥL3R3h$]FGB̚!X;8ɡ*o+ +@ Urw7SЬ-ɐMz 8cb#%+ T0aJI42itldf@s';RҿVM#u̳BlֈQK z < d$|u#֠)uN~9>zztzr 3PZ1%_/o_=9o]Xk-oy//y0C>||sÃ=).3>Q,'Y-1FKDv<-G}3zS8ξ~>z7pG|{kD//BO>>^Z'Zbuf Ȑ)R> F4L4w428d'6F$TfLk@'\9\S LbI,D2ifnM#iO>E!: )^2cͦMܬv 䖃;wӥ݅!AS,Hd6dfr ,9- `BdF&$T&K3,ӘƦ$(s4b$,Vr'H!xjВDOɘdlH E3oF"MXqnfҰ Mt#z^\?BeEWL—Օj(I8Yv- ]\N+en75]Uz7ŠS==N.Ӥg_߳?z'Sz\?կ;i;;|?Sc??jͿkʋ_~?r7>/ϧ 9}aMگGFĈpx+Go㓓keY>sxW|k$bU&43]zK_W۾7؏ؗ}ٗx#O*eY$흞>Ljا5~F 懋ŵ9,SS19`FaHQ-ZuƊmZcW?չ٤pc0Lt44-at6(@mjB&E!4dݾB+k ? yRQHsG˕+ٞwLXmg=4:RxQ3}Xʒ4tw,۞yMw 5ƘsϭOVK #.;&e8 NGHL"؄NIQq|K~bHåREC~G.cc r@DIs޵}Hl֩}.k9Xx/_o-|\{I" +KqCYve5VDͱ4=6`>C5іpUpb¾8T A`Be0[. DU4.ӪPhDP۸'tƪ9rWKRN !a(u}# J v`F#x^^ZjV1@aʐwOtJoKK<1OB2a"aa6:,lGX$+HT8@` Cs{~AfQaH$z-ۨbo:mu@iI)X\<;~ovö`}|ܼ!GO+~>l mh X>>Y#Y{Ji0T> w6YL' @Eٌ0zޅ9(@"@F2lcԍe@qa,uVU c/I#)W+vr=2i ?wK~MP[2?[>j~-gU}sf>W\v{zսoZ~y?TuWo|;=_o>z;;~{/|?~7n=Q!iճ?a}@ZƸ~kBglv%uO/׿] w}7}ӗ}ٗ=ov۟|Ϸ_|5ޣ>?ѯ*]^\&tɥ-'"`!tpi I0ӣA% ^=H.^ :_9,_U_lxY8USNkP9ߕyo}?n'ٟ骊??l߻w~yԯ`moG>ToܸqƋl؏ Fz?W}{|OKx'O?mG/u"b Cbk,E֠Q$)V`1 P(.K\@Y[$RGׂ LmjeG(%mv,u+e$re(̩Y1}O~zUoDp9ok\s?,Wԗ)\o?ui ْYjyvQ8FnIG̴2%]]խeS9&!a]Uc3D.-֊`Dn 31#/S 0: Gk+"NfWeeD`B5UeN tZ!QkDKhƓ֘+F0 ITA6Yʥͨ2 ]/mERm1U -Bsks 3 N+Nfۢ+" 1KJ$=f26~5Y҆y%( Gֆ`Qʶ?4J2{D@M/Z Ɩ Զz{hx㔚CU.;F idcOJ$L[b5n^Zr .5.l; h:a\?J9f5WU`KmY89jTZe:HSs^4aK܅sR\&S05+i``NmPQ!/,$޽{wwCDNia?ӗ;/jw|>_Z^~Ӛ_d)‹gS<_pxƍ:~c_hm*W[vMh1K(JAcR#"@$!4dnkY%QLFvM[²\ &gⶪ%@G1萝u߷#<᪶nQUvØxS5%Άt::.=wr*YٳIş7`B'/}x/d qXg}sǩ| IDAT*<=7 m&"X ˺Akm} MhT6$UYU$⮙CEU*>4WK.Kfd3 \09sS8$DŽ!0FV3 gQ8IA.$ĒU'aXxGFF+ H -gdFT.PW-XnnG Pr@4ӈ`_~ԯikn|Y7>_;.OXO孟O>}vGu]/xկ/+Te\&׼~9W]+ ӑTn#2rB gTȗbsXs@["2IIEKX1PpME 1NVf6EsKIl%!z!a ͑ZQU># m@q5FQt)tqtwKSf)`FYI5/}[/5x橼*ݸ^ԇyjywG~zmt&%6+iauedJGLpYJ&buN%N1)y@Jc(G:iHFFUY*([؅rbdD!CCŨ.DlA3J*B iA+krV# 1jtz!*B26ƉXȉ݆) "j<` G9*RA- n{("F`4@.,1g'ʎGYOȩZ=FKsd3쌠12-E:%w*02mlsmtk6Q@Sts7ybY-9AF?^ƑO*/L"2\j-ۜ8OjM'}_уqbKBu6S @"p%$o/9R ra0lHy>nz8Jez)N@n%0}$d#sB.@X&`!2gDn] ˱x<=SY}8 3k̖f˃S'&Q􃚄tGLF{rY橆@襧|)w3ѷ oxXerY>_[?7˿eRGzWK^|_:߽K֯Aj闍l۶2?n˱tA.3s_I$aR@IP]*bm+ Kmfua'(eЃ+2>@ ٹ4Yc(Έ@yet`IP-&JX^f\~~~J4/%DǮ=vm=^pxvpC+O(o? wO {ٺg9<[ņXx+|{% 5iI.$ܟHՔnhrnUJm=cAS1,K#"'7` -$`f \Ywy؛K霯iZj1A^{lA \7%NcPT1.ɜgxᩝB=vPұ:M D+A If s>1_I͒`CՓTL*<ˌ+:=.\e$ 70H-sD3R@ Bbx3TT$fŠ#Y:VV-ˇz $6[G's@B J<+Mb=|bE\\i=|1R8q:‹6Y,Ձ*Nq6JS`p0Ga!\CK&j$U@\:`5`%v"=R2YdD@Y (􄑡;%2X GCҚW !MmCpvixLx(2uxM٫eKk`l$MSi^[^PCL -VGڒUN5*Y੡`W2 {,h h1$7U[zgguYB#c0=3Z[:@22ӛ_<>eNfOO =M ɇG7vU.ܢ>JbO֜~O"""ЀD.=h0tjH&=& Tf"4w6\Cb?5Fɤ$bbC N!ۘCĜb" R@BY%؂}?x /^ǪTňo7 /_1Zk-YW_x4R)k@Ld%~_{TK/GU=~w~~Cն! o|㛾?3R^}_4w~};ۃ6gR 6e7QOTL-,N4@ Bdܰ:"(`EcuTI d9@LlO&[혀Ych9ʌ zl3|-iˌ1i@m[>Fj  䮀D"#]BwC;ei ڲ,@* ƍ7ux>_~vYw>oxϞ%J{q_ض.a|BO6|#}_pݺu'x?Odjoyqvk x=󺮫7ώ*puGlհm'(EʂL4ÝpEb4BՖC޳iލ8T}۵ O#2"t a 9 iszI6f);͒9\È! @F0YUz&=u(mea6 FT24ՑHt UJVT&i2YL, ̈́,99)a2`Dex*,"\f6rh&)FÔA2;({h#5qW:Aա^5zRK1Ru*-#%D\&(ڍk+1.5yzč_6`iw~RM|...7}SO=ʔ /Gcp>pp;lwOe"=L~RU1z۶N󳳳,_8dyD-TH{/d' /|2bCd3*S.`V2`"<]JP@QS"̜ D:3ݮQrKC`99Qb{O ` q03lKC lٞ Uaa*2{6 dfɌecFG6ao~๯yճE#=ÂF;;s/|篞-?׬׏?WC=ဋqa*`b;LiφiI52#X UbbfI2K. @fYTQ\Xp̭8_D0c(H}h,TDhp*4*,q6"ӭYC}@2N&r tDyL4H"b.@QU ]1eh|0vaU*ЅYbyt{)׬ë5ՠ00,ȘBvshc F,rkaUeh; @DT20 EcM2zud&Zksw r_2٣oxo]:r:(CQ lƹ UrJp ]ЊH)8&de*yv8{ճGzQU@"[/GĺU7WiL^'An{aTm{*> |M aF8k?l&r.g0_#Hg0\1%4[p> Wohŗ^kr3ɪm3?3{>VȌׯxm}8yX'* _?1'pba-I2$UI9NZg\f25;2x5`K;`x N#bN1bA69+[lTtJTPB { Bl)J.-yhȊ%4% ة*(utwGzXۑe=܇n'u=C>GGc{kW|GC>dz&S i(r!1c0#ꀱ.V+0Lp Blmp@uœ0I-=6֬"ֈ.Hx ,uT Y,( z W`Ĵ%gGyDjRxa% eS-R X%B9vic.!&=+9:c5PrlÔYct#Ąusu%&IeF$`*"X V,D b& J}S4@ @C΢bsQNI}t'*zT&PZ:h8r]U 8i0Gr<-cIDD #I֖W^{Yڦ+qkӖCQ>br::֨RzU%oh]t43 {<1 J>vWءH_#-Ɛ4B#(ēL1nJ|BLyAY4p2rOZݸ2'* 9m hF˚ʱx &d ɏVi!\0ddZ>U ` My9ziG;`&ʯ|ec1|O= oA}򙑪$8^iyP<|BcX. .Ԃ=Wbu\L &GTWsn&3Z%KZ h]0djsxD :s m&fJ9cdhS&4 :11:נKJ pZ!23z(3cd,)폝o/~{G=/<}G? ,iF6}#2rCl>LWWkTTYDc!y(r$,ell@2=n ۝s"Mo҈l N0fu0lEB%WA#(K!Rw` g <* 9m(52bK@Ռ٥Ӌ  ˤzaTczJ06zY^P\%ecUq22'j忩Tt#) M`Z44; IDAT0>iVs+B7801,bniHtMOȢXP Hd%Cy7S`^GrHmHkV2>`)"lGa <:8'1 " tO02U R%PWyW"՚9QZ I%B0)js4>O|dG~Q]hG+3&AM2U3VWW 8]Tqߡ5ۦm~,s&ca @0,-fYm.`0vCw-sfΌf<@lLK%vBĊBZBnAJ\(FJ0WC4QiH`UA"jw6s~g<`0@9K[gw^^  Ą&VY6̦KeubUspoj2S@+lFMYZGal^Y=$}$CN\HD6#RfBC䤉 {G% U4p2F!JMb9]3q^NZfv9, Zܳz2r glhd~ 75*FTPvon n~'F^Ӧc<"Ii(}~8mGy1jlt܎ǓnmFǏk;:Tg@T(>j|ݻ -28V=kZCS#ŞcEWn秋E_һZs_hǘ5v)1'I(VM/f62.hZ\l a.NQFlAID8kl`8i4\`abY`lܤh Au@M-2QNT;RZJMQp40纪XVl] Q8lm mHE@r5 +Jͱ&Gi_[эϬ<.[ZdpXaV4+c]ǥ8Qq%YZF09շWo@.w]Nԏy[um][~͡s1ٓ@mM U2&%p/Jlg^L\5e [z/1b5=$&pR=;*Ҳ [}*vܛPf . کv;a'PXI&.^;y^ ئ.&g'6\)'fp8!0GHMS=}du>ßzK.}J+[-%OZ/UfsGڶ);ǿFԹt̉);I G?Qp`%X% VCdVl"ڴ4.ݣVZfcR)x.;6j"R77Ӯ(PEgV.&"gc3.1TW K%_XcޏB5O@V $rٲmȶQ  ">Ƚ@ԒaN{& 2[fjLo-4TǶiȑUCs9E:{^`yUeFmɢ--3_,]9=PyO}֌6c[)4PF D$Fr}h<5!@mA(dc F0.-C$"% $ML(6 ˹1++!hS ADHPz)ё7o@pe C`)16 6HmAޤ 9b$334##d1aaqb(zq`Ұ$:9NeĚ Ae08S4L_=}z,nC# u6FVQӸգz\?qo·REua;&vܷf iDK,1|=Pt>~0%F@)ò>b^4w({Cڋ}9KʌΥ 9)w G`OH@83~4;=%v 'Bf@H;8y S†i0=ca:;oeF{_mʓwOp8կ&v %ߪ4*5F͐;?QG>|绾'z'},gbm‰8S1}%6T)RĹAΩq  xc@dYȌԣ8SHaH+'V T09BnlC˔-ŤpJѶҒFG1*=wlQc k%Դpv=(k`oDiE0*h:Qa%tF`2͡YfDXY@R}I0ܸ1\FV DY#2FM1Z()"DFG$;NV-&""7kL>OZ%يuu2˝ټAXC۴\-GN\uXSF,ջ{? uj=>\^8:ե*FlhSPyAփxy3sXEȖtdpUّu4>qc8U`&21s@y0*L:zBc &kp4*~/~YՀ͚;oD{x Ds[6vdKgExaSGjY,x:PaENք!FfXYtA\Vf'*@9w)$UL=уm(Y4@voC*75h@E`LӲȵ%A 3#AǂL :"ȳ)H3xj^YUHB6lma%^Ii֠ҷ4WoUݓ֨fщr[X(1EH:T4inEf&3˒6%{mCc.E,UcL2 tTaeGJEt]*`1[&Fdɬ xAsTCwRg8#pltnC \ `;\!!#Dا̪% dSSya8dl8K0Fb#fk2(ɀN& p T[Jr)D[i#=rŅbXYXV 'DrßGm|r>|t"䬸OUǡ^|4xKM+$OcFĐneZKE.K`MKfcdLŬ5$<7o'<'dhd!;>`mb~Ih4উ A!p]^i # ٢"H`R 1#Tf?!bԧq]B\qjPGͮfFyɘkgX&~ͨgTO?٥B-oyK^򒷾W^/-/{˞\`Oߣ \%Iri׿Gw)1ggg˲D>vfu,W񙚿ms'VO DSQZped@Pf45GxZ݌ܙA"cMgVoZ}_*[4D64¤*ۡf0[FD:džb]f@t[0kjeO @pjض^Cbn)֩1aňYɇg6%\[Јp(T^r%jc5Mi`n&DThm:Ŗ$14=]LU-1iP:r< s3䮉ȈRE2eeቱlEjMZ[pB q/KO|/6f/ yYU#ez-LB 3 ]Kb,cdo-2DU:muxn$2\VHSh]3FVɓĖ$KQaSlMjnIGVܰD%e] َѶ>nGĒQbs4ֲŲpy\/q]Ddf.mmi˺yhlia]2wXN^㸸Tns2`ZWzuHn3CbuT'Z M&zr0vW il ځXZlZIڙF"d˶d*ᵵCk`h>%P*GЙjf/vS{ȽP!^JɃJlf ",(TU](D&YI@S5=[ơT5#͌ %b%{*=ܙ 18UD 4*m( ͗$퀓lTVȌvFl66%;!s@v ń8 @ki$A#TUULO8ps, {#eT3r+@^Ծ|͝YSjBᝒ"?\&Nkңw;Go~[~7\{8>'>s?|c vy{G>чz>~znܸq}]r?7oW\N˯w~7ďxu=??}ʕ+?իWs? Kc<˯{N?lIƒעa؎f l2"S"32$.[)njL7.FD$+3֒\T%CZ.{  Tp6ju@2ث$^4T&3r3Yb_\\ׅA;cY t0O]IXdrwTqN4r7'&RZe*7^\^!V4kYjZC.pNuhqX 0P1(שaAt-^d7^[5v(3rAаG l5(A0BSG?lhgRF ,zJ v 0r>eDUɨQ5WP,Q0O. cTr˧zU!rJ6=RU0bBrѴ؋B4]hZ]x d3@ڕw08&3YЀJ,3D ^-Q5Nө9>dnZ f`&I9-SHbH rEC#DK.0%Q* ĄF ] hf wKaxBN'ciZg Fq;i ұC&r6޾(9"z='; k/xE{q:M' E1ULr\&t3<1no6?v_t&X:,aEDLhsƮ0T{Tbڵk׼5z׻^k_׿?>;??_Ϯ^W|k^//y^կ~#<'?ǿ7mo}~s7_+\y}wm̏ ;(LQb̀kߴe`,L!ъEE ͳ2‹Q=a^2Cab"  i2Rď̴%$0j N%}Tx$0,2]B/ִ#3\#/doIs2Wedkd#f2l'U)ADѧ-PvDhPX82S4jb̻\9&N pȖ@D\W6,OM[fԲ\*)ڠ J "FcŌ `7PkFT1[l%^H3џ>yY?ImhJ>4wmJ{,ѕK(*+hZL6#XRrcD' \Ud3 L9Hr⢥z+v,(f[&<0lBҞܥF*j 2ta,:3̶fS[֖dl&ffHFtJh2c9hT[T Cֶ:9dN!kT ٵK3!3D 9;͌gR2ba6{L0n y"нOl -%X-YZnCagIri MJuD<~bFszm AzÚqGæhEUt3BerP:M(!qu7YG+ppA+bR`r)Ra84e9mZ,P°, f TBL8aQF-9e`Rk)mm2r!cZaϬTvcYYi mGK,#6Iow04wg6k=6$̴baOX(+`BɜPA =.huiWLC$IM)bO`=wQ{~Rl͓nȺlc ,C׵S];x}pP`0B's1m0ș {xnD#žӵ*T')#u$fL/0/b c\1v]Ecwu=Sd21AmzB6A ."ڲ\Aƍ5Fľ//oo?&%_Eɶ!?P; JOH!*t \@!֙Q bፑ]ݢ/N.Ze|P@Fe՗l)e2ͅoMJŨ˜** ӋG_jLY\@mVzڨulbWoZIgVX8d%])f$@c$)+l'lF+]A$9u L*Ҋ}6Tfhn"k: Z5F)>##’(fq:\ T}fja}TQ$i*ڧG"63,H>xrf!%Q% 'D_6zh݌m,EV:ܒVL du3#/ƒaitpжRB HtԞ FlN#6EP#%e0Z6ee,3raU+w FХBAe[bT8jȲJإ TٴeMj]LQpUwF|wgw?G-_Ҩi am&FA rB$J:.[TÑ;IdpˮL2PO z8;R=NѼq=Oձ]@ɔ,{gP&"]1`'D-y舜^dN4z2Ib.tHyvicI)em3 fP"^kNbr+f v-DwH6àܷ{`Ӏ)r>mnOKqy?*4_ј@˙Cs;xӷ}|)S{ׯ_v߽SDbUu ;S4*AO_r/~|G>țΏ1^W׼/v?#?ׯ_pڵX\z_+\yG_?zo_W>]˺f:n]>6. ux77M,³SgsS1O{.΍0LUk0&H42E%fa"03/F{E%F T~p dcxJ"̚TCkfA 7 y6lEt\wDx<O׭[>/uxk_#>n\'>>g~Fz8<5wߍמ]㏟ͯ޺yɷy;+W؏#|pX/}}Eă> gX+Cp;4s2p VcSqI@5%AM"h:Be B3]ՁL.CG1-Uew\kW"(^Dc2IF5|Dzd:D%FO1u%823423V'l<'Dh:--r*4 A 6a Wf{ol_^w>Z}~tDf| Q51S#Z RGĈ*_X1A31Zj8%Bf8먙 1(/VIԡ{?>h~II|s9w]k=1Lcx6dVZʈ(WihE 3MrĀ EH$ E2yQ9O!(iԘ-fU=+F[-HXPE2izRbyK쩦iD-`JP@BPj╕=EV"6ɔ/uKۻYSхAhou; wNtY; ]f 65[|"W[ү/#$ye/1 ݱ=It TLI$@) yNSqd~*'gȻ:?;e ,_q_絭n|Gc& ɘK)1@];;6MZe"w1ky2eW6(čL]fALSٰh0Vx"eqTTҌ1mwȵJړ ,vڡAˁ!J(1; &3Df:9#@MٳԎńX9Q8F&T+-ɜ"v R݆g$ai7L ()T.EK wUkČmښR ,A֡sY%$ '9]" Op )˕IB„cWx0j&tRr@ҝ8LPl6kt cFZ1K  !4W8ZvX jθ ÂkFXLf))*Gʙ{( VQhxǜr]y GÞL>L.c51=I(K6h5!2["qfO` P*E8ca{?GgP0(edi$7Ɍ6NGz!&DP8ڶe@Laۣ Q5ѣeJr{ȎvIyt“0Ov9 rÐ[A@֚Ȱ #lkrt-<Q,vHS%A\il 1<]H@Жfx!q^OY:m뺾ɩPyd_)b1=n H,fj],tDtBeXj A(H<0Lc J0F*d̳rvXz̞2Q+pEpաcL.$X.kj. GMe1"C>8fіtr8X[ԭyUKȲW .0wٲm/$GR."0ɩ ϬP:(+kL)1(w!εj@"P /u-Uvؓ#!YrZGdage5"$ɃQ CUN K,Pt'=R%qVjxAK.U[}:̡i\.d,t1s Ԧpg)HFC28DĕC4KΪ0˜\z2%X0*Q]@Qb vÄ3E|H!Ja*Y7B.",k9Bx;'i=tw=RpYtcMW؉TWQ9SYrhkJٛLɆ]e6AΎ0iM|#J& "B&ro;,Y&Mڕj}4ͷRMIۙѶ5άv{[ۯsG]"~mh1\m"MhhEÐNm=#fcۏY- _lW5Z@d +4g BS-+[(yMވ8eWZs__|m_rS>h;{*T)Pt!һ ΋XTIh*0 {oEG K00!Q5TUDk5vim+솰#d)LaxA wCyP0UÑyVw8nt`S7z)ZEJb5a8]7+ki%thyehBӇ:,_~vћRd+"U3ĀRV"TAUCe!´GI}5N]hQ {0VK53K~k%,PFIBI,;k,s:~71 8-K ĪNA\E ιw6&CN=FffI9־6ÙRbYEA@H59.sQ ȵV{F,S;̢"2³1`"J8iH"9Ô1JypIXjMϖ_ -YQD<;_Pv2ëLv!6kKqb%dB0+NZfX(ŅE" U:LsPpxa\T‘yscX} s*3b@ʘdU-rPP߱1<9HĤC":;]fO0EBl1'0ɭ8"{$H[IM ܆ R#Z$i1Aa fVRZW @0%w<77^*FfYƛ9c7w(y4iF5S`jN(Qi,0Q\gΊ*T*Bѥ $PrcgZC9CtIvc^5R%&6:p9X` mȚr:A Bc#G{BMvӗU-(0=ITq fE uPZEWZEGx}$g`*ihĺf0l_LLSv.ȃ{E&K 2Xȭ@R2L'=8&`mL2T%O4^$/![0IG˶qTm8l@ђċ}p[ (أwV '>!/_j JJ"ܜ" C,(khkf]= "6쥼`;p$lܜ;3I@ eRPH1?` J E$;#ϟ'e{=r,a7>}ef|w?즇}~'=3׼5Osҗ?>;>IOoo`ߟX_|==׌{!5g,],;xS{붴ql>^{yڤ,ǽW:?nq#03\h[peD=[ kL29dv2l'!P"LƈMCr 9͔ptGƝhw'hq 3*G̍@c0 ֶّ\ Iy'}(yL{ uEjfS`;{zvVup_ ,;+j#&o>%} U6&ª&[܏n@5jsS՗MD.`a cMd33Y.g`FZvI nvX"ks髃8\ǔ7oقi}NBrNZrX1Ai/[f3ԫypWHTeU޲abcÌM p4TхHPv*yL ;bv%)LHVDH$epzlk276 @@po[kb3k∋ ˂(">7Q 4vI} "Mbgd_ݢ&ՑC{wdnN8f{KE ˷H#ג) YMA,ȃF]w9d@ A0t&KvUW _˗ w|ۿ;{k]z];{En|M7]v/??ʯ|3wNK-w_ OOڟ_/{|RXoo7Kҷ*TO~ϷB_zsG=Q`~mw/Zc}7)Mb{v֧뜟7hNNN|:CY1aGnP\IJf2iѬ0YE6Z'\}}F-gE[4lxvĉ>bc[M: Iwb'-nxMMf6r.nIF64Fg[ܺ49uA!.Owk -A"F7.GrAP:Z`HbHjEid+іF;7?o?/!ϯ@.wPw}{^|w_|f>_ukkwu|Y~/x^e/qtYuwUz(TH/#6'GԂ[n妛n{[nϯ|׻CG9?KSrZuZuZ;N oUvlѣ6lqҐmsC:mPQ@㦛nvgggUn~WDp8$nܸԧ寸qtzwONN]:Thj6h':9>@uHa"6JT(-CVEd8:lmFXT'2B؈ U.AP[`TɛERju\6X14 -5v t b36 `UkO/3l>;L6 hxܲkx˭R?C'ZGPc٩77]dc閇ǧ<8pxS~[O;Ioz>x-8s/[n囿?>[7>?k諾ڵkU_=_xK_<1o7~78W|_[}'}B; oS|>?6՟wo ૿k~'^/z~ _=>꣞|Uy>oxOǿu{3=i'f~ONN2nh[D;ho.D'd+wra­F"GY,:R]$´8c2Ĉ` Lݔvj Bωѡ)!7X[&%b!­1,ծXaa>vK2hNŨH if ͐]ddcΦMR872"IqeР8:*pC6ɩz#u8Կ{ x}/M=O#{>q{\Z_'?o?-I_k}~̇]VU?>#[_z{׏sW=E/AI}kKDUo|_ ?'>_?C? 5pxӟ~-ʯ|n[ d]:$<^e]=>TԝiiֻvB3h"QqÂr< j0\2ƈF)p5ɗ;J+@ЗB9 QdXtuN" VVUTi+Hk/7BdK}@{RUA"'9F ކG޲r6ID `!O#$-4dfd.FGx!ƒ\@A8[ #4 kܟDmêBVzRb<ؾkB3xp wPG^+\~֜=x{[1樔/|{>#>;W YᆱAau}zw~weSf/px7*Q2#}U}^criꚷ+sOt>iiֻ꒻^ I[(gb,13$p^mvbHpG˪:2'H9zvF{S 93s3*$asF' ;xG}W;A&&(7[[K!1qEP֐q4,W̮t4'86J`V6zEKb+Կ)pKRa8NX._ vԆ4G:w'*.w?O|G񳟽,m?CW=l]WW?'~Lo?>oMW\ ^GG>=|N:::w? IDATͦӕ3hctVa/5?{oWY?z%r H P-G06HqaD1QuF'bFЋ* (Ro=]K $ q{yS"zz,U1dMV)Cq3Ndvg˽8 :%\=/+!cbϠ? rRBJ2H4oo$T&r Е`fLfH1 wcAK(|O|K$֞j[MI_2["((8L ֦pCIc⢋`MFSOT:#*Um(bdd#7u\tGFG_7d;~r]/1;smxAƌ3f(~`T㸘B6PC|=Sn{g%da) E %$3I0Y n;3"QqzwH~$b0.Y,eJwd*bb&a1WQG\!A9| Jg emMf!1Y醚Hnz|=500K/_aᡭfgg?O{w>p~ )-Y䗾-[L_#nq FG7Kx5%-[y mv;h`  )®ώ8$_iJ*lT l>M5TSMw=E-ȡ/T,%#hC\b,vdD6bJ^D҂9,pYf2B A#+BnV^)T&%a(W2# E\3ŠjGw¥w tD$z1#"dEX.1ezXH)GU\8̺+qXl 3Tdr vHso^l\~޼y/]t#-O |9_s5oƪ>3>я]}խV; B).|J)=C淾oDw?|b\zeVj]A@5󕦚jsRTPEr-+Ad# ) L[P= žuz y ui̝ %+HSO}U:h-|ͧL_}c}=Ν{Mkr`JդI=k_rEHZpvmsy|ԛn}I)uH%~a??_]V[M4~ӽ{-bGy7uuoƎ8}ٻ_ҤIva{g%{gyʔ)͟ 4e|\j $>L'6j@ F9"ܬ).wS"ZT.\)Z&79= .Nr<1s1ӑDN"SɅ1Uyf)GQ8fe7-e^ZV8Ŷ[VrOf& (p@F!])"kcDEKfdU"f&dy߈ @[Vʞl)dg*@;rTu3͋a v4Ls0լjB3ϖkhZ3kef=u]we뭷;OxSn/~?ǝv;z.ZtGˮfַcfwyԍ6(LeDqdwAR|;x_ nF'я~Xvnx>Ͼ3ASM5TSM=ntlLd0!`)]ui,d,̐gY \WL0M3e$" >cܹ9.0+N꘵KpSM5TSTq*3;&T"HUeDXA"25V1WN],d|pVq #9$[H zD IrJ;dH0" [f<.,@ͅա1cJHL [4\teGȎ,ݼ̐2_sɍXgdQ.8)g*{*e5nfu#ݔr]))Y,'^]P@VD`.*s;fvi~/mFƂ4ԩ?yzro!<843@=E͚GW~xNwN)-G_K>C/'L066 ,7o3kw=xA;={gll줓Nvy.?}9]vY ~aC_;묗|o T?~sstWQ})VZx[o; &8^6ls1G/]]1~>{}袋.\866vew3urJ6lӆ3]@">ftwvx6`j-/(fDz%q.V.nQups+nt1 0]1Kj`a_/a[.W0,|"J=Ĥt[DUa&ER|X7v!LtDI8u00 DP4V>Id<_2 iX->GdPf)LA+(PfɤJ-ӒȑCXv!Y4nA Z/f.RR~w<'W:(3{_uWtP?#J,λWjyGK&G~;8>u]Ϟ[;.LNGG822^{ޱ+f{{'{l7ȇ? ,r=[^jj{^p(D*b&L'Pz8:AJ@M3RU3zP<#M%c&&}fD"$#N BM`pҌ1R-'hHhEXŰx,'9XG;dqn PBg0ws \{VB:Ɗj E1 A<3CN%S0,\S脅[1A"m wD #ݑ?8oGW~>}} _ 'R]vWx ;ZMȧ>yY HuUB6}7g˰qusjznT0z}-<;nH4 +{c:!9. z#r8mA7E JNR'bP,7g&8"FwIXNIyNQZ4q}Y]j׀BJ’Xl[n@JSyVb dZK"LSڧ3 ^7BNMt72BFH+)H ,q\LuU"l/?Ir`?n(2!3:y3,Xpݯ~qAZfk|?sKN6m޼ylIUUq.]OpN/ЊORwJΣgھ5TSM5~VL&_"6,f&ha@e مTD*Yee fUp6PZk<C$L)J>e90* qBN(ܴ(2J,B-P4ǡ% wx.8G%{Qa( :}W"]э&x L@ 9D'H s*"6+^ʂV5DÑv?-x?#K,:uiT>xѢc;n2:C6ɓwmYj2 ZIf+&Gǿ]?PL8Q@yxxXҔS=g&O/ ޱ􍳿~饗ZJniZM_~XUU&L444TUU T"gQRy?}]__s翟+|pp]~OVT,qW]׽/'9kϽz)d&Mz_W>oxcS.Y688n??#ˏìOӟk9طzW{nUUwy;|}~G]w˕InM5TSM5^޻t)M1Y}HH-䤧Bc* fFgϮZVʰ>LPMG"R +x̳; 턜2iZDeV%TEK9)R̴!fxg$ab8 '%+!p2"~ivE餷 o:uu]S?ᣏ9>pM7Κ5k0b3qSM5TSMPKD"זlv1pXkϵц\a5,J T L##>nKLUjUJ0tm1+e#df\4P nEucNrw)2I<'07s)9c$@lb./ {^< genD%! x-YVYIIٓrUBT1%KUH2TsBb68P%R0Nz%K^|wy3yv_3\>|avE/:묳oE/Zժޮ轮.,?a@fGlٲoa }$`fCt9/}(EKW\;l:cȚ2'6;w~v~[z&NXt)Vm}]qVma!-O\IijCcSć)CnC&Blb O`u0 Nd MHaeAJ29Zˑ HD* #i0:%6;Å0&yHEHhз0npJrPDj2HM NȲ)ÍN)bw"aFGh.ʡb%r%DSD@Yt$ d2PWU iB$`,j"m6mcy C禐EL0a„ 7|oׇqkO7oޝwyM7r-<]wu'OSooo8?w_x*7T/| sg>XdIJ_=6z'?y!w93g?өjI7xI&.^xĉ L[xaoo_D|>5ϧ~h z.w\.bq8EOܚHjheUD&*$s.Qftd'*"U:GPod%A0/v'r2`,yɌ$g~ =%8 i'Y味YWU_F $ c̭Br:5FԢIQκDCgA&Hqb"=1rRD!M){'[::$ c%控At:jC6`ʝAAqQȢS)0fD V23"i,k@ooK_ҟ' ^zJ%rn~͛8qGyyq(=}wW^y嚽B o{ /;-])ʓtj.:jmtWկ>/'t1>888cMpe.^;qa莎1<%)U0(,ABc!*ɕpB:{ebq. .,Rǔf.GbȒ4@H![!)$;tCix hPXeŹ@v*@cL)$HdC{s2$'H `̢rd#]23rgVR4I$Ezg̘1}o/xAalտlƖ>\pg,Zol&ս`ܹ~w߽>lkp?844tZd__m֯:蠧*/6jm}9+7;~=6:<<׷F=BȻo7w0gϞ}!ҥKoem]׋-XBC xd&#$DPb^b1A "Rq ! *w#L)~lq_~M8/~W_`ӧw{.n=-288s]hQ9sx㍱[l>7+|_; `֬Y?e>gΜlұG}t}gnWΌ&Lޱ ,E .[ŋC>88}ÏeK/k; 8O<1̟?6[.J`[nnif"\FVVȑ'9sg;Xxzɒ%+ɓ&?(:(E@YI*^fRZ>RsV%OGtzs8K9{ݳ+g#S㕝tKԙظSHKd"+"A-D UR2Zha(jyY;: 5s-Bf$ӈ*Fbv ֎Fxcv!5!gy,&nTrҍn#;ePQޙ^TDLSn@b iQK̔SVyFOTUPeh%%JJ-LLH^D%\& n?OR'Ou }Lnm&+"v=BV͛w=?w;M7CY~Fڸ6۹k(嬳z^/|XSVزZխ{ɥK x{VRi;uŦ_:Bc\4/4J\2/P]xrz,Ɣ҆}uXHTSO9 yB1%­]u!Gzd^ڠdJ5ўDD9Eܛz,y%:LƖX i٬ X_9i) H4&!vuD<#\@;@B S|hsaJDဘJwMF &X (k,4Kby^ <xW*fi)b$Wsι'Kmx\c?ng?@>Os?Zt,1K7xYgX[걱6ܞ8igaq(swSLeV^h\vӟΜ=kre˖{>:>VἾgm_k|5&PZݰGFG;֚^ldx[o}. BXQ>FhF~PF ]cF,RCM-_/* 30 /`58)Tg`[\hX6H$s13aCAʥWȔ[}"=eC(Umr5 G;q0-?<21-t7`eX9ʖE'!:CcS-48eR0Q&㢹L 6Dp+)X&HY:~~u0 7p/oͫk_#8b͠ɓC1;gΜy]Ɨz[ۇ1?߯pv;~ wUs!]?qK`gNxJSa v#7\wK_|:?e˖ 䚵v } w/v>rbi-]䦛n2e >kZ __?% MM86eʔvV4%,Q…H&!\hi zdE#lGv)Ŵ_,c D QLp]Ɨ?o'cYď !@Hy">`EwO U'3rVI8E`?8[ ,CNv5:ӓ2,r8 pπdݳnJ(YX|2W-PLTHY 6P2-iŬz)1cK?E:{_} _4ix2iҤ Y Z~[&0[rȘ{:kٳgJTO{neT<%5{-[vzzz^{whhh-8aCv7W;;c.unkP3<]Oy楔6tS ,:UV2qP<ɾVžZ6n_`)hTܽb{l,>Z[:O4?qmy"2?ӧOO)ž̝;w̙ݾZOs;-7쵑Ү>'8&R,QJ*@A"JX "1(?`F)z'AAF,I1ǚ~*1s^yPf  Md2Ya3VG[g2rKSU؊<_sH!7 F+*!HD@e3cIU#P2`jf HBUݝ 5)Θ,|.?=//^FOyGlfz׻?;餓>O=y{WIӟkhVw5 "6UfA2*zYE0e|X;hDHʠ䬊.e Ve-'Ћn%2H]!/QY$ų JBrB$ sNbP2f&#g7d B*XKffLZp*"(2%Ɔc9$,̝;{o~ŋ/|w'Θ1k:tGva Ƴk s~ҘVӦM1cFHV.3iZOwڪȓ1 Gv!9)SonLycf_利vZ]ד'OFWNOyw^8w <0v?'N>0xԩS֡P/'W]uo,]?Ot3qݑQ]GuTbgO{=V^1<Ҿy/EOr7!y}\?jYuvǺ:.^n)WCg1Мd6X{efS ޱЊ\H2>с9e^+,yi X3;'*˳B[4YLJ!H(̳$Bي$HI;P[bHRD0%.t$2(rȔCϓMF,xI,,2dNz_"Epˍ[ e'9d@1T2Z+pnT]n10M^\Kgy5p7WjM6.16(%xc]3qҘ>=x˳iJASExѪmXuCYV.D٫>,ZꫮZh74l}@\ M6SwݵE*zO;[n[K/tɒ%YW<徺/s}Y}(DW.4o{$eCCtPW} W~wǞuY[nV+?SuOn/'|r]3ݺ8Vށ&J.B+›@[}_vX)pppp%O66l*\߸_1 2VUZ{Tf"EE4bco1Q+j3UM^KO1Ɨ&1MTE``iν303H)f:r=mK|Bl ]F }NoHC)qׄ}!8(T$FgJP\Rmi9 rH00-3ҐhAPQyUL$nEj%py$Üp SJZZ/ܙ IDAT$0( zMB0{HD@f_9v\ʕ*'2IʩWbbv: ĊNBCKĔItZg?]w>6Eϟ7oޤIqmsFT.B_'(i}4ޜT ͟mh; "zO<'?5{}$q^z鑃l5ݍK\ro݇QHƎ{M7p 3g<:o[Tuw|O>l6g6v@D72'=ǶuA0wܣ:{ߔӷo뛂7XDd+R D^ _ 05f$byxρ) 3I؜界 GISZ$ ٌ=CA/QQ"όU 0!$D R b\6\bGi}PAD X[ IQ,Q Ж\LT>#\λT)*K,3N- XJk'fL&>{sA=S0s됲hoonn>bD> SuyAP we>N[An,'tvD3HRC;'Njod86l؝w޹rʍ`ү?%Uxޢg;+W訨Ԟ]Z+weO;6Tm}ZǷ3fؤ빅 KD0P L#m]ϸ$m%kp+abƒH lBjqMLpF/΃5`J$ LJ2aa(PLSY3 C.#$T| gBgfP+EA>1zQ6$>H<sJHP2&G RD & !&Rb_@cbrVeCٓzRG0hS7SX[_/*]%H/l^#fLGs$/bŊN:)Ϟ=cf˴Nt:}f2m?gn566>׿̜zq?jk΋/ֆ-GE4 +V,Ydd(zD+gyM7_yIι;~q;mS%"{Ls)߈t}xכ~ԩ֮3hРABacbgs5ebsy5@SEW_}・h="(Ν{7ۏ;w̙3Ӈ(,Ec(q~3-P}./~.h!l8?x|!+8k=ȣMMMr;_tywSa8a„8lrv4hE^ßYY^~gwwO:aÆmFB7]CDn佯9r$ 8pԨQU.=\oy/n?؟d4 ï 4Ml}JD͟sw mm EM]f;&N0g; RxCbŬ a5/[JEGW"W&SӤHdY F`B"TlV"QMa%K̎ 1\"aB$0'.|f ky"  ذ *8|Qn(^DTA U"S&k=7qLL M8Ue0:W'fIP!RQ䊽hᄷj[zĽFԄK1q""rǿ{?|.gy~?яQ"4`i#&Y)l.8ŧ}hbzyU=Z;~s?vDhoއaXVVt:f ff{s9g㘙K)m{?8ˡQ^Q9c;JkK˶M:y%ZJ8g׮~`mۼ+**֑p% :玣BT(p̙L3sEv(++;CxKW6ۛkν?>L:RLTkmX?d;9QcW1ZO?(hۜ7oyw7=fc'sY#NlrԸa~ ,g>3f(-˖-[|TƏe"#yaܓO宻4iL&8d8V t*ED|>c&ʔ1S|UUUs Ja*22f5tttjYYKQys:vQ[[[qL'q/.ہ5#-+Vfs 0s dR鸼siss}d}_~ά^xGUAGzg{nYT_ݷhѢ=v}}gDQ{`'Ng[^vŁ)om@SZ{9%j`ZIq$"P@,lu8(yDIEY .>2l,f¡hwX2)u]iALݨWRxhlL`Ҥ$Lf'`q spWx%֐(,c:UU" j$ 䈓 ;@ Ȃ"$"2hd!0wCFeDM )1n b؁2uAukn)ЙS46⮻0a&Npw>Ccw}=!]uU ,x饗<GRq׃0z [{<‡ T,f>Xeef^t)Z(~ۭcƌygN<#?{ŋrφ~!.[; ;=}l6{G 5ae "݄Y_xᅅ 1B>@u8.8:c}\.oix9WQ^WU{.L~'"Wﷴ|'/U9K3g2.XxarIa:??N;SOFQ[okjjZ|~ost7+-^Gqqdžao/R6 $9yׅR}GRի[[[0nIJDDQsߍh|{--~0o_Һ#83OKRݣNDŠ = Lbh)HIԿbxDp͉д8 $K &g*3!" U!"bwV+A 608SOVP!cr0(`( $1T4@Dk{KTŔyUxDΎ-` H)7XnZB `%1 ̉iX@8*%f69&sĞ# T[WI]t?؈;U4^ ðP(y/;ϟm]xᅛBc3=V`Ҹ>B)PL7Ė {ۮꪓO99>;_WkO8ēNy9''|kǎ߸|;G;ٮ)mn׿8p/SG_}ǟp  Ina#Sy6mqET5(S}#NE0>>0oG{J*O-ۦTԱy3~V-Z2tuy]mmy-nһZݬs¯ ":n^:x/STYY}`Խ%fk#֫ȯtű|>766644rhnn9jTE^q_7_?jdyyySSM7|g]s8a'UO~rOiBࢋ:O3:E]y^pA6qǝw=0cIlK/d!_>ʫAO8o^{mڣ2S_T̏<ȟ{lԨQfbkն+z[2w]ino LAփGg:}{ӧO7(>˴g>{s1goy>;ھjPۻ׌Ty1BŭyɪNu}]uKEYOUwtv*ՀbsS;9pK.SO X[n6$KRq~w{OF5,X0~ĈK/cO/ J˖-yݹ=""fs˗;v1mmmDў}_8{v>_8#<2LƏ/n="CD]Ə$/2rdCUÆ ;CHCh)BDUTUU2;ŋv~y텇i֖/f IDr|&1) wr?>87 ff.$KD=!iK3{BZ"%Njk$J IM(";LK"[88vz` @=QDb]&WC'R&0CTmni  AbB9Mz,E^II,E\3.aPbO铨H!I<.- $/ʤ')IEQOelHä7^Zfٚ׈''/"DXռ|P"6sb pt̓^].p)p$䶍FtƪiӦM g-9rΜ9S8"]Qm'SBTؗJ{ATvq|e 2qF[1};cFmK/|e˖_LeM-˾gJdGt|9~p"۴5A.@NE÷ǏOv-sEg]$y/cǍonjt͎le.G~SlMUͅo\GA &NZe9( t˚oz3WAjjw(LF7#Ȧۯ.oM 7pa*lcyB-Z+h3sEe믿V:t-РN+((9_: s̱ -1b;8OSN=yȐ!+WnY-*`Rh,-"B9RĤC))kooD?E㽏#iH ?Rs$MɼR#&bח`z<R 8FS go,{B=)E҇owmRERa tk>)k֘J.T0`3oIv& qM?8Sǎ;lvk:|{>*=}.jD?c;?4sri_.Lu]\}Uk+ܠ5+pPsJuͣ"&PPQQQ7 G4MlD[@͜Gy֝ew2eIm#_?c=7b=dWzOUյ.j翗m^rr膆NB/Ͽ}fwg_Kgqf;ڪIʆnI`\  pMh L A93DPE`NMVS\ڲ&ZU,~InYQ)"Db}Uċ>[y b"R&I`tbBlnbuCh U I&<&&` eجՄ%rS|dcLp3Ij+U& d}Īo.0|OFaJ  v RL ,Xq$ӈxl. \#}O%(=nOKBRos R[[.Jבv٠k&䮾|>+dّǁx衇zۯ3P(g.眪_yͯJ^}̼gn9sy5mmm~yyusYgsimmf#RlDz1-1,:%7F%xWZzk TtzL>hӚ!n/Q?s^{}wGޣPQwZjGlW.܇x3{9`u紏 IDAT޳9Bsjee{3657u531qO/R6m'xw>hY0} |6t%8J*a8a;q%;nLA>UUUgqfyy?k[uUueeշ+ SkeYkٺYf,=/S(/ Tgnii)ԓOژ~x2ު3ۜs^P(DQT[[˻b(*d9"se|㪎lwSQjU39NPVfo RSe"Vpȩ7{ ZP儆!`(yo< >x2UMxQ-Ox8q&%#J b%!ߕ"͒fk$QU0:'2BJV.4cbSr'98&'$R+:T0dD"JE5j擜t WZӐTeJTX^ճ'ưś5ABRC@ޓYX08 Lbz; -5ߖcߵ}ѵ;ZM6z,ng?YYY:`3/[zX%ѹǷADBaʔ)6eYERvItV4|mm[Wꔨr' DEޜsXGLU0҅4jѣG8`Duױ_B\q:o<|m}$'tz„ y$m /| z衆Ͷ~N8$%>|I'hݪN>{ܔ =v}{If͚eoںN8!_:2QhjG{ֵb]8K=Ng>< Cjh^z\6s|.GV'IeoΜ@kARV!r:e4k#e ր-'#u+jȇ$diڗHL#+dԫZsZqU1$DLQ%,ꠁ{baEcuAbc/FHUՑĤ-`A`ޡg/%zCĉQE(MU Pah b%sT %>&> %D '@ƪບ'?֖X$Ma:@|3\[Gb.Yx]wM:5VQIӓ&Mz{{.om@7ȑ#ߎa̺q*uǏyr C(UM4$9Ll%ڌsu vaXS~Zŵ:jֽ_]tQߔ#{6|DX8ֽv' H$- 9'h5/?={8;wǧLA,o[Q![6ǔ,8f1 {BXC;3HEJ\WoveDhnnes=o8{j>?*/(冭~8mڞX|{o[: }^bS0]m:Q%Xj EjPTjH"V!AXoN>&M$L-bA' X>a9$oUFqMo&mZ.q"&ND%qe oS♙H`opک[J{JHEŒdO1c90H 3j- 3kyțOc'IGEJ67`0I睅d:)ǢG$+4DVϝ\Yg}N}pCMM{ S &WD""T,3D&ALI`I;?DS(.b}&0=“JDn㮚tvzМ|7T?)i# Qʄ~ ةkbP*ҵdEE|h5@v)@e*,CN-F*D>%v0cyV0C)Ou519SJID՗GznUؑ `Ĵ>S6Ɖ튚$b& =ABMsXȆ"q$r %!'XX/I)T@Kи bJ`uDqy8)c=*19 Ӻ؜*EfG`p"+HGZ?..5q|i3#QGuenfÇFJ^ٴƄld2 7S r\.MN-\`С{.0 8rCY^V6?pεq#k.u Fn_s=EX :lgҮ6/6U["#td$F*BĮWs7*f{6`!c0 kRTQe!xyNX3רX"j`LK*F )6ZAP( (FLZj,Dy-%sU=䓇~3b$nmmz}mm8H2@@ 뿴mt5 F0*m+;sUVU,^Bxw4t5>psεqUm}!=)K}Ց- e>Z0~x8ح IٌP.牼3JJ&P"ObBf6b"!+C CJȹ`„ W뀞+**XO+#G!u *u>psε~Un]݆Pp.^:<ø8m,1I>i09 `Z[`@gl(cCaHIlC7VnW!H|3Z`eπ `pI%14`_VA*I]"&ΑIs=W! s?T' }Kb5Em/1{.6YcN`Pm퇺ll+J}4f>_:nNsw ࣻ"-oJ?6ͼl%$CÀW P?2`xR|\ߠ`ϋc!F5xU{TFxD_8= ǘЫ74@$?r UE"Aa8Ƃ=A8 )5{8¢E5"D, vB5Ǽ& ѣ )9@FfbO  C}=qċQ>Q/E 8BJGc|e Qq,ǼpÅ=Q!^8_s* 야HSipsT 9BԏHi|fF<=^LSh(_$7#孷be͔(t|  rc! Q#Igf mU5wAG&kPdzOMsZ*^|E|~nWVVֱ6Ye(u/_裏7ohjjrCƶl6{|3f̸[ƌ'@AHg2Sd@e+E(*HtqKG l)6\3|68 &ᡣ]G[U踽Tf~U>GRP5fPpW&˹w<]u%EМ+ +JM]pk\|e r\vy߲W2eTz_Lfo&|ݶⷚqמ_nvJ75y4z675euu][8~"~̘1a7 D{Ǿlv3qH`I& oz뭷fΜ'+_|ɽ6iҤw}6lئloO׿ (aQ8SQ\(B{>O&>gZD~Ϝ5u ]] 4@B)TCUիUb^}$>/qͶ.܍x"k0(}}40_dqyyEyyyyEyUeEYYzZZVt) \) cM qR#lC<]PQJߎWyyeJ0A´ LQ89v#b31qQ ۶-̙8ZrneƢ[*2AmLK_x~~龒H+<@l{: ;x^BWKʼ֊5(͎ydEѳZVޔeee|~?{g:{WWޞd HR\WL:}d$I٭7e].f~,?Gc=" ;VTT3e鲊L<]VJҙ0S0L tA\9va46P*Eæ;QTxg}3gy-Hۗν~;%mܙoii>}zt|u ծ[URLguYg{JQTcc{DPil\16sժ}ɮ[Xx/~K/DU+**&Nث۸~Aι+㎭1b?Kf OzcIRs\ԩT꧷r) u_RIJЗi;IKɅr@l?6%d낺_; R*JMiO4 \%OŚ^wЬAUڿJs+[s{ZOEl_zx&Fc]W^4ڿ^{Z0t]sGA6]kO^S+=\P]6)4=;ןECTutG"#P8T R¡ B |<;fvĎ(Q'롌8 Q"aל{Nn`f*{gO_Ak8_~eGX~`+yO"5qT&xw{软KRQ-[ Z[[2C Q_*NM>h/Y2p8 `h89 X?݂bqEzaxm%)+6UhwSJ>->b@"rj@Ra&; @Ҏ9t 58xDʄ<$Ѐ!ٳ@^@`ʇ1>Y0KsQ )g8ځHcN C(k$"#ۛ8|\&9eT} ҔD"!<)iArU؅D Opi*.NS9QrJB*X@@ c4TCU cx *Z`9KLz bDA!"^xzë8ح|UgƏ~oy1 RBˢTq]!>" G fQI)sWIbRMq11 Ѕ9ppf-cBꋭ`x14y9bc,{)D K$@XHb3e b Q K9'MEiWe R%(]duq4cн3Ԣt'ֱ h'.igT5Q !IEC9Xe]p( \+"""/ExE@P'VX|Y^o_z?-| {ӻw/:[޲\aCcjܪUgC/;w>WU]i~ۼt.rVKwu򩧞zw>õu^r=Cۯ7ݿ>k}&~lg$L4.mmi<1?;pi_c9ol\ѸqŬY=O|gL)˼ƛ  J]{K_vw}wo.]h=wK[׎aE|9xu > NӔwUi&&";jÑP<"j2 ) Ћ@BHA$"HA9vzVp$X;i""- ]R^#Qh*䐉U B.Cp '(+C PMg  );*!iZ)Y@HQ*LL*ERp**@Y4ī^HSC dqa@ dJA)F(_IU¡3ae/>t. ] KH|nu{*Dk,A @3DK: 眈 pk;*Bե@H$^ 쟘BUOD=DCC} U#9D)Q%!Ed^+/"'< IDATtxB!U$d rah*ahʈa1w 98U3KLp2;Rbeb3 1$ 3 !0kb$IT, 5{q.X|K1"1ECXUUxsQNHX :2@?0YT"p^U+1 1#(RdnH1c'?szoIDQ]/gu8\+ߟ{9lм]ta6u~T:znaCԥ]VYYLꫯ. /⮻zYgjW^u=[YY9~ǝ?{[^U͹o{,(HхRlmрvDPIb@")6Zjհ-H# 1a6J,)茈ݠHsη5gܺ^Pwq>o?\k9oֵL|`=Wpe^lo}g$ۧN3Gc߽nO8{<{~o{㟽Ǟ=ϸ_x=Aq_o^kӯڿp~?MʯgW~sg-ekW\~ŏ?zK6h(B36(xh 0 g^z2ذRVՔt)j۬1u QUBˀ`htF(j,b2~%b呜TKCr8*#6bP}oHw.S5NYHnʥyjÆ]-s=A졷[8A: h sJEDVp6B!ϣKZ`Xtں({uKlffx feu:1Jcb(sYBk3chg8|*tT,VU-n|37=y|gggfgN-}/:w?cё_XoP!y{jmzS_?97}|w٩O{OkӶ.uoGg/ e5վu?6,wkpDfymi:A}>\hCrwn=/ +uܧ8a;"}|gdHaqp:5V‘0?& n՗ٜS_jݱ'%&`msLYvn5,xR=&7*vf,$(][Y4i@r=WG]ОH[ c|@MSM&yWL!ny@ 31c'yXX8yɝ1Z6Dg3,sp ohÓrJ0$rLfZXGiLD UL14{rr/({yDj3-ɨ ("їMp#% 4jPZn9&;zvvW&sL55 CI*CѪMl*0 i*P-KYڪv̭@Ⱄ}۳1bh*QC O#)̽V'ռ-fp[ xNΕ+OΙUn;*\O?Sf ܥ^U! q# _eK?ٽ[O_on;?n{sg~g}]1y̋_}G?w~w]uUyMv{u|Očz4O/OKK^k[kᐃWxg?^u] 7><˟}M<X#鑟??~ӧ|Sc/ng۳%}/'?g>я~t֟=?Q\r__d8ȸCt 0 #_(^WmOZ!y L&hs#azM@6V)ʄ B 6ڕXDi{߃PB(ynrz9@`wF7[LDKӚgsÇ['-K~߸읙ӎ p H LM`e22$eev 4B=* ־L Hc100rUԪA1hSXF 6DOBdOE^/lwa8_A"""!+N!QETxpded}y<eQ);nfqŔp=ہQBRY([a"bX 4<@;, `Vl%!8>Q+˖_ryJQ ",8UBxey}sկ/ܪ%*%h3W _=^?w;㇦H?ws:> HtQ{%ӻK4jY//eYg>IOle<կgϞYwyǃӧO|Ww߽y7?mwwĉTet뭷:u 3׳wqGD\}gϜ~׹g֍/U[ny?MXc))}c@xgϜ?7?? 7W\ql-ꫯ[$]{zs~~ٳG:]8>A<xO~~y7ڴDy\\41䈐Z+ (Nk1lRΘ`w(Cˆ=[]M)1`G߈Pq*½eJjfEPtQ1eJns`<(LlЇ>[o}x]w}oo)-tZCФX3b"blA9 J78 3TtW*pEY}KW\(kr8hrցH 1G,Y1 Ulh(T HnJ+-u_uO馛p)vw"rxaED=fnTshqM"3i)* QĨbRBo+k{dBh^U:'۲aT *4"j#Gn6rNcw֒WK^\6ep[06 Q4)ڹr ֭KQp`m,Pl(-Eʨ"TUo!kI# e0 5̏QtJI!\%ʲd&:d[8f|RwTϕ'N3~Ν;ıP _ucϝ?yG|;O|ϓjLJ?y~}7?~@/>>/z;wL'-ϼM="ra 3z]~_~yЇ>;;i_SN6m??4]K:E&+yK_=m~2 HWZkW\q+?_ƇjAj|7~ 7\Hx1C-)HB)䬦r wB ѐ<oG(#b+ xtEe ]I$JCh<Ēն^(Ql#ƦP{z2d [] !]wݛoKK~O|mݶŠ=RP6BesSƬiTޓ͙lHb%bzزmF2d5,Ս}8bKӖ鲧{4h1ͶeATsTS6kA}[:]Lhpg먙}Ԛc `lZM, C G$&0SDkM#8<0n!4rzG:Y[P5FUBnNj#I^2v6G6'`{u뭷^s5Bt :B!bQ0K 63"!*4dug"ÔJ !"pV0 eչDjb6hte pbO:68OHz :.zd3Y16 Z ̼|/uRk<3oo쒝W^-eK,~7qϙ%~Oz}l@G~g~![S򊉈w7}7wޱ# QPo۾pw0.S9Ç x+tf,iWDPJj0Ξ O9_C^p×\37|q{P8B>BZ:1+X93>j\d߰vT9`#=](nj R SCǼD57*Q1Zn*r\\i~ʊC-\)*yxKN=G+C}U(\BewMQ EV-Klizg DaxwTcNAm:¿~y_գb* rDŽ"Pn1)QZ,Um88bM5zeu#0ո-0m 9X,$ *JI #`fm4nQɬ"CHIn33CDǨG?IO+@ًީE95jJ\8BP, o-hMK550G-v65X9vRU+EJUhz ͽS݅VDv٩ЄA^*, 7>jViz&8" |k^{z HAn2 ҨhEDف,\M<{XHԀElX/| 5@€Pll\L@GX6Vq|~WH\·0Ҕι>ωZW$Fc,>Ȇ+T[T@lƨ>@6"PIZF j8׆ї<֑72Y47ږhNF@cADi'=zBs(*: `hs][oQz0_ H-_y?gϾ}O#g;DNJPV2QQi` ,Gؤ"BHB=鲇de(BBƎuC(TWZ!̃Tn\ZOq)6SL3;snryyïֲE@8)~rG~SKUS#u>S'|#nÀ$t r=V*@я#oYs98Q2mV0= 418s(!8:"R,46,i+Ӛ)6%Į?9Q6e(4EOBcnimG:)^pp  VY]"p|$0: ]hİl*3+$(fG\[{f-R0KY\ 'pkT&%;Rb*vDvڇ݀ఘHK.WEGkT5G.uTΜ9???|ab+r )[ZN hMJ QjSpa1i!}ba(#D HK5^?Gr[0\tJ6P(0^-f/miK.AC c738_K:]yi?ƸKǿb@wÜbmdh &RV֕d֢M:QVGbq4LD PS1Z}Vن&\%։mz.5H=G 䀳cIJ:FFm-9`\hDA#`k1Tg+Ht4 "j]WU}cg SHEp8DMjReŒpIqhISi@"Vg=԰5F@da #@ֲX6mpFD v Tu"1:szѩZ<23w6TEFY@,^nt[baWڪ\v1rCDРtTՄUX *M Z IDAT"n0*:" BjѴʀFOӟx{{7O *2 F`5_`șZEd Uk)&pUXeWeˆXV dk:| _E@"9+0&pǡqdzr'N=q'vwvvv6yJ:bG*<~툋(>e"Ȯv|=<kV_m(p%{ɮշȹru 6 !}pvR^$}sΞ=w7~7ˬ[)84H6:j`PᎨL,U6ikX98Fʝ}5WE['Y(p(كTsrf( 8Q[E*9@K;=#y*JDa"Wxvwq]u \Au52C5XR CHJ*F(kHF`حv(wŤ0 ҘPAxne-͢[VeFWL`ɶc?nQuґ\**P-7M{kkk.0UN(Xj)e5 "eYR<,[6 L@vFI7f\,B!8u^#Hr 5RI.%,)5y!A%+H+sЀu!QQUlYu`c@oJĽBA"V< -A)fZ{KX #WS-X5@Wo=¦\pO>twTx PZ+ke-PM?$CsƄ$e׾}퇪c=A1qQ?9.c[xI6 HcLTUBLu@rS5*SYDE {+ΡBj#ШW\yw#"bz#eW=(&#TK5nah`*nj X7}cbD'MÕƤ8˶4pL0G&D mk*JoY@$OGTT#q  .Р!]9_yCq!U (ʢh VV*F.INv6bb\uxTAi;Ⱦ DEHItDYԺ:t,pNSxQY &asg\0lsmAhմGvp5,dP>x&^d'i N)S^[;lj.>lt"־D]&$h\9yuR`TD`KU4rG1 bxFG +8:3DYTŠ ]jÚ(:d r,7TT`)s(K)C<m{1]݄b֛BDC;*peZ9a#YgەE(#J``,ʼngsl V٠Gu:B04­Ja2J>@V$kH튀mB2RH jg&UTu1uh$^{ iK>oʐ( Q0#XQfv h[=d'P" {hAVFb2U7c5.*eHRe"!:sqq< G% ox;k}Szԩ 9xӛt7~]w _oG*c `-뼍4`Wà) \@ X^rwr;l%">T= RQ:݁!dC(T+ AiT80b 9R4pU,4Dwh )AV.Yi9\}HT5yh5 U XCIIX-;C1*NLFVVU XFn`i$ b]h8I)ApYB''щi)tc*0<c݂-ˮ1\{{ofVeef(zPF2vC!@L`舶qC4v"$;p+hC?pB/l IIzWf]Y{{9FTdi|gܸYg}Zg5a QP&/U.P@J~v!aƚt2]X`d? --_ ~ת׻SO]VS'O_rr[[P2F.-?_7\H9+YƹTP#JEܺ@*2@ dYJ V4ifCH7U40W X6RHp!+푍5XQ^Β' UšGTҪm*)lC|.{L& af+19 g>Mšf/K%)5Y$$Yi$ d3'8H,:Z"=S( ƪ,ItMD+BaQtx%4UF Ѻ]bG-Z VZ~ajE #58 #Xs1Y&&yQLAP$2ܨ,Fёn ͍4#KPbaPM(%@`Iji& C#X-! VVe@rQ@ԭui.}!TH B:Ս4%# pq7aq4l^̰2Ȗ&q7|/_k}{??mo{^~; >я^nS??|w}y{.x⋞љ3g^rSO,ʕO|KY xcs.W7j*7̒Ɋ%+3.aL_K%!`)ux^"~ xt&9P&3aHAZdNwmE 4R4l܍!ЄтptpLvVʪPVeϝ5IZFa"fefV ٓYw2%MVV\(Q-S6l&IJ1bN Rc.Y&kP6IRc*.].R @Uм{IIT B!ܺ+~G~OOs^>?c?#wuOO~gv/>C?C?KkG>{=uԒAHo\ί[ow}?55;7]݊2O HRqb 7w4#򒡊k4Fk/,lY >Ȩ\Lv 0ri y,wY,m&H-뮽n'rL&e%bmU*j2˔Mt34xB: "z8,ٲ.#ie=,F SL3ZE k%ZLiʰt2yΠU$*CPqQ MIkMR#LufŒop37ywXI, 0 @:es7 "\fE3! :L$LC%*6 C %d(XDز*hknzMծpaf-MF:Upb,PCu\&56da @*[BE[hɢ)脺dZ\y܂lY!JVXNr+42&עJ-4 E&{=."U"%/mAH3؍.yɊQ3 ̰EXAA `&(\ 2@/%3\n(pfI4r,0ƒ/=Ac+\y׼/uWՑ#G7z^ڋdrzQ/:t/{Xw^cK>r?L6+ Mkʞ핤%tY)C0'6ƱLiY㖊FJOV/UЛ(Φ e0)elɊf{HR3S cuy [*@(qdp& i3"5H 6hO$.`tYCޑE]b 6UɊ0 33sQ奝 JA&zˆ*9 .7D)ݲA0 *Ot.}Tm ]h ,ބ{Ṳ#6SȪJY8I%(!U̐O%. %krA PS(rxnA,5W+fY2AJ6XUXE[:fy;@̢ "/UP*:( \u상El (pOR.\ KX%MO}Gb"OZD.,&qL $)@ؾ]`&)Q( ˃үx/??`cǎ׽;/<;qomGGԩe5Ŵƛ"9*KE,RUjUz5V> 7m袁C6|`<8]$U3T&XсLmC6V[6rkΈh1GqXc5P@RGjEuNCh۱~|54L1l&amfJfPGIl2ExaA6kk@rkdGI!^ P9 p#ʐ4Ee5$lhiSؤU]p)""4!akƺƅr3/,ka4 Rl6M!K5sh1U*sUw6 & bվ)di fXifT;cvzZ5`MbGsW IDAT鳕lR Es9dt""u䬎5c䙳"PhU(J騬I1]q^dM4u5M-dJ*TX,P aJے^(AKg֒Ӿ02BqieoBd,!\W1Q4Bl#! rWAA?Kw]/6տW__Czi7x=ܳ|bZ}Cz[zY Jo%~[?zի^0 ݣG!_+h+ p}aы-}>uSXӁ`\ VnL vf,T0єrWM s\3";z- 9KZ`ronM@A;%s9$Y0U$U+6ko~m>NB)Zi û5SL%*tlUuh4%øaȒ0OtP'ԔlYxvff*Y@@a.e>" ]Q斛n>У2m`٤DWѬo8OlHIL1ErXT0٣aXTN<'LV(8F%Vn$dD7e h +P("YQhCx7 yNCHsӌ#;W_{{0lPZKnc#dYUTo'FB,衫+D*y}kL~P&۰2tA*KJiH-Ea1D4-xir}|(#"h5Ӟ[]}5m{>4E bI0\̖BGHn>o|hyg?"DtoUhfgqqDI/^BkK;~x|#'Or-/Q;vGGyK/}ں:o?/?n3}<#Me1LѵȽ͝&/Nb9lHkmc^qR9p3: z 9"c]u4һU4P)4JHG+|̩E};WpkQ-Pa$Z T6ElloػʶF*e'šPt;J w>S}:eϪ+:45K,sG+Y a-T9̃`ct[72|0%~|kx+>Ѩ(" [ͶnD2tMY CDži ]8<_=W;Fwwթ.O3r߄f7 4~ n(sGBa w$7w[3hx5y eCp'yԚK*Yb4$GffQS{8xOp j+6@& ?ȱĕApt9/x/ŗE\xZ]{>?;jpPf^ tˋuV(eSq&g?ڷY Aa+Z >2; u | (aٚ;*/m|ϴ2cU"#`rmWDumŎ?CMC'7.AXkHY.)}t 68kD4Y`Ԛ˴qv6nxz$]SwW)3BfE y7 7 J=9r6k,YŒ"`UerE9TN[;W7)P+_TlF?6"=}o :sõ[#@Z >*p /tG ͢Y@n,Hsl#Ν刐dL%wF󶮂JjK.C;͇9F,x.ktD-[[ Hѐvop'nɹQ LVB/ȧʉ3<;f6nj#`V6԰]UF0Kxe4i:s.j S137fnrVnwoTE. 8LB9 ,Sן+=HD`btRK*5O}\}OeQOB7\Ƀ hn~nЩǎDYm3;qĉ'^KÇg~x<*WPA@ 8;MPT*q3ܪ`tsD!`4f(*-ĐǏ~ϝNrޡfaramٔSQ&a47G?o}{O܊Z%UѲHf<]xĿ [s'w"L=l5fKjٲ-U<0Э cٸUhj0Ì=n6w܊÷{hRD).͘r (½W|wokkk8b1ij-[a/w'?p-7 -&b8,46B2B"1Sl6AAh=ڸsdsZ fSd2Y"13 Qv}7?t] :Jdx:edC3VC0}w>9r[&5+m6_k^)Bffo}ۏ"܉qP]Xf\}ꎍN3E' Go ,[{@I&׽׾*}zd4K<~VEH0ʌsZ]Oj[cBuBWm}i)N〜B*-I&^>r֟{%Nn];fy59QuP5r8S4)&o؎O<=>lWC[jw1_f|ܑ=`7t_Nw|+?SFî-Kᴌnm۔f5Sq [( L`Ō4Ω[[i5|];w#y[3eL[Rhfi>,VNd1B050ls[;ØB|#?rO`~~w'^__?L=uU7{a*9/6š mF{746f0ݪ ^JdSQc*᳏Yk ĬY@hUK[*-Y>QȱU[G_왭f!m9o.\gןmܫf!WW2 rx:gs/Ԥh rLF>` ͩob4o(Qr;^?8ge*X{Jnɀ0A*1z|5^61{l60 l15Eqc}xۭF0>c}uehaȞV{ߺsl623>[^'~]<[~l{o*kg{8͠()1ZH5uQiCQM7T!3I0C_{5-C3w7za)iݲ\0o=ʡٹjxWޑSo6ӺvF\|~Kt=~ӟ6-NvJJYjv%dVeݪ{yzuZ3C`Ewx3p.c=}O\uѽ3 Wܿ O_>Dy4+\HD^ e2\l#(eU':DH"DDB)2{r*{脣4+qlyowOUjUIX 7w/C<9{|kozӼ髷>O<>]ąQ{&IM/qtX|>x=zʜ2T|.  pw{{?II?roNx TӅ}_ rAF劌}Okq{H\̊5qS>uUׁA5rOƖŌ2@6S_kD{<Ƿ#73>GyLRzocOUO?O~/lN=v7O|jhOcЇΖʾ7?{[kXfy^sfʷ3U/HI$$$mҲEfw-oժɍ$0eyGgHr{۽fs{|,o׮Zi|S16r;~ozp{O>u~G{_ʺ'>;^SpϾdžG/~bsioVMQ?{5aF D<` H 6('i&ɬP0,6$ ~cpo_}jֽgqei1x˭Nī?v߽OlJ_>u=y7G?}g<׺+tt_]Avam9Y:l@[3&><(4Hou˭'zNX탁/he헛Gzᅽ++r}D_a jIH=j;wIC(O tqUyݷ[FtLys7 *px|ml&_ؘAlmˣ;w}Eǿ5'?'G O>~#lUv߷gnZ.[SNw=ͅ1M{)z=:ԫqimrw ϫ>z\>LI"-7&E ֦f^5&󰜿wxco}o?73߿}5u/{}cseVJ5Rl+$$!&&L?v ahhCwDa,m$@2Ri*Ր5deVfVV/_|ϰ^k^N*UQI-}'=g}k2-<f,C@,?嗏Syx.]56ri\w:+W/趧[YݱtuKe1f0dUv{=-L|0I.0"PŐfkj4`qHJN5a hCWdݟ|x=S/ /߿PÝa1C6x"t*9VH ҙW[Q2͞/E>//fu3;3n q:Ğ`rYjg98; `44o`j##~"31Ţr *CUb0%Hld`^()+23"((9'Οydq߽}Ste׳CW?{h ZU)%QxϮО.ިUcz⥲@}29_r7ۙiQj>>Wk`KLe* nZS׷/=8`T24nOl($p8*Hc*VLOG.4x`sӐgH+++o3<<ţy(}s[.=m9n• `13ݦD8%EڻY @%:?ʵ6DF*Д]KյO9}֝g^.b1tNtK[vQԭ?pT %lW(;?gs?HR|s7E"T1Ҕ NJPO^'!CD blI^ϟnO=>7*{k/:Vy:;D:z7.씥+N]ۻk*h^^_jꕇ;߼Iœj%RWTU#(6"F\ Ⱦpfmd*f @@Yij2C0 SDPbE$0AC0;^Z3?|GXGk{EiI2BdܹX{To$>90=,4f\d}+g vk99C`̋v @CfDE5URcy|Z@X @L.Om۶ma&" y^W IDAT;~;~ⅢPj ݽg}~|?o__#b fuX_Wmvaߌ}b@;7Jdf:ifS23"3D Ifl_EHb܀4e \"TGf,B_~ۓ/ƍm>}r`w1Ayo+.Ń3NMоv.wNkj4KFs8֍^՚WК;t v{*9#4I??-~?}l#BuB["( LזZ sdXRLRN C5Cz]̿0NMϮj\Jq:{זvvLg8b݄颭f.^\zWfDdUHUs]Zft瞄'rQ܃*PkC4w>;z0߳)iµc.ZkA ; -f!)&T͹=EĀ@.G_{7Ql{~>˲#GG`.x߰X?OPL0!'w[Ķw [9bpI$ @GrL%]38 c")䧞{qrfx냖-ǟ_SӵMܹc`w:ިj@F,v _sJv6E_ۿz9!xh%ZPj 0תj!W?^=$,+D.J+ 5I(iS UM`&F36 G AvXSCj| ;a1~ + {pkChGgw_#  lqǍ{^[u]l'G87i<=Yg WbbGcG]\6 +)'%dp Ԁybɫ Fdб)C $BA_SNޅWN.zTt=p+;G_nv4Qz07usK_L[I\9Npmk0hǪ6)yYiJQ g~; @Y'^^_"{]?Xg` o+jQ"D3RRI# !)I#bC3C Dsq}fP4:T& ~- `y&nw~nDhp\ȱK^l- ¸@l`0Va>r/,1 2@-ASV2Y=wѷ) RRU45TQ3tM̌UňPL@P;#ٗ~ҫEKk"+ ٞ{6\Q8=ny˹s?wg_==f953SЌZwRˋuΪNke[تv'/i EINWߺrJj@@)9M޶o9>ϵ[-{s3;ǎpUm z?Ȯ^l !LZko/5zS$$-qu-|P?0J>WQUiF!R`ns'{]ιHJ)W6&*xZ_3#N$Z0`GʦVeS?K%SM3b'X!zuɫ0YK~揾Gy?OrE 윦N#=cJ8OzάќbQSԓ{] X=D S:+Hnd5D!Jh(bZ(7& R݂TAX18{ߗNAU)R u2Y iϼ{uTU0c j^k|2xhw?׿zm3{_5,ȈQ9\ /^&z_Zd.ѠmYLw\zZ%e'`.O?x/gD#uQAӈH4!2b&41e1PA@ $/ǫX"YﺙvY2zʋ#w3wF?O:=į ZҔ`&"f\gx}ǽo#^BTc,LMGwQ\U(Sۯ\Q(pl۷ژε MF4"ҦK8qPx4Lbw[+V"bwj:l^m4@"{Yo WE77f޹!,$&F*6x&%1rFǾ񨷈1F&&4S4YgyN\-.^hq{ ";3TUDF"0M3O@el۷""]o VET'7P$*dQ-E6q_x]G#$)/gA+s.P۝:;\82>:״P,Qc9pz8i{ΥefbJxh&/A`FIH̙ODc9tȞ]s|^! @(U.o}o?NXTT @X`#$V2c@}_RQm Lb|w=u>Ku:㙩j-Lq,xkw>H%`]*rkX`h5/~ـ$51 PMiݾjM<I1HzMoշ+]Fˁ8#)5K8Y|HH r`" *.~8#VOwq'LQՃ*T 1SK比9@m"JSb#5-s6Mr^ ;_^3o;v'.4w{dvfN3?<^x,-N7Þ/yD0ΜmiyGb$F"DBBIGMҦߊ 37ؚ1*Iy#?AeТ՚d ^Wpċ]@m (3M2LLBjT(T +<-ͬM*RWW+@!Lc4B Bϲr&?3S7U9'5+!ZD&fv:yY!/Sy*\OSx<PEt:cmhp[[-s|"-@bUt_% k0bDB sDJlÀ$?>=[Şe^^߳7SN-Fhqdɡ5,5-49k-tzbXعp=s'uRҸ sˤրF(BQ8Z^-2 v-x``ꈝf>o౜H1٤p1zH&L=Ф+p ,Kcu?FZRSIZ:8{}$)x!(5 $ĔA CB%$CNcoz(Uh15U]ů\9^\VaBR(Bصg~֑Ͻ7ӣG mk{z 5}k޻ۓ_krF bTXH01bL@)DL{aI  dh7rӋHx-UEtm>e;,gS $M0E4l W{+ ܷ]ǸOSd^)YSlT֐siku.qZv}SFy;]}987<~dž뫗srbLAd`Y[^˻ Ȉ@Ռhfy('] "d' MH]14,P%P 1@9~VK_KXLRShRSӓ>\hN|OO/vßm&UJn[7֬J :Hvר> E6ABn P{+eODw}כS]S #\ R=֥af];a~ x}Vϲ+W oׂrYׯxTA!B2Q1`(FsSEKZ^;c+}qC )DsڏzH%r%5Т[L~v&4%%˻?zZ- ŴgsCKq_;>>HLeh)&%xK  ?ѓMj_([CW!n05px8NR&j% oy Gc}<#1R?#b0( T! q8YM:S&J@H2sAmo>欽ü*_x<{22PT+1p՚v8D$kp ӳ+F*|2Mʖx{rn|&XGA>95QkXQ eS EL0Rc顿|q~0^vIBq9wfeؿ,Rj{xg@"Sa'spj#̆J,*q'v$w !j s 󝶂dP|6@tfwpI.] B~Ttk39ݜ L 1)0B@ ̬Mi;8Qzd!g/j`lh!B^83D@E#u݈QyNHىՎ6Pc1V'j&IX=1`f27ـOȄ>]_Xcwb"@Ͳp1fw˷3**`_;dﲜ#{&O4'6%+)c^e^Ι pš{y/kͤn[ff7ɾLՈ&~?3'@M N;F MC@f|Ϩ03#7`m"7̿E?#I9:'DrG^֙A0 @˳\ם* D3;SG&JfbSΊSŋGN>}ƪٟ٢(~Guog>}? T֠WzFH ,U WbZ2HPf(EjhVCk~{nuG5 [k0L^rdZy= co[k²*43VPYLWELcɜ/Zf*S IDATc1yϘę7tMwBV9 s}`(#܄HWVg;.< QL-u b)LѦ/ #zESo=3O_|i|UAAk#X#@`jH&vmMSP DNZX]y`ULf|nXl3b""  tշ:mȎs"v3b?a!1ЦN R$Qf05nٳ뉒3Pm *woHsŔ+Vj-܄!M`[2-bι5t B›V-8ǔux3o`7d& m7fMut{3`jĔ]]CrbaAxLvCD_&ŔcѠey{nLa߹f7Nkf@i.M"3 aV^x{sܹW!?Ӌ333A'|W~W^}3__[W6'wOUiJldLnْmK' FkdS 0>&f>th:ԥ Xǹ(A}n޸ltHZ"/,gP<߯էxfyrb45A͒òv30d65QeGZb49 ֠%#ܜ𔀨 DUQp1(Hz,9k_c8T}UlWJ(@NvP:pD;D1hw};D8_:q Sթ.@ZP#&H;wxՐC;R ūPPqjXP]D!1s7jeKSӝ|*GK3͈ vcDy D3BH iE TRhQM儢A@HdX/r8x?5{Bi?ٴNC<<޻΋#b LUّJjh<5IS7b ]X]\Y[Z{wkU-,!S H!im5}F.C<|y"t.f)Ԝ(|ߚ22yQ;TsG//^~2eA`s<fV2_x&TMhL9)&IՈ PسQA^xgrfaxoE@#Vfچrfs, ǞeY)e9cCQkɃ%H%,8Tq#$1 ٨w:yʞ?>_߾KgV1rPKӂ b&o! (*$3MEB]WCB Ɔ@f..wgLO7EUw`1og|NL)Nc /\ΜYB "OB)$M`S=8^ 5ut"J HlFtmߎ5=9O3qF.筤 1ocDTQLٙګ<&u\.7an}¹m2Mb7IlS~Mf*D޹enp:Qcvx$%d=& VrkFŌłLE†p 'A#'ϋؠCt䳅= uI]*&""W,T U@B%E$@ !^>||=ĉoTb$oֳčwqRJgΜy>|}m]]-:ׄ[oY'`bT0qojZa4Bpƻg[?zsSꜣ©[8T+6ւ _)$~gZIXM 3,PP[UYۡYB䖃$A?5ض*sε>s_}~ n=S"eeڅEʀ)P !(RI"bب cjGԭ~}k9>{%H{5Z{9}lkM<2B='$XPⅈ=47IAdDE5TseZJjbڕ<EDKk(2;+7ߝ9{ϮmA,#RFEݰJ9Def2}#;r<|<9oߗy~u_gc>O[o~~ggϟ?JNX,booɟht/rH󺿤K^-‘aBM۳&) XL$b7,LSQaުF AUo_{fbN6eE/aLHui7lZk% d<ӾZ]NS7h<2ӔZw.PB ʕMS L࣪S6 ^:3ĬL33in jܓ"_|fgX"ttFnɻ^?DM-p[7i$>ެϞ bQ8GŶ]SID nۛ.W\-Ƚ/)Fl h(&rhf׌\2 E 3e$yv6՜A f'AB9*4I럿-G{1Pʘڷz)z&ML"eL0CniӨ}%W(9''R45"pyQ%aqM'DɂҗwXEs% `>hp(d,a> 0w"o*BuH8 j ek Xep$Kh@/grHd q (f,C+2#9$,t s]I , sNԴ2/HSbc^"KAeǒ#'e7Y5eZ_+[4ߺO%"뉨mW~SN~z뗅 TrZ )0/2q% mRC mpfAag{%xTwCrqss.@\d:k1rp.08LJJBĒؾ6=Rca"TaD܉TI,nFj0Rj4&s s#v ![-T:9ÄQ-g+egrQI`ESjK0D !w]7 jpP%sPӏ|%Kԝ1kf%$DJ2(VF;UӒsZB5)iJռtZHVU%(|:jx \;@ SE_/j53+}>\_xQ͜8 CuVCPWrS l ` fYVA]zrf f?ˮ_` DD#ݣq=,>FC @EHؒ*Yu R܊E"`cueǹL=0us Cr#,05 !| <8 0/D-z"b'ffbjZZ7O\D"V2ǁ,"'f K 77hL~j{r+m?/~7~7Sw}'_ϯ}Ѡ3 > ;L===4+<[4~3gΜEV&*ƒG- + ǐaҒ_r` G5SA /u쏴P| -opbYa9GP 1㰝nh!_vEfࠡ172(<; L0jWbcKffjJd>^k$6J~(`f;<#:RZެ21k^er{ޗ*?c?r޽r[/}B00`Bmo?b&PJaU鍥IAzٗ~o/vԈ٬,,&5% DB2J3SCj@$IoDrEaD~%I8sRI!T+ r5BRLk`fǼtn1Y߉ʤE-'(Z# 7Էsޚҩ;F̫h,v1"b-V!\AJyuܧL[L 9TLL<wэc3 r"*]fcoMz;5*Ϧ&-T`LTBQ޼R1n.֩l1vek^bݚ+HDf(ů͛[6ݝ_}RRfd2jRaTdѻ*UTt:AZcuDr#g@`h"36&H H_mg4c@ xi8#lֿB7㈺yAr"=sn*j$t9܋0t%Pdf6-Z #nNHc\m9Z$OqpP]kq0bʹ>Ѥ3[\VZ=W &Ijxm-gĉىFKFdNMK(9WV& 3ȧ>|a'~{k~Y$2}kGFZEf =T& 2tjU#Thus8)QӘ.IB pNqH;sTjMb$B1<-R]c@׫WvDII8'xmޮ˙[Kr7դ#uz_)6O\P<ݨUU1YKDzZjFDGEpXlQE=\3I1rx8N_DLKu=̊Z}ruVs[WGG}m4a(;kF̪\[qՓmd6ZZ -< "ͺU/&8P/+ 1@਷1)0Xqi Gf 2V4x˾#cM>$ttJ+İ9R ""au@t L6`gg"B4#H! 0rCb.Z!d4!rFa\p<scK3^ _~=yG>;?8qqϝ;3?3""?#?2aWgf_42tP+zKYyţaҍsw% )gcDLLH%HBCDIKh"9=3uV`UZB@lnsG]`9$>+ت:Jnw邈4kO̓{(&r.&):[=/jqueZ ЈEg,Dg>{*NN$2{Hcr%iw}?*~bK6Ra<"Q)d,*"e:3=Q` faTɌ q`rf[Zx~M!`ј΅ ܹəIHs ]ksOO_vј\w4R7Sn=Omőse٘K]p]<K.X̝ݶP(EJrgJ%O_r)FDJ1Tٙ0{Z;;N)0•Fg]]1Q_T7-Ko7;oWy[Ae5р}G?PM Whf08#PG ~Cq?:6M&/ԋ|?_;c1 aBVk-%xe6 hhw3xu7}vt]cЎ͓'.?ƣ}^C7>D?~ 4^J|gu{o|~/ҏȫlllOR^q|eNK/*r3 1|T Wx'ݐ{ϳKK2yZgtA%2ҴHT5u )AZwēJ1*g]oʪ&ͪ1%Nŕ.]m?vOr,7Mb5y-&C'\y~c^Oo>^9Ä!Hɹjy_ ݄el-;e•PˈE!I2K4#44R kߠG:ڃ r2qgM;5 h4N"i ^;sWgSΝ*'=|(Jprf"Q|?mGnXaw.'헦jTA%1Br@P!rP*e( ,,  aPQħ,rqmt0תn"5* ~םxS&c-}J0g˗ӽ?o~}w{=s&F1 B@d+?'n=k;gZ?i H䖅bדq10L+J25/Nn.DXmeY `ayer3ILHD/LM;y6_o`,CBJo]^[E?_w~#ӳkwon ^68e U-:_Ǟ?[u&f/(iDđBA\oWO9R2:^aֶQ!?(:jrI!S33AƋ{Q8v6$_(x]Ju(Ȇ~x#Jʇ;a{̬mhC\C_=?)[]k}<(G:\z_,j4 hdj'67OuMX=V,A N5a^p3gOfZ+ӧOӗR4ܱx//вrw?}w&J TC+~}?d_'k}I@u&j339 lF@ɍYdTy*.[ԣf)s&}4}#H\{htDZk'yr]ΧB4g>v/屓Ojʵq@5ǎ{ phHwLd+aQA6-H 3:1CU]䪋&xЙFv@.dž6<1{oy*5\~ޝ;S͍ӽRېNYDRMLȠA`Gq,6Ԫ`r4LhZժVoVbΗ(t@znHT^Kɋޝgo9+0E~A fjnV3s"zTn@>E4 Csn4Msx@X٬ܴk_v 7͋ }G+J|E2Z@\nwGDםmgNyN8@+/t\QKZ,\^2PƒH8^( )RK rI8Q-;Qm.if| $ǿp-w^꾍_SΜOЬD^f&1@O+8v١fllil75gzһ)RT' jQ"܍;3&7%HNnpb':,"ƤŹQLkf9@Aj2<:GjX*Yn*D\̈́+{"A~AܬN|}/<{}vN_?S*Yz()wZ֕boOd-M;Ƙ?~䢑,8עSTԉsWP *WeĽz .*:GEA3*y8`7㄰=xpSf0M'6?{vohmo[W-֑q%w٢{;~OC;1pxf9È&)lȣf0CUHcTrcH(4/՜p"Vyh~YV@KC?.ucB9luf`<ԗ'< ށ=ФBM'bVm ᮋ+RMu%z=8nnUǑ'aPd_C >3Vr=Sbn]Gt숢Q[C@/ݜM9LZ\JWܜ.5AKea)gfv>%wBGqkpĬ=%vwri̼R$}&~r_.6vw>'ъ0JўLQt{%얊kE )Q"jcu&-)d^ʢ% q%o 2UKqrf΅8RGIxvV<_t%T~jIܥղ=4.p]GJ.u?ˋn1=͛f MXk4kS6*\Q$JFFFL"Uj`lF͢w@$*FRWFV!0/8 &L^(6$HЬ⥩S B3M☭ڵSSg̯n>ˡ yfl鴳lm7N1Ŷaf*,}ɒAA >ߧ]7'v|5疖(fϟ4Z_;1.Ӯ22PΤb ; NYZt>];o~_SoK=Q!b"̠́$P֚Ř+wZȼ3-fz]3 @ S+eACj=G&S.jЙ'`YEB v 5Xz1ŠX+-]$̾r_y>+=;4pcEyOF-'BXXm ^kqu]*Qњk%r͢fn cBL-9e"0DAF^6 Ff Id1h xD\W-(;%ϕI6/Oox7]E-:u1j -~ޑK\(!qyIfW`kU\~,=L<7*"űȥlR5k0Of)am(  䑔ܕ% .NɫU2'o/Om-rImG?{=5FlLjuQZL1A1*|U4V#h%rM78AJʠŇNF(䬮P-`F՛7ǟCnؼ.0B;I٤䬵R~1Rp$狜{slr)k$. *1 RAB86\K7Ջ8vJ)W/_9wbюe@)Sg(&="4<մ߿2!@/.]D*}nbr\y?.Jahtsq * Y"9&VrbúӠ܃3_Os%\ g?SYիkeu{ǽկ<[PI=:"EJ@@`(;cdX8(DF 0IR! #Z)j(1hDpfzU]]8ʏs_uVuuϰ]u}9׷A`4D%0Aě*) DPrŠ"fNQPEM3T$ 18b03X-9b`$ 1 yG,(6w@#d#cCd *ةXzgZ.¶l}y{'Z;ϾǛJ`ATc]B"0]jd(j,ijIUJ* сDjbf D"<9u⍝B @u!ißՀXTlĒf1ަ "YIμNR@QTbLR;]"lLbQvZ@Ly􊝕4ko]ފVRET0;FXQ֭ dX5)"`ZTF ѺFH **ydX2R,fH=TKdV-H(pD7r0-JĤ։̊,d} B̕4XU{ `NymaWV!(W c T@PDTLͻ|!75EZID0"*')P%-@5e$%VH @I g7@$=dJ\PxDIj!'C3#Ee͐ТQ :(PD$oT9 F55š` ȹeYL%*8I0 ) P͍&LdЃJ 9c *4XxnDXeqETį; Xoc-BD"v.Ͳ啋>߸v-iy+Ν⏚ q]vW423r:Y2l`FOmTPVU5Z)cg9I"8/(f :AtrS9l}PUH R v 9}OWS 8lكYdx'DXhkI5@a +f0dBYm ˜G@# 7DfRX3B4&CEZqz8,v'i:2#42%Q64V02:hf$6, F"Z2T0JRHXRDRa S@΂8K YbT0@D D5' LhM <) ע .Q!Z#` L4]a<%QDDL8Z0ZRE3 (cYJd :@Pr(Y#UX"c  Q"^3Tb QbYu2(bU*xrX:D UvҤtVR L*߭+աUb7Mz`czҸKeHrhZ9*w(#0_p4{~5]R<@`#{c`*#G7&UH%9| e 8d  UK@gc G"ljMJJWEJ+ĢjbT#7R$6!VBL]`*XK4Ržc+[VۧIjIJ̵ )2G+Ө1*!fR) ư YRuiC7(CZj@0JdB"9*JjBL)Y$B@")* Y]QW tR(rad1Td¨bY*gIe9t杩$B*2+L21Ua3c'..b@ł'*WS(AEVjFH&CpJJcqkÑVfF)jƙ5d' 1QSr' QcdT<8;(ɂiƜjy !K؇{)ZUTHTU TQ@(@e(&b,0Ue(ZJB((BI)W,>ƌpJ$`3qFbY8 i]U˃atH>"3Ȫ#P`N MLz/Aҁ˖'O KTZ bU/ABpTw D1hu uSiN*`T2CIf@UЫ0 R|C)T ;.T}̣UH-KAi d M6pE1Ac(f&$$jr=X]5;Pӹ_e\GbY 4 w=Vc5@ /Zp`. d$Rj)!& RA0$.ɜ\9CK]@}$X*Q)PD́ZP9 ju-kt UN]ͭBUTTCB(<D G"ٗP @0Z/Rce(JEP$7(B&u*ZX0D &fNceƥ FD(*jI L]j fbfA&6 LfxDP'LPA 4=TUWP xoؼ5׍A_^?r| ;wznooOU(2v.kuy򩽽I*6;~Oy}V>3"S F)CP;wy!Jj|G"b;lŚ?x*CRC鋈孼 m]fX4U.ܧBBbSWK %X( =oI2CQbR`@U!YCP T(P5ޥ*1IJtfDPԌh(->@D#J(Xi͔@J )FU A*,VEH3*(ZٯbJ .x]E@eUEQEdeG^HXDcg AgW$TQb8DBd`)! \)$F4JIX@SC()@#1yBAU'bJJ @I}(BD"\ S$$sXUh 0䮈@I>#bͳX}EP5\ƪR *1u2Ub--HV=jnT8#VDT)^} Dd*ςjEl!`O8~*qZrBhtdyW>JH4]Ѫqߙt{<難H߬Ǎ=0l`y+>QS|;[.]O3yQb:r;eY`oWja}=Ms"LH@0Gux/}-G:ev+qa3*f+Q};QFV$tУH zLG /ci7$UBp !i6ONΥ?|\tdjFPE1'xbeTwڈ4nyt`ooĔ)ehNUIΞ=Tt4Xc5ͥ3gfu iFF`f*"onameShvAtI4%.a11ʡLUK NܬOq1s<]T{4̲C@CZeY斐EeVYM0zt^{ի=}G׿E裏=}&";;;/ɟlnn=??pgBy׾/_rs`]u4^rk_/x5Ȳ,I;kw P9#:H{ek'?o.uc5Xcߡ`vOh x}noi}ju3QqjJ߾\L[UDIdS^lԬPM6lz[,iFH0)V "cr >mQIM#Q6Ӷ'f5GS_)13јW,+W:sFZkVDn޼~w~wOKKK霌]nݺ/~svGΞ=t^ׯ__y .G[o/_/駟>{sVVVɇۻr[oK/]vmeeΝ;wٕV "]d&0z]fhk͓XvR>vQ]d,WWax:le!:{wb":UUy9'<Sp51׎V#;9jIzyq1$;"pFMj6ߏ@k@阧)ٰ7˲s6Z2Jyx/ ;;;WUښ.ϻW]WF}ۻ|rrCk׮\oߎ1އU=TٹqFQgΜݭȭƊoq7.DWa(x-+7.=<3Ob7Xc5vFN^}Go>uC?CnYnqg֭P9CĀ.ۋW=.=eY7-ww CK$Fuz'wtjv`3꣙]|\ZXp̣#?"}n9H@NEp*rdט~mqMHsl:Hf;nn]tٚ {sY__? O=3/,,<ЇzO?朻1)_Tи'  ( Na ix-src3M*nWa ٢&cLofZN(F3S]c0#-՚T#IKKO!M,I'UsFbpv\J,_}ie\54M/^Xw:>NsC,!V_ɥ˗////M-//{u4f^YYyZ&">}ԩS ɜs52~OD/^xz$fiCdft9Pqj!ˢߝE@$F~LDUDb./ҳϾշWW`{+Xc{\L!7ߺy=ϿbQ~ 2۷^(N;0 WeSPPN;I*DU5sĉHhd8PdWC Ư27:2R̽u'H@L.谶 3%8k`vup jc"u{ώ8DPdZjMvwRtTv:uT,{[QyyynH8!)%Inzld]O)˲ԩSUURViT;6@ vtg4?{ڵ?WȐsCLXc}g{~fS5I6UP۷_ӯW h-7x}+0բ? WOtU*єݯ*U r}k뛙OaW~9A_D<\퀆x<ˉ]>b,`$>Aٟby I8q[LhNY1ƽŅE"B@fNӬ(#8:h Nll8lggg{r뼯jAD4]*v #{~s.sbz5Ji()} #eY櫯<̳e94S+8(CTk"ZQEAXcv"rfb(A,--_={\gaʲ9(D4N33s$t9 Py̎zB'r8*csBTUD<~ൿ/,, YQm2*5641ZQ*56هj)B[oW>ZCU t$YZ>s,PURߋQD ޝs7{B:fgT`!'wuѾ̯f;'f]0EuWp%?qpSt! К?KIs"`zh8]Sai231-./ubY^'kݮMMNЭ>]+E*L]fn/,4fže)uWZsZVO6"JlΏEggHsekRѭ7/\7%;/a,#tƣ,^[޺WF !w&~wgoo7IS&2F\;t`x+3S8(>81<P>azTs̴BChj]QJ2Q2;CDbA0j~q ]]ƪ,6Lj͇mf/QC>,,1Ri1h DZyޝqNl1sέ:3·!]Q}];wĎ kZRsV.(dJ<(KFh169FQ$7r\m.KcM[aDD̙3fCU̞6U 0Տ򼅎(Ć1]V SDyBB %:nO!Ώ|.骰Na CiθG2 ؤ>vddSM0 #<1W <'^sXk#;H;[rw7...%I,ȮuWG&v콯@g?;`vghliy)k%޷Fzw0=>L*e\u<Β4 z7{lfd1q;ORikĖxཧ tȍ_y啧~fvB6Dŕs}uKKK <ˮm޸['j^owVg⢩8.N:r&f6ӗ2qa1|ֿ%"$IF\pYaq"h0baZ?\7e0QH~,xsT՝;Vj/--u{݅DJ*'$ڟ2:Y  _/Nzg{x{ab PyXATp-: X;iy"Q@g/ { z?/34e-5Xc݃ cWxHcŋ\G<鍅u$f ťN9W (^V/o/JߨB哴L)aL;c-j%hCNl;D0ի3%.0BXXA`MU*NfFo *TK4ݥ)fW~ڝNgaq,I4#DRgJ¥.D<]`mރL*ߵ0||C6BCUc5`]15R"[@DK2@>&aIh)5Xcv{"cУ9[˧g3Z;{aù$`o[?z,@we6╋Okh@H]5@  ;;Hc4)º<tU숟gefn,,4{;;7Ιi{a!M(`RHm_A@ 73 |8{l$N kkk7o|駷,{W/\OY$nJtaaʲG>R9γFq9 9yXT.rO=^ pc5XcӎgլZs i}rP3RGl@J$dO<7^y9ͬYX[7Z8ovsMَW/cÃ=U NӨ 0j'0IƧfrPDkP^'=9˳Q#nUV>IZ:*ڷnqK/xmmmeeeooooo/7nlmmyoы/sϽ 1^olnnzwwwlmmm~Q%/޾s^ՐĐ [I_W~gf'sGspIq$0OgZNx8G<,.c +8ʆ ٢q,Q5&(SHG!#*fjB,.!sx1ӧtwȈ;LٿvԩS5Z|cc͛/"vW^yeee%,<jSh"voݺC1FDlgΜ9sLժvݢ(T{e4SknQP,#1!D;Fహ5wapQ׍%*oݸۯ'a.,,vBDpg/>uZ텺a;~G"_=*R@DE=ӱ4ga^L0M tR`r@ ki/,3q&3pM4IS3@,BUҝkyG.WEv%M 2>iƒ?/VWV7Z(:իW^Z~Ng<`qssssss{{eYUZ[nmoogY}I̙3/_|S,۷/]timm;7@!ߴ!65ط݊~: b f8$"^r8<: ;n@moo"sg^O:Yu]v"84=>BY__V4'&~yy9w9/o=۷oťD["ZO[U9}W͛eQ1ѹs眛DD?ÍsΟ?ɲ,˲o/--Dʲuk׽Ν`p76"nnnVUU{(VV9>1!s鬬=3SeXM2XO'E@Jy:T;wA,,&Y uCY-#B2i3>}@Q{?u1羨vBXҎ:ǫ3󢪈(8$3$$ Zx>?jE:bKo$iɪn\~GpG堚yۭeDO֛o+ٳ̼BDW^MӛKKK}ӟ>~ծg>O}S!?'i$IS?S<[q_oZ7?姟~JU?kqگ--/}K_W~?>s_7[o֕+?#?j~N[/oo~?v}_o?'>1 `UVn_|g'h09Q$7^~ܹs33Y\\pO'ڭ>Ϳ]rҒxO~]3igg3kK۷?ɟԧ>o#.y$U>|ι7*k_zonlil@P>@QԙQ@PTGq܀quQ7(76 -4MoUKUrǍ\?gOQyƽ={(ae0L PԪn\IipI]+BRBtZX.DeP8<ǵ-{B9RJw(~o'bժZS du0DDWu]4ɦJ=)C^TNg3H(,ۮj5dN .dc݁= N2HJ)M <Ԟ9Sj뺚2 4M˲,JGǮ]N;SN9۷o߾}FGG׭[jժ\.N]- ˖-4 2iLwbboޖj(M8XZ-RR0BU޸q?yf>+FGG#-?;~Bj[1ڣ/I8U_yqeњ[,1JvJ\|s-JJ)˲Ldr׾o}g>ahUhkU:gݺu8l۶oI0׼yϿt ر4\.̕jUeax 뺛};6lຮibeiy^[j 8jUT<{}}[ DN/{;?Om޼9"XupJ }\.3s6}_gr9M=yы_LI|\.ՐDlVQ/ؙBFJI#]== )i[V08jPHgs-u\xǀTii%VivXn.Li5P\ڑᠰ8 *dar)֥c쁱!iu>T)=7 @n\!Q t*eҐ `6 ydfӴr0 P%hW?0@庮&1 }_av6rlV/3ٶm߿m۶T*588aÆL&#[lYPx6olv:6MS ۷o-i&۶Mt]u]X,FjX!6nUF IDAT#l۶OD/?>T,=]K>E(@HA1(F$Thɮ/U,OBL:sMMN~)/+8򨗼lxWY{ı7<Bucysejj_ڿ7|)oRr׽ndvToO+/UV\;,+_0wvv+ߵl2":3u .8_JI]Jq6bXTJ>XzMaJ.;$w6l-fm3<<|޹w՝wkZ;=$)&/{ˈhٲl6359r<ϖ ({3KC2LKaZKuug C*fi0U"rs4 JAT1.]U>@DAjTlET| ح-ۈ"DBVr9۟?=V( Ȁ؇EJCN B@(+T X2b(E~-P~BLˌntlt. 2Y^bQ2MaZ]XXؽ{;vܹ~]5oYty9]vm߾}۶m۷o߹sΪ4jzwqsϲeLӬVvIbNK?燆kttTQ,T*}0Txh)iah1rRhq&M6_*|c=Vga2%Fi||2°,5"k!t<?O bZyeJe#_Sy_7w/ ~dY!-*Hw{y7>f2bo׿իb®_]Yۺ{zԡ ׿~i?mtl/~;/++W=RK/}9;v87X =܏}<>>/EDNҷ~C:Ӯ~o7?}Oԛ=w5=3`T_/֍747?ۿ۾ۅozӛ_o~m?ρ?/yy_}n5Jw '''٬qB}ի06-q^³^:s]D\{u/~<㌽{~;|+7_r_><<6 ô,󆇆vȭX,:߯̚իLa_S8咓N<7yͺg?00!R<11Q6m$ܲeΝ;=ϫjLfݮ M6r9EO<>vڽ{7d2ͨD%"45P Po=ZRHMR|ɚz_.!}~_̌uYB쩣Vӄ@90)Ƙ͗~F2\_ xWY:;s rRۗm"*_t\pWynMC۷ok7|-J)%+Ybaaaޱsk:s ',opqÆl6sG{o j+T*EsRk֬9ݻszQ>ٳb "ob7z)uf  )j<4lS\*Ȧ 8yQN͙/¡ !>E t|g(}AҬhlM92fʦa !EXFJ\.. I-sTG5rT*;w}L&o>-vLĿ9S*fgg?66w޹ZffwwwVL&JEe˗/޵kڵkkZ\޻w–-[GRccc;w,kΝk׮mW׍DYKd<:>]ST_jDLkɄ[lrbEMONN~#׾os]waajM=]EW8??H]f###:Wۈ۷_LfV8ض(s]]JmE$R$#lm277S͛/===uI+uMOML޽s \Hfnn^f+~_uJzc]y- UIΡ^O|c{Ǻyr%랱ӟF漱=SbaURVw}y38R7ϊq~I'puݛo4ͭ[F}744?xvҙLmO}od2RYf.||}j/ر HXwuRj߾}vww$*$ I03鴑عIt>PR2 5V̞ ֍MoTӟbb cHOsjdZKK̕Jab;|t8CmV74ÀLr]T.¨xX%;Ɓjn4H8&R0p[=2=:k׾ѱk޽[n}衇xx`֭v* krݴ]at:r9+5ВT*d4Jd2qvGݻwBo]ݼyի97omsss{y iJ;rO5!C#ł5qycT\3qpf~GM.^qL&C$>\|E_}QG7)>9Ϲʫ<7He/R333^p^2!9~m6קP(Dke%,g} /ફ>95`&P(:P#ъ+8p@⽯\|y6=gE/z{eㆍz+^񊡡 /|㥗^ye>>A!mYߛ{go;\6708xuE H}W_Y '8Ͼgsٹ뮽R/{K 7Gqg3 .0ߕqNUV]wum㸮WޟNn馏|-+UW^_v%o9+Vҋ;fƍo䒸}'":ssz///x^~m<Dzw_~Um_җ*Rя͚qꩧ{_{X4Կ lg~z̗6xN>'&&c=Vq~ff}6OR+??]XX8stߺWao; +HN+Fq[PҰ\![* ӊr[R xq<73' [p(`4Ғ%~SV|>b P/jy6S(GoW l6gHCWiJ E^cdϢ캞`3yZla @5qwyqnnN ]655ВVU*]L ٵKե {w6ׯ_zbhhVٳGf͚JR,]b={p '&&4'D TKBl뺩TJpվ,:i 9r\.d2Fʋwy<|#ʞ={?_O/7? '(vx\/ia(-"DIbn~\]+ T?(cr+{.<+ޝC]:Em *155U.3LWW=wjdddvvVlMB@DCCCڪhbbBChina2Nhutr߿b j\]W\3+okӮAL\LOO#b__m{nF֪attZ)519Ԝl6׫M X( IцQ̜xLTBR={ k)OF-25=7&|ЁcRٿAD@cQ'ٔm{?44X(tonn|Z<0u6Q!B4{zm;Թvmb}B&raaazzZJ+e[Dq]Jo߾n6SSRI)lcrrZlq+W/Mdk~N!GE}dP$iѿ\XXO٩(m$O1 {NeVSf0m;m4| <|a̠E*p# "!3`&lZ]4m`JC30Ib@YX#溺gFbzHPkYcZx[' [hˆBVJTUu OWհr$q쇮[*Z;ix]FZdB_Y.D}BJ˴fgZ AV}Wy5ռZsJ粹=C)l\Զm|:p@ww3N8O>c3L2پ}{llllffq4{zz/_nݺc9fݺu+V}~Ri###|71f͚|>?===77k֬߸qc=V֬YS(LӜݻw{^:,sssDXVݻwllR0=N8aƍ}}}tT*?:3qw #Adk&曎Nyʕ"qO[e$Z#p^iYBZٮ\Le4IH@\<`D"y dZ:4+_\!oo\ot9?BoHD4kՊbae+ϭb$ i~kV8l^-Zr"qP-P|=WNTW5q>ƭu :Oi**m`iʥrЀYE M5wwwX~hYjժkvwwgY.LQĨh 㺻ю;RGy.)x~~Oֆ4JeڵSSSFY{TDMt Zt}i]}YU,uRJ&ڳ8|>i FC744488֭;#:hlM| _֟K@p+VJ)b6Í10!$ZLtbz嫴̟q/tc\at,caaaR @llHZaM0ŴR4e1ߏ1G-Y7' lnP/(]10MmUkjZV-&"sΈ%5~1A3`k(A[]Á4$ E9ĉ+/J\N!ۼBڶWZC*  jVk02WV  IDATLwwF)\N|>?<<<88ӣ{7*۶mNWWW___֭[-[GuԾ},ھ}rnnodd_w杝ݳgYi f{i8јJ3$Q7M FU&}ݩTjxxXJBu!xaVJx#2ʺ&z 1W rC cxl&Sϱ9ͷ~-YzĖ6~-͐DG4?1)ewlTw!!)۲ӈly(E!úU!I!aH۶%gTOՏȹKfۿb V C,HG "fNe2\sjruY)I~sy)?;|Ј{1#9)֫A@EIM3zcdRa@q8̍M?vm.Q ^ODrY!eb!J"tb`F4A6 # !,HR{dt͇nBtL&J٬*3 ZrT*577m۶j:88_Y˲ViRKNB3*Z\S@tZ !+{i)cܹsӦMGy %ׯ?3ubQJm 2 1薶e-Q+Kұt,KL |/ ^<;0 H@fIU c\>tfmBJ!D\Up,J{)#B : +3sF kA5IIBHDPQ6mJ)=\qjS2kF5yfXaC@ [Dz.Z8 ܆ xf낖G ep: xr!%AkCy?ӛQSp->}7lgr2TWoĞݾ癆i& u3zt]D8?3aX\0LThGuQʯ+zCR#V}:ukaJC (D4!8b5)>bS>IwOCxѡ L|-/̮㘖EG^BCXQo=r)R:EyߧRt:KQ 8p`nnnڵsl&ў5={tE=~rJ N,<,C4[jQ'3i-iׯ~tI? ʟ;\ѫe{Úto :脏vB@Tuݗξ+c+`42\չluFaYmW!EALի%:XB :\oW"*Bq1 Lzs6> SU/pMheʏTɽ1 RlUa<֪߫,uq'C, |r DV XcSb$CD(c `# ;+`|凁/+lFBl! |V A;ܻ`_4MSIf&Avq\BB/B)Q,2+.KfXfpe'+d2!`A^ՈDh=Uٿv}Q({+,n}}WUePܘ9! VJH$Ad(Jc7m[ IB/_9wa$Y Q)f ()GBi+1tURU NXj͑73+40L0$ eA ;e)q'f<pko4nˣ33g.V(EO乮I;ǂh¬Eq$jBׇ[4vwwoݺuttT:\nڵD{{{m__sss[lBXuݑ]4cmٲ%4V}"fT4JWۧv4p]72b^za۷ofgJR30ke\4,W1#2$fMY fd3+fYqU0X:@a 3DtpZ* ~y+2*rBV?I .z%P")i4hA5&LӈyxwHljL[O@۲} ݓے^;.A }#!` CbeY'0G48[p C1@|%dDp iq< Nm8(lWJ Aip|Exc6gSaۇPaaZ+3̋`|O蹁X`"i=o :|aА X=um4F&~(x%d HT:\?'-n!)I\iا"y>{ *`C脶&Q *rN71 $²l;^(S4 ! D!BjJK ^jaT&- 5U@$F,+LRz cYyWVkSs+6jZ"iEwC\2BD=ǭ!0LӴ,Ӳ !Hj(@24>NK?~nnR~-'jI<s|zAp%P7'J:Jbc!j5(B0 ޙci!l[`4AKWS F"`Nz)]]DdDGd%""zg)-T2 EҊר. &JQw(K$=!JR/}!D-s?lYS40͍V"k* Yچ-ȴmN !@i4PB HREIHDJg|R,Mwٲyk:ٶvFjjTVZJűS!G@fuV2]RT,|`6-0Z溎Pbfw elav.ue[DW~rh\.eln)9E+;+W|t>ߵk뺿N=ԝ;wvuu }?OޗTX,ݻoq~~oM^tGQQ_X(~Ϻ<\+\|ŬϾ{GݑxB XŒzS< Ĭ#? IϬ 5B!N"J҉;FIنH!A`'Q,N`O,rbGoq:b6 #!$ZK7(eAOR.665.@Eills!xmˊp~;F%6"`\f&V/h#bcBnGoeZ0;{^RQ L˰Sٲ-4Vݼ$CI$tXp1GlXP) voD,vNjٶ49m'膋_yBlٲEJ0^.: q h!{i-'XOUX)CPU}W*JZ*O,AR9{t,+F@@/,CLY13!)w %k3HnآI\T1DryЗte9v~ےbR0B.DYHc  1G좐1{C3 fEߦH" IH T**Ch5DAbDtP*ۙp6ΔFźI Cn ȳ0nCHVn-!+`ː5>̀OB"h=)("1zL!1`Y^~awˋe"zv)F$\_HAw(CZfrmH&~ %DI42*֫@=i+% ЈBax0twwDZ4ME斆Tb=YSFH'֦ZL )!+H(H ABX4@R( D$tLY*,iXi|4u܅jYP}b\&Z6+nlȈJKjB -cq͑ |_iiՊ՜T:eH Pd,!EX=<⇖L^ŷ"JEZb5|Uϙhp}_)0RǸSVb`L mO2i@*z``Q9Hmgw+ժz'Zk$E>7& JQIvoe`/MR( ]1y.(Js]" 8MeQlLm\ <$ʪ!MɄ4XAv<9!J%x޳0Id0Z<$h:aXȨ]d BB.1o!!+ExwPchl e5+ bIS Ըprk3XF#3 K!a "!6·8|ܧ T bnJ%0Bl* N@ݼܰAŰ:)8+b h q;d3Q.4PB3e=W9r=iX_5 ava~ΰҮ㦳*Tr֢`$!o}h,qdIpζXշF{F"rb )|Cf2JVv&ahsz\0H옺eD !!jZ(܀CZ^FD m^:pt]56>uT4Vb zO~;eo/?6o>S.wyRDvU#!jVa=B&̬0-$!݈H䠠C[ ' -Cx!M2> g[71y PܜF۠}(LV o_ 0d@W"B2ED3!ih% <[E2%|&a a@b W°|džڝMiƆpm?\F֘d!g1˕qkkv kYk*2"`b:Y$^8w[p(D"f"MjpOZXT뇕fĀ ^ ?%6yQh:~ {7'G~nSrT~~aSaVL&|A'(B>&NcdR{H) Yir^6|X 5S .9szW0b曻ݮEQh0Rjgg{X+lP_OT,%^$ F !H! R\< z"#" c-RȔ1)7x$PHrT f0׎ D! 4kɇ$4I;Av9rtڪtJK1|ffv4  H2Z=+$21&i&sO56$P$*J1S`m! dL)`\3еD"!Z#D"S!~bIdX,~|xuzN&iHhr@LRR8 ơrϠI7 :+X7"wO>ߗERw.?:MíV} 'QB`il~;N2WΝ{衇!<ϥwmvگ?|fX||ͧ>o}{{[YI(k@$?G|7ZQ_Oj&'*LR{=Ҳ Q8b]y>Ї)36Nw)A #Z>.# ٓu9ZE,55Dy+))LhHTɔ1 f,A dP~˱ "Jj\V91T7:Ъg0Wa]PD"AЩiƪrll}@D&W($r*x ܍pc#HJ2Vh2)#sj!:Q ٕJ`e!LEOE"#.T<#PQ$(2$O8[ƨ5c"YAZ@$bI$ӳ~uUD5A)I)IaLEkPFGE(DѮF&QqZ ћ> @`47o ĥ/rAi\\n֗-K7HBVlv"% H0N]0l\Zg[ݍ0 H3DsHJ*`P"z[,p7,d꠭QԗfWѺ!P$H2 J $"B6#ED^:Hv{N,uTek9 pk1_Eun:3F#IB .ݷd(!J[%Of\/f軾f~?~?d_tr⥼}AwC}n6}ssO87͆ !d2<_E/??!bfYH R[;_OʵNѕŊYx}[d/)k<+` Z܎ LU B$fF!ɮL?5R$ ܥ+Nt7^V#"P Cybܐ)AJzl#;ijHI-RQ&ua"HI$Z _|)!@"Ezacod!h@DMaV$}$W[ƗeF&O&"Aj],1;aUZ$r3O HՒq)e$Vy(b5T !DJ ԅդ1I*V49V(B@RJIQo1Qdbm~ڙʹp r3,l֟76ÝobB[:&h}P #< It[G[[i!;̷kJr/F ktѧ(N;YϲL)!!+̗i8ta̋( <%Z*+5NUe(tw/-u 0'+5>Ndz`Cq>OJj_D,qy #Š,\.w㷥MSG~G$Կ| O|ғiO;W}Wۼ(rfvw}l6nB^ʵ0]DapCh  Xa`  CzI54s`b:EӸ"*bDI @ o q|\eOH8 Va*Vfݲ@BJDR. N<^ x$@QLBÎHi`yFzOb] Z*H)"E4r~& $CZ2#H)YF@2ׅHR(4uM3<XDoa΀;j 2H iADi'D&esR RhV*HD'd!Ɖ JTH `i~pSQ> TM`֙])+JC| T9$:!@LPdB~ i1,;+!ISXi%W)M.D$KSX%vAAHj߄U! F*فJH{'IXH(D*F}rc@  PB(.5lJC6E@uͭh<H@$˗yԽ(~Uw$Jw Їf;KEi4)bV Y1i,d1rX`s+:̊A%$ԡF|Y䒕iɳf./pMsI:}l݅o9 `r ڄBHdd0t||w"f;Er3hvKh'L2`(& 1B 4M4M+ZPcvM* Dnx A.Zu J0pu8UGDfB$%Wz27"Ҁ[p-ÇN]`Ii$iXR#99꽘Q1q&@Bb6e%<֠$TJҸVED  @) C@&bP~1uE]u*4:1ϧ1֨`{VF@Y#ԙ4c0FJQ(~Gbb rTtGaP+>2 J֫D*%bP-) (!J-4%^n ;X=JAУ55gE"!D A%̬?AWZV6ݲH0IXׅdUQ)"$Hr妧l ?Vl^BT$RU -xqkvE0 uiz| )0+%{BBB8+-_rHɮ~h! 1 HDw XEc@Y`lJgdcPsk\:fE #! %U{9IӍFAl>" YY' `5,KK63H "LRADid̋&Nf~-gjʵB'bnɠa:V=ҟ*g_R8ː ('֢o2lSlЈ:4{yHN}F%S`^RD~  U^65%z-I[S@qDD(t"R0XՐDT EjT1IX˶,6M6~9zRc 4DƋ7"&!P] 6xr!]\ 2#mQBDDV"Zytu\Os٨gҷ`IP44IWЈ#(!be(ANxc%Ru^UP@ kA@F$&FDk4 ANU0aϡ@ چ`iNtTvH@ _d&#a u ޲5,ft'$YfZ H "ZV d,j~Wʱ!aB76@$N?(i VàV2~=rOgN5|uH80bcsl2;\QGd25ˈn2`$BKB Yd) "EO Y#.Kϟ>sCvAeN_T5lecy1M775C:sjk{ >l6_Tگ+*oSJZ%znxy<cJW|w|t-;;J5׉s:暘y +ҏ,8Lѝm ,#[0d$3.\&k,4F$X`[#`H;E ua 31YIEyk)L+FT@$@18!q jJ)f($ \ r sdb< 5XDrnMPM W z4Q1@1xG+FTբE/? Zg,K vHbst :p:&O! DL =CZЊ)&7J.X(`KH A"a 25Uظ,+i. @V{* Z/0't!xxFrtQՖtOBbDN*A:G(bVjkɄAIwO@#'آ w$mcL[h,#E*MĊc),ّ2ۼתe.-'bVfNElHDRvvv$].G V"k}K)Nd"MҬ3ɖb6R'{( {{f|nwwooO;8f"Yu!~C|2 66Yz˭9}<? :QJk>]_u睏5|;η%|dr=QMbӠ5-q®!hFfI7GK/ QWWDf\.4f*՚H5Xą'w2Xٺ"YWm}D~zR  а+AYhOW^뾱I5xMo=a\Bv SH_߅s.t6RG$tm"k&MlSd`VҀFڦzK/Z2jl" Wk0ȃ~i8qŬW ˏGzyfӦR;p4PvQA]m ZpTMj{#传kW6c빮X/l'V)8Z DU)g T}E`29bJhx-USi; @+;)|Ti[d J cZ܄o6~a8Uv`ϧ 1ˬ=%D0 ~DȊi8k /3ϲl0ɣ$gsbV.(Mqp,:dC!n ",ȋI2b1/ߊdq/z=^Ƴg'KK}^.G.U$D\$'Frh</r>_dcև)b@NNo:\,t2eDD4 P'a]>rEB6W&V47G {lu)Jt`t L1(~ȟI~☶ex&Oj?9C?J,I& jVh$-:`'/nz ̪ C$tt\"(+d@rR*FSU4.MpwAJypi?r/1J uZN>$RIɺnvx2%gÃS40vv"_.Q ={9jLU/RJ[l ms*hҬ].d6/c%% .]n'r|)b'n}"*b:e0˲|MTI}7={v_| _"~LuݩAO_]N!d/-;'?JDZMUjaqz퐀"@9PN/.\6&%hBʇstGRQ7c^KOJckbH8dp٧VCK%ɿxk\8ƣ"-$'﫪/ҖE9z2<2ǺDKhgSr5}9[ûR$moy\17?|6r>XMu,R]NדlNG TTQҺz-UkCřWiY6v ¥C(hom TZL:'T;P&˅YAmgs:Vv\oQr#,*3kj!N |ܟc<2 ]"^\?$3R S)DbƠвK7#I5g7)tzOx/XW2 !cBb2>sfG &N3ԓ1:dZց\Qljg3<*.c'3jU̐p{{wz:]pr|XW ZeDfL4#::Ou{ы^+mo{??z)Z./yɋ9/\.Y]OT..I$(Pxq3{u\ƖBL\T) #2\DeP_sޱN쪓:冃N:Y1(Vd9sƍ1t>qĥ;&m I(B!T x`#ثw3ib2P`n`I!JQ-3R*gqqBgG*{,ܕ8;z1#i:d%=KѲ'^ IѫSL HK/SxZ b2g-_Whmヽ3p k gP3dj474 (JcMHJq@~:VA$0X mffG."VfB$ UGZ 0/X J*]bD{ !,ɗdBS*3R @tI2EaxnRaVQ#XU5‚))wv;ީNsrp$e>:8Dl6:>!1@bf); {ϼNfJ)LvV^ ۪/кmBpk=.<:O{^xOΧ?}c=/˯̵;'*Bl #*[{7bMߖ= UYIk.8ԫز_HkZf4BQ1Lt ex$աi'摸1v!N^B.$KC !ǀC~˄d49dS*sT$Č33@$)gN&+O:?A˟c IŕDBwgf";ŭ^lD–-[{~&O;05Qͱ,!Pܲw%Lg|2XA-}]}zj3 F9Oؽiݱ6/R!}ٸQ= wH`pKǽzY)8%b Ym\J-\"Zyv݃Tz:0_!شgw" RS6)^>70Zѧn\'Z,.Lwe,$RJ'B$IRyQZ6?0k$M4=5Nөzòg LH*nB //`d2&Idn, UȨ5 LI07h/ee~h;ZL-$"߸mx%']?iQA&E(g>6͞wB7n/ttt?Sws)[ ?/Ӎ75>9>~k_C<>}g[o{{?H{6AgS42_.@ubADEa\,R{ы_L_Jyj73?OGyٳ7|3=G? ox>D-/| __M;葇 MJ_W='*˚R)VɆBȬ:]uʚ떈 BKgƭ1rrsXA}14T[  u5_xo`{]Mdx_A#g)mlGDIB!gsϻy}]_u{ݿp⭷zO?*_wv<<GĝSBw=z+<̙3x.ykCBdbԩ%*Y?/+M\///™3g`<onnh "4*^ٽªq=QV1Vۏ7v`~A2S! X5 p0<8se]s^)cpa4NUt?6P XW~+ 0yg ##h;d*rf,zY ;6 6M;Zooܿxٕ̓ac{"EqR ڰXՍGUFV]<^6Eth2jPAkc-sh F*۹ʮ͕d9-/.qM5EVo/4c-CE1&;vMޠ^V $,Qne_ΘT^`MT_備+jK%G(4d# D|9}N'ΦEUk\NPgild1똸zav3eKEy_ E^?r~Nz|p0OÁ!73qڑ7Ad\}-3_eh L{:vgnmgBX*۽aeH$1y5_߼o?'()F obV! f$'_0?萔J*yQ 77:}YSHiˤfz; 65.\p{nW;?veO{O9yΟ~}zQ쇎\[r՗:|K⅊K\iȎX;iЀwH"{.@'FxCI̮#PjLW,ZbZ1v|ϕVL6`f?bDi԰N{Lw1\E4khOa?g," [3􊩵4ͅ:DSÇ`]u=Fm1 *)gk 6!j.}LU(?%\G .dZuy l7|氷IVnWz](n?>@!WUr^ùsn;;;vۇ>ǟ'ԧ>5<)/{ٿPJ-拓x o{ғя}5y [(?/EQ0s|ի'3BJx3aw̛[}lTϟ_x]wu{'w}o~~ޟ7 ND|%EzrwVҐm" t]y ze2mj<}CvEAwN:PaDz6I&L/cM}-v;~;ݑSB*v;iŠ )2l)VT~m:OğtA (ZMu,`etj5T}ڤU\atnZ-Rŵr^U/5=ciGl틴d%T@bHvưZEUam7m7"jׇz[Mq߆NW.Օګ+' 'cg 27g${lU!5D;^yJat=x8 IDATs;8as/JI)ә͠p T bX_:EQy^4w8q \# uWGX9l<.Nm 6Ř њYt6Άz5{nC *ns VU=b K}a9Uwilvyi$ogX?0nX.G~Ozm{{?pByk_;~g s^?>ןN7|߾X,yQԟ''=o=w/pkYI0u^>yG''U?/kY׾Zw wvvO>www>O|o}[ONN^Wnmm] +UF/~韖EQy=QFA-&C]ZUzr(٫I"_ݲ*9$ViXg#ظ5| B\ 5ZZj+sUUCɨ^ ѓuH9X FÁ8xrG%E'V:ah5Pqv?Wߓ0!~ʴ-4Mj P _j/@nܟn[$Il X,myb.TM+FEz00i*y>΂ $HҢ.3 Yu:Rl"5ɲ/V}C0ۋp8LTK~ESs{}'u AO~S?o۫>fsssssv执xֳ/=/o<ϯ_ cqMUK+OSd,wt>SW"]+J_A4ڑКYJ9ԔM]EZ9vnG:_C(7)K|-|@WՕ_@"Á2࢐ZW6Ӛv^VsLu+5lO/bc׽e<@$I,u&7=y^G}{7~Ne[_.-/fۧ_#W|+dQVz2OɊepyyPpٓC[CL\ALP_y"fN1D'}HzRP'?=j< lZTqA rd&<`m &49t1L)%D>ן65YQ^ !-+َuM{Ӳ=Z?N]b3 bbI]>ձ!o*Kuq5gY.ҲQ}uy1ٸ)iզCeo]v65olhLrrtuN!]) b*pڿ;L\peÌÍt" teRw=p7SS-S}/9ݗNO{P|,zt\a pQJ9L77})%y׳ֱ KӇq?Fj{fvr$m&pMӔl=>OČZu7WEFqz]sk~IU|=QfnWH@2h|X(zd1c7 EFT{Ef #s- ëj/rG/'Dwx 1+ʥ|abF q(,A̾O-uC˗Bgc i7Iy(f Reʑ ֮Kn}:#+g呎HDD6bC*M(GEןm|h{^kH[~B) w w*n Zd P5sXJ<,9NW&f|z-aNeZO B"c}-O\:!"/7F^Ba(=a-VtG+|Y-9]V^g {N@#Eֽԡ߉BP6G2[!Ǭ0Ź#!͌(Y\V Vh=]kF73kR2NdݪRJ)D!-!hhrv2$"'"f f;6t4о":)bE"N\T6sk),o [M %#I%GTe'HZZ3'#S"ml\p>FMp(+{S&f[F''(D~ҁX;n<抮$m.x'P` H5ȨMW˛/O|g?zK၄>-!Zz2_ѫJB^,6)kqҦ5+]y@V*qՕ* 鸩WS Kd[YDҲ5R+JeزPJؼnjh&e0TMY,Tym#6Sk)+PV+p֊2WCptfk2c*2JMџk6i756A{{XTA%r.rY]wbRJtaͪX@GJrcu3Ъk()K[^A_I]"oq%r0 MMPRJC_o<E 3sb~V6^RR$AʎMJWH ?u-E$ne1< !I1R4XŲ BNGx$M!FܛʟbNd\׼FB(qNu%M&֩SuH:4,fhK%41Z@5)CDB =tsY[4{\L9jtBo3;9Eafd(4nm3DY&䕕ſ雿?M!h62R"bo|l650ipPͱ5_YKK5ge/&Sa*42Ct% \yhbJζ AU.D_r<`}+B ZgrņE*v4]R\npHPWkz RVjj0n' ($\hhPe75ّh|2m `|~(old̡ܴALVKj=6Je+_,wn8C@Yɗ˕B Q9vEqrx1siߡx 7n'F-W&i`6؄}vBN,d,+$e !tCu+ ?O$Zk)GU4W-Z N9m:^ފ zc ϛQheZX,制P`ncA-W42sPtt=t݌03ݢRAZ7a 5z[ 2ɛopm M+cM,[ zUdx_eCi@NX^c3 574Tk><~kln,+O-mp!GgU"! S#EH]_UۼݲƱ \u71EwӬzhϡ &_WhD_$b2  tXlS-_"p$`kgckE)nYxt^gȺI-J`D^$*:__6,ϕ5a XO.({#S< m[S7_5ǫGёP5N2(??i-.R: sم;5@SCH?KT賁AU8Zi:q}@JdG*E.U4ߥÿ8MSQS| WWxTȾ_SoCOvõ,ëry5=+nv˺T!V4|t+lrbىŮITz&y`U#Nė}");*_;hLU WdQ:}:20$LtYX,Md$ ^6:բg! KF]_8njdv)I!vDemM':Okl|O1_<7Ap13ލ7`17iً~[>`:h6RmG5ѫzWDW{@S{6T+dZ>rSŽzE$N4/`[\"AFFFsf[.x6e`,%|ׯϺ#B Umgu(9z4m78IܪV:Ak oK+:ܕ kɶ́>,-ިSjCu%-q޸27jj" &:37pu鍝@"ΨVj DkSc 8. h( tnwwLm7@ܭ纝,yUnv^D\.Ʉ ufx❌GW68IgHlz/h-fY!_udd@;v|meriHV56\yMZdj_] #x>3xo,bw\i@ӣnl/"s|<:T[>`n:fA6tn۟wr2pM%+r1t:$rY C?u;ltJBwX#b\]x;Ӏd-nG(5H>sxOF'nW(?CJ1s%rǭ7)<˘"+U]/*˲<[Μ>sl29:8"M q^?&"3f|ى j/P?/S#V$ED3M+02 cT܂ ͣ tB$`Uqx5"GDa'@XonWy)LzZTuWhWfa",X3Y=RA0bTP$!b a3#Gc,ea'RUa~BCEXjyEqe [&:lwcJAqcEQksIFe&#-Ck軿?wimI)dPr*fPX ueQ*NqBJs"D+%쨯}$QMѴ_hjڒ Txz߫|u̖nJb)m\hu^+VY{TO҆K%O=fFkìK`sS$ HXd*} 9HAPJ$xwzoUwqxpxt4" j*FX7 KE|2Hz"nvUQ;1ZKr*)N=D:RY#.=:ܻ$wz@0-yr$+RY#Lt)|fW_$y9U{ݷ> 0"q(BYC"`ش2pBmY I2«ld"$H& &. 3`0yֻ/WUʪʬӁ{2O;_v>~oyz߹tQY*{>+ܽ4t <#d2rh\-#ݻӨzBӓ㽝[]=7nx}7~3Uu/[u #I{vߝI(Ilz'aὊ. x<'BuWVV%3"AƇWZ֟;6H`d3kH11kt4A= ANl,"c& J‘ќ(JIgx]jL V(-r[d+j^-9О(F!h-A5q2Ɯ@"!f:_[ԕu=Κ̔H2S,`v*WجUj1 OfhҍW CϢ߅ss>y1E5jOk[1:443u|'_ԕp./F >|):kWbreuҖ\Da&Q)Q2,YeY(dQ ,U@PD?;Uaնq_Tye{:L+n$YQ͓#k?3{[GzqB$~w],P9ugɧǙ=HӤ[Z0InWދX8s0 w]ܾ|YPh'J*2ܽ/{? 7 BSB- 0+F=PHڇ+l U'%qAhޑԐB ʫlEs7 *=0쵮]KMqUf}A5ߥx5R+./4zĘI5$Â%vpv/MXeU ˹7:".On@+]贎9( nx8k,0s 0,Jan4DF}v߅a8_΀1j6U*r2ˊEQ_99> 4HfI x<NUA![]VB)DS/~z,"T"IS!"_E\zDǾ[#9Xbk㛾w$8ɏ~s?g>;OTCUb>Wɥ_Pҽ) ;@ <_inK :Zk|;o()MVm|'6hf8RٰML֌8P3&\}g>$!%X*$$RNvU#Zlz %5 eIaF4GN-m71Kz>c,ww$N`wos(B$/}Vv~G2HW\{ÓEM z{4} G_F͇)j)ԱI5/NѢL\EӥSZxnN P+G9VvR$C+^MIO"+@L'_g95ίzUW|/-T šOΨ2;ͲN׼fc.et.cz5Z{%*aZurZx)(u+u%ኈMjkfk*6FjHxՃd]3C4wx6wյ5Dϑt*06+FT ySrܰ'G'[ZELPg6 HRH!HEd:&x:QK IL'QMQn*֮Fc[73JA5vWVkt|09=i Q29M<caPSDA㝗?z~Ũ3?uo 'e MS#x="9=`ѧ/~d "ٿ͇.>c|wu Y)g;D2'_k}o3?H]rgPCTE>y&,HW߲<c/m(be`}7sheá#|z|`tU)Oxm tˆ>>jYI}J;fexOkj̥KV$Q=۩0WoW)jW8܍1T|rrbGMMb{Mȗ{ 0mn, kI!g Kdp97Ϛ/f[ [øsR@ IzE6Rdﲚ1hNy3kf:}KMni"G@2fvPAQc}SUkxE$i n}Ϡ3_9?T^B#+18$!r<NNLaF8 v8('9fk2OHӃ;luqnr\J5GHar{uct7YW@)4Y[ \OTq2RK@;{ۻo_IVX^2u(c `;'v %f{y=; Q@xDV>99 `ssð@%i2NbEQ5M7t$xS^*x4?MW`8kЏI: W%]8gnu%rxrtzQ5̎_ I;w~/H-4+hm.,']K)S gGy3Zmr'JܓӯrʕR6פ PA4MSDZNgJ{2^ea:0A@$z~:ol !I !ad+3wFͫO}(=J2^M *u ھ>W3 1W%F![ͦsR0[/\Hd.RņyRe=,Yc^\LRe7W)~~evBZ|߅<ijrWѨr@qc oa1/"Y|9(|A Y3^I,j~ΧX$"I)Pkڳl.u飪Zv^SHSƣ챰lV})p08s/Hʽ;W!|@@9ɨaF5o5uVztxrxz&xwCa[ReYJg+_l:AR:m/ltl@R9%l#y<>'מy6;SrTp΁" >@B)p+^ʕg~H0MٙS ;Y!Pjų;W^z8x8 ۀ]WW._-?gc|;v̳Q"a?kB@kl*V/'^@rI2$㍍G{{0)eˮ:t& \~( G(B@t=Bx/%}3q jA]QV5a&u[jlʷa $XSkDMWDkӽ cAr jڗS||uDl5Z:(!,ɔ\mS!^Y/;|33֌Vع ^}͛ۗ/K!BONOh9EOlDQ]oȏ>_x<?_~cO.դ À am}cum]ٵd2 /]oF̵ۃp0g3k_yع} __g?mW&9bԉ 9$J3`T2FdsGc#IHB-1@5%vlN.tcZH&bsJ[Ja af%y t'ԿLi <?MME?cLJ!4ҽT(C7!ϔi-UL3 "p>,24 "[/KmӃ*UgqzjR@8=W҈Y%IR[jB2F-lr qzešLXP=꺷pojRfB6&5>E+) 08g'J'bRVqѦiT!ɶm!dVNQb믾YpYٽ%ή4LLX6)r*ȚgW;xQj(A" cRDeT|$jk*!d4^[[bL 0$.ꘕÌ!qdL8+#)1Je$A* UaĉLnMq$D\ܔDhR)IJ %g,|ҫASd1Jfkeu] qw[D1 XJ fL*3+4yyA̴hLX)D ; XVʬ ~a:4ѷx1j}&[3TD{R8 o>iS_uzz ^/ #웞~?)IRtyjvttr|tգ @QH_}Z }~W嫭uorBFo籠GCp^>v̽$kG IdQ/]kBl{ 4/\+XJd'ړ_K{p~#٧n7/^"lt{V p"y*&]Z 2tO,T#]`jwKǂ3&wW50XiaA/#`PTk>CV P<0,$Nhܡ69B`ce?4tU%MKj?G2[Q-2U]g;_xDI)%J#յT/*vve>U7],h<<9]؄UCS&šiyh14a]ۈg> $!)1"QaPK=vg@pU/ٜEL'ӓ# Bd! AkX&:rKj_ܾIUE~.IZ7j~c ;eDR>CgPG{5J)??YNEçGG{;;S)ADAo_olb;?>{lziҏͿ$p5 Tx/~nK괻z;/_}cLI[h{rB츈Xx;7nhhDd{TN'ӄ^~=e/l_}ہXhRH |ehU)k/45teEz%ϻsiP'vl"V"w "Uz@-"il̅,˵TÙ;cn,# z,*s<:ԶK9]#cha~`e #b)Osݎ|Z5y{#g\rp7DInX)pRO_.p|QmQck "4POx<꯮JӣARmF8(cuYoʟrɘK$ih5AecIԸY>T~ ZT-jw(伏u.ƫ7gMY,`#bES͑GخF.rZ!1@ YcXN֒@Q!o#2rftSN.ttoN(3~Fk$'q>$Y]bjBcstؓoy[Zb͠_iz湧_@5_~qw"DFI@67+Tt2 k>j7qI!4=}ʵk'>s4L{Svnw|H& зR5 "IJH3dzl3W}C}Ko|cMui$JF)HTõل9>ĬIhOi**P.4~XOx)b8Rhek /O],0KyydzsJUK]J .6XFt"l&=%d}kX ^K)sǐc xX%dCC ۪Ekj(hT1jq΍, .y IRu֖* uKr{>hhЩD2A8ǹ+~/88MgN-phGkyHtXzo\WȅV#Rqrruq[Ш/CEMX !AVC2#dhemPB޽R76;> aravTike6Ǔiwu x6*p]KXMx62NK*%d,a믯W@_S:Kѣg='Jmvoqp2x i(&ȩ$өYvxmP52iT> C8~䛡FɽO%kj)Ka6/U !jB-3;V>.R/SpR8J$u!8="KTiD*K^=5ITqGD!h4ZLt `ߋX哀H([/8+6kI/*EASfp:hw;~1V.v` P qd9RSbL iB^r1NuB[۷t:+kՍ:硢U%˃ d@R~>$Q0 8ZYjꡞgJM6P/8Y43~ř~QlнR|lggx\.wԳȭw)9kr Hv4zsH6%/ _!+,~G) iu؝Ylx١yY""^8-=DdmUz 1~||2˰{s>y0xC [[E`&4yH_-`OAf{?B=pƗGD̢glVN7D*x"fsN=v |Y>ZDR *dnH$e_l\!`2MrTDM5KTSqꬽ!gvILC?ݗ{dD9䷎1;/-%"ߧ{`g]V)`O"qIO>˃07y[DI)kq(Z+`I L~]B1767hak3wɪ5ZSm*9HwIFH1Mӓ,Y} =REB `ݰjXVo8{`6&ý;n/jwJyi.S󰳚LF2MyQƹ;VDȬM5h5Ml2qL^*}fqDzUTthdivlaD/r&.O7MEAZSGpVS*XぜL1_q Piie'DȥD(HV1*ieH@Q?HAKR1ӲxEB< ! 9"V/$JRV𯕋PJ.vYTۄH"0E!T)yH$\(ᳩt0RKK_lj,}[$Q*`)f#d" CiuIfZb+K2A @D !R !FLS(~ҢH pA6 L'jb?#~?ʹ[Om_L'g?/>/_gpm\Fhp9+*rYj:+:=+AEBkV}I{CBEud]E*! jFMn_*! ?Km|I1% D|=*whTVA zA")\R1F݊V'PX׆zg<DžKW3ZL:@"YAAz;'=qY jҟ%!؂p깹-26UpX+Œt$/HZD"@IΙef- [P%)ou",NNJYbK|e= @s02VYj^U-mǃl6 V-KϬ9tڝN;zz\GGR3AN@tg3W,/.'I3RJ,v9IJ{.X1Rwon_Y_\ mqۻy8d2($ID"!fã!2ȐqDʉ$ "gI ='Bt{s.mn LEӃ2H\愘Re,6h"&<a~mg?lp|,yZG*i|B#X||h`b'p{e OZ?¥Ejp(ՈJɴn$p̘/*wPu JJJ K qHmuWPgTYRv?9iFǯ*ᆧH$)q5zUڱra'kTX*=e%[l(Vq=g*ėLY.gmpIM*Wmi H,> 4( 3@;524c@(BV؊ `xTvd4/Yy$57&6C EcIrsg48]AcF-DU!LdrrlBrVi !TsfŠ(d dcox2CƸDdnn\vupr//LB! /~9Igqd6a#_%䌁&PT#T z-1VM+Zu5ZVuulJ: E6SÐLm$CS_N7?;}șcЮI/T_N2(֯t"aWg89>> Lz1p_jV|Ootjث򡪜uUήjv(GR,t8a$ KVtًn>iI7weRQ]E}*Ń;IUj}b 7&9׆5=*Zl0N'pQ []uWwo4alϏT6sXN\ JwD]_ѝ=U2lvwa{ Cc " 5VENQhd  T<IXo7L4kfJ( Syxx.i*s|;}Ri7I$Ky綬!`ݜd[VB.r*'ET0c,ctɺTSe^)f`f&$Dy&FٶTol)19&[ҤB9>z}EIv4=JzEҰ'33;Z,\0c4ǠomE¹~Nc@2byJ|ge޾rt2~'q%crN5Z:zQuXkt 9v?Jջ\%vtDjw!y,Dr3nb (f"Vj94sK*noʖ!WBU?Cׂt!b3o?+Sg!1-":%H'2Kc5i&b0&Mid] *./%N/9ç_jqY'XA˱3-+yf?L'nA[Wz4 P_x3Vd(W}toR^ĺ鵘RL\X4E,S`l BJх'Zj Oid"p.-$TO_j,b<r$U-!3;SRM}JE3Frh$J́Uh~5D<;N0_ۿ}K]۽uKJ;'Qܫ 1Bd}"H$I$Ab7Uo%W9HEjQhjqfu7竽6c/ Ӏ B҉Bv{+( /D*NbEB9dV(Cp B ~@C`P*'@Er- S%^':`)M+/rfX[{q:d'\vR)N9!6c, @ &I9׈D2*]R{C@;ȼnS?1V=l5_ږ;L"Q)#Ȭ?[ 9l gg)+%_U:ϦPi2'Kί:{d$NGG.1LӔd6~݂gHLJ]( {$TْR@RE8tf %Ad,@ M%0?W[\ w2# ULX*dKIEk #٨f 8cRG.I`KL0TZ=.<zekeʽ+eZe]F Z<۞E B2l1CuU+ $ҋk/2;2-ZCԊ$L뮤[6vY.FD)%V2`K%x@䂏>&I4NƓ4:,)K ǧۘREJ, [K!)+GA ֈD47 ZR%L%gHdűIO68ypi+V4:˙A)7ϟSW^Q,")!,Mu)#k:N2ePX!%L#b!D"$P7'M̓.X bPR@,KǗ⠒j\ytBK㑠 ZniJ"b,aӘVԦ #H)gVSLY nP1XxIۀ0t;R^{jG$Iԗ 8rT Sd'%3)@ÊJV)UzrF,CD&D,tLS2YLi 7 Q"79{ce͌ĉͦn|? s#JRt7Ǣ0 `+B^.d}ò}"*YH 0"yʃ(cRPUQG6gf QɅO%фt?bIcdh76*Rm@@zQG)Y %qYE}T]Ggy{UWp 7(\EEemPYO\Lik<,-]8;|x`GƗ;@J'WZ:ԃ79%!vz],^wrst3:#$>9ZI!3QF}%>-iiI¥4`'B*Hˉd :>MJ@p}p@螷RYEAUgq}~a`}s|onJo!a,9{ZYu:;hAaQ)TW)NpI=]DǷ5k*wܠ攛[ta\˔>"q Z[dҡǙ iGTj:BkHX%X# Ɋ8:|Nݛ3uKY4NB +NsIXlVdF]J>'jT[(Mz @:\2UX ~Czv>FP^@Ɠ7(ڝEVEs- C*P [xRR5zETLI]( !8R&^4JYc% Q2dLi3UjTF$V涀UѱMgMgTk^2^õwߧ;8[+JU$ o Uj+MaODJknwu&CL%R}|UӴӇ[+RL}D9}kδYOc4sey)92."W ak~ۭ$7CB9ntS ޵[{=XHAI*71\Ū«M5[`r 3aEz_B5]j]= }qΘT,C枈h<fVEVʟVL:d_:NUU|_`ŒpAeJ$ ͗܄ĝ?1KXD)H-q0Ǝ_n[~o:>,"&IRAG>2N'(?!cpG* (f$qٽs'gĒ.W$,#Uah4$aES,o*#wK,e$0glJR8wB=Tv傃i_/\hsc-cOpyDvg솔xIBIȑ1$p}ZRJI!}0DDID rh ;2ESC7 ܏򤸝. [ BL,b:2WމBJ$ $H b<4J 45LVMըʈ0SJ;Sc&.ksi/U3ڦDo8#Y38<@cn%YIܘPGgɱ CQ]w r[9ɉ^ObYɱRMI`)2N\AnLm΃6{4>S*7&jl/QMkp$}pKtmfB.~OUNǁ$\#y'#p[mZφ)WI+ "2y9^˿2 Sb6XA)"`ECDʹi2@d^RHغ"1A |=W8."bfUAQu9ؖ&bLmSf DC$BTu픂<QJ5M#Sx(VN7^}]PX[w~/M󷜞Afv,BE-c'c6HPRb$9)tj0:N9DxxL,1uX Ҧr7em<_ $ILoWקW϶^֣Q]GgBρQ:רO W5Z>R~ahOnN'D$߼(vE|p7,MJ;(EYas6xvۛL^_2ƹ.F0Սq%Q[)d 5Z#%/^&A(-R" Ȏ =R#o\z0=(H8ֵ Boo]FeG>w7!69u+ ٙL4wZ9`CƅIf4*`Kv4୐+D/pd'9)̼2XWM׀ Re6{m,Ayhm1hR‡uԥ6G>-!73YͰ#RE:B'\BypmidԿU%RT))op{IU6Ih< gnu氻 F zkneubgWq-Yxroݫ7oFu4͏כ+%I_FHeqꔏB7/[7f[/G+zE3Nw\( $v>5c]Pۦo?^o杷յ~h1h]AvHu] "D:NW;@Gxmmy1IӴ\m&9}./N/q[ 1%ʦ #!'YQ}ZjS4}E#/b ^V$B,c0WAJlN%zf0C]|7IKՒWjI|ᔻw|f d1'MLRɨ1ͅQZ;}ڈ6Kģv"*Hiewu-2_z%rE hoM\gz[ׅ{:UAT5\_FeUJ&\&J:TYPe 6qE w OIȇO[4B.a XrM:`l}{]`r 1/,3mP(LՕȉ$6'!h\fݻzxw;#xem}}4UuJ}'y̆lˆĬp49gDfūj4qHh'Ih׆ h`%%5Lӝ6_n_.N~ϋt@yRU]dl~pty3׳F1Q0w=@CRޢ[>1]3E$LJB4{IO}f&2O>K"8`e@$ *ڴ. 8#p3 #[ {{~cֹZbCP/DUA23~2 zB9zNqƯxo$-2$tiBGe9WݏŊ# h'Jty6Aӟn.>ՕՕge,nzs39] ?E](Wv\,ggWgfmȱ>ȵSAD/_=Ã">΁-Mwݗ,įX8rz 5*\6|8lB3+2|:v9 %zwCtK-kS[/>:(%\T)DCjoLRB-iQbˁW#!}}Ŧb*'LZ~2 &| cuSRiPLcA0Gu|ϯ}e ^#\ʪdX )fie"T3̟bC IDATdw a*G&W8e/&h Y C#ݚli &Pdē 6/֯Q1D~dkg* m;89b"}w}GF`-F sP \գ;U`nj2Ϧ9f >+7I~r>9?ϭ!w*Y+WӳlE%iM7OowJx4{|r~qu/a?0&:bׯJH kث\W'8l=} re \``wmdi k^F/ Fnnnr$9 VJdCJ5bxYDs#ËcA(`sN&3^ \Ryr;0q=2zZ;V:$~ЁCEȲ[ ri>=ӟJ 3߃×>whGxl7_V=gچX/C D L¯U<ȓV:GUQ?udVՍ;$B"ayL; GM~ڍЧhG>jfHm8$9pݻ흋㣥~B3iR$_}>hTKzN.G *{/sI1'U# +o??z]Ì|wio֨WLu._*+ELd,u.P ^ ]C6B@=sS$d ?L>ij7-~zJ4p& €̴t #LMr J-ш^ Nz %;UX{U_ĤOeB`t ˔˚| |T>M"a+d=xChu/m5"`]`ڒýq8]JxģX][wI7,J=A90"=1,GZ:?keLS@ïiW/+%9px<>:2X8𸸛7jP 5 xC3]}Dl#.ə'S!Gw%ٮ]\, &nom$2_f&S%kHu <z][ZH-`0!2E< C 7c/Y>H&Râ\Cu@ HDAAƺu裏zE@pcZy'0x|U@ 8uX Ȳ,ZE 󀄄qqqH$IE@ 8Ǒ$!'..c||0@ GcZh& @piVBua@ 8u˅D,@ sYx<n@ 8$@ 8$ ^ GUUQ&_ yxÌ@  @ ^ 0@ @ ?!P M1:!j*QH `P@E_. i$lՀvrA-iT7@@9< i0f6AE]E@'h3]It*4#K|7MD @ <o/↨ H;YϘ1Cns ՂקTMvYEnn.@@@ /03I$ ^ \.rss$)blTUP9r$駟z+$`@4=ʑ#Gp\@R'2</hL?pcǍC4ђEQ>}z{),,Ty /qSjՊ.]yf$IBQyڶmKϞ=ټy3$%%aِef͚iӦ=@ Ǧ嗋̌j'MC^{{2s<Ѓ|0.w}7v;FsNo/_=njEuϛK||y6l;w$//vIݱl̝;ݻwrW,̛7ǪUx0aovcg=z4]vEEEw}⋼8!@PENvĐ!C0~׎d4b >233TUfQ^=ӱ4nܘ$@'֯_իypsΝu=- 7p?7ofСL֭[㉋Myhڵ pB4Mc۶mlݺ;VZKqq1NW^yÇc&..UU ˢ:#Ann.3fjb0X|9~˖W)*,K~F͆ӏdf !2짠}^wb ϟرc6IMM̯l3gi&6o1c,8Nl6 .\ȨQB@x(J0).`"]IJJ&?/?:DbBS\\1P'RAQ{YnVZn !>MSNy}ΫexSF o%\dQ\\ _τ Xz5iC ᡇbɒ%)S0x`L¾}سg&M\dff裏ҬY3>!@ |MӘxD;:)))Y+Fcv2sL|>/qq 2 J/?l6S\\/?kҶm 08N x=K`ّf .wy\L& "11jժ1sLrssu=2gߨQ#^~erssZԪU+I%999r}@ Z(#ijՊn:e~װaHXQFCsأQF7иq%I"--- 6;999bKHbb7  *D a#%xE4@ *ERW4Dӌ$I v!C25@ TMUx0gȻn\n7g@pF IĞTaϠ/I@ N29@ @ @ a@ /@x@ bi$^eQeN=#֭]AxnV| ۴a7zn&4Ucf5;t$Z\IF;F݊HYrV$mL3uUy#)Õ:w+Vе8cb*i0%V^W!5U^}4m"nZI+<PWKMK)(d2a4ع ,W\y۽:uOh4퐐ĪVҼy Uyv WV֫WhdnӮBWaπ_@jZSΘ/vI]zΕzӲjC#lv;JsiySTMbB&rn m2(/@zV%e:5kfΝ!^xgHv2 Ys6&+S3􉎱2dl6GmN6l >ׇT$Q\\ll6Jh4fRSSYf~_гgs@n|m6>liiK(:A0L(Hp,XQt,#p'`0T輊b04/Ujg>,[=HEeILL,.ͨ!zI0Ȳ(s`qQ ե(着R\\Llli ?q6u6\ի3xUFYr%ӟ~)jtb42g\."] ^n?3/R2eYfoo1 JF/=zk׮r;QT\8tx?;vng^ԯ_,)tȬ; ʭp#8& ն qAٳgׯd2+3|/2,^-ZDߘL&~ "VZɓ>}z"'"C^^|уe˖ѰaJMgw`X~MӰZС֭jIRT.)YFER扞һ|l )))Q3>Ǽ}\.W[f3>#<&W"vZ3<Ì3d2 @=̌ jFƊ˭[nn.ӟ~gL,Se5F2@rbFUs‡Q7MS#u|ȒđC,Z[vү@ z||Lf3J:ѣɦf4TUem:t#Fp@%9*Z"!!v;i=˻'UUX|{"99 ]>}/"%%e˖2nX$Ibܸq̜9Ea4x>}:$1qDOQQ!?#G套^^#66͛SV]\j_'+09uם]wENNYYYL4bcc{: zoߎUVz7oaILFf͚Ŗ-[uٳfΝjlgIJ0s ITeYeʔ)T^_ /_nf؈;ػw/"7nd f.рlݶSiѢ92?؏FQ| J̴(PPΝ;z=>`gefԩ6RRʕgIoٻw/ׯGLP{X6lh`ڴ'HKKcɬXM.p\ԫWӶm[ƍhB&NȊ+YxyQ:n;2,ﺥurix*d;ȑ# h5eԨx<dYMɡWX4k֌۷S{ѴiSF#kf޽QkUU y#HΟ?QFqŝiѢ9]+Wb94k֔-[w+\ߒg؛8^ZC0f`䓏INN&&}M{rw>nfPc0h߾=.W1ƍj*shذM6D<]wf̟A`_0`: e-o)| Lrɥl~ZMuە5./A?c-ʕ?2hРЃw,6gyɜ9sBKq=( NTJh/CS ~u={裏b'%%%8é*((tFDl6F2mݺu*2i#k֬]bΜYd1ݻwGU7Ӧ=wߍb&>>IdO?~;|< ,ׯko1aZhɓx4h,|*! IDAT4b!5`xlH}Ɓ=w'ӟ~tDRRCrZ/ʕI()6 /e˖ѻwlLO$=0nQTTD?+GiӞBQ&P9$ ݎb̋"2NGRR.+)((@$}[NH^_J[d)[mkȋz榛s|MVXeԪUs^X,HMMeQnݚ8//DOOO͛`׮?ԪU [ #VܺfϟO}UbA8d"`%cƌeݺut֭=5L@p^#5jҡC[oߌ]1x`UFEI~! cNvmÇ8tPԀ,oPEbb/,chѢ+W.=za.Yk:*I2k֬AQTModhF\\;v`?7 ֭[IOO#EESL%719|0+W'd9LLIIܹKڵС=cƌwXKgXX,:vHll,ӦMC5233Qoફzҽ{yl6vZ6@ @.]x+F='m۶e„lv{$yfݻ':u'gGӼysټw6mʛo!7WF_Dݳܣ['Tݻu>rѧ՘hgA L\A+~feZnWĒK/( >>E zVl2Ess>KN#u:2ܟ.СUW]|!_gx<̙3MJsh֬;wf[GUrQ0q4n܈>Sݻ7NEfRSSvm0|p֮] Hǽni\;xJs|7\ׯCo0uٓg{ D{lڴ={:5j`ʔG׽Ѡa#y'EEEQ1 zVM[Jʄ ʞ\j&N@JJ M4a֭L:ڵk3G㎑nӖ}jQFr&I26-*L3).*^=* Ul6͛Kn"#F c0ٸWt=Xx)euX6f5]3pT=t] - # EǏ硇h4ѤI6oC=bj{/ǯgyFŋF`>ѣx7"+B^jDfKdlt'tԑGHK\px<4hȞ={p8HDjj*?]^A=4iժU oc>3п~euX v?>?<5jѪU+xz5\GVV~!c֬Sn8˽VJX9s~6b(ode4^iZH!{#af͆  ExLL p,KjsJzFUEbbQߗ\ : sJ RS&&&&&4͑ x]qBKZJ-(LVnw ˒ļs5fŮS~f33kM7Ѷ}{ &eK`񒏨_?#4l*;Nguƍi`&PPPQ8W4(=6.7rzjE4|~, F#EE$$&FYebcc#>!}9dD a召^"SRkht`Ν,^U=U(ŸY3INJ ѻW/P'zfŊL~Qrs.Gsr,WF#6-ǢxP9RyvRuRXW//ɣ~?R^nDx8xK).t]'?//u.wT?nwsv1ۢst%r^ W>3 5Z Oc5 Vb RʱexxC'ϑl`9zo3%/﷥{kWυS}]5kW)Hjie-ZJrJ(8υ먚Z KWU2?"62\)yu*0gGuzJ=uesAץP siy +A :Rue7 Ctذ#r:Z; v\7>UУ)A T+_AVU 1M V[is2D=u-=WGJ YTY+UL^^.F ]d7FH -:8Wy?ْ$y#V5J<-$)D z$jpe^f[4oт˯jtazj#2k\zyWEqt`fbv;fEԬU4RR ueӼ֞m'dfdЪur"Vp%Aۚ5lղZ/89j[Mel;>F7O N ֮¢~ϕzӏyhCZ,K=ʚ5>]4k~!3}ۖI|2.h҄5kiZP)((믿[E`4~oUQD ?hd/^sZ\Ɍi&+0YYYkY>yXƒwInG>oZիѩx^4UEUU%@ @UU|g>|~?āhױ3}<^H%UL . ))ϋfC4 FIt i$]%]t^CptM8A_!8IzXaN!$1)W,sQ2ejаV|IYoaz֯_[faq'Of˖-5kT̬,{^[+y%yw}l:t-܌#^[u6&IYC߻\hd7ufXxʅR=`Z1mxl|p;UUU xtzxud4rC矃?IpCU  +@$ Á$"15 l߾[nʻC﫯r1vܝ8v{h'-Rt^$f=j̝; 4M믿[ |wx UӢzS6l`߾}4hÆѽ{wLfS& K|^![c4ڂ+>>$N:qq.ȲKq47ق}\ FMUp%$ࠉbk:kMT58jٮD`]0L/*iii&tU # 3~^|ӟbԨQÏ<;#`ԨQ/I'ӟbʬYo37m<=}::urC:DŽj~JX}>|3gëƘ1CB˪Yf̟7DK.AڽaΖ-[Xa2nϿm۶|GByGs y'/C;}.CLڶm/vӣǕ 67||vN\\dee˼yHJLdt]l"] Nc!f#sKc0^x%&MHAAo~];wruDQQ1CFz8x0<bGu1nܝλ7[nʐ!7`/?gNdrl!>c+nׇb/tUCU5-޽{3ݕ ч nѨQ#<m۶e˖`($''䴧 3#k2qrrr$}`4ݻwSTTD5rˀ1|x40˒(!(^C;ahǝ]4MCU:&? > $۶3ϲv׋nQÆԯWNILLDU5⇕+ٰq#}>yyyxѣG|}~,]_{c]Khn Gt)u]G>}_䮻wE'h#QĔGl6ذa+WgϫPU={FtFzzL/oUӘ;wڵgذa4iҔo7Ue޽4o4дi$Ӣys.`R[BBDG麎:GfMt槟VOCrJ2l۶#RV-X2^WƒQzд6J萐uӰ]WJ #9h]4 gOϝݮz4$Yfu6ӏ%Hm^{aO}ر3~<<(o͚PyNjD6>J{W\y7n?Yob`0XW,_ٳ&''g}6r~$ŕ$tne߃l86Z=~<:u+vUcK/ҭ[^PPEn:ؾ ݎ Yt]'11ܣG#|eyyyx^Vku]tt:#+4-8Em49uxTU'XY6=eު6|xEQ#j݆oiجVyYlܴ4-Z" ~VT{DzaY1̌3:je@pQ!G)i~)s̥Al6~f".;jIb%̝77^ٳgӠA:tAyUQ\T̃>?fxK?1 zT3g$KX-RSSu?Ju駟֭mi(jd3|IJQF IDATpnvڷo`M\~z뭌=.̃B3)eF>]I0òeլ;fǎ$&&reRz[f=Bky9v؁!b^xZnCͫdrЄTUe;Zj_EtܙǦN>}zc4IH &?] Fb.UUrMiݚÇ0$%'Ui|K%5MGԫ[BL&cǍV͚~>]iР> GU5'*mZfNlLLtA*{M?:i۶ GUUӦ=ɶm@iț:_znۆ<4jMשW.EEEUUvOs8n~3ΝdOӴSASq"/t|XE-8t0]cgM?M|>e)J~L \%r`Bn,xs&-fiKp+yEIȟE v,0M>.oxB!_| [A.[65Wuu|`S<=\zýt-^g7j~?.P6w(^zB :ze*n O[ Oh/_OW6|f'hY嵆a駟_PTTDHHz>%+0n8:{32 ôh$j3գB Klsm4Ml6;ufӋر;[vfW \͛3#Ə 7XƍyW4 Mؼy3=\*lsw0|MƍSO=UE`ƌ7kP !8߲{[n ,^['r q,9N]vU{!??m۶Ɛ!CXlӧOgʔ)mۖ?ρП1c< :5 6;3G}RZZʢE1bSN%--,e]믿Ollln׮z/R)gkOW^y%O>$> | O=<#h/|c==܃OB3𡍯`OEd+:vޘ9N/>!P.yrq$&&Vyi,ZococBBBoX`?8ٸ\.JKKٶm%%%\.RtޝK/mry+s]7niii~֯_СCtLZnIOOe˖1j(֮]Knx嗙={6ZgϞr]!)Qvqdn"?av} @avɠ:TyR#GK/`͛il6^/qqq̛o ab ò,LB||<999ijaÆѸqcƏXl YYYcj*ϟϼyzDFF:+u (,i۶-?nﰑadge6jΝpE8ʕ+ׯ9IIIt_wM, &Mr0Mݻsx6F_v86nHQQݛ^x#GV94hO<s|< <O>VZ1`V^ 1ch׮m۶ lQسgk֬r"B,#GNԱc jqܤ)͚6u?kэٳ';ag\omڴKnn.={nӶm[0tPڴiCLL o| 8[oŷ~E]DLL =z`̙̚5lXidddХKhѢYt)iӦѱcGgɒ%tM*ФпfϞG}Dnn.O?4;wweǎL>P B^^o&k׮pн{w ¾}HKK#//;2`l6Qߨ2 t8:Ys~N0tƶ-ܵ| hӶ=sW Ti=cYekiI1=[7"$q`ذa#ZZZv*תr8E^4]_ +V.';'HJLK.%%QwQ|]f 믿rwzGZHqm\z% c l6#"zb`XGav/?~/]BqxmFPrXbt R$5mNbRdqhy;+Y4N:өSYPhhUhU,s"m|xںnJ l'g` g`iaZuC.W Noh4JKKҥ ]ti$7iULaAn !8Kɾ}BC ;=ߐ( >iΪCڢ%^a)KyӲP}|m.ۼi-)-u>tMnBfyj*MY{8:v.PG&MeZ90Bqx<,^-͎RRiܤ9uʤ/s> $$$yۑ [* a؈Q~LS7 y*xWx7;8Q(RS[MHHU+ !Y\љeuܳ:5LàDž!k35N˲= 1Bq}o+i=NNHHhyk@4 !hBCCxl6l6 !ߗݎ!/7WBsIM6㽋ӯlz/!|u|Esf1Se2w{X@7B!_~7q, ǬOfRO)EDx$͚8rQc(!1An^9|^tɰ.'??ܼJ)X㏾Z[[oѣ'//z]Kėt#ONPR7?|  B Ҭ)^*Ο~ L˖-yaxزe N޽$##4С111}>WgϞ,_Ν;.Z*x((( t#!|u>Ev~VXKDx W\y~-$+={vC*3]wݛ9sm6'/\?~<_ΙCq 䊻"Xh^@B\½42I\%:$!9Ν|^?-K 8x0 T 4Aar{vou^;OO/vp'Hhq^YǺ6KnB*<^/7%$$w6`vHgm4jækzRJptt4SLK._~DEEiÇgL2!M'Rk7t㖁nB.? {޴k۶.D4\b-Vymya0eLRe.۷W;9j8*InB>kWx ⊎t먕e]+Qq<;w#v9B!_]HHhXQk:"!!իVȁB  %pE yy2ЍB9"$$ .! AXXX@7v;v t#ܻ͎!7'GB xQߕ t 4nB^4|0)-u}VF!$P)J쳳/&(80ڷ ^!:&qOlp Z/<;w >ltF!̏&11#_8U}JQT EgBH_]J,rr, GDD$_yeU(VC<_%322ػw/P6{rr2M4 tmKMx׸ ҚPQCQ t#PZf˖xKeCFqa~deeݔB7ѭkO]6 ~Ӕ:]wœO>ŋi߾=1׿4i~!G>==z7|f͚#ŋ:u*6/<̙3֭[ШQ#{9/^L-x!}~v+nstԕ~h^v>I|׮]$''vYv-CiӦ11O>B?G+((NuB!S>oim޽R ! OBB!/B x!BH !B^!8J6R:]^J)<oah-BY KY.c !GuHvIDATJfaBW*TS,EM:g&t,|bFȭhB!QX K~)ղʾ|,Îqj0 t]'.6!0ًŲ, 1ݗ9wg(yB!Dmٝtz^eY,ne[:PF4nJJELTWTCh׮5b̙l޼5kpҵkW233k[ng۶mI.]xljIa{B!ęTV+]k}pӇ\XW4QT~oGK.fթʷ,kX!'B4 *8^^>u~eYx^233ILhLEN9tqdd_ %KOW fM(,,dܸqiӆGyMӪtdSjc=ܹs[w}yfF1cٓnj34+W2p@vW_}xn̘1 0Cƈ#=z4pBqblۼݻu7bwԽ?/uHi,0kEOrrra:f͢W^ٓ{0, Wm? >׳{nf͚UmYf}v͛3f =eqA ..ロSxb B||??t]B2M.y!999Z Snħu>%,Rw)XEbb"M4A)%??вjeqUWUka̟?… ٷo[nRy8%K{xh޼9>R-[3}t.B&M@QQQֆ}i&^|E,bݺunRoߞjvEjj*x'1MJ+ĩjVj4,!D:]^MԹ+zOG+ ͛iڴ)999e+ Ʋ,lBhhh}ށ5a吵DFFV6kbb"W\q| nX>^ꫯfƌL4~ڥ_?saaaر#q@4O%%.\y5eB*nSLLD~ t R IN|~qٳg/㯻R eYv ào~|OP) 66_}Ç+{eذa~ZhA׮]TW_}5wm۶e˖- _?LHHM4瞣s8NHHH@ufϞM߾}iڴ)7ޠM6^M Ŵ,:D}Xnj׆۶mKtt4㏳h"GLLL`uV|>\r _|q t¦Mx뭷˟ٳ} >^z%.]Jvv6l*Yy__n(?(nV!8{YIj\/,o6[g-iw^AAZWKKKS׎\.dgѣWݏibjE+= ,85zw8íYIl]46n@ll,111ҥKd ,-hw80 C 5rJR9Ubr2_tqneg~T ^4'8NVڄfmx~ܹ7t4qr`̘1 <@C~#GK;!8Ô*N4 ɠAp!Gk޲,~L{=p /-[6fbРA\ أ0f\%%5vd,Y,!8K a@-ZWk[dAאGzyg䍦͚:qq\>rK|OaAaZ H-WB'^5?ݻjusuĤWpF*ބظ8j8bw:iZy=!89R5mַBE)[g+;.>\ʯLbRɫ-r'l;íR !v^ΏWгW㞳nQqlONK@!8SA_Ӡ]f,uR' ҋ^!Y!GV]u4M t>-B!L藔o>l6Iz\^!YI[}}|TvϔRrӴiSVZ#'B!Jbʏ桔nk8>TL}7?0rH.R͛CX;#_6oBfߢiAAADGG3yd^opDvvvru .R6mڵk5k1W^y%V |(T+W,}/ℋM^/~z-[|+?*u]G)'++x @Ӵk*ßWJ1y*ˏD_s'$$u 6~۷iQW\=%m6 m+$fٶm;g^cу;{￟.\'|Btt4waaav͛_|`ԩ,_YfARR?8111!%%9s`f` ˲<쳴iӦ|o$(Idd$n#@]yY֭[ԩSbu8kS`nRHmihΞ={$2"",4z9B!DK@ pE]wų> (|>>ibFҷ, L$((Jh&==ϏR> ^׋ JYz;+eU@obF~;= e#x暫kM7ĻK~2d0#G^aG\iÛѕRZymBѰ#^=HLL֋pФI%%%B۶툌WXa\tDn~Ѽ{hƤI8q"'a0i$f̘UW]Eqq1{ҫ*{L$%%~XƗ_aҤ[ׯ>,vukǍC4vMB!m؛I=4Wvl6æuӉ|HHH٤/&<<8~iqqq8v'̩WT便m`YeǪm6}SXXP(u+Vl{ꏤ?E^y3?:U4WTRe !8 jӴﯱ ÕV)@,(kbOHHc&OՓɂa)+Zk n4ٳ'=zUlr]]!qǻqO$rrr꫹S> VNvG=8 RuFBqIPm)c`YiMWUd3=BqBd16̩KUVYg^!8a9fdzeYkߑٿq ϋV x!g JK]'>1ܣt.W JjjZ:5]?iA?B$44;v:tOxx8m۵#9 MZ'}:5 VޢBq2iFb$4:Oڰ(4@vI xAWO)~EZ8*v!R+UkD/`>BjGisB! x!B^!B!B!B!@BXJ)4slT xi Â;sXtςB_nY&{3$111jݚINAnά"~ٞg6Lvɤąd?C !8trr@N`Z7m`ʕgPPa"VF"*"] ߉TB ~͌v&Eac)ڭY4OhQtN!KpHHyp9W웮넄k=poؓT͒b)pykZ>|WD WH/B!BH*B G^!Ω;:t<|>Nf͚t:OvAFF>eǤI디nE|||=B^y衇HMM%,,ƍ3i$bccOzl6rssС~;4={Ca&pE1rH è%B4?t?xgС#PjnRykfV+U*fߏU, Mӈ8m>M2`n皦q8Վn4M, W;>{#hӺuk>3mJqq16lLZHeYl޼;wMFF}?͛ǖ-[1΄ xKRRoV͆a`1Wy\ >W_}ob„ ݻ41b8+VGE4zͷ.xb;?fΜ/Yv c޾ߎY&z! 0Me&)))!R:M0 ?_YGӝmCbbch$𓞞NVURiO?1j(JKK瞿bVn]m4 >>p륰0p8yߏPKvrÐ68lGg3? ^!M+Y "=###؞*7M%D_Q*nӨQjPR>_lcWj˞=iBh+АB >΍|mBQ/îrNӴc&eZITB6\.9ϖk(5 "B9XHHjo5K}>%/gE˖[ zf}z(ؓë-).ʌ2~H'C w $$,V6NǎY/|'gf*4DvJXDG c)Hg\? ׀بP.ֆlLx x!8N)D=vA}͹qz`v:N-QB`UxH !D=oyi\ϩ/:4,NP9u$J !wrNvE&B! x!B^!B!B![/sh!isL#B4`A 4Mrxϩ)BJ4\.0W7(IENDB`qstopmotion-2.3.2-Source/manual/screenshots/pref_general_settings.png000644 000000 000000 00000127344 12536560630 026243 0ustar00rootroot000000 000000 PNG  IHDRCOsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxTE&lzB w#E~* ( *(J, إPz ˖5B8C;s]6'sgׯ7 B!Dc0jԨC!B"۰aCV"+:!B!`B!j1*E!B"S !B8@Y!Dy1 T*eE"!"C &"*o732p]fyrhp'y}s?_y+kє{jf{-iV4[gkꌍ×ȕAZ[i߲ycBNzdB3oɗDDEӠNmlEFff隵XYZaev_i( ns Hs@ )IGjרΝDN+,7kbMONẖt!#AY!D!"*|tԴ4͙KM C)Y?:iX?oqoL-}ѶESZm _^14m+=B`Oοxw'nN'ju #~NgCn+rm@!DTEQ;/lɝ$׮W1c/k7Xn#ڷV5/Tʬq/͚CbR2I<9a vh.GOe܎ݍgO}v=w\#M&X7nȹWu.4:Mp\1wbҧ'k~i/]Sˁ0Wڷ=;wuzRRSH`P06\ ?ay;}uIbr 6ᅑCјҬ9IL_`҅p)[a:v, <2 G;[ztl}{[_Rr +y̝>B!ģJ5lذ֭R)7a!|wҵ}"cSxҦ/#8 v8Ԫ才v䏍%ϏxĂ/Ύ]:CiKL\<Ϟ;-}SSSv;HuSO"F)}N9;ѦySBosIzw鈙%$%sAnlgQ1tЖ>];qf.\g כZիR(yWxyӪicv8DJjw[6F_" -V7BBmW |  k+\}]۷nRJ !YZ (cg0kKx:}\hĜ)~]e-CvnX[Yn߭`9;Ѡ7s?[Ƒ[6thՂM1gb=O維ӓz=bkߘSO{Q/{lv|u@MQ*6B+7g'|zcokKF>4WLqжq`{8s9>ǘ'y :g˫]ccpsvBP ϻFu ҾE3^9L~!JL !Jqz222r!cokBȭpN_DTL,.w \xL222ݞ#NGFF2555UIzzq_y#;1TQħ>`M\[V @\a}c2s8[A9===W׺iV.?1~۱ٓ'а7BQ\D:n#tZ4m+WϾřjy9; Qlc+itiך=7ѢIC< Z;W']d mm9?m|̈́ z쉹yE"LMM133CPοYgf{VQՀ$lCLLLPƱT\ts7̬W^cƄUբT*$33\ejkVEVVͷY㲟J ljʄ;wE[YYa0HNN._Xr^ 222/T*׷=BӖ-[dt Z1Q2Q*HJJlff}cQz}S?233I;T6NGBBB//g_\(T.;i573%99zt|q/]]~BҒBrQW襩Q*W}O!rR_Э[7,,,*:!DR011%33lRY-ٶm[VFy{8eCբ$k4Ba$o !Ty~gB$B!UCB!|$B!U$B!JDV!BTI !B*IY!BQ%I"+B!$IdB!D$B!$B!U$B!J2)n??CB>}*:!QD`ԨQe؊A!xd!BQ%I"+B!$IdB!D$B!$B!U$B!J*[IHL Zw{ubcmJՕ1eDK[rJ #ǎbei3t'B!*N'pvry( BBC@f-MV 8 ǟȇ8WfϾ}5k&x.!BQ$@PPͫ׮XO5//e|`o+h4&''cjfiWiڤ >^2%9O6^OTTZ-II4P*etB!Me&Eݟ   "2~aݷ}+++f7.T*ק7oΜFṱ/qEZ?;o'L=9pXZZ2t h/GjŧDooB`?nܜC3ckžB!U]$e͛ܽN͐~q=B!11`ƽ4ƽ: O6_Grr ͘g̝6{N7^@0Vd`  ҩzi^GղdBDtL:=ߺ\7jO HTT4W B!xX["o;rßvڅ?q4'N$^}0h=~7;yQT4W2qxjլ%:> T$ֵKg:wڹ3˾dx2k׬QCx.RJ BۤѺUKڴnUD!aRnl.ڥ{2_UCxg;:8Txz׃F]K>g<3xf҄ t1s !B<*ЂrvvMQz*!!sWQnצ ڴ! 0>Y7dTXB!r`0jIlwwf5#G|&Gȱ+L͛-cDDFrqt:]u_t?lj@ ԫ[i3"!B<<#4,/j#SNF1O8u[[[1mTh4 K>]ꔩxyzEԬQ|2$$`iiۯϺgWT]G$99_6&CBE~zC>}\ϏQF廿,V*tSR+T_LNIIIddf`o_z=qqqdfjqqqyd+RDV!(??)pŮAVV+e]RѱP?*B |._!117WޝG>I@` ͠O3# oܾSԩ]Sg쨧ѭKgzG~5?B%Ld,Zqnl+>gΜYcOУ[W}xz"pZI. 00 b&9wauнkukܸ(J4ֺȊ0Ʌ[VV(n:;У[W| ףsǎ\zѨaCƿ͠yơ?~\c_~};i԰!N\x `jbBkx'p!s4~?F<VKNqvv&>>R)cdB_U$Z?ʴĤ$$ Hro|˭h4E‚ѽkosZݷߦ77HIMcmmmxcn֮_۶]FWK!ģJzd(#e#[wPƺT{6n̴ɓ߷hE=w~u'%'=V_!ģ\D $ZVlV?3nP(mҸ.jV !(3e"+=Ak6%Ϝ?xyzVںBL~lm><7cc4`΅|O$aqe'ZsZףQU{dfft܉;UBe H@@"y/uv_BKSI^YJƳ sX2:1|w(o$y|eWzdo[[22~ !Ɩp9IdZوL]Oq_;^K<$g%\/TJRYͬ>Ŗd >nϝ4ng`e*VL;Z ^IY7S8}&Լ݅`̚&}օʢ2Ȧ`@z,!"G}%*qw!le"{wGP/ ƾ+ KE7PŜf,qBSH9MDB&6`0pf/RI[f]6mk[aMfsҐbXjMX8:St+{jjnZdۊ|lI$^o\|W k빚Sьt2unDSͼȳ6T6G6{*O! R&#cƛ jfOtkMzQ,mraLʼ!(Ⱥ 쯳EJdS3.*8/'0OVՈ4zNt쿚_;z4o_Y+и :ԱK=k í8T:OcO p%<>!)$^Z7 eV_w ` WOZX=N?$V)2B|8 !xwEe=X~O>E.ǺȖR嵲Wq(0Sr'EGI^▷0AdmdC[v&$Ҷ4odk]˒·7HD[ &Cl}Ƒޤ~àBGWioS:J- m{[>. 74?{z:*5$YVo0IoȿUMUdB]a0z*CȖGV5,1WI]W5ٳ<J5F -BQZLLd%lhZ8džc/ 0T=wp爎ڿtԩT牊g7֕_cԩ];rzk6>Nn]KB{:=DVzd+'b|""1#"kZ{.jެ)ε~z]^*1)~\ k̷V¥KthNA!D(^_C J1Shl2JVgq<+⿡9pw[ιNNtDFE@JJ )65ё[c=r^o \DbRR畇vmZgKqI u  dŲ%XYZ̘tr IDAT"&Oc={^~q=#"Pۇ/%5-!#FFTt4ZNHBGձch۶-[IDd668upvvavk49Hm*"w!u)[wuql\o<.33fم%˗˯hۺw>#,-,عo`077_=o>gՋXݸ+ռ:i",+jݺtFR= &{}ijo+==ƾ{Ɩ{lEDVBcfӸDu!븶mZӪE[滵HJJ"u\ `OW }`0W>;~BAdd$ii4i&s׸Q#7jx7V{18;;eBG^b333zmܹ`ښ>a6o<^ Gݍ.:\Usss C*44 86sfW;֭gԨ^>CVr_^W)Bٽ+ի/;wn'!1KK+zF32|NK"+CFվ\ cN&w9::H-۟_"s3__}KPp0_ >aʯeE!DVcw~8:baa^yde,nݾ́Csm_?CV=M4Ņ_W_řKw055 fr5xת 5kJ@J*׹=A/+ !DywZgc *_oI"+C&[9=wԯћcj,Jç2w( ,-ܱس?{XGRrk_KRR ^~k++Ҍu# !Dy+_2w`cba*4ȵgݝ>JՕ1eDO ӏнk >AFP(MßřU_}o4O>MT:y$|IOO/󺓓QT8uE򋥸`0z$$jqrt=!YN8AVJ\^Vs9Z6kYQ#5^gyl;*46[1d@223EBb"Λ[XjլQV|A|<<+ ׫ > BC\cdH7nRptp0^\(KOBT푕1PFϗ+fʤfwj^^ޞ+V27h4Ůڊq/o{amj$&%aogg|7x}5wDvݘҳ{\HHL(MiiiT>t:]1=sIIxxsulA=S} !z#[T:>2׫˸DzvΜ=qaa~eMn=xg} ƔAF0쩧1jEcH-u`O;p0:tzai^J8oӢ]_h2c౾xh46SyR$yBD-JP(HIM)ѐȲH%jd+l2wk_v;r5!Rolck?D ggg~۴իYެ۰֮#**^=z͛Y~Z>9n* <$7puqnzc=r[X\ .M^wo*㟽{YN*o.S'ObaѮs? ̞)-5-uiצ ڴ! 0>Y7dTh&OvZӪE T*^wm݆DE7oݫcvڲrjj֨kޘ kFxZ/OOZlo"kjjJ޽i 7D۶3wP ЧWO6+[_6欙̛!Ԕ9֦ĤD>_; XZZq~TdffVBQJ"==*JDUXr!&&pߊNȨ(1;'ljj*QQ;Ol~mőŹz"+^B!ģZ٫j5j(cB6XYZKPfh4͖_JeB!IUqz_~BAZ5+:!BF*.m~/ޘ9M%BQЂ*-bcm]ѡ!B^/-[4g$?7^g䰡L XP(iPKiZx&4,(J͛3gh<^7-sRSi٢o1 g''XW<|7jĔI]x'cDBxmZ?oW9BB!E%YfqL2 /Y%'MfW+Xh![bİarVZMڥ3Sg€5_Ҋ?lt:&Mׯ#99fdw3q2UFڼ9s:qq|v6V}ZiӉf҄ XYYMye~޸x`ƽ4sssmpf:NeJ!B#vh ptpAz6i @f͹xnj )) RU5.]b4j@MY~'O&MƎ~tT* cJd+@]ѭ幱/q)5Ξ?şӾ][7> àع;wС]",BQD6'F񹅅&;wDDFbiaV#8&n.y;ϵbWz}yk׮eoee !a%I!"H"[Wyw:y#̌v⒕^B+ o6Rzt#"AAލ=99Hz=#:aB!$ޞxE.ǨQ1)&&# ILTsg0غ} RRREf<̨RZ8'RDB<ӥ=v\~gæ  T*UE&tX΅0WY?xCDJc?d(G[6քu^=X+׎> KKK(Vey RbBT}#[JWm#TtXZz /\^ݺ>}q VKح[:`0<#q<|M} ʊ:޵177/q,+X w4u: zjф\v566eRW~O޶TulaB"l)yY<,Vh,..:zBc%ȟ[63cqvAcRy\Bbb"n.<ֽ;O|@&MA]vx׮sO?M-7q׮?^:<>U~ljSILLݝ]:С<8}_6>׽C z&2*; ,h>͛6 5Oz /OOzB$eXQ] n:{ ._~=j5.^cnnNF 8t(uz=?6Z|7 7W"hmmM055Eב$4,fűqfRRRʄ0\gLyk^s{zz:SgAHh(> `kcÿ'Nڌ|sc{VԪUK/%4nS/B_59EjCAsvr2[fM|4 f0o5,m }Qz2&~}%B$BTCƇ*J68BBqsue9u1hP}m~~|dy&2* {bg-;|ߢc]iM2>߱k7!th׎ƌF2elٶq/E]l ;vDVmne_`eiI<  Ky  mΒ/nO<9,ky> /wpĤ\uڢ/P@Hh(۷oje\uwoQ,?>lش4+KKۏ XE!#Doo]'6.θ۽RҘc?q>ƤaYB.KI'13ANl\٢ahҸq^X}~w/j$*:]`kk[z.Id$x{7޳>)SV-kLoR7ǎG {x wP*&+IOO3c nUTKwڅn]Tu Q$,Jz&Sˋ!ԯϴ& /nʤyϲ{O_ȜhѼ}}}Um8!!!xzӴI"_!IfŲ<\ J%۶A1d@Z6o|[nF1UZ͐Μ;O||`ѭ Plml FP)tl_W|<}ٱk7komۉZܹ3-7o3gD 'v۾ ?ODEGseZ4kJZ5CQ/ ?݈#huZr(M zy3d@T*%׮@^Cgdп%(9YV2TK&''}lIH@"jXru{%%'},  xcR^JMM㉑Oa0ظ{Y!B^-*/= qYYZJ[*͸^}j5{Y3qpp?/+Yō`>q[Rr2+WOdmll֥3jԨPӉS ͍͚Vt8B*Nd:;e뉈2}pZDl\z39%BFL0+`>9^Ą' eP(2o<|BO\ORǻ6ay IDATa~o./\DTүOoޜ9M> oQbr0OtL ]K_dT wϞ8tT,--?]t~|7ݺ9C fƔxnK\xo?;R쫯8x0))4nԈ)&Rǻv-tN+=Q?ǒCo1p@ k"(?vvvɸX!Dyl]x&NFzF˗,ʒ&,Y֭Z1b0\9t+Wetҙ3faW`eiş[pet:NÃבk3f8a|c fKcјkpvv7 }`  ҩ~o.5'$**+̝6{Noᳰ`ܫf҄ XYYMye~޸>zyM\ɭpcLN$$&1`@3yBc;j;I ]ZJ)(e*{+w *K@P+^("C%J4mGK.#>yH{眜BQ{ܷӴqn"9[EpYS :R*Yr/]^z>{WYaتeK>GITt4/{.JEhH{T"ۯoo6ۉl.\;OBTP(HLJDѶM$ڶa`  kZ0NĩS,[Ѳ Ėo2ސwƗtz_D!==Eo22L?qb,mLJCB!j6Fv ~Kt:*aKtlκ+hL<y?1 !fPlڴاOwؾ};C!LF4nn%0##1i4f >>999di8;ߕ{'47ný\KESҪ;ri%Vk\=p"49ju5G(BeERnnnenW.beeg666T[|Q*n1VI) ql.Nnh\<q+mҡu<56!<$fz:=w/6͐GERUwhBkN}gllmQ ~z=:729||#:U !Ǒk/bW'`쫯TwXBqC#tMllqppM8{>ϢgyG=̞;?3^ЀA|%ЫWݡqa0W!jY'?OPWBmQqWpx^Q*̸AT(+f݆DoUw(e|&?ѯN9 FCٜs@X0gI$"Ċ&S {{TxX6 i8cUmrrr.>VZg)&6*+++V/(H< aiop…"q듥5H-Z8y4++++#^"%5cvq0Ffaa oη}6;ϚI@}*ͪu51q86ibKw6[cJ~֬MkW׳jZ>Bvv6M (]h!VѹSsSSXt)C͌Sx}Ι3.>.pp9#DM!uZmZFRMdFcJLoÕ;Ӄ/aetlߎ+W1 yt0!55K3y X2Z-Sg/*F=-lf+II>v4n.\۽w;9s% ≉ϯ0AѻgbN?y`0x}LAvѸѲݝCG~&Z$1PpדeL'/7g`SYv=gLx ƍ2~֬؜3W^g9X,]gvuKjӜ\4TPT1_q)ЁۓVETP(.'V-[?ѣ[WrrrPTq"uޝ~}У[WWWhI2WJ\ۭZՕݿ`o{hWD~CHp0~~;;;B7&qcTVbqqv晡OѥӃ5CjWMu$$88;DXPiѼ y[:ooƸܼy7[_&y))'O̹s*=u}L<|Vg򷇱Tܹ\3gq_;6 kNj›7+qΙٳ\b#m9Ԧ9#DM!+BQNdff6 @ffN%?խl V F#̝.׭gq0ЮisE{BSU\J]snF4ݿΓ=Fl|<{UjXz ))Ƙ_0b,P*+++MVB_߾,_7o5jH`~3phLqSs\,\qqxzzX\jҜ:I"+Dťsh3TY 8)zc 2"+Wx'̘׬FS+ _m Kٽ;[~W_o!%%.;}ϖoGn]+ǥ˗yyy<2?<ȣyz=׻GwV^~d o{GĘݭjINIkSٹs ~Kl\N^Ҝ3W E_^Y5mQ!|s5 Yȼ՘+6.uE2.\~+WQ[YԨ!F+-cq1:HHL;ٹk7YY˒׀5ouVЬiS5oD֭+rvNߺ?l k9w/ޞ;YT_z۰#?@pBh2v0yxd@?Sc[$NqB7.|xyz%9zy3QҜ3CV-dɧDEGsi?RԄ9#DM!+BQF @qtOzN^ۛV-ZXƽrKbggkmBA=Xn= W^ ݺtoһg ImZwnxWq$i7F#>>̙1ݔ[R߀t9(Jޛ9kְ|*rrr kʒquu%9%l*3wիG]?c篬_򶶶̞13ix{3gt8\ˬښ93L<faaf/4&!j ŦM}x۷3tлR1 zq ٲȗh!O>d_ҭKw}~^&׮)q{eד{sգ(ŽV!RFz*ٺlrsuX[bgkw%`0p3=FS/\Z> nζoKqKP>t:rs_^WU*3wuq.z`s}"//r[R'PIʫmu{EVPkj_@PӶs/̬,\Wɉ'TvmAE ovW,g+VrZ̪DGQ'7T*J%." 2̍OyOeƨ2sGPxnT$ټuSsFN'_VEٟwZWԫȱ?͛h"W{)++ 5U ӻW*עr75h$77B!TOdhޜ;v0Q( wkԫHOa8~PI,qqL1SϠT*yC=qv@dɧw~YZ7kƸ1 jTz /`ޭ+zFv׮&;[ /$u{@MdLi%x_Aybcm)xzzP?[6נA?!BVY?{|ȩghޜSgΐDo c¤QYz%nli;>[ deiymDV]WFb0; SR+8::Wylr%O[[5vttdώybc9vҘo888El\Ax{ܸqoƱv lmlʌkQQҋakkˆ/ >!w!BHd{ɇ _ Vgށ3tP񓧸t JsTCMۏh^:]SPBCBسw/_?s)-ZHhق b7[yu%sdo+ O1rX1u [. (_cٕϐ§ۇA_HOO/qB!j"u_>/c˯ҷwb >Ż[0ݢA @F M &6:GёF֔6i K,w[.^  #BQ7DaRRRYvo݁%mߺKm(W]3퓕EUSNǿVBq G?&1)  *BQB!jbEprrbU4rD0a847'Dۛ7'OeW&>> :oGd1g95jO\|= >s4 qq ##˓Ntήx %' |}uo|6TV*:? 9gȅB!&U}7_}-f666|#Ϛ1chբJe⵽/ 1|}8{޲scrj?mv6cO̰ǟ;r-'ЫWݡqa0W5}"f5|6RP(x{px'qrr*w}]zѯϧ{w[T5^DegtvhDDJ%V *5_J@炲qW hRݡnFcby;2}q{`WqqvӳC*-c_UG#F Ck&/٬,1>"#o| k00.ݔSmx`4*HrFP(psá[ϋJi0HMM+_/999X[[P(mjjjvbbcvy\zfaMPoez=8::cv77WO))k4(O]R({b,jXR^דUd12Wgzz::}ז!DMv_$ ?^Btt4+>Lwܙhv^ϭ ׫W h4r=9ш{/^sۡ V[[c-_( e8s\9:!*MOf_j7R q#pߔk%-KrJ CF.at:=q۷`ǯXaI0ᾼ2%|ΝRG(lmmMu?2` 5yW[_rUV,XȟOi F熏ʊ? !O?yqsEpHd)#F.ҟe|*N>`ʊAʈHIMeؾ:hYX-ÛwߣFf00lJ2a;~B}|O(q9.[AEb<)i,ZGf)\bbcGx>\gpֶ!DMWٌLGۧHwIׯ<11vT6Yp/'o{ʹO?ce4 d;ShެEc:c&NATpx{J'I?+jZ1/_'%\ٹ;dħ> Wg*~<ޙ,x .cv\zgȣ׷i\* ƍ2~֬}L5k ]Yn}^[5]~Gry-* IDAT/_z3N6m;{Waϱm#ݿfb܄7Iu|Ƽ|iXv]rsѐKx;rkpW"WAx;h*:о][x}{RRSj(J דЪe ǣ]lyrgΞſ?v m"[@ΝPՄ7oV>>{kQQzyMBQRǽ!j:"-lovm0ۇA ~J\Kh_eO__Myݻӻw}}aϡ|g^F2RNdffZP-˛VIJf>wYr'233prt6Sel V F#̝.׭gq0ЮisE{SU\J]snF4ݿΓ=Fl|<{UXz ))Ƙ_bY;;;6xTX\,\qqxzzX\s~QDa`'N{L&7B]? .#uKqhPDĚ~eڻqsu-G(Ѫwõ~-cSpܘV qZ<MUKdD\z>aظf5kW,7g BA~~W[’{vΖ[HIIKN'$w߳园ѣ{.]{|_GP]ϊ]WsΓך+V=6.mHooO]S#WCڠ'>>tܙn]:ӪeK="McxrcX[[ӡs鿴G߹i[7I:% l՘+Jp_~sO7\(2ȃ_Fz\D`rYſE j5 Xh'>#^x//O@MR}yNT*۵\qYvpP# DFD₋3 7n2ʭ7pvv"-8xLw<+vIc_N'66@-!Yexs<=YFN@?11lJP[j'K>W_ 'O.'X\u!j:L6#nje+D@RqE>£ *qT\]\q&{%o_ gΞdi|ruDžmۛ7'OeWw5BaZ0TVMK}Vm%:]62҉K'BuW̬L\EFFi%l,ZMh4R~=X/ri/ooZhQDl =zzzBA.ٽ"CRD֭ݳ>*8$1>{\%}l%k>;UfԫW]`_YjEmmm=c:-f;fΌ5Pm3s:,XShVjʣ:bӦM>}X:?77/?m':&;[[BBԐ!ttL1j01{#šI=yҩ{O"ZF>e2Z.s;?gNNN<^b/--C(FRamm͍Tu'7rssJ{`fz:zw_9dk899UyUg۷ݸ`եJb(Oʌeeh$%5 6OVVyyy8ceݒ:UYs~QSm߾Id+#55шͭlrssK}:999di8;J-WY(XETըT*T+'//O!پ}qjAeݾ04vvv^IZ666%`4ͭ0B*U#+B!&IdB!D$B!$B!$B!VDV!BJ !BZIY!BQ+I"+B!j%IdB!D$B!$B!$B!VDV!BJ !BZIY!BQ+YUwB///Ns=-h\=p"49ju5G(B$BqI) ql.Nnh\<q+mҡu<5BQ. Q%&r>S[[{^NͭtGNyUsB!Y!(>gn bcc#nn<|#yjcgo_l.Nepƍ h>_@Tң[W^{u$0atҙ?Faoo'б};p"N9 U_wWV<,XȟOi F熏ʊ? yȋÞ+܅ 7}FȀ;p7Xh!W ԿxT>;ǡF29~=l4nn?k& $&M.^~"[_>?bd\]\m^^o6={T({92Xf-!;;&Mxy M8կǦv|}K|..> oO&ϏgKBbb>! QG֨RO)?Zmmrrrػ:wޞٵ7ӡ|n`W \⭩3=?f`Oy:|_~U$<ޙ+?]F`?. VϚCnN.K.`!cb )hҘA|x!,^ѱ1<O3ih4nDlIot~ w;.-^frY=ٳX'FV]oQJRZǎEx?k&n.7W.ߟygDO>!??ܱc02mc1i Ǝ@rJJ}MY혛[QѼ>-5lȻ`0{ Q$rsѐR2{jR"OƢqNGΝڹ3))}ѭ+.<3)tzt(\=r62ggkJ?-7Z!eKN޼.62%ƙ+"9-[@dgHMK+wz<}31n֍2m$ a[WxؔՎuƿ9̜:kk #!Z DLffoʲf5( dfflQ;w`+߲Ex4 5jTvg''_Ps`F0OH(3RI]عk7#_#6>={pbTįc5$`_U#Ƣ mW PYX+ҷ̟8wKUؔ{9oݢcD*"$rwR9ٙst*<̬[degEnqQzNmMٻ1F_d|K~o]b9 |}ˌ$77 pXlI}eӳ{wlBJJ*]:w">!o-l%//ݺV*K/yd@yG+T%}*O |W[Z2|i[: c*jINI1Ľڱdn ߏ,\o//Z7X QYrjuT~~> s̬Fy1Wllڞ?J]LHfV1MHL$#3$|)oxyz{s1b8rGiQ[j'K>? *:iaI9a[xNͭt2nR(ݹ{7MCC)~ppp`Ǯ]4 i 6/jԐ93cooOV[v93h2ޞ6H

޴jGbTo>U6R{3gb\ENNaaMY`>fۻ^MiX:T*S~q&2y ._6m2oСCbHB^iii c* kkkn&7W-vv8[:޾фq"9j+5)0N9dk89}zDi WJH*T70TI SU]^6|kφl߾]Vdtwt JezBQ抡P:fcmmJR He -ZUӧn;5mMU17+ք qDVh$77B!\%B!j%YBT9w[B!%dEV!BJ !BZIY!BQ+I"+B!j%IdB!D$B!$B!$B!VDV!BJ !BZIY!BQ+I"+B!j%IdB!D$B!$B!$B!VDV!BJ !BZIY!BQ+I"+B!j%IdB!D$B!$B!$B!VDV!BJ !BZIY!BQ+I"+D ϯ0BɪBe0?Ï?Jۛ2?|K?V-9%oת<<Ŷ?dee{߯A볊wzJeٖn}̙1ĶKQ!Doa!j,^&XILl,vv8::lsbE>l9ii7ӓ/±?4Ⱦ8cy&_l##s$mVVV<Գ&|$h0BWϏwM 77~Q:^@fʽ*/7;GC̬,nܸ@xE)Ol11}XӦBC ݑCNǜ8xH2ٺc;gggz4 $9%]9ED!DՒQC8;;zϚs[7T۷ʲ 0!-/ 8yFv+)'GWz~u;TU?1|<|ݺNjx_ZC a!{dEVg\|oL7WW''P3-{vƦ͛ٹk7Iiõ $1vv޴ xlB Qԯ_% >!͛7| ٴkӆW޵ 7W ƆSkfg`ǎٽ)i} GGn( bbbq_ܜbu,p}z"9%3gѺUK.Ofc7n`0ₕU:rJoBUY:})F#_~g*[!DQ۷oS T*7㮩ʻ_vDӵs'IbS  F~=E^Bq/H"+UȱcEDB!X3 !_H"+Ug9/V!)9@!BJ"+Bq۾}{(ϭ\$B!D II$&&i;!=^^^x{Xo`We/T}CY!II%$g'9Y-7orj#;i] #+B 11AĊ:əA$&&VbF<UYH"+B@J+4g'J6䌋KFT~ !B fK"+BA q/9:s.ET> !Bbrrs9} :sJ"+B@Ȋy˙3gP(D IDATrrss-^o Qeds1a0XFTHٔ+BiNJA)sh#4 .^$+K˩glav{EY!sOb0hݴ*2\Ϲ'iG(DU+MB ,;[[5 ښaa>s,֢9@:zj ۧ>>4 zjBuFyŗ0Ŷ=KsRƯjYq\p))7={Z>ǢJBQuz##@VѪ%X͑%+Ba*vX~BA=|u2!m]D|BO=1±۰Xy-{YAUE5+e).>m?\}GGG>]J*VU9@qXXbe.-ѝ7}=IdwZMNjjKTtT5vloz,#VVz+}@jj..%c999X[[j8sL۶iM==*ZeO S N:L_66֨e4ݿ燡P(0ڳ:~4s/T*ѭ+: [[[SR00}v IׯЫ֭\gqPhR=^ǛS00 &si VVV ߏWFTKNI1Ѫ%CF.at:=q۷3ob $&&accÀV:Fq7W{w !j*kk+6%{de;=z\<6y X2Z-Sg/aϙꉎ{[mmVx}h\]`0`41L5 >ӧѸCo(?M2IJQHKOJAPQ[k]o]UQAE@YU%}҃)miҴBiҦGN_l'dOro}xxr -8ȹZS#Myy(--NCTd *:2QVi byʳ {13l $I+;vf#I~- D8]^lH;0 #n[3uڽiԅu>V@EE0o~&9 {c5>Vh NnGߴTMkڨ}]{Q1aՇjk~" K4gi4@Zh,cXr}XrF^:.,լ~Sg ks /Ǭ9sQXTf=\ڹmE{8,7yc7^Ü/ǟDX p:~ysNDhHH:)ヌ3jh4\u\dX[3ӑG`S0sTzraCWdn.{:?Y"?f4D"T.b^p8w*FC;cLt/:AjJ Lxm[x`2E#??n00LXz x > St4>c<|'rKI @QZVu7pؾs't:-R5 yy ֚>i?#ǎᢸ8hj쁽AᎪ9s,`PGcIY8G:HCJJ.# HHC>WT5b\6jd`u:-ޜ<ӦN, q p'175ZoL}^yc6Iѿ_?\>zG/B f*b񒥘7{ e6lٺ޶oQxrg*`gQ^^xѿ6]CXU8}4< 1fSHZ _@̔njYYY0aK"R.nɲ Ӊ6^UՊ6 `ޭ$h4;,(*.!myKӥp8EԸ[7c ݷCiY$IBpP{OB<a'Ynxup}Y"&2vώ/j4u7lKήW{!r h:qwnk 95kjQAuu5wFZ6>{K^[e%v ͆5!V KDD䂯/b!j^I}`ٰuvTTXՊHINh KDD s,yk4$%%BBe)II\8mS :_4^F$"%) =ݿ=b/""""rIh2, \Z:Y"""t:] ,Qyy9t[oY"""L&a%T^^990Ent>t+kΑ%""rh0Be>z.MiZM0ؼusPd\p:d<@&2p80Q.dp8p8.ȫ,Kh1Α%""""Eb%""""Eb%""""Eb%""""Eb%""""EDDDD`YYY~1cƴA% KDD$I((,@~~>V_CԦZ=L&#K,%o(kvϖb%""rŖB$FXh!jSKOБCA5{cQZp, K~),4 q=␟ߊ{[|{ZY"""VXkaa6І5, >=>, ~&jMUUعk7*+TQ0Q*dgBii)vʆ,, 8"K뼪 v톭 n]PUUo1݆[p<($M@@ tGrB?-Bטc|=ltHHǾQQa]Aȏٿ$_ ttTI.߁~)|cb0h@!--ɉmR?/z={WXiHJJ 91ٻvjh©D~Tq#&3_11¢"\6Xm[Ӧh#+ÇAFt @V#o, TACs;:uPq6EGE!gO/^=оEm@<, a7x(6UN- "oѨ5ZTFۉ-4۴Ȉ,^MS$[`0A:+DN?rÁ3g ((>-VjBVCnF2Q^GCpй{Էkvj_S5E Mju㣶-q~7f!!>Ƣ]s V] KI ޘ44>Z-^V|qa=\u6z/Y 4>0N.{ fsϾvdgC$T*\{XZEEO oZ@n^سw0x⯏@/]ϿE\uek$xڥ3[8"KDZF#69"ш  6$W'bލNNbO9 ZQ I 2*L| DEEbA?wuu5^yyDGGaG30d@rABj۷rNݎ@{F@@ABT蛖imZyf uߋCl>V[&Y"?9;2 Jjuvҥ.|֪dsskVAVSN@ng+$򕫰`K/l25rFE]Yr̚3EEПto[9yj60@nx0yx'=6{7ܽAGGE[oxv~rylشK-M uDs^s-"?&ZȲd;Y 6=\:8Qjc:{Ǹqam܂ 7”wß_?] &pkE>5..˺61ktt ޘbWsT*:PT DXX(.6N'ss}] GdSvz@ީ\ mz촔$ƴgྻ^~j ]3Np8;BE\>jdV?7M&\[4p,%%Pa p8( Ndt n^^f7rܔԔڔ}dF~~ /cpQ\4j5z}Ry[k?XRΑ%+b;H #>Bɓ1k\l6v;h4֛g>cO?[[ow٪׎Îl|8Ę蛚ѣ?j>֏}bf@pp0F?/,żٳ\-[amM} tZ9y"M_Yơt8Fyy9@GАArA@U N>#lBO C1cy,?eve(`p]DFD[FSw{ڐ{#!wB-n^֬NErrD޵Vkh^EDDDDtaĮ]aِ&m{apk1XڃyRbu:Xm6lݶVh"R<ڿ0Kn^IIieAJR4Nw""#MD׹ 99 HIJxvBOo؋\5$% 8"KDD5?־}ANWw "T^^ed\0Ep<'aRyy9ݲ6y8GYqQTVV6ja6h0b-nBuc%""rt""<fښ,˨KGc%""rpp "X,.8GAAAAAo 2 r:NɌh KDDBAa-HMNE1u(Ŗbݿ`jmn, yyHMNEhH(|]Q ؑAڬ0.Ñ$ Fnd\'˲+!|9?`%""rKeY"7:¿ Y""" De8"KDD5oԒ$Ie82YqDLEDj][QQIZAˡRJlC;D~fF֢(9} :: /_XV|!׳go؈W^{~4W_a85 蟁/d-,*„/Kk!{3Xj5>p_AZJ*{z֮߀ 'ssh0nU{a6TS YVEE CEs8??'1'!np/2".h6[%z/p'ijqDGdزu*8JX pŠ61Ly=ǯ׈\ @$k\>rz"lڲf ȃ87r{cŗa&tW\mݥ&IGd9rnĉP۠0 uo_? ! K9_syCgzŹ;[K$$[,޻I ?3Y̞i۟٣**xqDnpDO>0k\\>xǑ> `æMzשS' *,Dn^P_GY"?buܔix1_n8znD"Fۑ]{_C~D|]ׅw?<o"OB͈,בmHe@y}#\s6YQ]] y( _ Iy D~$kW={0|c<\w%񫯽[9y2@Ȅ'ztAqbrskF}5ckZֺmec˶mڥ f:ڳ^ษ)ؾc'w~XJJp!h_0z0EGcXb aa8UX͞ły Foaa}mveYnp0aK۫l2pl2![W:|yyx쑇ۭ+-]^q=q9 79'R|*;+tDT %sT* c:ĩD&4$O}/XtVZ QѫgO3>tH ޜ<N{e@Rbbst:->x߰zZ|툊Āۡ0ed̚;3? ݎ>x0#. ~%K1oFۻ;=HTȺjY\WgoO=VY^w~[];%sd 1cDٚ{~ux׮0!YZ9}Ǿn, 0\,,][n|9=z͓ Yop'>m*<.rnCѸ#jBVCVtqD IWCG.]pM7ǟ~ƒeGORafTVV"-%M>^[vMFm|9w6jfEnظ :cb$IxD[}]^~7lĝM@Tdc\_ps6j!!7t,Y;D~ADQ+ ;S?}#.cyZ]Y"""?Xv.> :XbE]s:GYY9}Au'y_fgnpϝc`G!B DDD~ƛ6ʱyVq ddm߰jZ<|+8u`nG^_Ukbct^ WaV1W`aѯ ݅e?qF#j }SST=v ̜7~sf~ 9s}׮0/^Ir8NzӍ1RSq\+_P3VY!2"ڬ>Њ" "<}SS̯PlWnZ:Ϊy92#-%jǎG~A&eh4OB߅AZ}ο7ϯ9}}!Y"""?S{RkBk.%]K+.cb~nͽW}x#zDܭ\㮜>}l}w.%I{uY]`%""3q |%I7+(b;o5zֶ,oJźmDmQN Q#2` ڬtME} }-bg%""31=0hEQJ{%NFM5E_C}J.)Ԣd!IMHEMf p:Sr"??ɶP`` L&Q]]dDdD$&3|]HQF]#Ϋ7 W, -ڟAUWWhAZ"1"1"1"1"1"1"1"1"1" ++u5M?IENDB`qstopmotion-2.3.2-Source/manual/screenshots/prop_image_import.png000644 000000 000000 00000130701 12536560630 025375 0ustar00rootroot000000 000000 PNG  IHDRCOsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxUnz6!WJ "MfA_TDA)]QDAׂ(^HH H dv?BVBAr%ٙ993'gϜQZJB!U5awB!BXlV߱!BQ":.B!UGVPXB!GV!BT= !BD!t>4>{u-BZ`eeucBTBl=NfMb_L:lsmf s:vv ٍ"ٺs_~_|n4mʩ8T oIԙs\MH^`?np7_Oޞ͛c= 3Ԥgylxj0GW}-s߬ۼIԠ~4kXdhdfeqV:1 X^K ;~ nޔCfM3iݼ)?>{{q-1 .ty(;w;̭x )Nm.^MM1~Z2V^:e߭!9@A_N[XQmI¤BCZU:xQ*d䐟O;aYOP*@AZz:]:yǟthӊ:~wMMf K~w_oO:ϿG{[4}9GZ ݝ];K>罙M*v;8-pJ]GҢqCRo2.]/~pmZ6g?LJpy>שCc6>]f`oGχ;r1>̛4kk޹G{{e>6kHT*\&F{dBaȞWځ#xzHt$esJoʕk|oҾ-sb Qg1n3hٹ q׮zs K/_a∮|nNNtݓ=wߎqxz $-caHp8}<=hX/WZ4nHrsshҐ-P(䫕fu0:#'8t=6XBc˫x;kCd0›6>Q~ ~g{:Q(<M<$0JzdF޼ɉg !Vh)z蓘|#cb ׳R*tdeieGNodgr //_t"IZ撓Cu {Eh}izz:N͝Z>di7UE^՗]l_՗qnllILN1T}nޔec羃y챣hT/X9B!Bqt:=>p5!ѳ7jP}gNӯ/Y Iɬi l|}:kkڈGcmmMZZNՒmѺEF8z!nmsʊNmc!w%ڄr~<ٶ1?b7?wZR2:R]xKc.Se>bP?>\OJFe !<2@aCL@48z$nsJK Eһ?1ѕ.䫕8T=P>__wn-\j8kȴG-lݹ:~}i=9aᾍlj}Gڐʏvm4 b|fݰ .pr2xL}Ouy[XOcb}=ec4~cqj/SX+#'N\]jx޴mьb(UVvgJBPQuGGG֖,򰵵ΎL#++ R9//IOOٙ`-,c2{"q+~35FDPNד ju2L^¿0d,W !%dhҩG~Ite7EP?"7ױQWBTnUV:wE!LM6|==Jssj%BT~[n-upp= BQYqrt08vG!D"o !D9!DU#B!WB!DV!BTI !B*IY!BQ%I"+B!$IdB!D$B!$B!U$B!JDV!BTI !B*ɺl߾"ZѣA!x`86lXy!DpƍBB!JDV!BTI !B*IY!BQ%I"+B!$IdB!DTL~ y3:..5 G 7Ĥ$v3{{ܩjV^CZ~#BQ-{"}<lB(\q% "h9mZb`~p|4?m[=ony\&KXΥX{ kj5˖GYa1y؈B"T͛iFXBAZ\xd9ٽw7WW,]ƫ3P1MVcckucb/s"y{yqhE*y؈B"T,`4t!999( t@Bb"䱡CsnSRXػ?L4n1 "99_IxXK?&+0fMq~}.QDTҫGwfL}z{{qu""iZlmm3p0sfͤ_&غm;}Wboo<~\H!AR!ly|2A~Wwק7K#`;c'N")91F܈YfP1c$RSە2n<_-;[[LVDd)kF}۳rj^pwVz:Z:M{>:ٯ?Æ1h@?9{toB!Dv?8x@AAf1:z ך5YwGwTK>^@lތ}~F@Nҹ3C9r;;;b/_fF BCٽwoD}l7n޼IdD[m#G,WBPp=:֭iӺB!xUX"۩tpdA,Y%KԳĘQ2W!C J?bb nJHL#] ns=!ظv uj׶x ]i܈6mhӆѼ|&M7 !B*$t&ot4iԈ{#GRXv66<6dڂd3>*IOOMv(J|}:s6G/W^vmo?;[bemEȢ=a-M{i.\H!^Q'Obc]mB!-$. #_Rpɧ,XFCfMzxx/ @h}8J$&pqqGLdxt(GOs::8,7=#s-T*Mf!BFj*]I&ݾ}ɹ.^p9fkk &٨33qYTSc\VKjj*yxyyZ@NNE'$&ɎTp^h4{)m+i[%'{Ud{GfV"_E3ulL~Nݺg`6=#w Qc@~dd˚uQFE\彷0:OsgN8}}}Z唶\q-+NV5XVMc| صS憟= $^^=~!DԮ]=~YΜ=Wl=Z-662J#// \Y2//[pv Z$ .Fxvcm{.,Eիx{y3VOʹrj5YYZ- x{y+smDPxQކUsTUSul.jj]Kڲ<IN#1) NQ4m!Kh7mʀ~}%fa - Vz:磣ٴy 'Ognq<;E:vCڼ72Z^zzos? I֜7ޤW^NG!2'k4?|Xٳ_KZٷH._bv l[_ZE'==$%'3~T";wᑞ01/\WFѱ3]{!s/NtH7z =z{^uv Jd.ҕ/ ?CD r ܽ'=4]{a_ ֥z2U,OJn=ѷ?Ͽ8%Kѩkǫ *cmr&M#H7~~8ҟ%=MYY~w7V9s:6XKr\ڲWKxgo 3]ϖҳzaOɓe%icK-u[c{f>_G4m<+Ul{*9?.)STi6m٢ӓ`c&LϏuVVg2nV|u+j8dƌ_s#^dUكl?ТY3N9BݥedfeѧWb׏۶"MuBM]xgχyZSɥj~IVxt||ٷ˖ eK5j@nn>>tl߾~GG3g0 GRR2gϟ ^1%˖q5fOeKZE"))Ddi9DkK ͍4kڄ@ZKu)OLM  EJzlr:{ٽqqqF\b-q2֖}?EL0&ChHj׮M?!6k7RS%ncsrݖERrtQ4j؀< a/,S-VtR!:T\{?;vs;oo^W&"coi_srrˋ+q(Jzv/۷3iX~}''|9;'gϾ}yJ%˯aF~ݱ ~TŘX TXQ~u^Jj  d,Y} ƌE{M-mcZP3 iߞTsdrpp(CPGX^`%gSmV!cs$eȝmY}p!2၍ ġ}Z*T<"3QT^:VG;ޭ_?ؼ'''_xӇ&KcQ]x>tt9f6'xdeq$Mr߯' )9٢6P( >4uozLWA{1w2f}:$vc).|?)<.Cc-Hnn.>^^%ncK-u[f(Ttl\\<;vN#f?oފ }{ĹF |}:s6G/W^vm{c=͛5IFM9JŚ백!CJ:utDi;x{yl xѦ5.Ĥ$^~YxXKwssEȮ={lAի:|[ח7ycHLl,HIIՕԴ4vK%ui.\H!^Q'ObcmMxXKm?wXY[!!wKSO6h??xΞ/'= NڬRLJfM0oΫxVo&pqqGҮm\jԠGa[~O?cYS,ZFy| << n@R(Փ%KgGP*t߮Zm& ߏi^ÃmZ_W*f?c6< ""g[o @AҸkۖ{y4nԐZIHgܼu JŬiSy{z%SmģC9r8|0ZLdˣ 1UO=6aْ|m'LDP򂂡NڬϜ7d䘱ha)5lxa nP]|]~#xDm">M㆑$ niW@f3#;iu:%I{<)Cf=B/_,gڬWVqV:( CV^hu:8AbRR˯JʫN˽6ʛ3/0e:Ђ5&JRsmGu~ܖT*jo//_uZMfVhZBOcb/sEj$%%uuf& G[/:Vz:5KZ[#sj4lmmMֽz+ sdee*^8;>c[^^֬Y1s猡z)ɵaJIۨ8;; Ku!DE콼&ӎjj u?Oe{Q9TلD ̜Y3iӺcݿVKfkɚPgf'DHp0)cd3iҸ1nj&$8HcC$ŵkk-g]ٳoYYYT*ޚ;rzP(hؠ>NTnu+9r8Zkkk2IǡP(IJ%ztgƔ8NxngAի3x&W?1[m`i9cmOzut`X[ˣV@ק7k-,v,p>'L,hL矱X]9ٯ_Geӏ4ϸIqԮUر:gԙSX_Q'OǟF}Ralq))+7z=9SҺ`\,e"{/{duuJA^MȣUuTjZtw /aqrR1rX? _O\|{?^9 ҰA"#"pwsAh(͚6!(0-xR;wHΝ2h 1 9r(G(fMJP$&Z-7lo߻gOܱ 2"h^P$!AtЁĤ$j5GS>y2͛6%8(͛WXܳt0ukצc8m6#G{2=wCʊ޻ Bh4Z 'ެWe60WN-i:t 3+drQQ)bbb-yd.y/@v_>Fc7vΘKiڤ1Ae+/ԿۨP;^|3OYBR-B; 0v|PgѡX؝\ZK_䄷W5±Z9x{b`ۯ%$$&r,9//lquڼ7VPoA,Y%KԳĘQp;ĕ8b޾ZbL,~eE#K)J×_Ì)c(tm3eBXh17RSyVBаA}6 (Y}; %9̵Ͻ8GDZ 0zBp)&FZ&!1n&+;}:sEK9wa1<>tDtdQl\:k,?M"ڴ|t4?Ig 1w2ToAiߒcc\]7y)n?[)Q eSuݛ_,y/<ܩ#NNo3猉z1O>z%߰b˜(r;oCJr>Diͧ>(1>9c^s75x,b9:^q/m} )f.0v$$DIH܊/ @h}8Jpɧ,XFCfMzxxh'ʑcy:dHaْ|m'L,2ЃYڵmK޽xu<7js\,h>o>'LD]6g`bn޺Jbִ{p9;;lKQYLփc ?ܷdG[3Na[oȣ."LK=&KÃݺ le?GǴYA6i1W/^.)J[Ʈ غJv5)M]8;;qYRn=!JTOCBd(~gά///GÕAzzVVݷ_ +pw7xFk͚Ejg[1ꇢ"1) __2wZҘt$&%4 t駞d+/-9c^ʃ%Q׷'{"BT/d/S(WF9{kkk|+d?f1vvvŶS*fˮl1ƒ:88z,gYc2GP쯣j=9XGy^ߙx*.0GY!=w!nޤnڜ:}k1t 8D۸i5$(0 V?B (G=3ǚoߡTc>#"K1ԙ8t'ß?wOMZf5tؑϙsyVbbcpc=q={2qҺv:?nS&+SjHdwޘ?}"&MԿroϗ]9u nnnm˹{o;aZͲ+Dy3O3O!*#Va奼o??oD gr+S{Ndj5YY;Z- x{yi#//[pv:L ~nC5ySDn]?:|WfZ-III\h-rGӼiSkQ G}^⥋E-:$%Q1[ғ$VTE_;=;ojh֌𰖬Yuf&^|G+9r8Zkkk2IǡP(HqyoP(4lPSo ".>ٯ%ꟓ(JzΌ)K:?w&9%]E ƗD޵+{#++ J[sб}{ngAի3x&3GɓCvnۊ5?ΤIƌ3 -p>'L,0bn?0֖֯>3gLMzzMՉB!.-dooϷ_.'5-'Òb䘱,l) @Vxt||ٷ˖ eK:uSѡϗrb͜(@!>V}ۯ%$$&rt //sxP\|<{nn )ë d,Y} ƌEJ\AAN_䄷W-mxg!Μ;spٹCÖ O9kp[OOO6]у_m|ODD6| _ N*'&MARrukݞtRL5ZMBb"k8 ;WB!G֌\]IMKc޽Ѧ5~~;̝=___NDE k/SgfWkPX,gSp" ֆz!D<;ZҤQgoJbuXؐ!k-5-]e+VVt,{|/bB!D ڶo^:`ƍR+gƆeK390BZ >^jDt:...>zQȞ?g V[i݊wޘWiFOS~i^oP xq[w(3gڻ/Sf*"//b^*$UNdz;~/;v`kcCׇуߧOuR҈zE{s jrrs%Zֵȗw]1x}ۿU >8?^BQz;VV-5m;( Z-wNpvv"!1>3gL+Wxͷ9X[xf>NT*գ;3L {'SIƍ?f4!A%uyÏwxs'xHM廯$+K/$<%{@ExXOl< ?dž]INIۋk׮ OR+ -NBJMKclތ+q8;9}Ce[%XR 4`e*Ø_!,}" зW/~9IM:yL_GբCGnn.Ɩo\ge3f$Xj%ju&&OaW_3zHZ-c'N")91F܈Yf^^caGNNN+ _G2ͷ ԙ3|rT*j5q1c$RSە2n<_-{;;qwޞWs5fO{E4038]+^9u4ZݺAoqY⑇ښXWu(vvqqO {,YGRٙΝ:*\!S兵lOY?8(}l4BG/ F*!!<h֤EM ƴEE^tl'6oƵkquI̙5>^= /07 !_o1/dɴl , IDAT~K=uJ\11xzzl?&cBHdu}|~+u5k$2"غOD}"_.& ƨ9z˗dceeEPvQ#9r8GEh @޷?7l䕑/MV _{aP(3k&YFK|U^=zwйSGt @z<3|Gd>\Âş`gkKP` cbn4lP>sC㟓UӫGw̜ŵשgϟ'//&MA\|<-5Fj*k֮#33/*SzF 9;;!2t:1 www9ԙY{2- n;}ggg7j͛79uEԦU+L'$ЬI<==A71C`:ri>x!M5d]!"uQ=o;w2a~۹ݺir ˊyoyͭ`8˜J\ ؗ_fڬ4_}\PPEխTʣQ|[t:|9Y3||Ya#˖?'iۺ5k7R7k֭cԨQkׯ>sfDP |Kص+qqDFD0gcil /0;["1;pdyB8nwNg4Dx6o?Yd& 7y b[fVu0GiҸvvvgĤ$'$0d@j?^?}6XQ2YbBHd?dW_B^= $.߸v uj.?bb۫jHRŮh| <<9swQTߓl W+(E^TDPݟU:*HI H6 $;?BB:$lΙ=3=s ">@jx #{aÉgj%-=i3gy\ۥgpa;nСCinڔ,&&Z5s׋_A 1?M²;|/աp=qqq|ZFz}s:^h?ؿ_He”<6iZ!Wf'z4fӱ};xm<^]:Fzz:ÛrRIrl޺[Z6{4~O׮ٳ f1 }`/}U˗]Jp\<== '|rlwf̙Kjhۺ XL {gn#GbϮ֕UkgX\] $)) )Rb=;[m0 q{ժy㭥sÍ^իy뮫kɗ_EpYΛQ츠^X""Wk&,ϙG6Gڵy夤cJ/TvmZJ? -קߕ+WuƌuTrq!((\\bAo7?oٻzu= 孷?w} #Maނ|ͷ@bERbQF $jIF ^4ndOZP9P:a4o?Ԩ^;ouAol۱hԯOZzz3? Ebk֬1SDDC-Ð$r恝8<t+/!!!|^^U ]o;+࣏y R\~qˉR]j1$]DjqmȊ\ ]y6 |Ax֫YĬ+Iu(wYk@bR&MfZ~=wSLܟλHnJd+Ƹ\ÃFIbbժUul޼\OG]D$7%"+]o7\_.'ţ."JdEDDDBR"+""""Ȋciw"i{̮HYp 4$z%()Nq2$M+1""WɄٗŐšDVD!i8^ޜ9sለMعkYɟ5͊ED27ncǎfCȊc9cLtp$"r1MG%""^i|؈\rۖ.)) %"R&J#5PlDD2۶X%"R~bquRJ(=$$&P;X1,zѡKZZ:?o%1) 0g6x^^UJAw=R*æg ]oɴmӺ㉊fE@>Z'^Z_D._y\\JdEaV+<"G㖛oe9{lڲ;nDf8U^;{їI=Xzxk)yty!nqnLBb"2___.~m;vEPƏCZ5va"L8oXǀ~ ##_#))$+[M<{/sxl35inS8;;p&NdB|vϾ0׹ni˳Ht4L:L&2DEGQj([D֣{o6|$6D|In=HJJ˛{i -%"׀[Ӡ^= ;1W.Mg7 cϾ}u:5VៃR2{c4lPaa|ɧsGrϐٙzuq|YkZ@[ß}׭n٢9/>/zuN޽3'^'>͐_{3nLcJ/a撝*?9zCnt Éujin0 ?Nzz͚ެ)6&éӧhբ}IF\7nWL5ƍMu.޳)Ӻe7jĽ빱}f%663{Y]#ݻٷ? ̦Au5ΝE[D.vaJz=I|LӤJ*7[fih\Yz.xm;b+8; @``@=yZ5kݻSG>#x 񓧒V`= 3?~~p"sEqq%#W$&&y.̵ϹjTgʄqzo Oj^wvm9fQS'ԉ3ndX)9}Qݾ/ww=r 8(0[Dmqssw~|N>ge9_TȊ݁HϞã#3hP ?P?,]RBBԡ=N:4IędffXdyIQ #{΅e~~,YjU^pZüd)f%oC@5_b&!@vnVk'OrCN/HZ'f>Oc4{Z[D͝>/?ѩCg<<< Y)W&)6mBff&[$$$y _=Kppm6Y3B<}<!!ƁaЦU|gű/ܨ֕fMqvrfd$;~-q9Cbxxx,wg!55i&}K.raYX2cŅ33}ƌa2ww7ME3~iU7T`kӵ_?b^:~\ߩc' \S]lO#|baѼR&Mnvc'%5WKJJ32HHH 0 DZVΞ+OYAܶmFǗba_;iݢ&ȊH^~W>w@d$...y~fqurMI[sU~Q⌑-ȅp{0`K1 ދ}R}6[DrY e:}իo~>|-*e*")++KcdE8Iw }sq9=""EQ\3yCL\\|\)JdE,G'+kEɬVZ]yksq}cUCrQ|}p4+)=#$UucȊc>l6bbc.i .`X Ƿǃ_ JdEDʱ, ለc3339{CP"+"RΝ={""呾ދHDVDDDD*$%""""R!) ITHJdEDDDBR"+""""YȊHDVDDDD*$%""""R!) ITHJdEDDDBR"+""""YȊHDVDDDD*$%""""R!) ITHJdEDDDBR"+""""YȊ#^|ꔣC)={5` /}ѡ䑙ə3glW-/JDS"+"W90`lܼJ[DDsqt"RL02۶qF|~%R\SbRu#-}*+Sn.{-+zr$*G {76F޽v߽ĩ{^N>MHp=wŅ8۶b^:w:{!!1o.axUB]v=m&rbk٢9sO+q{esӽk"9HԭSロ6[mҬi4lЀQŹb[`A&L @zx}\뚦'}κ"&&__5hȄz.}jdȲe|{ETt4&00;n~{zrW\KȊs??ԪEhH<aquNs?ƍҶukvK X,oV^ᅱ/Kcdffq 5GiNBb"|1Vxc_.޳&2sdš4_/&*:ƍŖmxxUR:uRJdٲR2VboڔBCĹe6X*U֤1gwE6m=͖Uc?SVMj׮߻w3o4mooBUa\kȊsM7biĉx!!|ɧ,Y}۶|]:MHp0|v^^^r}Lxi,a}[KTt4:tɳ/b <:b8WRNh԰̚ ^y5>b㈊7f4a h1!wv gFq-ܱCqZ]&C︃aMX,:Ç=P1[{ϞB冯. V."rQ"+RA'NēVt͜rmÇhCMiSXjռTcO0FS-*&mҨQvyttbO'..O>_qqss_^<2R?@Jj*@ת]CDjDV*/ؼu=u[o!))'P54;1@нku钫,0삾\W:5jT{3s~ДӳYȞ%\$ǝF?ys2>bu.ֹ(9vQV>oK>HEDV*s,&~ٗލ5}w?Hlqݺjl޲+$%%a89x{4ݻq&cNlݾ0rԩU ???Wn߁ RhxݹD˯"8s, ջ?[K  ߟQQVAՊ<#?>LcvX8;wҸaC^5 bXX0g}{D|<V-h<ԮU> ݺa8DEEEZzķa4oFzz:ZP^"MÚ\tg(9)ZȵXfٷ""":th$Rq%$$8:O˫J-{g%|1==η)$&$KeO2ʫ+q.k%"r-MVۼuAsa Y\UthV8\Z\Ȋ\7i26-﹛ժ9(*ɏH)xxxҨ?ILLZnق͛;$///u5k:YyV""YkՕ7\Owt(TZGrtRyV""f- ITHJdEDDDBYr4MN5pDDp 4$\ONҔȊcq'8p;:N&dϾ=8,%""XLl M̙3GDo/o5h];ȊHiV|pt("rٸq#;vmm6~~DVD{f#iݶ8r|,()JFDb۶vIH9f`(2QzdED Ffst$"rܶ4M*)#JJr|);rgҴ9ƒE9:" O̳|j_}]*;~5+Wp׽ϧ3oӆGG bYB^C --o%11 0W6x0^^Uʪ"r] ÖȊClќ}ZVVMEVs$*qcF9.#{|oeӇgAkN>_ȽN>vհ~l6Vg_cǸhrc+ (xhAΒ ˪ҭ >>ެX.nnn׹ᆼ3M,{G;c:5uh׎x"Rq]ض,_OO:iii|?ɳ2s">cvlڲ4 k͚҄/ό)]Ϗ]lpx1 Ĥ$.x-[ae,}}jXL 3c899ѣ[Wy {UR),_n#--F 與Un䗍IHLd ?TУ @Xl)ժ#|*O>xQQ l6[ɣ*(y$)|֕F (a]w<1@<<>ԫ[&4=׽gRSSqrvb5s U*Wf},^0 4,?"Qr8;;Sn]6nRh"{YOO_w3sdڴnuxMtzuN޽Ҫ܍/Nmֹbcf (dlLv]" A7 !wZEx8cHf?jҫJ2L<+*"W܅m+}z'$''O0M*Uзw,ny!ͦ"reɻoD|<@vokm|{,&Y^ɵǧx #{XjּξӓR[#k9S=>rykT{б};x?<)3fV.zaD]ܶѻw?zNӳ2}zn7m(L=GG gquu[ N`?@vml;KP\Bt9BCC8e?jD|<]ҥ(_6Fɓx{{_0ǿNPP ۶e thދ}yHv߳;}z_~Sxxx71"R$$&ٿtO>uM @V- fx__w۷ o֌`&O#=DHH0q`iղı4o֌F &Mft3MÚLND [X,ǾNak-)7ڴjE=57{x@ sgLg9?0oƴIXh1cO4M0.)urrbI,]%˖A&yyÖU}|;wůS54TdHO%_>_"cwpAzKL?s-ߡU*Wfi[3n܄BZOѡ];Ȋ\%J^#kY{d䅉`СeHŕJEBb"7F*%5g'g6oԙx億3Μ!j\qU_Gvhm۶ѦMKb󯝴nѺ@DDzdE$/?_B+{fO} 2DĔ^9XӬX\-JfETj0Yq? GѧH9V5*G7 =#$U\%""嘯/6M%"b!4$__>[H9E`@ !8999: {|lff&gϞuhJdEDʹg:BD<{ȊHDVDDDD*$%""""R!) ITHJdEDDDBR"+"""" """"dd Tix{ቿ_ W#M54MNq">Qr],7229u!0 ` ppٔȊ\L$>*WB]prrU#Ğ}ypuk7(ɬȊ\bNFM$rvv&q3,7b] DV*3i }j())X.=87v;=4-"&6T">^je5DO_D"KKOHA7+6aq8 iieY(9y2ӧWOm#a}~sDv{2cVGD">zƍiٙ È>zkȵj6;mff&)))T\̈́5- wwUR%*UThL_[D2k&M7/߷O<,Sgbҷpv.VWI 쯣9|p(6#GHKs|GEg&f10M.{L:x)~9biP6[Vϋax{y]ԯ۰#,Y؉x?۱iVL$I7kgkF?3LvZ'_j׫ q8u6[fjwSƄ0 {" WgKZ*99ww233KȺ{rx JdEů'991&pfN/}blo$(0-۶j›5s44Y0w6D| { ++'²7cZyydV!Ç='G`&M47faas5k^fȚfvOenؠ~}빧Gbջ񯧟ϗ~}z?кeK{7Zժԩ]Ԕ_K~>>Wx"rwo{KȚIzFzGW4%"׀[Ӡ^=|}|W4i{z!ĪkAT̞X`=9lǟ| ?w}( W.7o7tOe`~8;;]b ;D6Gar)ڶnm_޼Y3BBhݲ%)i#̾θ1Wiٳgd\c^ Ll\}=sWcK̓'O͖Um9ye]єȊ\ccm_O,}{'pw{[snc11̚J"^W:À}سg//ywcԼbի/aݛ?Si1 7\I\q:_LL{Q.,m9?1 >NZw-\Kjpaf:99uA!e]єȊ݁HϞã#3h-@?@vml;KPZ"HV-ǟ4p եMV̙1Oߏ֭Z PmQ-30ʲYާWOV{:w쀧g* !LfaprrI9~~|ɻ4Jlɉ4+G+da8:)?&)r=?0jݪ%!![۶ *:voެ!L>mw}(۶`ێ <޳#ˋƳoFbb~xqfİŊ͒\?-۶|hH1|w|Ïf?[<(0-[Ϊwknk҄r 6Μ=C53gϐUۧ"o_ڴ8;;BNNN8;;>sڴ쀏46ZѻgfаA}ә>{cO0 ۺ1m,Z̘0M/* &ڴjByccG|MɓѬi~i,Z̛˖1nh~ 潺?LJhۺUR ݻva/?'ovשJp*y߷SfߏV-[nHO%_+pJ8;9dGB-{ !*}0 R|:2h<9G0֬Yc=7>8""":th$Rq%$$8:Ri3lJj*Nl޺3g g9CՊwnsi ''{bNɓ;GmAqIɓ8l~222xyۭ<ЃND1Miբ!p<>v;Ҳyr1<'""B="o᷋rk{qXJ\ [P܆a;4Mܵ""W+0hբuju&|-/* 4lP3'Tt>޾taY)D|QQqAwn֫MBb"7oGqt(""RxbrX&_[ňa`97+͝e/_ގ嚶rJGP:^kY)`rwwF^X+E"rFTH~K]-owITHJdEDDDBR"+""""YȊHDVDDDD*$%""""R!) ITHJdEDDDBR"+"R z ȯ6)3MF>Cٺ};VU?TDʣ!Y `k~ǁHsH%"[qڐHH9HTt4"/KOOgUۗu+6'|ȵmHL*DDVDk׶ :g5X>!5%GGakn-rN:о][jլI?yҡ'"mC:.wFjth0 iTᅱ/'NZW"Q"+"RA vټe+O<%="r(N?1a .5,<==0bbc_...@DDb0,iP 6@d$g4F\]]?{yFFYD?ң[+X#+"RѰA} pt("Rֆ$$&MS|\3,~-NL`yt3,\DTT=?JdEDDD6Zѻgf}ojh(=`}D/<,Aaddd8,fc͚5f߾}ADDC-ÐD*G ""rY1m&~~ODDȊy~4@DDDD*$%""""R!) ITHJdEDDDBR"+""""YȊHDVDDDD*$%""""R!""iĝ#&6kለAhH(8Ȋcq'8p;:N&dϾ=8,%""XLl M̙3GDo/o5h];ȊHiV|pt("rٸq#;vmm6~~DVD{f#iݶ8r|,()JFDb۶vIH9f`(2QzdED Ffst$"rܶ4M*KMM%!1Nr-ȦbRR%GRjH="RL6c1X5GRh濶4"7hݪeiMKcނl۾OOOrN3\}OKK? oILL0 ս; W䑇n-qyifE#?S:wHk=.W%Y8iL:LLOHpG~TUt&F47eoڔ~}za$:ů7K/#mbz{߯̓OCpP%ff;r{ѣ j 8z|-sYdmvǕ[E40e*YL? ^^l6Nuj*8D rC l6ȕaZIKKnNSu333IIIrʸm&iijRRBo '&%qa:o@ZnfN IDATz޼],a?ZA73}\Z6m[F?CX˾4M23. Xr"{|,{G;c:5/Ю=WA${}tfE_RS >c}ԪY:w)ߟ׭-.l[x@z샧}4kc^oH9ѱ};6mيi5iBfMlXgƔI>ܵ ͆ 78y0HLJbWٲuaP^]?QfM0s#:ǎ<{f]0pss_`}x3~if箿]gn0GG >I=Xzxk)yϞǚfǞ \_֛T sJj*|==uQ&s'i3 \z{EUt;\W:~\)(Ou1x{ˆi7vqrΫSgʳˣGqCN#r).Ld; o ddu$%%fi=W瓜̘q8{ 3NӃƾwV1uxZ67ȖmXz ͚ѹcMi,;OO" aZ ĵjق%q SHu:kR֧L\#kwчJHH0^^^&33&M"48%bZ?ek>ᅲ~ ^fAfؿ?Alݾfaa4_~-rk|e٧d{;~ܾ_<1@:k[T9{u$%'!KztO?@RR"^^+EmJly{|zq<==ټekǞ:yaȂ m`nαcǹ0,i݊5qih|}|(,,,q _Og/d\mO?L-uuԑ@NfWϭ9+-7j\ݢhmzC0|PF^vYv@tT""+>s9:wgڵ,ZϿ4P>m۴v0Ъe y<#X,lVa="ʨcb22}i4jԈ#m.v8Z "9??/>d|}|#GZfxiˋ/*'Æ aؐ!ܽ'zw,`|ON&*2.ʚ#[ֈljj*4&>>ٯ^bgFQ|| ))~vm3;[)cDӬI~۵9W;'qKy|=SOPP ;~ſ)d޳ӟ?ϖΊUX_&?(EoxT͹^9r <dEi̜2wO_jeE^ݻyBCB4=NS4ԩ$$$27j >>]^ݻxn/~lVtDDx8֬ǟ`зW/8ԧ:x]t8lƨ#Lg8kJEEog^$''O_Pzoo[WV=JNNұC{:u耇;~*񸚦IAA/͙fҡCWKN?"UTk ]W1Qm*_zO^2^z-92f2sL~zaǛOyo2iIƍ+ '33iִ)+VfAM6eDg[~;wGu.[*=}8Q}UKʻmٺ&iՒ}4Ml6OO~}tubhzĜnԂ11 6o]6DEFbEu33///g2M?? X,[7^㊱c"#"֥ α?f>Ϣ߳trV^fu˖Я)/:{zIMK>iDGE1u4&77@-Ddf&MYf-W0 DG_aEκ ٳǞl')R5[… ѣGCll,&L|CPKMKt"u*+ kׯ_'22¹>/?l*}s8zW`㖍t!//'''ƍ'i阦IP``sHMM%,4}LM$55eTT/\OFe:Xer8gd燵ZH 6ЧOfmѻr]llFdEࠠ ~{xxzzfJ-CCUʽl}|W p~6y]Ymy gT߹ p^xXrY͑a&NfiӦٳ~/Ə[⾯R͌ jcTEUYWj}O9r`jn9}Y1"+"RȊE?\ύ^s /v "RcjA]o"2CvN66MaVDU^u0 sDRWHDcmrDD%=#&u!4 ""XP` HulDEFTtWQ #*2 R刈Ecv;uZH=WPPP,DD#y/""""nIAVDDDDܒ%YqK """"dEDDD-)Ȋ[R +""""nIAVDDDDܒ%YqK """"dEDDD-)Ȋ[R +""""nIAVDDDDܒ%YqK """"dEDDD-)Ȋ[R +R\} 7'K۹k#ƍ'Aeup8*]n&""EdEAzyw^Υ""~<qMq4M èWG> U}#"r1Sq;wGg./eq8jՊG08zNؓSXl9AAA4oڔ{b+]DDFdEIMKc0xyy~ѣ 0;oÏ=΢s;+k\K~YVa۶}۶ٻIIYW^7nu;Yr%W]Zh믧kl6}8DBb"]r&|]eqN#۶A|B^´)Ob_[}Jk +<==3r_,[M0v(<5kXfM}h٢y;+79UY~=QQq9};wfmtڅ͚jؐ$&&w≩O͘#?UܪCHp0HKKk.esGED)Ȋqc>r]:;CaDx8Ç ҡCKRJÇ #꫸?>3^7cl?--qc~q`Enʥc[Syy%֗*ػo_k7賈Yzh⤻0,gFCڮItzp.t,cZ #==b)V˕}||{ ߏ֭Zʁ4gȠetr~=BC Б#4oڌfMTz͋o~%?g\{TyᗲiROŽ_sv>K#!!c;K՚Ï=NL[\tw銎U޹kۦq*sIIIyXqv&Q<Zlɩ,#֮@NN;tIe.:5֓/{K>~ddR P;X.Qi-EwܲEsGpMhh=p+ c݆ |BbuCvl6|m.L:|^|n~~-Z};?57jX*s1Mgn/iO¡Ghڤ )O?CJj*n ?_?_<ȣ?m DD37xmޛ\ҿvi3żs %KOnՊS.=hܸ1.m/˞}QXXX4*X k&nٺ+; " йsd|K1|8Gp|ӄar .dMm m6t]صg۶ct A6mXvwL łaHJ"7/c٣{2 46mZ_۰Yms=[ETv.{sԲE<-۶Ν8Y@.ͷ,+0p[},cٳo՗gѱC{ZjYLAAyy.#10qȜ/))IpAJJ>޾U~M j5ЦHT9?/>d|}|ɲ89v|<>f)O-sǟp߃ӲE &~svm?GSٹ>rȈR?^o͝ u{.0M+mRDDR<trVc-,;fnEhsŮ.(=(JY\^yeJ[ڷ#:*xuޛL~ziҸq#JɩS_>.5y_}g_| @֭x~4|}Vt,WTVOE{{{3Әk<1ihgѬYSfN{~GΝxclIJN.ӧ1k\{r ]:w.1 w~2Nftra,V/+,Fޗ?`6zHIDAT9@]a[Dz"Xp9W$66 &`I"+55K8oiijy4/?lJp8HnZoQӭ+^^}yr+T~VV]9rq3M[׳~jzGdDEO$'Ϧ-zvyjDVDU[6Zjbұ ètc•z*k&C3 ^=ѺU;~۹pDDGsuj:\TdEDDH`@TD*]%""""nIAVDꥰP~\35:TG]]uYT}%$"zQoT#w;Ո'YqK """"dEDDD-)Ȋ[R +""""nIAVDDDDܒ%YqK ""Lv{]!"n>xu""RV];-XV7IO˫v;+VEؾWƎ_zi6R#ݯ%AAVD[r%ӟ.oc|7$%'3uQj,1={XUHm46"""?{{{Yw/acbCjѧkn:uXjSV+*зOoڴn]vZR4GVD:~<ƎUb+vrZ5^ԭwtrmA~~~]kIMӈHu<>ȈLRrr]%"[u~ߨQ#C 0vDAVD2,E#'NXn&uzԝΝ:0HHLd3ㅗp;k}~-*EG-<##L",cބ`ٰZ4o֌8N:a_AVDD&8(.-9]awZHS<4:ĽU6?mƕ.HdJߩ/̅Hc`(\] 41paDV}}\(Ȋ44FQ8p8u]2MePi`4Jx4"[{4"+"""(\՞묬,}TCih3 oc`W_Wk'||EGy_UZP_9&y7W]Í\q69G2hDVDD Yl?-Y Fs0 )9yyy\sՕmBrr2'33BeQih57o!===_uVӸ U yyy{u֛yAj-l:]Yq20p85^fMrw%Kiղ%i<tʺ ͥ{< t}qEd֜lٺ>|hV >6M#5יXn=qaa8 ɡcyDZhOK IHLf1nht 4g.vb0|P.Ȋ4@591770t |||ݳ'K-sB8y2﹋;oCyidTܷGT6o\sǎDGEܼ:qhݪK_XXgeM~-푇q:xIJJ@\e%xyLj !!ng2~q&6ldWs|)Ȋ40Q4JXS_֬%77p82h )lݾh螪3j$/z1op8ŀa8quµW]`;vaCaXhӺk֭.4@59os/EyCwqzx쁸)?F\6-;_Xcx>#խEMF͙xMӇfzc֋>HS6Od 6{;Xj5LT8q" ȈZK˯Xj5?-]ʀpUz{{3n(޽z1enwnEFDpB!9%!z̊C5=q {(Ȋ445x%U(,,#:*! faMkD23O- ,4={]BG!vfKN#&O~AJj*7NƂԟLf䅗_wt ///>LBb"ӟjWh߮-o.q>,Z==={rڴn-[`޽xxxҵsgx~DGx"0ٽ{}]Y&m˲thߎ___mZ?o@-x'&+;C b,e{/c֜ѽ[>6fL'?fz#//PzAnn.~~kړOˣc<99t0| NEN5`ړyk{=x_4MZp8m]A`@9jRi`/@p!o8};/m$:ϭ{U_7KDDD0zDGMUCe˒ΆMmy9//#.HSQ[ 3췤+[_Ɯ^ZS}B#"""RBC W6yZ¶ kȊ9ج6`9TfS__⾶l絿Hͱ ]帝ܼ\3iݤm##"IHL (0H}}rrIKO#2"Wi`p8'Mݑf#*2 +6" IDATxwtU&$MCGHJ" *"ۣPҋSAB""ՆB$5 I uΞܙ{gw>{2cÇY111 q;bccBw7n{onݺ! $777СCgkX{6l(zKj~9r7I(@(2l~nDrԀHX(E d%+طgS1WLw5TUuڷ>8Aƍtt cd vemvua⅕o{EKs1S U<0>[٪>:GfzQm؈*4iܘ:kKppMGsL*@A0Ͽ\z:_}M[V}}}K>9y[I0MW V](U醗}|Bx#͆nw0onn`d"r6( Vj^۶DEF;oӨaG[Jmզ:c^6} _;]N/Z@Td$;S}{ᦛ^,1w@n`ܘ|@TUeu,Zē cxg?G ຺uvPu\Cgo"#gLw<Ǐ)[^ݗjw[yG6`9x07l ό' !7eTUw'r1O`n`#hҸ6[s>~ݵ+6oc`0p7S7H;wYs>۹M&y1ԭSR`_m>^)m ʹtrme;؞=ٶc~~w2s\ΝKw:^ǃ?axpM4FUUڄ7 ๧ۛIS>d_yӃ]֍ē'yWis]|B/[je _yu_c.N:M-e1gn#G1Ѥq#v{eBCi׶ O{{1ݻɡVT$'O؟Q~=l67ndPU_`s#?ȟ#?ŋO\,LjQvrR}7`h2ݙ?w!! ZPd^aܘѬ_h2>xnnՒǪdfe1jCvEaexxx`4Ю-=oW2h@G=L|Mbv㉧ƳzZڷm[=F´3ؾsw&2"+KrUn:|rE!9%^}2db/9l~dIKK#4$Q+GtX2ؔǏs݃ٻoGct҅oOۈ@HHbTd } "0 X`;/37?mc'lBZl%x5kfl6̙m-ojN(( w %Kp {ȁ]|yu_ŷu? 999;Alݶ۶qk+ -XH:s\>m( $3+ x1ɱ*N`æMܾcPIk[.w jEE'Jvl6V . 'WpP"INI!%%$9[:?BVÃ.aͷ_\f۸ܺ*eW6Dn^dYFf&v?ˌs?aW_xg"-^O t)/,4Νn];hmҖczcҔhn#%,^vKp N'%aΈp Ǐ3nԴ -7]6N&~0g_zq$_fcLr2?~ڶ777 TjUUd2:.jwEU7l>'$8ZQQ$%̙d>&Sۧbd[*UoƍiҨq㟥][X,$%'#^񟏯.-Z]6 _"#"`;_z=?`_zMBC?_?ORiܨ!#FTdjy8p-п__X|?FڵygtcW9·d~z5o|4RwY.=QVjfcԈЮ.;0p/=,-fG olZZm'S?O>aٲu+fk_r-7ܖGUU9c_ŋ111xyy]֊xxx8&YoiuuOpwwwww 8>_(|a4;`]Xcn\W.|UUe ޸q…R]V}}}Ql*m+Mؾn'//EQ](%)(^`0鉻{sj{ym>/ʕ++HZD`;6Pŋ/Ο?_沲].ݥmΥ˭[>k٦ֶ},^_yW|)R k75mBxX ukS9+5Zצ*}YegңNqm_8 `JQ:QWW2JH"ңE $(Bh AB HP@"!4E $(Bh AB HP@"!4E $(BhpAym›DcΝ%E{qi{1l%LUPU~_{yW߫}Ot-Jt׮%.s~oH aLzCGPg/0Yx/X<2f,w x5DuRrWh{Kk|}ٺmV+^@UmEeYZZ [n%>a-M7_k$}8O=--_P] Q1:wٹku̿O۷+;ڵj1o i,KN$&hhs|`!vl7lcvZmߴ_~ũI7.q R]Ə{eԈ]hsPUINϿӸquu05hPVxCVytѣ_;p"Bz72uzjUh2߽[%7mȿ@?ӤqR/\`xk{deeqG^K-֭'&:y6og1ML>veߘ~!aa75n(`fPZ4瑑#wG'\Q N2xCa#www֬[(O۰lSӶs\vШa"#"ؾs99w.]YW ~>!]_q!n؁a@@@?̶;vV|5jൗ^LJ6[3ju<)^ݎ겳tr/>_cl߹su)u6rۺ[f7z߼oηݪ}U((]h1۶?`0֎\/I, WÃs}O?O:u?g~^%EZ_ 5_&al~3ȰPAFرk7nZУ{wfΙ˘Cvdf>}F_?mo-7b O|$(LvNiؾI*po)MԻQ@"!4E $(Bh AB HP@"!4n_du2jC4k%&dãXzUuddd/?#tQ>2oV,ct>ܓ2DFFŚV|,£OfqmC/?__zιdYwww*ۚk#U=t=n'5,-Ol,fcYK l6Yf1o6liiu  f0[6ӭXV+YYm_jِXAנrZ,<Ĕik2ю2mZ&"G)LU:=>\&']{.ٴ4vʹ3y5jЫG M]?̩ӧٹ{ez)[m';;F:oDŽw&oz'NoWg^RϞd2G.7AS ڣyi+&沶1zxzxa/c>SُAsФQr{zX>_&O!#3pj׮E֭رk7/ZLNN"ygԲEKݥK  )U'?4JᒧTaz7Cj5l ӻY\A^>>"#6t(q{,bj٢|p !4E $(Bh AB HP@"!4nRUd$W3 6yAXH)udyx:Dee2Z.o-ZY۪JYYYᡗ Wt Jҙ$<<ڵ+ ذaIg\/(9Yŵa۶mo߾B*l\ֹ*nտt JA\sl ףjgtVU<85TXpq_A""(\G1䟝Q& ĜH" hB=w7 c]gE(e1䟓pw{!yE(ƌfێ<+L|k-5ӭ*;.:2P+ o @ZHIMeLyo^MW@eYЭ[ >?''גa#( 7%E/E7(bٳw/ݺtvܧ*]:uCX,"uoaaMeu*.^X,9^dBBBKc]wbQWiivBCBԮgd9]\޵Kw׬"#3ڹl"##ٟ]#ߣ9u_O拏K3Y%7ȿEq _b{b2t9(nnlќ]wr;wLnM?&زu3uǀkQ٧]A‹Ӧuk~VoȰzEtGKrշ CW_bᒥ+[_~^zW|U.;G)iؠ>^{D9#*Q\uRָT\{*{,ȷ52ǂQwĵ/Dd@)ZjU`0`ɵf VKDFDΎ;~R.i) wU[r :j?ПȈHա[Pi԰Ig\BT. t n'$8ȢEf:t9u焨*R.!4E $(Bh AB HP@"!4E $(Bh AB {Ʋ_}./^DEF!ܲM݂k2ndgg3{hؠnn8AxX՝$ 9%6|8ʶg=BeђX̜6/O.^Xs>rJg=Be }"!)MvN3faǮ]J60_/@v~#la͛?n w^{vm{Œ~6oV,`҇Sپc'/\ ,4Q#Fоm=ƬrQF#۶я]q̛9ڵkU(]uii4jРܲ}2sҙ5q"MsO?bœce˙4>=Nvd {xW*\j1m"'hۺ5w/ 60wԨQw'}@[;2ɱXV2.Yϐ0*x {K4//7ȇ00xl=6Q.gO70ӚoӺ5E ykԯWȈCJJj*ʂkEEѤQrvP5GT_(fc/ڵ-\ڹsJdDHTU\z:!!%ԙ'iK/'`+bɊ ȠiڤqWz^1ݙ33.^Xf@ %%%FP`eէhOw''6E摰"h|>V-Z0P:ЗnA2x05jcYn=O#^{۹mL5̬,21{1ݨQΰ@gdggcX,[pЇpY>[]ɞ{I={Ʉz_@ffe2+L>OOԮ;=11>9͍2rp~ 8&O׏{̹E ߷MxtО`vP+*}]Y,Z.]dr3,^XѣJHHz E $(Bh AB HP@"!4E $(Bh AB HP@"!4Lҙ$sjp&o"# `08݂Lڹ45mF͠z5Csi<|Ъ=h݂t&fMoj 4ߐ={^Ps "77W&jd۶mo߾B*BP`S`,Y סjgO@TŃ#\CegG($(¡*b{C)[DQcAUUݣŋ^O*NңcXq#߬\ʼnē΄7Vp]?ntR>>޴oۖs\\H\}0\ס(E[UUyI?q!ѤqcpsssqE_SSO3m ޝ4^zAT١(.:2z}>S0L 1͌|pyQ^|I\ZcaYЭ[ >rrrXq-)) 6.9׬]GMyw8xf?31|"+n߁\W*V8(aa$$:~{MnkVNHHhZQםQNLyj4jP}( C*ukoUIPr_.݉_ knl޲tfv.\(C9JFF&MUK ʢe˸JlyQ+*Jj><==ދoBUUѽF/cZQzA%00Ȉ"խ[ /x#az-7?F#ݻdxgKLtOL&Sϵ(Q"#"}Ի}+R,Y'O&_B"?&زu3uۧu(=+&)M#$&7lx {"/Z̭;e"~r=Uc]ce.5pmyEKөSO=1f75u;<{ Mlˮ*U%̻ ۋW/_/_Zdvu7rE\*ۣn[({nw9(Q AbLd2EЪU "_j%2"SO˨W3 Z *2iu@E!LHTO@vBCW((l6V<UE^ʅ@"!4E $(Bh AB HP@"!4E $(Bh AB~( k֮#azN>b!*2-ZȈjf'(֯^wS[PfΙ{'.u`3i|dg6̺"##rb-݂nF^yyZ4kVV9Rŭ^;f_O9J d,~2OS3éu}ӏ>4m;vÏ[({;;w:OL9ucٰ_}ΡYXՓ={`f̙?mc$9CVy6眷2u;DFD8DUUΥRb9Cե|b0hܨVk鋎8NOl,#a7Wgeu `0p:)q_RRnnn^V[D[ Ix{{s^w ?Ξ= _0Lٺm;[ HTd$+W枻"9%mwۖU';Ysx̘=nԨ!7W5[Ps6[Dݺu;1:k @ ߷MxtО`fɓ瞡IF<9q&45k\͛uɶT.oщ㓙>Qخ-#x,Z.]$(Քaj=nVBBBQIP@"!4E $(Bh AB HP@"!4E $(BhTU%953Idd MDG`pJ%95si4kڌA5jpi8x NC$IYfZz5C? 7d=lի ٶm۷к!nA)Kʹ=5?OWp =}ף`WQ ;(nMGeUUqbNGՃ((H<ɰZnCwˈOuu(JVUbɢ i)#>z)C/CɡWf)X>ΛEHpݺ(kIIIf%wɷ PԠ='9Y2S8(aa$$:~{MnkVNHHhEEQ\wRZoŒKzF-7㹧"k)#NB.݉_ knl޲tfv.`(1GdⅎO$&1k<5Nsq)|,xzzӽ kW~ѣ{/^EQ:(=JYڵjoUܮh{̨/1=1LeLjR_KRFTş?DL^lٺ:]ssRaXPU^~ oӧ3s\7!a68Z'**߫yru@xhS-(IghִfV^.O ٳw%;' rssjFmF+(9u[P ƒQZcY,,UPcǑ~=  ppŐsQ}TXPU'DzQ=HR=w7 c]V:N\)ESס(E/C7f4v_a[hѬnMW١(.:2z͛;a@ԮUT_&Tq>ΛEHpݺ(kIIIf%wú})ҀEQng޽tqtԉaX/7׽z6x"bz*RR -(;G)IiivBCBԮgdWSPwҝ5 >;v-Hlk"HuEסW9 @fV5埯[.IL^$]Mff_G0zK \̛f<<`׫W(.AQUа!INepFAmHL<~H=fæM n<#^Nq̛9ڵk9qՇ. /r&9͵]mּWtt:w ofLr2Z4'sGlo-]n罷;\NK9d f?'<2%(/\T๗_!w㖘xұ֎_ׇ\T~}vZ;\Ol^XVRϞ첗sCwң##]^AAԨQCGЬiյyuqE6,_Nҙ3den+y:U)yjS\tQ<==֥3? zɲOw''6E摰O:E#FzF:c?n̙dN$&E~xΞ=g :m9o233Q}?O%K9g.Ӊac2p ߷MxtО`:-]Ft.2O/^CvQm%$$wB"!4E $(Bh AB HP@"!4E $(Bh AB~*ɩ$I";'[fm&"<0 S-(ɩɤKYf W3 H; wJ%L͚6_ &? 7d=l'׶m۶Ѿ} ( AAN<疸ZcYUPcǑ~=  ppŐsQ}TXPU'DzQ=HRNڹsYU񤤤2oL2{gy4WAw 䖛[9}DTMb[-?˯1@U ٷ<";V-yWJ[ *ss͡/UFKypg> ڵjʼ Dgy [|}errrXq-)) 6|{XŀJRA*)cٳw/ݺt.rN8pʭBH=U\xUUXrXf))ɄXGQQtUlZvА"׮gd~ e.  ++HO?G|wddc6ӵKtp]^e *Epli2nS\yOOOb"aj233ۯPU???ztX9TZd^+E2fO?XHL<~~~N`4޽'kƓu> _b{b2J}\G)4G).xw77Zhήݻi~SS;wLnMRM^LF1{ef:눷Oϝ(~2_|蕗G?y223Ks!1M/7ߐaW5U0ˋ12Zy{xێ?Cϼi.s]:K,\_~uu/qKoRMUvB}{X9J׭skPPNK 3W\.<???=ƬrQF#۶я,wfΠv)W8-(ύ#0 >q8 xpM4&(00y4L[sG^n~oXN5ͥfP&O*r\Z4G&MSO`X0zy1xr&4f`gsaKxLL>s;:ڑOjRˆ \tEۻ^~<=n,|νf] 6oRܠhҨۇ'N8ڱ#2"kXަuk" -z7܈h人uأENs۳'͛DxX}b{si yd0Я/;vvkXm[6WΥYXՓ={`f̙Vjgm,Y3g:vyu]+\s_δsX,;[,Y㞢A4p M4.wު(ƍaj;}'x݉eѼy$B}EX??_ϝի 1,|Z` /rrM7&Fƍ#|ri,44gϲvu9v@RRSM'3tlߎ LdİEvN6))i]s=!!L&Qe/>2t wk6[cG?Fvm5߸aCkޢ;;/uT&@hHݻu{in7y DSv-GPvCH^|ǵ%/leDw"A /V{w; J IDATyV\3G:E tJ+VZI"!4E $(Bh AB HP@"!4E tR$&t&l!\ɛB>2999߸dYb}|{؀EQ@UU>#gkC9,4dVǯw8͵z*22 -qL(s!X:N\^%(׎kįYEFf ѵs76oDFF:f?]D8&\s%Y/Z̻o_Q-kAcӓHX +TUϏ{a28&Eq͡-V'y3HG?N͚A̟3[&+h4ҽ{O֮'|>>Dd2{nRl2h@ӧH{oETT şcDL^lٺ:SqsCOOżMx{ŕQ]ce.5pq26T':G)pq_/_ Wy=6sqmls.s=GnEzQ(eU1r&݂b2K"hժU@vN6&[/݂ɩӧeԫXr-ddf:t J`@ t&INY$*ˋ'N[Pv;!!DG&@( 6<աd>//ϩ;'DUr!4E $(Bh AB HP@"!4E $(Bh AB dPINEf[P{qǀkɣcƲg*Kٳgˬ71ēDӴ݌ fΙ[%mK-Z=El|?4?kqJеGdYNl6mCdd_.]X]LrJ >1mZyj<6n_;|z;`3*:,_=**={tgS%)4,x+Z_ۛCRPXva0q3|hG~n }z]3ro۝{M߿3uD ϿBzF&a̞91 Vyߎۛ^={p,kzϚGDV\.>TmkP&O``l636#G_xxxH:s=xzxT c܋/iղ\?̼=L``{g銕tjYa#K^}˖>ĭX^Nnnth2αjR-^k˖ %51w7߲w3j$/,ZľymrFҹLJJj/ K^}r1?W-c5پ9fiIlnU4qt@Dx87ßNj=.=U\\/wq]wb6c63)| sqcFQG+Z3rpl6l*iղf7}'{T0[L7=WiatDxXcFٳV+iD5o5:8BPV3>ېuҙwOc/p3lܼrsIKKݝf͂k|G),,bh#77B+ש͕.f, sq̬,TU%2z"#K>u\[R}}Q)J_K-m3f_@Dⳋظe 3vmbĉtjR!!k{UUSxŌ9wH#rAttM/ŘQ#ֵ O>ʑ4/$=Z}؅؆긷ϯq@ g%''FP``kSxyyi֭Y*hd8uC> ~9}Bנ?ONn.ٷח`쨑_ !##ֿXח=ϳΝs,_ƀ3gPRR+s8h10Ç%Μ=,w!e=_|rxxs}y~%wo,[\rrsYj5C 2'ҥ3777:> )S.-~А?>܃fyadNtt=bc5}Y jch4^=3UFp 6lPz6؜w ?ܪw)u6h(V,'::JR5Gi'%,4T2Q9|$uл,3 J%sז-'5-Ȉp&z+F ׻,3 J%ݺv!nrpK9+*9HP@"!4E $(Bh AB HP@"륪*$$SPXW| ,$'݂JfV&1c"B\LfV&uu JrJ21c-l6.bоm{:zA)(, (0"J ݻիWU u JXR%\un ΚUop um nG($(¡>b{C)[ k[PU'Dz0HrߜCjMڴaҍ~m+ п4uz)R=x<f{^ŋ%&FRu( U^q3~& @tTiĭ[/,֫Tqo kV,X_ --)者3vR8 Cؿ1UU߷/GbZ+<.?FzF:㷑XlliiVYGQם$@Ff&vАcPzUU9-vqel9'|ʀ~]dgl0 m΢Ы '7f$i).r(مo ^^^ <Ï* <ow(Jͼlӓg r,tOOO!S-@ ƎǐA0LնQQڥ3s?@NpwsʟĐ}]|||kl;G-&УaXˁ~b[|{|ɓN`@c:7DttT}ը˵VUkǻgfԪGٳo?6o!<<>B۫rKYhݮ ʕW\q>zQ2i{|פb+a yyyZh@ ٳ|U$iii5֫KG3g  ^aá`JZ+GzMa/ {\nnGxs:Zh+͌>N6k @zs ?7tcզ-BFf&Yq.;訚ov9hnIIVڮ]M7q{ Ajjii<@XPXXԩk:tm6~y_ JjZRzeRjѲݯ1#FtJ<4#]_QRR7t4ϛ5:ө#ݯlˋT{%z:(S{>ӓ#GqwwgԈө#͜+iݪU5 tPz-]2>lO=x7ƪKY ymrϧҭKg#GΦMv^XǏeWAI Q] K^fάjxqq1;w݉ϴ;8.pˌ3(Ǝ*ѣ֌1FzFPz/ryw^4* yzs ߏUx.3+ UUp<d;(|ʽ W[| nzg1 MNv<A}^KP;v|fΠ ?7\xl 4.['p ֭=fWeKo X)͍>)]b_w6ˠe"j$"^Bh$AB HP@"!4E $(Bh AB HP@"LAa^ec!"<0InAIMO%3+1UpY$K <4)-()tb`*CB9x %DӶ{nzUuE!(0ȩCx݂R6TU(mum ΚW7Gg#z PA1=tEѭpԵ-s"=hGoΡÇY&vm0ƉtNՉ˥i:RBw{$(sy;ngd<2-KLn KQz֭g1L7(Ӊ[_XW2(ĭ$YױLaa!;AZZ*S&Ue}gHUUUns!xLUUˑģX ˏm磪*Vk!?FZZ*!!UQu(e; n'4$@tTsTU\v6az*.}@l>e@|.a6[P6R~]guUyKNwww9ʷ/// NŽd[QUѻJ[Pifl6I39IJ:'N)bGl,~m<2rq F# q,sV-[yq[J-yju*z` 4?? 2{ :tJvq+˾עkPΟ';;kQIOnv<36#G_xxx`Z63kaalxw3K^{V'a6kY<`Y`BCB>d7Mx>aٴt"#"9l3r ;O˴)5(}n6nLrJ yKx\H8S=ʟN3r$őGz$[߾֭'''&A*aXwwEHfgӻ qY0lذA:tu`%$$4ܡ E IDAT$(Bh AB HP@"!4E $(Bh ABVUTS)(,Ы |L>DG`p6t Jjz*Yt!8(X2 $X"NنnAINI&c ͦWXڷmC]/(QTTW ٽ{7zպ!nA)K!gO@?7Gg#z PA1=tEѭpԵ-s"=hGoΡÇY&vm0ƉtNՉ˥i:RBw{$(sy;ngd<2-KLn KQz֭g1L7(Ӊ[_XW2(ĭ$YױLaa!;AZZ*S&Ue}gHEqAv1?cҿo_$jVx\~\',4to#??UUZ 6R (;G)ILv;!!*粳 իTq}&mdd) ow}€*:Cs\uˡdV-xyy1dpvl'''?ފ3tpUڂ(M7fOOON!8(ȱLRi<==wOر#ܼ\|}2h&v=J9 ]tftѱܩnnW5y2x8~5냏omu(e$z1, =bc9Olgan`44`c djق퍛VZlSqeқm6ЫLvmYĂ IH|q49hڣnC5Q.:GET"=J $(L} IL& 0z%,nݺպ  0L\_t JdD$gΞ![2 YɦydsmC( )r"Q'FK'N[Pv;!BM.,jOQJJJ(..v6t;u焨/U.!4E $(Bh AB HP@"!4E t9)򝍛[v3.X۷0h(V,'::r(De 5rgΜe ^^ Ɠ<,qfB:h4b4b6WXh+qߜS49JRiU|=MJeFǽ{OJ:}YMp!nr&OǔI:U&\U ʅLVK.AhhMPT擳!Dy"(N̪5qkӆI7NtN\. KSס(#Gcqۭ?k& Xh!]bbt+U8_]^Pun=ǎa¸DGENܺbJA&n%!B8p>e R2*;n'E0( $(?'Ob6<9wz v [(l2j9*٘3_Lv0Tax2j أqEEE,{eF0p1ϓGiysϿY3뢯_9(X&{GQUzrה'X[?qooozά{J{kZ7}f{l,wOzG Q%(3s̤]^r /_AV9 Ͽ/_9’wow/Ŷbrr뿹vG +Y̙uockK0 {_@QTbWL˔;ng`PB+i騊JDD8۶u!:y2!!1n(?TENai ѣa1ϡҳGw-U8jBUUEYY iƳO=[ôJ&5:jeCsnIs 9 peĭk_ .[ gϞeMN͍TU%44ӧaz'~c?oϷt׉ g.sz5zϤpwwgs/9ıla„'PEKNI&<,))Z|deeqi fcMMN}ܩGm0(lؼ>|™3NZkΜMNfI޽}3%5ȈKZĉ6lؠ:)stYpF#k\{I%$$1q˙Fl2/מ±)08G[4-w}ۗ(r s6i>9J 0`2JXj`0ΎF"<,6z]Nc-r.a_F",4 b'%%ݮw9;ᄅQ\\|KPbGse+k}lS*6 Z%(j-FNB HP@"!4E $(Bh AB x@ !jKNdIENDB`qstopmotion-2.3.2-Source/manual/screenshots/dialog_add_frames.png000644 000000 000000 00000362335 12536560630 025277 0ustar00rootroot000000 000000 PNG  IHDRTew6CsRGBbKGD pHYs  tIME *o IDATxwxU?3s{z#[HQUWĶm XDqEeݥ," HA@HBm;$!$owsܹ̜=o9FĠ:&L0a„+A(,,ҨQ#}Y~*&L0a`ҤIX|UL0a„+]׉(f0a„ WqqqXbbbA1a„ & A &&&D &L0a„+,&0a„ bcc84M30a„ Wp8I&L0ac|0a„ &DQazk„ &LJ5ׄ &Liv6a„ &~5΂F#&L0aBinj&L0aV}QUK:6a„ &L\q)0a„ &0a„ &0a„ &L5a„ &L5a„ < ]fhd$1MͭU1ɷܜ\N;fØ0+AHԫWZ)x4 gn}=tK.tѤiSQU7''&VWHf۶-ӗ(QLٰ~=mRAxعch:1їԷ (*_]ЛnF j]EݎfQ]`@ izf| Qزu78ĤZ&L͌ՙXBu%F^~_Mu\c2y .qӴi3 O/8Nbbڬ8m۶CJ)"ǏgYb@Zul6sN$55Z|`o t_waI(L"VoаZHuݨZ- id>EP;%p>b"##q8WA@?%&&V[#V E*!y}2 *K躥ުjvoͤEi:Gǫ:}6ۙ~tƫU yۼ4i2~2@5$ߚI1K Xhfj<ǎPAҕ lDԩ> ͚ iߏ(ԫW3g +2QQe=~Ȩ(;svfSDQBYo糯!AϦ ~ tt $iuZًvoϚM>} 8!`wfYYhVV,__W =ܒBXDA 55ݻ@@$22ⲽ FQT5.]YHHB|":5_X-=ݼ>q$( ^o/&?ЀR6TՅ%TRi᪲,I;v7fPNyc[aNj,.Dׁ@Wd~ Mר\1T.W@2(UZ]),tm(JPrDcfW/:tkLJ @#*/A$ӺqPEru94<+ӽ[OTUEQv-[jWvǂĉ6"ڳoO|^.i!&CFD:ub6bCnkikVzOj$u[H媦_"r 8u{f +UhgDJY/N!߳PmZdHBT+ y.Z^ O ͷB޽CPLLNIE Qg mk:N ȲBPVs#J]躎^~]Qu\WMzRr.I,#B\g(۷ rgy}[ _Q XKjҦ捛庾EMOHD2`ۉc=ke8pbcckD>z6i!/3dPE\{MݰԭS3XD&GVTjyiNj^Au"M4%UU{pAp~Ս>,Uu 4MUVL<Ͽ];EcrmihBH«jꈈխ[ @LtqVC'[UUnV;vIBxIo4hg7ߤW#+bAjbXx뭷$4~?^z'xłba۶m.raZkN@Z~׫W/wwеkKE>>\Beƍ_щbлwo>:wbA+I#%%?jJA9Ȇ-4pVkhqu!rf$tWc%C/q7)ג(vRٻw/P\\L-8}L A:EPiڤ9nw!^/_^IYLQQîݻʬ ‡潗SxqӾ!3/%Z&$҉q'%MUaxiR;uVbl޼Y4۷f+=J8KUBk_N:vH*\uUԮ]zk:::M lEAuVywxb$ɘ(UU%%%cGGtt4_׋(x.kߥUMftn]dZmo( i ظq#K,a</Pkt_Ae˖%ɲ\we8q"Nv(oeΜ9$I<쳌?7Ҷm[ 4Mrz &%T(X,-ZfoGӴj x^ڴic- [l=#""E񼾨J_pr~RK?cEQ$//۷_3rEie ayKGi9*/76-=_;˖(|L<'2{l7n\] 5=zk,wߏ>*~> zfMq1 u85mVő(=$QDUUbcb)**DV4]fSvmOx}3Eu ǎ#>>6m˫r#lRw8x}' ))x*ހBq@A ˘WX7ވ$))4j׮MVؾ};$aZ2e ͛7gذa*_xi׮=3f̠SNL:UUX,].]о}{;ޥK2tPV+O=SLaÆ|gXV}Q4iB9rH{gptޝ|EQ8y$Ѥ3g3v2fѹsg{1ݻ7A7ofc„ 7vO0}t:voidddpM7ѣ X{cǒO?d+u֬Y1UV1rHV+V'rfvJJJ W6X|9:ucǎ|a.ZvѳgOS.8]l;vSNƘٻw/7p 4 11({,Xw܁( 8AXhs;v;`уcRTT<@ƍӧ'ODE, ӧOUV4jԈqaZcҨQ#qV+(-B.]_jk|*hÇ|r&Le8yyTUԯՊ(?q MN]8}& ѹSgl6nMՇ߬񐔘HݺuX мysR8v(JJMl瓞Ι3gxnEG^E{XmsI~`0@|x!L~ {PSu$Q@E,Xtg>W(:Kb+@$U25s6m0n8|Anjr-?qѩSs&ka}5j%/kz1f%ѣGaw8jگiJP*~E%(k@PT ȡ!o/_ѣec=Ɔ 30l0DQ䭷bÆ g֬YҲeKBP'>;3>}pB 1cC ޽{yym]ٷo 3gW^F4moͦMx׸h}ݻw3m4y^~eƏ#7owa˖-L:c-^q!Aetqv;-Be>s̙Caa!_}Ӿ}{{=Zn͘1c$~իW3o<ƎˡC3f4v۷sA^y$IncԨQlܸn~h&)) Yq:kF{U iW_?@qKmpd"&&Cq ; Q*;w`4oޢJVlbʼn'8x 9B} ZDD5ԫS={vÊEB""#;~~?pGJb5t4U' kA4G GNNmyE nVXos}ࡇ@0#K6m=zm۶!==_~ǃfɒ( ?b\ hۦ5@O=p( nݺf$QsK\l,(+ϵrHMMe߾:twޙ=gq;111{qQc]wrhѢ9cnj]vhт_~vڑq:9sǃn6$/\I֭]63jyw;4m֌޽{Sv ٶm+wIΝm$$$ tMc(–-[ڵo i߾`ӧ3HH/!?B)-d׮e6mDg-{$C Aej׮M gǎyt]Sz>U:?믧^ :Rq=zUC{֯͊F4MFQaNš5!˓q\]zaÆ'pI-3 dAx {BAI>͛ wEF)""V[qFvJNn6ÆU&>6Ozv.^ݍ?|O+tPU$&$b,ԩS,,V q/tG0ZAڶiS-B4fMsafӿo'^/qqPTXD0(Han5LYf5i/U hDXQK:'Z;bs܁lKQq]~:*# nwY E%#ѯѣGq@ڵOVbF;U4Ϊ z+[t%"-Z0~\y38vё@:Y!M/եQj#2u*S^~Si@UUEAm~2m%>@P! kȪf,4JE^`0h=}4IIIHpdt{hF%fEQ"!F{u1ct!֭ JTAc1Nf̘Nt dXEo֭Gu;FZZcǎbpM7qM7/""DAmР ?N LU W?m(ro݆,+…7n~UUyꩧ>|IIIEg{ǍCUiU]d%ҥL0aZ+J ϿPk ԫW'Om6TU mێ(Bvv٢E\Zd  (k/YjfgO[LaUtZA x `bpmc=·2z(A0)snڴ)w;hٲǏ'--oΝ;!IA$ @~~>>MӘ3}v;8N/_N޽:- V"11 iٲ%Z &&ƍdn2fn)?|C$Xt;4MN:,^]t~{p 4jԐ|!CnQ[ 2(>࿔"##9y$-[0[u7o/O~4l؀'i:m۶7ޖƍsQ7nLv?aiԨ!%J{B9s[&--#Gиqc:thϔ)SUj%itЁG}k}ѴiS\.6lg9(!y""#U*G{uձVU ;wkzc3x}>ڥRܢK.t E oHNBjPh;o#κ8nA# /N! UZ !Xm,瓓 x^4d=D:UPAVAHKmTi(4k" IDATE =cN_KU;z!,]Pbqmk`BDIiӈ0[$צJtt`~#'Yb6'3Myq:hVr}44_oXV3grp{*B3}X '|5/6 ͆iH ~ml6OAZZ*<4^kCQ@ZrRV-֭˻vAݺ 62y$ckĠAIJhNvxꩧ/ٳ' 6D,oj*ZjC=fj2gFmm6}5q3i$4j yhC=oGEE@0dȐ; 77ZwP^}t]G%~y?#I_(QaKѣGiٲUcRPPh\1b8͛7gYKصkÇ'>>:uj3kLeիg'O#::3fe5ٳ5c7|37x#3gͿ*nzNӦMYS/>hDXjՊI^⣏>&&&3igQF]#G4;PRfRRREZJJmjƌ?/zAzL2cŊlvA1sL͛…HJJ[nF~DFF`'!uism)\o^z%Ǝk$1) U4M#&&.a÷w9~Cn¼y3~+2G:vrIUC}Faa@QU,]'b<2%<'pb6.##pZcǎRAjբK,-Dlv D,USHa0 A_E U_ }N\b=.#.T@ >bmBI8-u\z W $IƶBmy _dy:]H dddlॣ6ÁtxNXRڼTZG qqq{imo˷gu arQǹ 4 6TZ~ff&j2\{F4kfKbɬYnz>#@D*wo2ˍIҭEEv;;UPXȑÇ Baa![7o宻Zn傦:}IHJLСC~R҈(~9 wѬYsf4߀K/倏?_r$.Q(u#3[ fgeqz:wDNݘd= ڲ CbbE†wP76"Z7::7ѧW7ಂ %'D+5#y`HW/ncMV+ }VusE+ e.zrJ]T“{U'}'i {x[V^Q.2Y}qzr-l+Uo^z1Xw|aKÅbY^0?~[VkժUaTE( x<9;(wRSχ,عf͚O?IlljwKwSuظxWsP,C4Ue&n4R($% uHxePO CnAq~"I`)!_zB-I!"BIv+peEN9MdTtbp.˔[̦r}k/u@ QѤ5c(JA0tȍT7r([bh?5V&`0x^ʕ^H[U ҽ{w Pkį)"iDZ[V+Zy(rFEA`ߢ[CDT2٘0aםkmmϭa rjI|oQNL &L0Ǡ _KtX0a„ 5ͭ4&L0aDQ޼Y%~>7j/A7mV&cN Ifz AY3 VhּeIvK _I9 開3cԒC yyč|P4Y\ј0a7/вUkBGEEQe9x?Lr/{MEvXYʼnf6b]&hh' k„,U^h1QЉ*jȲ" 2 *2,S ͛s ut]0 Qk=t80>r3#iM\oʨ٦F'hӪ%5TMCB-뺎hzt O#&`eUHt6N9J/9ƩM,զ:}EU/5%EQF%e &?IY5HDQUtnb4N:$?ُ**Óٹ?-R]$*N\+?En0 Q 8*`Ifvm[vtpۊ˒$m;[~2-$=Ptb,ܞ"$!K).NJ=vg%c_n޺$r:Mfm/pЅtƯjA,@DbhRV * jaPe-UE-[6" Q@Wr.4o&G^5B|f!:t^Ēk%;70 UU̙<~. %mPhD$nnU`nZY |v'~-={{,sܹsi߾=C a׮]wL0֭[3n8B h":w_RZAX~==zG,]q!"5EQtcK|ӢpL"l6AA FU _~;zɊ+Uw}tnfc|iݺ5=Fyo}̚5˘ O>C=Dzz]8߯,̚5tn{^|>nrcM cӋnXwag^ӢqZTtMGV*'`0țoI۶mٿnݚ'|~G UW]_FV\I.]kYzQڵkki޼9#F ##.++?nݚ~7dʕEFeEFACrH[ VΜu.*$Ҧᴨ^E+@Jeӌ56m0qDnOԩqߥF䫩qvadd$ё"#q"OD@%+TU m̛7iӦq!nJn*U1iU;\lilٲO?ey4B& vݏ]21: N,h ^4Ň(*UsVhkZ' DvIl֜ eSXNx%,>4ҬN$EU(ZԍoNM$>y<9s/T K\>-CuEUxVQ7& CP (E YJY e/4]GPqRK !ԍhZ7_!NI\9("- }Fş'|I6l={xشi'Nd…,\_ O>o 63OsIMFfرcm۶eO{7ϲxb>SMڵkϛ܏;庀겫**Yơ{p >\b(Jj-iNuHP&G x<gݺu?fʔ)_>]vyf}Qy2334ɓ'sWcׯԩS8q?8'Ooaݺu̝;אロ[l2,X%Kٻw/7of<3dggi HV֞j~\ B iR78t,(('(JeoGa֭w}/!//`0?OٱcQQQk>|{^{իWtR͛_~믿ywyضmiii̞=3p@^~e Lcl߾oQ9u]GaՒJ7(:ũ{(ub$֍"''IqZ42 z"TahA#Wܦ^'rmm64Mcƌ߿3grJ,XE<ʊf.֮Yf_ʯm|n6{/!Y,\lo[oiӦM l޼!C0l0v؁ l߾qq73j(/^ȑ#yC }G^?B6l,ˢEضm{/ӦMm۶O?_~}x<ϙ3g;УGTJ֒щpSx}#(kP4,Z1VV?%'MUHeǪ=$q 0EygJWJеkWjyx뭷 W^^z4hЀ^zW^ySE׮]kرc#Gtr]wo>dY&..QFѬY4{W_}:uаaC^|E>4߾}i'NdڴitޝǗyuq7ӽ{wW5M%Ԟ?Zñ9EZ+ qvRC"x˹̜97xxgI_祗^"""^zQUÇsmt:=z4}۷ogСk׎8&MdL 6K.8NׯO:uZ̘1^xzM-8tP<#0aݻw筷*sߜ9sѣzm*:!<6q>nɣn`IC|0^2nӉ'rӧ~ q:dʕ"{u$$$0e^ux ׿DyǍEKjj*-Z  w^Ӎţe\.ƍҥK< ̟? 6PTTĽ˰aøٴi1?0azIN8qD%J]A)&5Ԣ{),,ѨV?33S2w\|>> ~)yyy2}t{=}]f͚g}Ƈ~ȟ'8|n&99?̙3 >9spAƍϙ3gk֬#رc4hЀ˗p8. : [T%H3. HV1!{rearx;z7 -QH4AW֐O8" _*$BO@#3_"XE]"#E =,IXEM$#Nj$rL8;1D?(|,:'cDDA#T ?rCBS5%󷯎Ik`*ú!TP5P-!M%,v Pfʺm=ʺҴ^Q @Qٹbbff& 40̘iiiٳmָCԫwNޛ4iٳgjiTTN2Gvvyukڿ{|I}Yƌ|ˍ"## 1WDLmK1EbiC=}~M_<*şENAٳQUMJJrYp:XfEVVM41kѢEEEjd k 2Ĩ+99٨aÆ tq~~m&MĝwIdd$Gfԩ/ZÇ_vxѭd+Dy,j#jz"=Λ^E?5f4WeIJJ2득Mdd$QQQl6B֩ IDATwTǿ{_z_DXR 5D_ آ$"E X^ M:l/So}3"3vΜ3s)))l6O_|#$DBu4?s:vȂ ,^: d-S#֚]WRwtzs) D{<1躉0f8: @t3j4)eMqEt%Q!㔨m"nu):`^EՑ$\YG v.$V"6Q5#^tNeHv-Ո@Oc׀uCixIɺ/Ô~F3 F%RD%S 8NJJJy0lHDII 1^n%^~ǃ"XQnĜ?tds5,YC=Dffedff")(ټD礐{͉v*SvgOBrۉOg"lB)KDz8$BV}'++ ˅oXiA:}t\.-%˲%F]Hnn.Ng}{7"vݲʡ /zӶbZ>'(q@v4MCQv;arz-i| D*JKK-zq:z5j6mb̙<̜9ɹNp:t҅saK)-)Wt4 CHDdJ(p#_1;gn7XMT\!!Yq\4ɷgCE\.i~v6 Ũcsu70fX22‹0|?Fu\Jnwvq7X+pG5p8DEQ #VwD!h ,P(;v,&L\]>,?37,7R.EIĥerN%s٩1!NK&3{l|ۿY+%:vYU*21nj:Y.U EeeDTTBJhTb?(FHNrSV"(kTb=㰉*}2qh:YI.Q4 UM#KȚmfIP a|!VC!%={r'2zn6T+ǬO5o*EDn$1b Xڵkٳ'{b/ 05kX׶mFnn.P\\lYQQQ6R۷osdYf##)JWTME ZI !*DEVxF"c1Y#'AJVkNVYcO?^_d庌tk'eeeOTT,TTTDrr2nvڱm6k˗o=Wxdmӧ|5WAAYYYSkYE,[Z5t1t TO6=6W#/99rbO7s>>7_Sc<ի7o"HLLD$~?deeaԩk/>}XzXGcFxo>rrr(A'`0@u@?#5ؒۓ޿?];Ǯ12c2ǚ,^?(OSRRbvm۶tڕkZO-.|-߈Fٴ,r߽uܕKcw8qdg向 y!r\z饔pPTTDll,]veϞ=lݺ`0%55;w2uVl6s 55 ,##{222=z4_xgtܹىA6"7*I_K`>HODVqeصs'ЄhSjǁ?jPZ-#Cѽ8l"kwq5dUgH^2-ڇ!pQ E5HOpC` FLcwe䷏U3( a Bai| лC{x)O0Hs:Cu@%Wqn*5 U>({FlgYacy3E5*>w8ڶ$1^dȅߛw@=//|I/ wIHH@$ykS>\{HĦM(,,o߾??Ox㍼ˌ7βV=,Ȳ޽{IMM%!!S2h 0 sZOS4)ƪU̜9ɓ'3qD~iK89<(;`L.}YUT㢸dE!# >{9HHHK$$$0k,K~yp\xЭ[7ϼy6mǏ'::ŋ#Z`РAVtyᑦ%$C dȠi &(Rtغm {'j[T!:紎Ϸ4X0};&5'_pAs.$QP[v>U^E5 + )\\`Z%*s.91sQa<Ͳ+,a)UxQ4MF6xB* HJLbQ-Ql6z^oLB|ȫ/ŋ;w|İ|ryt]gŊb۷祗^⭷"++w}L4xϟѣK[oqa “O>e]ƈ#嫯mi˖-o /dĉ HHH`ҥDEEI(✼sxZ`0(p8=/OٛFA||<˖-^@EV\Itt4aеkW~i{=Zj+bo?sW2f p0|+/omڴ뮻7|2;mڴa޼yl6K}u~xaq CϞ= r27=v|qvw?Ʒeذ_ r0$BLU?/$p8ٶu+ݺuM՗$I?KjQc'{ic&*A@HdahpEEtx k뜸f4HhXo.0HqSQ" wjnuۈrЯS"EeTm1|4۷o?(cή][}:=Ph4>8Y(//'66<&odt֬YVf먪j {}>dÆ ̚5 6:vvV h2s>OPOrr2999\f!)}5͙rJ.r'ٷ_VVFQQ}@Ir ؾ}iJA 33&!'zuI68DVfNh8݊@`u}1?&]}?ĿKJoއ-K[U5V&TIX\?"I"+ޣ^Wi ڹ<ӔzV;ibb"-`̘15xOee% .޽{7yҭ[3{\}\*w>tl22224;FA`ڴiohy$fZjŽh9gݺui`Ė4dӳ5}-|$zH g'EhP t]"Ume P Lo4Y1v&ď} C1 ݩF6Bs@(kƯH0 !i$IZ΂<&v5Wm}FF7dՎ6Ʉ b]"7BRQF^]Aڧqmx+VͭaafZQIETD~_;-@L5z,#wn9jѾDNku[aUGVmkadUWAdd׮TWW߳_ #kѡ#__WYܟtA!C*52" I"2D+{B m1]IOl-eC#)1ݻwx "d&iU2J1t0~FEl@ @VZ.lnԣ n=aлwo\r#A(P\ZҨ2LZ;62r kdguVVcT <,JJ[X|~wc-{h _G ^S9С~ILL:t/d.:E6l`۶mV+ȁWTTʕ+IHH`ĈVE5)(TE^O6lkX^*2#g#-AEe K*pJ`( z10hf@!sZŐ65=$73:?8n IIˆ.rLM7rKL蟎]~7Q4j_x!mbƜ5h]޿0(qCҌ^/l)#>F .!HScV419DeE%NIYGK*Д 6F&f4Mcʔ)lܸ 7ݻ͆cƌbFIuu%xvYv-7xفE裏x饗HJJ^0 1cGau Dׯ_Yn˗/or5&X*4jp^B(Ԑp*j%xfAqSSSCQQF"[o%**+VpwX\z-z-x'?a n[""W]u`ǎ^D/~]xxyG)//oErrrΎF BdPQQνE8EMpH)55^=p Ӯ⫪" ~pt./RR@q}wAn.E=yOq?vY1!Y(`JVpq~S>#m_l)F`iqTP/ 9B}*&DRq IDATꉖ `NdUouQ$ ImUA#<]w;ַƆ 8yw={6Z"??n4]am|`00`~!K,u֧Ok䠰lx<KkWP(dn 4GS5B˨AHh3e2/r {&!{P䍦{^&"=&L෿e>s=L2#Grs7}vvSO=Ezz:yyyq\z饬YD?v2e }={|tԉkkaÆ5H.]E$IBUUGOF(BeRcpf?_x"HDIpSpNY -5* +_~ֹM>iӦ1d.n `Ŋ<$&&ҡC.FҥKiժnn3eϟʎAƱf&و4wKc'=2-qog~ր3sm̎/a,_n^vG-Ķ]BG(-GG(یP?&(w}7W^y%WF˙:u*7|3cǎ%##䖯#>qǏ!Xr3o8n7pZI&YǏϦMXz5#G;r!|>`ͥǾ}4h5ٰaCywͶm5jT(0~xKh<L2I&q!Aof +$+8줞I]HF/?ŀLtWL4юhD)^o)))(bkSBBP:1Lݎ֎&u]|g}YFA,<NJLL ~!O=s[n#??o48n ^rIC)پP%O-śTu]D|H]&P(T*8 p8,ՎG֟juX}[Eii):?նp;wOBnEQ5J/D 4 -Ή?Q ):)sp+BOFMZ 쒀&RS,װ:ukaaE[P :nC:/"~/g},S$}I;NlEBێ_q\u^ 1\*NO63v#7-==݊F,acY[nmٲ$$IIKK###@ 뵄{ 8hzMr,ڵkcǎp]̘oXIVLInCZ$eJLݝJ5{Dgrm7m֭$''cq\>|8--tjjj̵PTRRRػwo{wsҩSfY( ,4d{۷cۉmrlM7FE'ѣVDUdxZ|D{Фh˩h<.t:;vEEEFEEư]IHH %%ݻw[ڵXKxo۶N%55Zw\s5O>9ed4 Mnn.ǎKff&.Q~Q&3MjNZߪ#vgL/e\}~,d!Q袓FȠ9\.WZZ(Đ̎;n߾xniT EOY q?dY>[nf.7 [9}]x`$`:tg! RVVvʄ+d/6ނyo~m%5:ouc btCx4u]Q>x ?DUŮ6̳q6KK ۊT6$mה7)n&^yB[ndddvIOOg͚5Ȳ̂ ,Yd 3{lo={6555?~^zc6HFܵk'UTAF$ITTTcrssq߿ݻw 9!}v,/c UA{jwUiAMG,^/FydƍB!y&L`5ϟϑ#G|<z?\ՉkͦHDa}NP+!+(k(6X&{~~>=Æ cǎLZZ/yN;N|!hОmDR<ɮd 衃m [OVl/eXTnDIU/6j~JGqQvaw$Gj8$$ lSη+K"w1k2ن|[ *%\xN*;s}m1fഋ& nyiGVn/m\90roe΀It͉*j{)fpc^ $9-EQBvn Q BpЋKf+ttGRbEEE w~rVV~;ӧO5nڄL8]׹XЍ7SO=ň#HLLdڴiV/;YfSO}voV޽{cڴi\ܹI&Q]],˼/a5;vI<旿%k׎_0O6Ç7殝q| `j1-R(B~Jee$$$ڨ>vX*++Eɓ'[Ǜn'|Ç]wEVVa0eyf͚EϞ=-oߞ[oSR^^8 Xp!̘1ÊO> r}QTTĘ1cҥ s0m4z@~xx;3gMu ]7p8ܬ<x5Zw)dEe=e7I-ٳ袋&%%۬YӟD>},uڕnnj&Lɓ+K.ns7[qW^yz 0ϷEaƌ,]Rky;СCƌS/Y|ӹkA&ON ;SIWʤneB>?{:QYo v؋/iQQQL2G}syY }={dqW6Ե|u]c KIOMh/ap5Y{X)ݓU<Q5SlT]6wW{9s(E|n؝"Phd=v̓+IwvI@}%\ñ^QuXBk3Wd`&i:(%"S|sD涉7 o_@t#γWvoNs1$l۶VSRVB^a)KHd޽^#Gн[."<Y?`?_a2yl/X]uPע6{.)n)iO Rl|x99)x"y-̡#"" 4b쮓 HNd:nKpנNX$MSs a!m᲋y .Qp"aNL&>#'ԇx kHd%wz],xt|t:Xy=ߏ k,D |̙3Ç79vbBo5 U%%)=zҶm&ݯg7g2^sΌ˗[(a qVyQZZʜ9s=ztcbQ7䄘z8A ڷ@IMMm}6gEQعs' _4M߻ed~λo!‰d_=sv3uJƾA>yrd&1‰iw MC6(a O=ʯ&5d9;j’GѴI\fv̆ڸJBk1[vp~JosPSS@AÇRPP@~}sn^S,tt:gof@SXn=` &pW7z~FG0zV ֩xɜw:]8v6jjjx<|oof\.J)h0D$NgI?5Bgv~=xٜM)$pKpbumgHBǫR[nnx is.kBg[-T{GS3N{hLcM;s^,s?'3u,(7TB-B"|D$nkZ 5tEP PmSYV&L8I^F ߺ Wg n}[h O[bpcWIrD"ÌGp-너JBo2q9'oݟa>h-<jk[蝍8VZ]d ( Yi  AS4ku ݈?%򟆗<]۳/(0JVǁ.hkdxrŏ/ٜ}km0FE_25xx+++;ҥ wy'x{eܸqуGo'//Ϻo˖-\ytЁ .&Lh5̄ -q"U唖a삂Ǯ!h!lxlnJSsҭ[7&NȞ={,++[nK.w}Vw!AصkGgϞu%?sСCY|5ޗ_~СCi߾=\s ǎC4Mc 6vqR\\ܠW)bwFQ0 IDATSD;d2l9F(PCMMNMG q4lb\p t҅3fXh\ }vFA~~>NE'0X#EqAb _d' */.N0ڏ*5?jbFz~h똀u- Ap:$F}UAbjǻ+~}WΉψ"tɉ{^˷2T@H5**2$/Zŕ!y&$dD#@QWXeE3ֽkNHOܯ QK"JRN);ޛGU_{dIﻠTUbEJGXe)l]j(;,a_Bu;w1K&(XjWSґFu>}:w7nd۶m @1wo:>`ŊZ72sL~sTȃ|'eǎ? ޫW_5pDn]m6VZy뭷Zl%%%Q( UYEEn삗Q&ά1F^_%1F,=Rc 6x 0<6m/͛xٴi[neڴi̜9J4MGO>رT5fII ӦMfݺuZ^{u]?ɋ/o<bW5:t(Ç'!!Gygy о}{:vc=Ƴ> c=Ƃ gȑ\p}vn6'OfϞ=A:u*ݻwt]'77#GCnn.;vlE B(D< .d̘1pl i&n.b&LЪծ( `"##G ).&i&;QDط{YbQjjkBQ ,Y MΝyy t2fzQ#G_ wƍ ~N8O @^^><ڷool^y&LرcYxqTZ:+yy&8UYGvxԓ(up{}(E;w.\zpI~?555\uU0}tV\ g}-B>}HMM'4`,YBFF=z`̙B=z@UU hİaf1lذF]b[l;뮻+۷uMM <cǎeԨQDWr1&_&?fGmm=>vz='bU]iFغ3!Ǐ'660LVZ޽;,X ݦ|\$*YAd%86IaV(tHֈի9|Ͷ#SŪ7`7E% #~rScmQO@*fI" Թer9P^,EEʃ((BaE,ح%UAPVfpܡ>_ 4qYosf k@SՈM1k:cϊvK( 6\>0#.>YY +o0 a^O5H#\;z[MVE^CMjoF+k(|n7PQQA߾}k @UUS[[Knn1ֹsg*++d2ީnSYYٺ4Aρ$p -ݱc{n:vȚ5k0y̙3>}:wqa| qO26 CrϏ(;936WSlnhԜo UU'++0: vc3OHHd2QYYIEE:*޽;-Bŏ?86'z뭌5*1C;0|JeCʎmHr$(5uI2B=I6v|>_ʷ5IRfi=7łb2 ~ L`0ߪk=z4{7oHeٲe|,]W^ysWH4U |$Xϣc9o ګtM$fK_|LҜiz_Ʉa@ jxZtb2o7VWWG|GV7nvbС-nʯk}Q1a 2SNQ__OLL ~;O>C pQ`rb\Ѝ:n.Wyq]Sl #DbbA9v3nw֔o^Q٬gצ|X,C3,vHnIL#[OrUR#BM&+f>]=@'+yd&TM U:^9H'nB5U#+Je]PZSf B@Q.JQivJ@Qid- (4xCT5 )pkڸg o/xGGQ54"`ŅPͧOg|!0'snd K^&l!'.@xظ$>9Jգoߞ'Nζm YƸ>2 ֭[}K||#,˲ MF 7Tr;9 ,i19$*sL ̳n#vQ;5O>ٳ۩SHOO')) A|lK.֭[GVǟ2Ҝiii~à9|0:t@u?SoaX0:jq䧏cO4u%>s}̌Dd_W_}%&( kJp-U OY9@.ʱ2 eXL[pN| 1w*Yy EI6rRAG븤:fp +( \3Ncc̍m8Z<]'%JMcZ,?QU璾i;̍|[T;A,&Bs5*P,^Lȶ }bt ibٵk UٓR/^СC={QM;c FArr2$?m۶SOq뭷3ϰc99&Lܹs6m?~ P%%%̜9>r4Mn?̜9sZۉ`L4oTTT|̪y0"C< uҘ .o{fΜ9F~2 2gV\IYYp8HJJĉرcE˗s뭷P{!55ロ[n[o9s駟b6[ ;*.Sb1=yDgF8@ :fϞɎvl@7og'`͚5F^Ezɣ> 7:u*\r K,!33Ν;??#=$yW:<.9sp7J_/GE999_  9z(XVy4h% /oYFV7ihRYE6;ffIl۶N:Gibb"YYY-6=%0lVO*˖-7dɒ%]׉gÆ ,\UUٸq# N׮]yx饗}뭷t:y=z4^{-ne˖Q\\̀ 7_ѣG4i_ uРAL6X,Y#G_]׹kt~t?;˞~UwQ 8b(HNN , )) ^zW^yH#DV=T$I8c(c.,+_46}%IG_^{a̘1躎ng,Z{rJNᬫ{93\hVnuxC-<֮]9,lٲ$Fj5v͡Cԩ76roN||}ϥ*} 2hmؽ{7'Od21h c;wR[[Kvv6#FhSUk2v8ߪi*::Mj]Av+W!(V1VXXȗ_~Izz:Æ ۷={4ޣ( ֭v3tP֭[jeȑFkrvI}}= 6 Q4G~dYO>t%Ba ={HHH2x=ulV+i jA׽$thEynJqq1z[no ֭2|,峡|9 {0**'I3Q[@eU-VI%(m c4C4H̏O3$@_xkItLw 0~@qT]G$9-;L\?2 YDt6C20Dڧٙ00Q !ΰ΀N*b!7Ն$b\>0$5EC }ohj >*]cItc%a7kTQ^YcBJ"[X֪ʬYqLqo~<WFQB~!K.E4-ZoTUU1w\ ӟB̀/ܴi7tST/:Wrƪ{ RbstǞ' NS][UT@CDfW\AQQL0k(SYj3gDQt]gŊhYrxMƖ-[n駟iG᪫ѣu#|fag%(cA0-VLtn Fŏ?ZĢbsS5NSYxua=NX;*PT˜>)ݒ)>g}Gm+!:Q'>Α2;%T58Qetv6l;\k ;0A="YV3D F>F"C\pFɨ #*f/dA4$!M *T׺<ͱ2_c4![PP3)))w}|,] /Ƃ?>ӟ5kSL᪫`ڴil߾ÇOбcGνu]GZZWz70O4:D}ޱcb2 ^B^PXY50«* 6݅$%dvVN.RVUE}Er9ٳWU ,K/{1ŋ3gfϞʹi ;ӽ{w>?Ӯ];̙30a[lnCt:~;C߾}#peYz55QF!lk顈"FEId ZŨU )QH$Ilqyى.q#P )bWSIm]qhrrEq2e >cѢEгgO̙Ø1cXf BIo2o<&N]w,2/2SN墋.⢋.[n,]4PL&Yu?NEEyyyڱcG#kd2EV(b,%j! `h݋&+IlrCrX쒂%'BXKIy=ډ;v8:w̼yXr%?g@k6GDZ| :h* L8VT%.@^$qtw c~56k h:n_Ia9 (!ďJIVD|}';@^= a*/f@'a64 a[LT43bE4A<畃W$i&3ugqI4IPY ~53&t #j:ElP٬{5pbD/f̓]IlrJԡջ\@"۷A\xl߾͛7G_yغu8q1ַo_ TUUѱcGp\H7^u*C7WphƤI7oSLaĉ|W@}}=fo .0 ܢBag&%F#xȔSTRM>-ѪvB^̾bCaÆ+u߰aƍ3ƺtBqq1GvBrGEE^cǎJB8Mt ⋍JKK_ʔ)S{[q饗?-7HYY pa.ZϴiZɡC!F`=d'qՔNg!삚 h8<V$Cii). QIIIk׮~;/IKKȑ#z ^f/1I ́ jJp_CL[ ;AB{͡Cػw/W\qq/Kog{H@SAUBhEv## GZz0@ɣH>S5~nMFX1̨JPWQ#rA  J(PTd] Y` (FAG'tPj6AV  ϥsM?Tʟo5ЈuA`PCǧ+v|yx3I UӹާG,BMװ>b7zcOI!P[A=9˘xb71-K1!ϥraٌccc O' F4|OOO7< A"f6lnnwD->>0Ν;;w.O= nSUUEQQQ ~`lN￟8VX3G1˸h򖙙γ>:`С8qel6i68`!>h/8wzYȏ_tÎ"8Ng OCQ^Ν9|0Ǐ'aoe˖Q__OCC/W{/>,@B֭ 0h ֭[,|gt=j#ɓ'IMM5>|p ;\fCejkkQfEAa!kk|>h/+[9R|2+> vNy˦9&O̒%Kp\ձl2&Md_xdY6 0Lt҅M6!2| C5-[PTTD `ҥF;dF?]aa4J4)[tH\UU9}tUњAEc1U+~VmaӑG+zLP]<H=NjM2^{ Y9x ddd`IOO/De>#>|p>JKK,ZSp]wh"<ռK\ve- 򊋋#Raކ=ka(/]$z:DNN6B;,ˆjYJ|#uQ>͆~- .;l+1{j_sP bauD#q# )$&S*.c逤-z1}9ZOuPT WcjIi7SXaו$ç\LjT.(H"[VsA~sqփՔ!4W4vM`ݞJTUno)cx*sIt;Mio8j DX<~-QTSvp\@'5Q`0I/waz?' 7C@Ηj&YLw9AfFE <4j5'')S0{ljjj9rQ`5n8*++4k(:u*?~-"??9sڌ38z( 4|l߾ R^^NZZ˗/q۷M7Drr2YYY+ƍ#553fL>zsҫW/Cz7̴ip\r%r 7P__ϕW^l榛n /W_eŊJy ̟?c7n]ƽGAO>aĈrW(tML>Y)//k(0;PՍ7[}qiwLf ۂHtP@~lw뾞ׯC$%%s dfeCiq,\]2dfΜQ%^3g;Շi?knԩSa7~͛7|͆j8L/"fBJDo3Q6vo;ۚݰCHzIS8jX',;!}1vͽolCl?gc°?GO?ma _GS~v]SExt6o gmS/O~d??5)LXq4]Zh6jIjS?$% bna6bдEڨڨMѷ) 96!|Hϙ\}^p[\m26_0M I6o3!}xAkkAA0GTTMVђ2tCkqAS5w$!!MPlHe%xś/ܯ8f]" $9m717SM hRbs;1 Oꨨ*CҀƈ;M IDAT}SkUU%].)?)t3klTCO-I&N= 'fJˋխw<: ծ/H6!OݾO+hpHInSarIK q u6یJ+ֹwQAذ6s$ꚦ#I"_|%h t!tEUtgznkPϚO>G%PQ@;8+gw{c("`EDH@E(&%[ /tK,l{ww ɓu_sf>s ۷ȫDAd;тi 707 #Ɠ@=̢2-nGWP_1 F(v'.=~.%|$ʿh޷_r| [CJ˸\v\;' *0Z=e_s=)ZW0*Z c=H"R#7("D/z5,~\YձH(j7-GPiTTHOn!H" 0 {j3{%ϵ779X"+*JIS !т cT/ [s7r~TsX(' hPhDCΥ#gs`֡ !\ hNYx\N{Ѝ%a?ZmshX2X vQ!-PSSK CSB%M*hDA5K]권.v.lŔmSPM'5K4<\v3664XZ 0[ilbԽ`<ߎ :'u3f`:>MQ fxcWH8uA RW[n(.K'*ͺ ֭/i֭[4h\p˖-~!ݻwgԨQ۷/eڴitԉU,^3rHTU=kZf :t."E( 6Ë?n (ST\Ӣp  ] j;jM61p@."VZeޯOk׮\wus @]]<:uGּމ'kѣo^vJϞ=5|YAFe*0 A)HVAmՐthqN᫪*]tᦛn2AロΝ;㏛,AZG+ի|ATyիWӿ\C˭Jyyy}2qijp?|?U5RG D)>6xSA>o1vUG qZ4VpcӹsgfΜi ӧ~&؍ vQ.9S])Tx[t U>94UUG}tt^_V@Qu!ݒy}GIe:Z^@zmP4x;OcɖRm(fH$ڥU1i;+Of_#粢p^4#Wim%G&!#r_o#Q*ŔԄ1 P̣I d-1q/WT8eb$։V:e{{h=YA0@ ס@u à'2yd[!h۶mL8w}wyGy5kh"-Zķ~˽=cΝ;4mFVVf"O8[oe6,ӶmfWaaId裉XJXVq^p2V.rR|8XnT?7nd/#<6m2e˖~zƏϔ)S(//GufΜIΝٶm111̝;bƏc=Ɗ+_ʟg —ɓ'sN BsȓO>eN6QF5&7 ,ziWJ%qK2qy9V+!j>]a4PGyÇwQQQK/#GygYd /BԘj񞆌eMjC 8$ B%q2aoV-EV4M3:2bpX1N $R9\'X}%uGtzeŮ Jk”,Q)C&Ŷ2|A%Nq:]l:XMX~8wW zĢ(:;"}f0k1<6.MepVĻ-stSbDTnҚqòQPVu#F c ⶆ+K+k1j* #Fi`޽wy\|$&&2{l͛ʼyh׮:t`Μ9,\'|{ Ɛ!Cضm)|Nn7&L`ǎJRRwݻwor6m_|1:thV[;v,a0w\,Xȑ#>}z97ndܸq\}pCuqUU%ȸnk5B (.&c%;QªVdڊSYUif6}y!//̞=sѣGUU8ފ{aժU&0o<~irss:t(n:СC( cҤIZp'xA[~ȑ#y뭷pW^iSMQAb$_ Cj)#+I=+>xf(y'ꫯu?~`0Hee%7p111<|g|7vmۗt{9z)=,X zԩSMN:ѳgO à"j<[Z&O@6Ei&^/SLnn`֭Q{NaaaWV0 T?1ȼYiIHO [QMz7 QFxxGyXd {/=z 333{l3>"|i%!*80.ImUhh*8oGdtISi8%QPUSXV{CȲ?( iX%E+dE*MnDAʱNE4p9$NQTUU) XGO7DXVea d`co)0"nFkHVHXA7v_֜bjNAUU']NCBNHVx,!<0I04mD5|dʉJq镸QY|hӦ)H:t@]]R\\L>}sGyyi17ر#eee!Iɽxp:6?zUVq!nэڵk1 ͛7ŋeAXl{/ƍ㦛nbڵteaSLvBY0륿1q)PGiwڙߟ2t]֭[֮];JKK)++tt:HHHbPVVFIII֭g Թs""cƌ1:D7ݵk)Ǝ'|oQKNJVH!<0q6.tں+f߶^}Dr1V UUUVwYYYxx}:#G>-[4kjF޽Z̛7ŋ`-Z~ J#2]tz]LV8R]<6*ӿ7&+֑$ ql1n`0cpӉj% FinIooSO=Eyy>t3f̠]v||'TWW7`"dzpBk^xyu]"]6t}yW#5KSb)iOǪV(¡&kXLja@nvX,Qۀ[wضl#F}vz͜9sL~lNQQ|9x<zŀ(,,ĉ ݻ- x{62:^ܙJ~} | O#֑';3q3f[cB ˊ_ zKP*$O'V]{ =s$9d2;acU=^>zdJӂX,BM@㴠:*NymRR]VU:f)R4 +IuaE#3AO&VUbcF23ae~Ekh:ziboAШO<eigXɒš,XS<7{Z04AVl4/1) d'''G ͛ڵi)X<믿{6ؽ{7YYYI*++q87R'|=->?O1l""˲ؚA[VAtg=i)kHn *A<<Çظq}1>}Dt(L pa222HLLpPqq1nڵkݻ=z_Bqqq}f6>8Xŷ",Cl7G6QxwܵkWSNNRRÄsjj*6ۛX\={зoߨw7ߐwbb"=mۖ{g*@?"bH(k*x?m/*,X;qхU.2fΜ ȑ#y'{Y`#F04MC4JKK#&&K.ļ7|/ۛVC=~$Il۶OΔ)S[ky7())〞 P#$NNN" qN 4US8&iӦ1h RRR̟?TTfϞ͔)SxYf t…^ȓO>ɝwɼy4h=:={6㓪2uT *++1 ANN999QDQ?s뭷e߿.|AnƍYt)Vsd/جgp) "D83Ґ^xL:v#˽[VVƱc8p8JKKy70`{mV)RA?m6xe²h|$`"/q;qcؼi3m6iBB̞=1c0c z!ƌ%\BVbڴi,]'Ƀ _!p^׿_q>Q;X,ѣC\]jc5)/`U$0K_m-xYdK?qI4_֯ 5!$$ *W"}+PYք#S7sYD"LIqq) "4-"|$;%aXMeD!yhfu݆d!669,azv' j=l6{=ϟ+ѣa~ٳukךF.]xyWfѢE&yw܁gK.[nA|>stؑnѣGG\޿Yxv}]>cʝwމa|?sjL?ͺDQnw䩓=z ,Z<p ر>?YWH4ѵut}*u^rs;rހ]E6~ƿ;`ŴnݚB&gqF3#q+8y-[7cZ1lPj(BUeгg?_*S3g{_~<ü[缧 &#{r jjj45Ϩ7'nTrw}mv?Gˈ4[1j_>j|o4($X Ck@BS5 Ճ 'AԜHxyE♮ۆ4̟zLoyLFBDjލKĺ\DYm8R^6nW\~15$l6hv9W \D?d;!G}DFFFUpuG'haC/6?Ԫ IDAT%''?'6~ sΥSNoHk|n8M61m4,YdY9Cr[p)))r~R%OzjFm&ifۆyz)--oUUU7y!k׮5FHFF9}4v6V?Ǎ4s?0`S _H&\#ЭM9).NUtʴC`$4,ME34p`VRyy9d\tE.> $$$x#ҿ[kݺ#+To`ʕdgg7Y hv5 :ׯYϤ:˗/goߞw}xw N0mq;n9ֺh8]ckq]H _ *nd2SƂǺT'L?ms`K`vw|~. Mُ>m3Xs~̳ޟӟ1>-$ŹINHeyZH[FKki-dk`u>Οj -~w?60Œyl1ڂi(q0)t1^4LF$C)RN!B_I8c+8 pV6)T*Cn-Q;tl?6Ʉ }p:≉myu4YcTl C5Fd E6 46N&fX(%{OzJJr6ǎE7Ki% `ފLua=4G՘@<ѣ7og4ņʊsIL jM(ӂcC0Y9 SC{Z.p Z>ֆbEEP4C EE%QTBMM;5U# qЕ`1x~#аe@tӽ{4EkViWV*5c NYew=k1,p nĦ#)9D W=Ȇn p|#շHS~KEDל_O?U US9w;Z{ƼE)2YZz.*:[→vWRU[OFD܈HH(jH͵D+ޠJim8DNDyLM@1X$d'EU!nnq9$2ȪNQUU7A䱑c.RVߗ'؉sY,^a@V0!E3 ETR}XWIOCV 6[QՑD](jͺi&jjj޽;[6I(bݺu@666c.\HYYO>$_})x>k>7LQQ>͛73f= D͛&MapnqIaldبbl(,(ϡ >|)SPTTϓO>ioPZZc=իM&MĊ+8p_=eeecDzgV\رcrvb͚50|yS x9|%NՏ%10 ŏ]b'@U}cŔU^JʪQ!lRĀh[u^}U{=JJJxټyիٳg^{mq/l$qZX…cf7]!VDQbQTUi`HnՉ ɑI%g-n'fo%%5!oqXsYRT͠Ưpid$:'RZfI||˶Fv~ƳzOeaAf-F#wUt偳\Z?um J6$IGB$nmEj *-b`5۳gռ@VxOXp! `ԩ>3&ۯk>D3i$l;ìYh߾=C `̘1tC 9kg1ȜMk{q+Ts]l\{-V$IE8d15AY!=Q|')y֭{J>MJ>^zS2m4nvt]g„ ݻ<>cΝKVVGaĈlܸ<HJJ磏>gϞQꫯ뮻:0f̘f݆$1tP3꩟ckE(! ‡`q"I/ /1U>M *եT֠5S5 7 _~9p &p Xt)'55>}Opb bcc~c̙\qw}̘1wy &p%_dܸq潌1.]4;Ft8<mSEV"ʸe ZHp+i1$?HfXCQi-5[ 6 /O׮]5k9}<8NNob㑚%^c|B`G0jm2.K.X0n8RPEppn=;yAXf4} ?aPXTEi(jXI$I5Oԑ0 k#ֆAAy+`P\PYD&>h掺W]7/hEr;7]I4nA؈6gN,מθaY<[oUEllʲn ?1 n1[ `} qIjprzMAAATaÆa֬Yƌc._k<ֳgO;F8mݺ5՝3f1y7ؾ}{nt]gL>crUWsN cqү_?&IF1KOc)8ULqI m$TB.,RY+Wr=z47o69\p;vɓ' ~)]v 9t_|qvڳ-,,d޽ :[{MV Ger-p1~pWDŽ u;SoZ.1gmQue]|T*"Ҽ]vyV,|@JJ yyy;v UUٻw/Ç7qWf BX9m۶Ea[oq}EKIXx1:K,A϶,̙g}FUU}e3o޼}:qqq<̝;I&3h 6l~ش+SpΌsہPyp'r-/|> 0fh8$i6b$JHH­nnzQ!99ٴ85MaӊuOIIrsIdYovbg9йsg|MSLd>CfΜIJJYjz,z$w+=WEޝTU-L1A.,0qs8XV^/`0 4t]' \ XλYs#asﮁF$ę+%NmN dzJ!HV'%`#K0  u(`AX5oX7sYtL k7-֔8;AY/hI[ 1Ɔ/RHNk/$`"1 GK|;U[J8s"Gݯaصa k:ui袋4hcǎ3cm͵bf t׮]r-\sh մFBx2rIэtx$?J8^T]ٸޙ۷DV+bO|;Dl ,&O… L۶m[̥^o[عuMnn.x^h׮n;J5%|1@Rhi#gv$DNN\OЉ2Fs5]%"!.TZDKKKܴ Cbb"t:iߌ'NN?% #_#RX8Tcev~_=e>.s\6PR<^eq{w1ȵACE^:fDLv(N_!)"'7mGjH~qDlVAyIl=R"~_%uJ@ e!ªpOZ'; (hnޏ$Bv* H$Ĺ-ج5~iDBiweA!VDZl V>E;x*刟%p"}dvIסC:DAAono^{ χgx}ݼȲ̩Sزe ;wF˷~(]oS!fݺuit{67~k\4?( Ǫ! X',Xubc%8ʧXVer+ XnMd{Gq_,\@ W_eԨQL8wyEQ8q"''Jǎٸq#b  `7nHQQ,ꫯrwN8't~M )..6MZ 1?MMMeٲeNuuuM1 UR(rK +Va꣬g U C*P(1+sʛƍ?DQ9Bii)\.RSSپ};_0l0 B;l2ʐe M0  w+8Khc*v2555yy$QWWÇnsqN8,ǨaVŲ|IV>5XWf0HXNcG!=$-Clxv;{AQ>S32tP>S*++ üKq- W0A$.7vt "b0EWgdHq$wΝ:pqlD]㌄_ JIxC /GUuTwNDqUe;ʰH"OzsZip(p˖C${+#Md8\MQeAo3G*uL.(G VRhDtAO6"pEtTE^!M9cbTjAJB8( 0H[go5R$]].a5b] o+2=tX@vVk8A5tWbԩx^zeѮjuÇ*̙èQp݌7\'O̼yxiݺVGѣڵs]wqM7{n?nݺ1yd.rve!0n8RSS駟k9g70*ld7iK^S@H咫;]O8*rTUV;HJJ> φ2n3ob3{lx;v,SL3`3Qh۶m|Gc#F`ɒ%\.Сp?Q/2W^y%IIIdgg3sL?1c ϟ$33yn Hv qF A\'r&82d@vlA~79FLO?M~~>qqqL44 `ҤI<˴i<ѣG3i$ \psz+\wuHĨQKXhm&)‚ Xn6Dy7Q1fAXl^z) \qdee!_=sSPPlC3niΘ]7=ҚVd{h.yػg/c$n &SVVFǎyyq1ƏO8f&m-| Z_0 uuaDOqyIU^}> ,uY`(v#lF5((!ǒh0 ֈHP],[%&1{|/v-9sSk/( lٺrU7$-%?4tkc*^V+<(py󒃨NX֘qm/qõ7¨ivʪJ ω){' IDATюUCII cǎ駟gϞ~CƅlE1}'Mb2o\GT9Qt6w´p ޽{q\^cڵkuovl#59Nrq7.Shǵ7jqי3g}OfҤI+Vt]{eĉ:[qy۷-~Qmw=e[~ |o,4(RNjUall`AHH@ufs982Q;m"nm4(5Ímw\F ?_y&[ts8.N=e$t9V|4.y>Z_ZZj[nh]׉F+~^7ћ~N~1jM%&Q4hzj7u">;L׬Y79b-&5 ϋ/h[J.,C6 S0uƐ!`bv<uTUe޽ >lڸ> 'A$k̺av>^DO(|Wc vD}ҫG#|cM6F.*kZc|&̎Y; DS?5L;H$Ib 6e_$z]C]"a4:C:R::|hNC}-6Isئ!!ƷC & VWh~pVO,:^pGCUҡv qƸ˦ # -|(C|aVǺKȆF4Z`]W_CM]UVf[eb[4][$%t(n 0Peki}Ans/|UjfS6q (cܠa J6ƌ]veD6p`fFF ɦhaMHbI'W6WNO!`[̃tTDA㼹u6ኢG 0bkܛFiwm)) X`Հ`Q'n#, 5TUCWR4VR~1,#D$ \N')Iޘ~3 Q|O$n^x0={m@-DP5I\4A4M%N?V(WMϚj0)<u CAt%Sq M.h8&*BgK΋s,"6w;DƝude-`z-m"4rn\{V.&y-qEݹhh&.hM0%5gr=c饨:&爱jR0 v#NDCezA@ڛ8TA(7B^xA`˖-~vi,]4nzw0`]vwﶎaLBAA&MVU>Υ^q _3`Ĉq`$rrr'Āh"+8vÏIn (eexpǦ+v̳|ڛ6lg˭3 7|BƍF0{|@ `K/oXߩ; 4( 0yd#< p8̥^.=_[Fp0ujkEԣCdžCPش';hK/D~)..nMF(p;x cƌʕ+>|8{.k׮_pҳgOzjkk0ݺu+W^y%}e޽Ι3O>訢(f) tȡ2hPסa6Y}}}=o۷/3gΌ3޷oFbȐ!,\𸟥t(5ӈUJ[ /ӋqtB0hQi:Pł5e70nNN _bշu\8, ׆ OF*L̰,R}zEU᝕eT4D1Eӑc/3-,q#x%.vvC8McoI`5GLa_'_oZ_楗^;`ժU… y7/8q"'N, y'IJJbݺuddd0}t à;vX4-n`[,_ahc[{-TU%nBx(>FNf8Y[|.265@(nm3a|M͛ǭʆ ˇ~Ȳe˸k[Au}Qwκul̚52^{-s-^wL1cưzj~mfϞ @MM 7x# bɒ%<í0p,\Њ( ak&w$mg}AXbwy'.f7 ۶mLYfsN6mu/|ӦMcҤIlڴ=zѻѣGpT Ӹ|D'.m>8 :=5CF+EVu+IIG!*밉9^F줳wd?uUbCz| '|2{.̚53g0o}'g`ԩ̙34FřgɆ Xr%r zlܸUUIOOgh,X@JJ \p7nln0 ~/2n83֭[o+nhwծ**,$"$"x(j4@eu=i8:.rkJ[30w\zxx>}:O=)))\tEtIl߾Mعs'7x#u],YUVq%0rHyggg?PXXh>}8Nn&h3f &L`̙7Z5;u]UW]+湚h)`a#46SklBݍ?lWGfϞ͌3HJJbرtܙd|>&O{%K8=>(?8ͣK. 2ɓ'[oзo_ (awn~#K&L`q )g&O7 7͛-﹡'x_;uT65W Y:SU]zq^8L|hNع0IJJbʔ)k~ <]2w\#E?ITM#De3*㑢(nQcfTٿk3voadصz\(JFTVzEe[12ሆ]2pD2QYEQTjB8l"68P@T4McfsIWPTUU9\u`ֵ"Q `гD;Ug q*d%9  .Mq?/@UU\<,w֐굣(Zyո~%Mag&Q IEHuFYe54XAZGcQMcVVVF-CҧO4Ç3lÇSQQ@uuu_>} Q-χ墲zjVXAMM wOn3h" `ٲekQWWw܁ ,]\~3>9ߨh Z&#tIR) ?nra>p KIӅMZZZ&nSSSC׮]-GTTTPYYv$ITVVRVVf 0VO?(\q$zjRRRx{Ӯ]> /{[>{ĉ)((`mch$"A ` G闭U%س+z~! \N-h3۔ àk׮n֖ à2okРATWWPVVƐ!CcC?ѣ ,[oO}6l ##'~V:o>*++Fl޼<TTTDILL[n~0p3L#$;"u9w+ϩ.A'g5nYVKIMMf3KrrrPOYY>?x`Fǜ(=_=Vxv+;3-a6C6Fxھ ^#1T0-M D$A@ ̪iY6:v,kiH ì´tbِe9E4˨'G Lkqu׵2dn~\Νܹs?>ݺuCeXs:QY&)S@;o~n( /]DIId&WE-Ylk֤( . IrnMamǃ$I466E*~ꩧ())a{ռtޝ>믿}yxᇹꪫxٽ{7vvt ;rdI/PTm[3\b#u$xݐJh>͆kҿ&l6HnnQihhíyA}}=odۭ\p6lc֬Y@~uH#0 QA=` 4wrAH3O‘Y8yD aCB]#e&*5KYSf'//}Yκu((( 5MNcDM&j,BLg'{Kd.!3Nꤑ!˚5[4]oV`B6md=={!-- arIHH{V>`Ŋqݻ޽{3gNalN1a<7ӣmj*,5^ #G+Oep7g51LL^YZY)((op;t٤et\.z/),,溽tҸ@zz:ӦM$YzAJv-GSEQD!H}p[>9౩)J '!LN`c2>_p(&YYYB!+grss$>}fK,a1 ?*f/ JtnI:]7Avv2cG{nTb-tR烳Xu%'IpmY5nⲋ/e.'p$V {R:??ڋ.\}VW²NT'=sK%3jp6K6W2 fPP0GuQN-H㭯Jݓ8P.4 %.3KD: Q~^Ey]cr-Z)&/|kJi<1Mn$&88Ylz E 0'x?OviL4?u]videe!I=V< &ϳvZm#<ѣ:u*wuseԨQ4 MӨ%!!/K&NțoIYY~)O>$f;$Ib˖-dffr[^W_ͥ^ʫnMp ~4˭PpRHNrqk:%%p\mO'++h4ʬYXz53gf޼y|嗔ҿl6#Fcĉ<\y9ٳgꫯ2p@&M_ I&'1 Ák;`ܹ@.]PsUWCFFr wqW^y%7x#=hJ7 Qp< PP rs,=2L_oo#p2g-ZD${>sLZMĉ5jҥ }aҤI,\{s= ?V\ @0De0BQ?1zh̙carJZ jkkٿ?۷o箻tra^{5N>dv:k5xs៭ĊP2syo^=Дp)֮'/[MII!##Yfq0i$Ǝ9Cnn.]vcѢEb?Vi )*bAm+ .p0!O?M6ZȦ}&g"5e%}R&d/7"*~QK>K]@F"U g Ƞ!}D;ݰ]7<B:[~dP%!Pu]c_0 IDATª^>+ >XST5DFMnqD+rK4ŗ[~@E͆ϗj^m[23}:^˗d{=$Ib0SW.s'kNMm۶qҭ[7|IxWxgXh-2N~+6TD$I!"˖}[EϻMLm63gSN믷~,Y#<§~n*޸Wlk;1򯾠W8NƆzB.jzi8WiuYo>B/ ~Vl; 500s 6?f4UcMl,#I<_qP3qR5I4;76VqanఉL՝W@ BQZB>}Acl ֐Ka 8&nSNq%0o<:we]Ɩ-[ڼ{ XT1t*޽'<*:܎|ޯodtܙC .dm}͛p:nb! UUDNPĩ#N ˂vM6`< 4Cr}/7|3{o\csbB0vm`4'~jjq9 2!Csu.6vzow 3oSY Cak^,SDyQsjd+wmZOEEjt)!m_It9_:ՍQ|~l@jke[[[K~tڕE44"%Y>Z;eDZ}^4ٿ?~;=P=s)..nsk[RJr>ݻ[v|O=z1[qMe*֬Y=|v#wI4%;+ u=>v<u K.K.5@ @UUϧ2N[͛IGztEΝҥK*GΦUߗ8ݢ&oWQ4BQFUMg ݲTXM7,HO6W|dYflsR]]O<9 @ZZQ[$55oݜ:I~۶m \.,YbmMk_`;!v;_:ځiw)K,g=$oi1h?M?7֑u*E30)G# -/ރHjg5cKLG^J w"R Mx{,eY&W `thFs{* %[563}dz(oAaS̚*|JVFW^o]GDSPV !CVZ.ۑq/bR*Ga}v޽;yyy6qFdYmM:(L ^)2v=(NQ!+NGD#QRAU-"#/0IuqfTZBaD>) K$+C3Ic ,Y-#:a h!rL:8)KdTQ\ȵu6%nn .yn.-ґ-;_-|eٜ ÏSǦ@ux: TVchQlٳZQv c=[oƍ8x ( Ǐ?>+ [d„ lڴ_ɓ'i xbx v>|aTWW3uT>#8*JJJ())_gyU>䨴ve,4YVp~F!=AG9`RpPQYGm]NI3[zѴ`/7nEWZZʭ͛yW:uš3ϰ}vLn!L<]S^^Ν;yٱc~)W\qjz3m4vjݻw3c ׿cPQ(..Cn:nV FB QEQ9E 8 s68xʪv`OEU!W^y^x[rwakr-l2 Jtx9"*QBA#6$@YcѨfd7d$-ΚnprdV쬥>ʎC b? ni>PeKK8 Z[8:gKu\44l׀ Cp<İ^,QKEC]6FeP# ! {Mi0hX66UZֽe#ޢtN4FFׯ n <Dt$P MP韗$iT藗԰#Gdl6?8`Ҽ{?ȑ#{xx׹馛8s8E38s2~x,BAGui :nmʊxA$3ں );9^<69)vb+Qc!9s搚>}: ,?$)){ 0~?5k&ӏifXq"(N1)=A*س=$ 4M{AAiMMT6S1 ]@4*af V`qUD``py$j{J8D)n=Gq向 73;3934zwjY^ :GL$aݜuYƌ_|q$?UVVsN88\;vl+֠P(Ĺ瞋 |>.?|,[8sٳ'M۴Cق&b'!}C@ t44mh.6B;N:wLYY@Zg4Mc=:%\bhѢ袋.bÆ 5+++yk[端 ̙3Yp!555_?9s株*ah"jFn82UJ h7u4A2}Kc۷8+wPET i}}=V8yl۶ cZ,܎5@h"i:j]00d<芌brnEeaYtDl6;#"Zq8%4 UI@DPT3iIW  +&%Al]t(!h(Wзsۋֹ "( ٦J|W˦}tNw2:n(zG, "$  NKCn&evI#wf1)‹> 9GѸ:''EQ,y-33zjkkq8֤ix<4663zRWW… y''[ȕW^O<˹Yv-3f ==SUUȑ#v6i|0v9eao:ns ʄe$'nz>'Y!(ju UC26IeuӸ;m !%31p:D &آvj. N["ipMBXVQ4~bj=va۹s'IIIHn:vA233& Z9P(D(SN߽,Y©WӞn?Y:"}%U!Ah$ )AYYYaRV%''cۑ$ :Dff&YYY444Xt|@h4Jff&iii۷:_qq1.2P;3f-62e O=T\س=N0{`˖-3Cfff9w3 !=1BnQO:&9/.Nsz#J׹$'nd$qyi7Pv^iQR]]m-:,jkkUUIMM%55={BnDQsθB4 <>}Y}84MoD4СC~RSS'11jF:T_Nozupo.&}o9c9)W#&-ه;feeQUUeda>d8l^/(M;n|c|1b#Y( ;ٹ/oٱo J2WE9\xy=:lD(M/#pcwY^<"tJuN}P!e#kCa`$6&7ō 陌.` (H5VeXdD<.Y^ ==AN XA5wb2n qbfKH8!9݅!"`qy^# @YutV)gPŰ\& l=f@mYQ4`zbϞ=>|UUy70۸qx D"?q0qD^{5TU7Z梢"V\^VSMA4|MʸIСCmNMU,bz-TUUUfsUkKY vXcwL]PcGi;KH,[U+Lc[nwyEQ8z(bIJJGQ>3 @~/De^|EÍrmpB.aȐ!S4nw=-`ƌ9҈>UСCdeeaZ)((Ȳ|JcYAZ?{Xʷns){"Oz8TS0-T"]׉jo>Ea冉/?YYp!ƍk %A+أYŃ gLV$ I8ѭKǎcDԴFi2wOW|WʑE㻃U 뙊,RYӭD;\a(p͆X$vqi~ 7_Mq^U蓓/vW9 ,$;_C&pUӹG _.ZU!DEcU(NaʴDubmj5l-oˊ^AAaаLNX,+M#˜AN>CsMj:m۶e|;wrsw}8N!Cؼys=iiif^{5|I&O'|$oCeW®[8! a+}X"/ʤBBBb믿"n`ߠA\}L<٠f㦛n2 &0oh˗/gӦM7ߤ}F`%gȑ0`E#Fp= "0UdDA`w]*k߭}K$qĎt;i1&;k/ݻsNFI:NƏO?Mmm-<\p߿BQق{[sxKWm jqFib @MM ;Fi jezt{,v)<9 7BȏާG&?g+")?M)j< vatHsjGi1"D[׆|qU◹:Aػw_}e`ٚ56¾5#:"u,,A]A? \Vu$dyq ;vѣG3grrrpSEE}M>ǟ.gf7_Mx~.P7ןJ!2аHL$IF }>cǎ'##{ DZ&lܸ,\}vIbb+RSNGkkkra?11*222~svwԐdgSN׏ɓ'K/!IR1C=]wEǎ=`u7?|k֮0tzS𽝊Z|S<. t5dF Mz'kΉx55XrF S}"'-&݄7 c5[!X~$Q ->X#8F_~"$I4|4zbX9t֬aPB-BMT\Å)\Sl¿)))'X"w@ %K nsʫ xz5ڹADEE3pti ݚ{?F:U}mٲd2M$M]./{Mǟ~ϓZD-wMo ,E23ݫ)))Mh$MNNDgzEQ8r}1!M#[8oi;˯(k8GQ+_U5,f y ~k1;"ovvS6M ,f& :¯dbJ/.h+fI~$ @4'j{)uFfFP9\n,3QQQXD)pQ &5b͛ǡCHNNgiFD}qv@y8q"ՍDn… $??I_Џ+~Һ#QYVp88C+5:|>]tAe#s,_UU:琔ix$I8v-fshv^H~ zy+u|wL-pJ]S9ç23 fٰk,˘L306_gJ-hCS!šC/a޷BFZ⢨52;itkn&Lb23l>`F4td;{G?S$M3Nί-\q:؜b --_ekYLgb ZKki-E~(CxzFmeKkig_[x-(jRx5'Ӎ0*bDQOsA ] hSe`pG6ĵ0jJKxn$R<&3m۴lny4 (9QhTkOFzbFдUKYʼn4UM%#5V-o{1 !kk kvjdZg?^t+߱=0jDsh߶iBjjI7,lVWWC|\"Θ34nE6ht45WAvWpZo]е L6GUp-0ܙ W99Q45 =XAtjkkO%HREA_D+l6?ImqFG hg ݺw G/k2:\XܮMjMtEaŊ#srJe ӠСÑ[﹜xd x= K.<v+v]!T4"͏$pEA, Pe(LVIē_tdUC   |JcnE$Ewf.rMՔEdECjR<]AC5_I$o9N0Ν8g_dc)B@U54_WHI HR(3 3[sG ع/_X< \Sf.haמ)t;67٠7޺ WQY%)1͊.h(4::ɉNx?gޟnkA5:ǻ^*">,bh;TUWVQf4bPJ>7sfDdlf(`5\s~*^MߜR N3_]E !h9i-7 5(/8֕%4MniP:_Վݧh>?(ɧIHA]GPXpa ǎajqZuV%ʬ"8 vsyꫯ֛lwfРA\x|e˖ѽ{w:d|MmNEEHh2(hi?ڵ+7|3 n7&M"//'x.oaa!#GW^{mƍߟ!CwY!CNuuqo:0c c4o<>裳£,}'ȧp$8x\uD[4VM0iCig0ayyy<6GeӇ˗s.Ba>MT MBWb3˫tG~TMw8l?/%3["(`6c.^_uDP5c, O% L$;~E}jB6檾D;LNߎM"/^@W⮉A0.ފݼ.Y1X-b{Exw}1'jG|&]7T/xp~BD İc1LMR9XPF˅C xɊ4S]]͸q7n+W|׮]\,\^x;3M6!+V7n~;O?jeÆ DGGO:lٲ P]]$9bϟ믿ѣiaЊf4_`!dDʗ'ڪ#!c_Iqƀk۶m|ͼ/ Jx\XtYi=LӥKrJ֮]W\ĉEeON^^֭FZMƲexYb!x.,Y¬Y[ |D|IvInn.?q?/[f>|]v5I&|gB&5_Yt4ك](I&#^[ve|f’J*k{@{<\p|7߿E!3KcrKT#UQAMc}%?6I"s!2 v좌DW-/˨>d4:g:zOހD;LE8:. +1s#;/vsKqO2 7_@wYj̾B{ hdGt:EJwsd IBD׻WUG]">̀ D$(Ġc.H;t "i40^ʪt:e9QCɲaXH4ܹ>}0l0RRRxg ( 0w\֭O?4=h?>III\y 4͛7_s=}͛Q$}Qzf >>@ }M'N,Z_q@knh,x֭cȑ\|ddd0oN8q㈋cƌ;\[oкukϟoYfϓMy衇x7ڵ+}l6#I6+2NR |l۶ ?ɓΝ;in[nĉM ߀܈+n$N( >J*AWĎҢ$%DԔEUfMUUU(رc7`9q=зo_?>3gΌ6_NPT(PQ8muL2AY6:cVIDQBQT@$( Te7ׯb6XM".p-WzDLf u( 㴛8ZFQTE܋"`u,+|~ ϶Яc<\͡nj=z+d$ؐбHe'8P\ǰ(U}P5qVd$#vYjfC%J%yxTٴq#u|Rb"j9B(M "ڷooΝ;SUU?~~ߟbJKKɉɥ2A ::l6?{5jC^hRZlp8?>Ǐ@֮]˝we]ƀ I*Fr<8+-Jݑ<`BpI65>ՐǏ])++#;;x:p JKKZvER5޽;4{u]gq嗓ٳ6mZkA3{l^{5yA`…[;t֭[״9i}ĚDAFiXj%G.Zƕ]5,b,Jee!u]u֔PZZJtt4K0+99MӨnݺ}ٓ2Ev>}(**2?},]{Ǹ[nadggc6ԩS#ݻw/EEE|>֯_ϟ'n?QZZCEnF i눪7ȣXLS~^'"\M)%ʢ"u7E'Nhddddq\ңGz)--vP\=&g-W iJ%c& G611.:'yH1K>DŽ)XqkSF@QPO KI40Û4Y[L"ǰGQי%OYXP,Uy{q~\ԥY3WsYmO#u%V1V{ظ먨C| cMG!}9K80Dg! 18x=ĚH5((D;KTy%G. ,5iu]7Eb I,7YT/_5> {믿殻2̧͙CLL >$o3tPnS|@@&&%yW]LI8 aGxhvG?5.US}W(zOn hhf,..& x1idOTNOZVa߾=\`R?qe>hi%I_ aB4U#%Je]_D;~YtHDO@G$;Eů'بrq<~gx,S/mρ )Dmу4 2x8*+D<@߫ovIjiwQW,)%5 z1IpEhfMj[66olh]veu03ڵ,IfR`z)RRRҥ Ǐ0y^ REAV5Fk15Htq 䵯}9r64 OnXjUtܹ3۶m3dddZH]].v:DGGͮ]֯__Oعs' ,w?O=?8$1GO8 IDATzhzɑ#GNol@Ӱt*KĝTg[RοmzgkKTͯ+~f {nnǎ#--$Ep1k׎[}]&ի٧SOqAn7\uUL&f͚G}tAirȵc1 W92;)Sb'2/^]a' 6w;NzM455mlHㆩV,c^p "#5^i]$+!;{Mnݺ^z0ydï;ydHZZ$c&ǧ~ &K/qFmƣ>jh 3gd̛7!CZLmm-ʈ#xWX,L>w]o-Iw&==iӦ?뮻uZuΪCk>PSrh& ]8v_dmӧsEg٬_ٳgpB֮]KAAyyyHD~x'뮻={6cƌ`<,^|&Mŋ|GFdn3j(MƟg~nʄ ew}kѢ|뮻 =oG}UV5~|*]3T\u:seqٱ}fw5sLLOpݴmI/ z+=wqÆ cذaiӆ\&OlXx .RRRR(//g|7fCQjkk2e W]u6:r饗+0x`[ 2jkk9t;wfq1x Ǿ}՞eYA6nXBӦ9Qۃݻq8TUvamvGث}<8P]FtIBZu{{,:vWNlxK15D1xuKK#b|U!ٱP!b,\5h {ձvWyyT6-kêeM7]ܚLI[Khd&% I #GQ5'ojƫz>tEUE&qlش!gn(a̙3ٷow 2}tTU'$338~zy9s&xg/2~!Ç;DEjjj2e $::r&N 7g}믿(vm :vt;ƭj oo;CBB}ǏorŪ$'rSj6g %'J(+/r#AÅ̘1IxꩧHMM5έ^өS'{1$i .O?eԨQh}$GѣL:}ʶl̙3M W\</Ȋ+C~f̘9s;$vJLL Ǐqϳgo%)) Fڽg|j4 (tpy&Qv=z}C~,Znݺ1UUyXf ]w7p񛺺:~a>}:ƹC裏SO=Ebb"o&o6$1vXZ7eeeocǎ\xL2Ē%Kbǚ2:& X搹>BN?৲*uB+LSN0IBNE^!p4:H _h7 &~ŭ >:)un m=jMϷh4(j'}l^]yUUfzR~|6$hGtSUYIiY)Ng }{#??."f)zFqq1W]u/^aFq Q9ך8QBEE[gsкuӦ,q~_]]Yl6*Mzjَ=aSR\k `111" xl9s搟O޽:u*)ǘ0aSLi2/> LA^(q]աfzK>}to۝5=􊉬WyN맪@WmXI@SADDIh_UM3B "^/ʸfB~(3I1V] Qlz Ycb@^+*(Wm6L' mnݚwͧi\dş׏k{gh'a`5M#G0qDO츃.G ;dyzMRROۙw&4;wnkkD\eJ6lIXlY}nW|n ΄g2fՌ1"ԩ!ÂPQQoMQQ)))M=Kٺm+Rۏ{#oݺum-|udiČ31'+eADQ Ex*ހJK6М]IOڥFqW;PCt]l6ӧw3 &ڡڂKa!ي;w.̚5.gVZѪUOZ~in#зo&ml߾vV\i5/?c 󨪪zR[[Kǎ={,_N:o4uIݫn޷ϡyɗqY2[aC Lq$p{ Oߖd3kN~Mƣ?9 M[ο&7D[=T# B]Bzij}Ɉbo^~i MW_Mhg-lƣ?9~k4mjLJNblIMl?َdPUKo:ۃkkmk؞}!.؅hkcqp+eNUzA\-_]ki֨z5Ɏ): {Lk4MEӦM;O;Eg5{k*9qfcNӈ;5J=ݔZZKk!+F DE[Zkɱ 8 glioӿG[h"|mM1LdH(_UV*-X\ʿ39' pAԁ0S"*DzHv- px/8Hut5?E*B8- hǛQ ~>[Buѽw 1#hzۅdj ůʀ*"f$IaXzD&m& N{L#ah&D,&Ɏi!+-^6j@o*_C +fцEc5;hBNxF^(rnFŠYa1ٱK}hTbԄ+8BNQ@D1X^Rp/ tFjPtDb@WS{yz~hrhMLsdV /cرSc5Y¢"~'JJ "JA1Mn?Zмo\GO{!XS%DQ@EB^@qa 64UEVdvnۈ%! HR" f۵G=kf=ǚoz#jƬt:u~L&DB#iBP{VbʺMU sD݄'RY-X"5$㉢@RA W4#jI zTDTDtc $8-,nB[WZ'X֣P4MCJIdQlYمzY),U| bPV9H#I 6,A B}p\mۖ$M&''(\UU **fqiӦQ٧Cp8ԩSRm۶%99jݺuׯ=gTU% Hj )THM@Vj6!#i)s}>{AErrrׂ PQQCp:AGT iٳKv (Y9vHDvv6 2kHݻwӵkןTCM}~/&;!*dAT$I$2PӃf֖p]ÇKСC^ٳG퉏7y^كdcǎF횚=!11Gt]Ôocݱcp8paRkaQ(b4t$A@!E(b t6g:th>t%_BxFyE IH3Wt*kAL/Ժ8`"EJYNz>(g`ǂXr∋2)d%t[).QW2u^HMP5+{'SR'nBmeNFc)ge]GjBV5+8Z5JjN\Ow:M . +nQ"fƙ pJNVVq{eR,|6MӘ3geeejՊ׳pB233Qomۢ( wfQVVĉ pqzIXjo&l۶c2|p***x'Em۶gP;nyf/^lۖ-[ݻYe+A34kwPYWGYE5ibFQ\ABˁ vmXd b&OL=8z()))<#̿/rrrزe wy'F4}Q|>qqq_^{d[oEBBEEEرW_}L˙0aaX3gN`W.]~B~X3DT+ >YEi‰JQVZ9@o^PѣGy衇СCk׎)S ._~%lڴ￟iӦMCEذao |>ƍG^^uuuxbf36mbʕaFu]_ޣClٲ[opvo[=X:d1ۧRPxLnv2]X,]4+xx 6l@ٰ֭a<hƤIfi&,YrFEk76)C-$PW#5ށ˧0*&I#[W@UU4QG$hvJ!d*rvEU>b&HbqNX+}wY͈Z?ӿSu>϶&20/OpExtIW l,зCUR\'a$Z%8VzA]ȍ,-m9^`hBB~2M 9@0 i:a IDIdu֭0I*U.r0.7iu={pa,Xbaҥ<,YEѶm[f͚?3<Ì31c#FoFQ&Lw}G>}xW>}:;wf̘1Ç9s0L\r%th9?y{=j!S#++26dFT$Bvvqyid5 >N;]sΝKRRk֬a֬YX̜9sx>}:?i˃sUH?4JɇMa9pFq=U?!(5M "PC;VUxQC*R^/#*jg`uPuvmMwj2 @'!JS햑D$PwB*ڂj{  9BF/A]yYhZ08-/3f0L:%G}4;u7N(ɃS"inDá%8**qx:Ċm?6MSEAA=z00Zʚ5k vX_}˗/rM&z ѹsgA ;; \.(bZZnw=`28zhu8ʨQ:u*6l@~?O>$C !77f:EUd%N(C%b+eٹC"U@ _0~j 3AO5j;RPP磦lA 77cǎٿ?69r$_~eH[ AUUg@vXxKX."ƍG]]ロҦM&ijA @GɍS ӊdΦL7hX | pFуѣGs`ڨj*ƎK^Z۷YՃ)IscqlZ }5ZhZ]]4jӇ;vwq50N7̡E=gM@U5䐯VU!(|x%bKLDWd.lGE]ݓIvj>,hLfDԠ/Sp}^Iu4D, *)zJDrydd(̶l6T"zU@ wQ EDЋKWD\Jo! nLylvM$K̓ɞS9-缎Ttt|Tfwz!P D!ڑW!`pEpC; E0j {K1Ob>j4Γٰg{Fx"`VP;sE/ƌf Xz)pz3#OeB|xj t©Z8VMԠAviBw  ^"jiTt0 ~[SO=Ǐc ˣ IDAT lR裏pL8.] (((@Ϟ=Qlv>2( k*y,#qxw)Dybr#RhtZxuonWfWVY~}fCFV^Gii)kpFDIJJ›oW^y9NF9s&^u9rAAAD.:-?VZ>/ƴi0i$,[ GWvr|m6+|tfxQC@_N)jǰn!!6VPÕf FAJtF^dr QЪ"xwFX,q9dddHykZ 6 .|||\xxxH[h[h4bƌ4hn: ūZisXo߸98XШ0 ;9@" U evXUC:(^-ڙa-΄b&$(`$g[S [8~? LÁЬY3 ?? モlcƌƍaq֯_/Lb8w7oeѾ}{:u bߑf͚XVvر 6J;sݻW D$$QDITq>H/ᠷoCf1RK+pWk#}gO?Adee!??Dqe<G!8C=/6i$_mб?xQıBp/b:@`ars&*E|z)}4d[qrJ^*!xgCL#2 ,`p|!z Bf$I6h N]-Aj"b:hB-w94#H8 h~xQD}M @*x;s-+֦VNSP}:>S]Zsq|_D3&Mȑ# VP@Vc˖-R௿rt:f͚ 8|sŞ={$)FW&|z)p2NZ,96zaK0G" Z>}*ṈHOOĉADСƎ+wEll, Fƍ0uT\}t:^y@֭ѻwo̚5 <<\F.]ƍ{nIf駟gAjbΜ9ꫯ* & * |`ݺuXdͬ:_t¡b 0 "@>$gϜAvΛ7bccT*1~xs>j7,Xܹ3wiӦAE4lox|%ҥKɦ}vڵ CzvލM6QQQRݼy34i?Ю];DDDeYgφZF||>SNqƘ;wn r<ۏ~U=:L؋鶺f\0RG0 wy0^͠:İه`H(N"{,]$w @`Wla@px+Y=/kW[A`Q+.N1w#+FŢE^*H^ye(&n~O/2XIͳ2ij*0,._N#Wm;o~2#DQZRh&2h4`Ym/n{vP*PTRj!"jYVV&D] Iv0ddd`̘1Xx15kah9 ())O<ᦲumva57=vgΞjAСCJjnE9˯9%BaX,T*xtiV+yŋ *j^P?0o>93 F#߇!#*m-sn+ݜ*J+ݜ}I`gwB00fOGEVG7g\|Ml9 QyJ7䦢&!m0A :jKg#XE^+@uTGvjWQ9~W+<xhr, @ |DMxDZv*(tYîg9;zVkХs7DFG[n\m}˲nj74R<䚦V%״yӳʼairAL_nCVcCu9+qnxj=Dh޼E͙^ݪFζV;ԙׅ ܞ* V۶ms۪](+3\~x9]E:2,BCx քnNpmB?Vd5Is&ѹsg sߧb_q477u_˲f83]Ǿ(:ƽJFh׮=n8˲7j{WOXM&*>* ̜C|?!K z _`Щ?zA $UPGDG*n1LPK2Fc[}rJO>ZNj@0jrg|v2^_0 //@AA6m)ST91|*VESwH::N(--hDdd$x@رwbѣR%M7ok\BN:UY|[_Iu\Xx1v0Tjr76X9)nj.\ynR˲ZPՕ2Q%)Nfa *l6uUWdNlEmE-ҭANӁSn*慊[ǝd4s"nxŁ}WzAD߃Q@P,\ J|$s]OuTbUnW]yPbκS_WAtP}+>SyVq{%DA #{Wٔ4P[!*4Iښ bkpϨyZs@//{%8MP2utN 2dO]S кy;X_zp/C C6dȐ!C ʐ!C 2!C 2dW 2dȐ 2dȐ!Cf2dȐ!C|eȐ!C 2!C 2d+C 2dW 2dȐ!3_2dȐ!Cf2dȐ!C ޓxPBɐ!Cjg=%G5HJL@QQ#đ 2dxYFc|%{ttWE2dȐ!C-|%Tjl4 |X2dȸOP!jٔ]p<ĉ0MJie2&w"j3C Y C{}" rvoذ!Z>(Zfw <ư#2l!=~ܹG4.ȝC 4V+}ЫwX%ؽWehGo*.߀GWxj9]ʒx *3OBVQưZR."xAs}%֑xg;(--ujjuRfw B#鄂e' NV#GY\~bb+G^Y 2?WTp|KJta`٠hn#Ԏ2Ƚap ti(ο*}$}T*`Yː!Y 0 qm6ۼmXpAnӦFM/eXlݼIX!5m7Z^{={n/._<zz̙3Dya'C{())Wo 2hּ9ڴm'9ey1ԯ%*F "xxx੧J v9Ɠ 2 $WGXYkIF>͎!C >dȐ!C ۹I(2dȐI,ƴDp()o:!C BQWb4dF(af@ts|kE`G28_z]$C T(1#sΓHϴ !%x҃ax4h( @%;!⯣GW^Cɐ!㡃(HLǡb n<1 o"$\NզCAb”)SX+Z >C?L&v튒 :0rv;֯_|;R} vZh4L4 חΝ;M4 !?̙3ٳ'bbbwv;֭[B;=[Y֭juc_Ʋeq T,[ &MBvP(p l۶ ֭&O|_P#W7fK_ԩ5j=lW7BV?ž{n:9ǎŋ!xǜ9s7ѣGIm͚5X`f̘3f`ܸqDK+gyL&hѢ#- 3ϠW^l9r$, ۱yf5 /_Qq^|Ez`ܹ8u䣣Mwϗ/Dtttdĉu59[1y9ӯ^ɓ'o߾07nV+͛?cعs'VZa̐ IDAT"q4iзo_⋸pAii)ѴiS4jzBaa!Arr2NCc„ 7oOF3g ((ȭ͚5C ]*%"_|{bغu+6n(1qƁy=0 z=zG}FII A||EĄx*.*t˯=JΞCgP~^.ҥt!1΢‚|:s?w9B/'R8:v^KKNLG'S~^.P ~=mUOo-xFADDd2h̘1)%%yEN:Ez"""B 4 "+%'' Kٔ@nϚL&r %$$Pbb"UՕVX!_ԩShԨQ믿Ji*ܹJiiiDDTRRB#F2t͘1CzѣRۗ.]J~zzhϞ=4~x*++jr5>On˗)!!ӫͫ߈ F{;w.DD4b""|2dRKKKDQ+WիW)11z I OFR ܰ@G|""ʢ"":x ͟?_z~~iݺuRNo& <حӦMӧOq4f*,,$" 0`T^zիWW^d0*'--v; ȠDz*q'bеk$v Hw7xCJ_iDD4k,ڰa|rhРAtq)Gd6iܸqRRRR$Zܹz-;vh…RO?$Uqnq';;ql^dJHH+Wp,ZOa~{QIʣW>NDDv8URRBR]}u~z, %&&ŋ… TRR"_ZZJ.]SQQqGeeeHtYȸz ͚5}1k |f ;tx ENn.jDaa! ШQ#vI!'^{5'^nݺ!-- /F`` qI >&L@~~>ϟ@`U]pU.\ŋK<֭Koׯ_l`@XX <ϣh۶nݺ!!!p9|nm:uTV߾}mx' -[`ʕ ==f1g!;;˖-C@@lقCAVNJ+S[}JKKaP~}@pp0ʠ둞(=z9so6h r9CZlL4n  шRǰaТE >>>?~<;8q"##֭[㥗^h… 5{z|wuC)))RW^4~),YDJҥK/^D.]7n999RFeeeHIIAϞ=郙3gJcݰP(8xu`ر7nAC0sLڵkX`4hk׮ԩS[U;[,x{{#44-oիWa(((1edddncŊPTXh`X駟`0 ::G˲֭[kmZ=]#+m69c&XXRFFK?ݼwٳ\N ߁k?~}.Vdc aX} CXxl<# E~~ܰS&OF}Qs0gKP(ҡX8CYYJReYvxxx ..NO2 `ʔ)n{{{KvРABnn.z &7FQFh4СCur8έAzz:L&;,Bnbj|NIIIx0tPl6L8]v7NxyyI|~ /֭[m"99YjR(,,drSٹji40 A [$'27bWFѸq*!& P(X|9Μ9`˖-ꫯ+W1wW(PհlZnZ3DT|{yyjr?o bƓO>閗G=C K/#""3gxbVWN֗*~wA`+]Ӂ8f~P(T*a`Ҝ~idffSNhРڵk??Juò,z)4lF˜1cyaܹF^^uv%lV \0 |u8݆k9/6}:]K^U+Wa̙3YhԈ‡K>ð49۫H Pbp?}%}%ª;1cXb||}\ 9'`[k'ե+t:Ѩ5bXjĜ/cQh4MN} dggK%##R[ƍcɒ%o:*w l!;;:u0$_hhh(Ν;')2 IrD" D@YYL&BCCt靴4x{{CR!88RYR]@&Mo h۶]$`p0X,Rۯ]&}BPTjӧ"uU)ʕ+ lF˗/eWuFPPPAP~}(JT:PXVL&`qFHH[agϺ}IKMMꞚLZz@ݻO<bcck_Q_˲(..Faa!ZhJ%-2ܼ%=((R Z4VR?*--b6wǐ$&&J]tI*0w\a݈G-j44kLoD^1*[J%6D"DPTؽg7~ @E0 ARQ~rssށΏGc8` X )b=$ɝEEW6l!5%ϝc B@rr2V^]~olv]pT*  qJ2eeeHNNv8 46lb_@"<<zlƧ~ӧWʣVBtt4رc8vN;v@۶m0 "##h"I[dbccb "77 .ٳo}z\pwF׮]C M`Xc<#P*رc0L1gI|r\~999xw%tРAaq)\tI8N>]} à tRIС>#XVzBu7x|JKKq>|Xrjٳ'lł~A&Z¥KpIF,YDRN:~!222ŋ矗Zd JKKqi8qmڴ{aԩn…ʪ48vލ-[Jcs(+7ԅ.,ˢcǎ`Xwߡ{ݏ;gϢ/k1c/^lcҥJW_Ųe`4_!!!͛7B@֭}vX,|ի9q 9"-Ν;'1-WFI z!""7nDff&K'޽{qz,Z:`Μ9xT|'?~<_'|Ʉ#G 33h4hԨ~WX,|W2d$ڵ qqq())+{aСGV v:ի1ԩS'0HOOv81yyyExEͅnǷnƿRx&"X,( dee!.C;nݺ?~GVV&.^АwxPM5q:u 6Trdr:9mzRfΝ:QzZ*ؿ:uD^^^Զm[nNWvX,*).M_o3fA_B%NG&LMҵxN0t9H%_Nܜl?IAAAJz&ng_vL%Eys(3#.\H4e(55ƍG[?V+]tJ:t_-94lؐG!D ,pj֬M0rss2{=СՋ8rEGGSTTڵ͹bӦMԾ}{8p ]pAJSdd$ ']zƌCmڴ+Vf:D=z.]ݻm6Լys>|LCDԹsgDDԥK""jԨEDDPdd$-X8&MD4h 1bDh<}Ԯ];2d3Nqq1I3gΤ%))FIm۶+WJ""ڿ?uޝuFs+kݺuԮ];6l%$$9t]?rvI+W$QiΝzjEZ-EDDP׮]o%QIE:{,P֭sn(Raa!͚5"##iܹR%"JHHaÆQvh󼔶w^֭uޝ/niʕԶm[9r$%%%IeЌ3(22͛G%%%{=ߟZnM Y,""ݻاOJKK~ׯO7aÆ}5kPTTuP\\ <ڷoO7ntsLK]t=z9l6OM6SO\z)22^u7 .}i&5jD}e˖I4!" w:|ߟ"""e˖4m42R|饗M6C-[aop5-חUPOo&EDD <.]R%tJ-Z7lb*../XO͛7'__ԩ#%%]K4`***"=z4 "h4B^EhP5d'v{[Xaͷ߃oSUeU`ٹjrFy^ٳG˰lhӦ6.FRҫʯ:ڵ+? Pճɘ?>vq[r;^:WWΝ;^x111Yu|hժCY]irQuiU޷o_|W8z(4 F}|I9rCo-@׮]o>x{{W[~aa!zK.U}o> 8#1B:3hܖWHf6QVV&977o&m&Ü&KJ BEɜj{OOOl[72 ~;q^n !XRaJ+sp26g#ϻAEQ[m6NtP*ٳe{a``soF.d<#;;sqpo]nwkZVuxǥ>>`YEۦ\yǵkZU {ZQ#H_J瀸χ&²K[ [+]U7:~FEUfj.um׃W1T1Tl P,~-7zxzz `N7owއeGҡ36Ww_r]݌.r4[iBy Uݮ冋"@2O SXvNqmNTe"AY?C a%3~X- 2dxdȿ ڷd 4±R0T|yz;=jP]vet8||يTa!CJ :vDt^{ZŢUP_ƊN 4=A_tkTA`nb閙oV|ݎ-[mDː!D8Z]HaOmPЄePjvF|٬٬21dȐ! %n;0:G:6u82dȐ7yM$eȐ!C w2%}2dȐ!ϓ|esm0 a-l6X2dȐqLڵ*;((3aZ fVRY#|kF:yAPk42MdȐPAyq&hذ2!   f5$(ї@!ud+3Ze'B]дysY -CEE}o $0 ٳӷCB zXVcz=e{E~^>6o^ 2dȐqOg mZ,x З $4졙'=<<f'VT +C,¹3:iD< Ww2dȐqBPL'S{/Wu՘"xEF(֪TkyM3_a+`4P(T*a pۙ$AVCVym{*˽xfÞ={0x`(i=oV[M""?koucMPy,B|nVBr APKDPT-9'\ӫ{MJpYRnknn7Eʺ1k,j0Hu_0^ePZ萍Lxh=_?4k%%%طo{oЦm;x{{vbj;VvtN A*J%fϞǏKݽp@zz:~gJ%.\aÆInԃeY(Jl۶ seC IDATέ\R~Ν%:ںu+ϟ_mY#F@\\^:lٲ ,yG.]ٳ'5jyI8' RwyǏ& ׼ AXz???9sFz^R!44f,J 6o߾>|8+X)J( 8{lqR ш xyy]vEbbmAѷo_1_ :nZ޽{#55J н{w$%%AR! >>>/.]*} f#F~[L׺͟?III7Xz͛gU*aXR'k֬;wwkѣ>**߮N5,&BtT"bXʾY/2 (Ȣ.ˀ *#8:^@B! zު?:]t'MH{|CS:wN:y;$'ŋ\3 W^OnQRR,D끹Fl`־5 d9|c;{cǎS{!{$IJ8)JϽ..˲⍸λ}=[w ~z聿?o&L&y٣-M[}"ON^^3qfc۶mtIDw 6m2j(DQWFFqqq^P :u*W^%''Ç+myoYIHH //e˖aِ$ Z͡C?~<(_ҿœsiyGٳܸqtdY^{ ݮ/EEEʽfT>믿ĉ8r֔$ FÁ>Rx*siiIDii)Byƍ(F9vo&Loa޽?HNNCIIr W^W^L87nOYY̞=Nuu5 ԩS,Xsq=Zۮ]ncРAh4:^UUJǎJUTTۻ,˲ǵ,cXf™F8 '""AlL&.^H+t:!M6ÓE߾}lmvLF#O<ыݻy_Z-[n|Q#Gg^ ؙs>|8ZFxw29wiiS8{Cq v͐پc׋#ƌMV-Q._̎O?E-9{ڶڵ"Μ9CrێhGee%ϟ'!!kvJRRF-[Mǎ=z4~~~Ȳ̧~ʙ3g :DDQdݺuү_?eDQ$))G}TOWڵkk׮E$ˠAr 0v:er '//Nɓi֬:tbnܸAѣjRn˗q8H4i pB﮼j57n駟fq!rrrѴiSj5lݺ\˖-K5mڔN: ,Zpy!W_}Evv6Z_eǎȲɓi޼9j">p8{f͚ϴiK*yϡiZ~vIyy9zKb M˱̞= &$I8zIFFAAA۷#T1®͜9sQTt.]믿^'\j*ZjxST±|v;z"##˗́nɧ>pBߏjeժUoߞիW+$''{O+ &00EnGRV+Ve˔s)))u9zMFFW&,,:ZFÊ+x_5a\#66VKaa!ZgL<ׯ3uTw%l| > k׮UnGpI>baȑ$$$p ߰X,78j5Ǐ'33ZK/Dxx8W\aTUU1j(:w8S<_AfOhApH(cƌjreNڃNcdee1(5w-czfz4hAs zZ̜9={oӧO3#u6 <ݺ+seV9x0ʊ JKKٿC>O1s22V-[ ̛'F#,aZn;s/M6qvʛoƍyG7ofh߾=[?-[jYp!{K.dee)Ĺsr{n0 .ԩSh4MF.]7X&NjkҾ}{x ObÇcXܹ3[lfyYTTĮ]?>< {E:ugQ\\Lnn._|&Ly v_/fav:u͛q]z={0|CFFVN9oNII 9999r &дiS&N$I2c i۶-ӧOG$#2?6l3呟_޽{?>}e۶mki4RRR%22Rp׭[, 2=z0k,ڴi]ٳg6m#F`ʔ4/vSy̑]ze˖}ӦM^SNչo͚5̙3y^|EFɓ󪪪b޼y4oނP>#fΜ wҥKL2#G2eʔFqp_YY̝KV9$$"""8s L:mjvInn.&MbD=֯_OZZ5ݞ[tt45CFCeee}Rx?~͛75kx5hiѢ$%='۶!_5CbЮݽkw/Cj Uyy9tБMBEZhaü*aXD3Vaj`f͜xM}ԩ M˜p =,#G@4&vN ;ޭgNjd~MN@jV|i/N!883dױ#[dXDҒb,O?ͳRy?1?HHHY31|;wr~-͈&.ܜ>}\ʢr/w Yarz ǎ!$$Ӧp摦ƑI3LIS ^.]H+\EhDJHp0U^:Ě}eYF4fѣ mjAQGY-(Q<#5r=; p8ͽE5j$c`XGXhv+TUV8PT\/jghnPagA%ѪupkDh0 J(fhӘf>#m;K|||I4pQIqeh$T*($Yg/_NvvሢłNQ2ʪ*n('!vg}&vh֭[Ym~!^x>eI"8$QFbh{Ͻ[WFJ0Mft:IR y=SO?]7/ T%:)pUm0ٳ?pIIMM ф?ٓ >}g0 u8 pxxwwFϘFV3o"O5Y(x`Zyۣt֍ 7gT֮[ǒ%KxKV+vV\ĬYj^(aMpi7RMRRRt& IrL7GZXt:Lf3i4G6{y\I~i_yKjb^ sU|mno߾uV^}O<޳'VQ4i*AdYp`0u\izw_~lϘɦJսz5~deZVc٘1c:F#XXm6}$90EgIRZEe%ss9p0Ir?&d\v:Hų gyW=_j$N1W31|811h49zÆ2d`>3{<`9sxg kȲL&˯b!<<>0Oh׮bԩSCV^ॗf1`4 9z6}CB<ߜw?رcEZ-СCx 9s{T*0:ٳ6l';v,|NeY+`\# wYr 'NP^n_bۈ@JdFll,}ŋ\vMi'Kx<vzQM#I«8DN۶mزe _|%YYY7vP:WpևJ UK}@XX{UUUߟ9sfӷo_dY}v՗Gp%cǧ"2 0;4~~~Ket:˖-b(lΨLUUeQ)Bq [OG} bF#Rv`ʔ)\p|/^Btt-9t:|VgdCEN8AEE9͚59TΕ $I`0tmƴi"??ŋӬYȑ# ַsP g("6 ҥoaFf͚ŋ㭷ޢErs/_-%3{l.]D^^o-[u_zGl6oCnd>?DRRƏ#Ynjh; 0޽OsΟ?{1b8]v^kZ*]t!-E.*͛@n2gRSSjqU._|G֨AWUJ&Mxgp +W@Xz-b17X(wﮓZaÆsO;֭[ǪU+QTK*mEȲL@F).u:Vj,/Uټys{ll,&LM6JĉǑ$OYY99TT7T'&&2} ֮]JUoCCC9q0$;R9x.l6n۶m[ʲDyh߾#ǚ5"?~j@rrr5XjdرWЯ_RRRXD.\8OEE9,ԕ ʽ Ddd^T:BZnqokD5ÂF$+l1GAiH^j~t^oq8著Sq8Jrq0ٓ/u[{lV^_Ϲsg֭;%kV X,˄R]]xzP `0i({]S^6O"884cܨMz*%/Wv,Y T-Lf/M2^#44Yf;)JbWg۫-"[DZl噤$C< ۶mS0ռ7w Z_ft8A`0PշT͹*ӽs{7?nGjRUU,p_F o {yYۻwU&9!Q#G|rݫ4oFmtЁ`l6-.g-ܯqZ/ze>CÛ(FCફBΟ?Of())ANMbbFDnWnn./^TPu搝ʕhӦMt,+ɓ's0JT px<ڏ(ZE:7^շ:nspϫ***nݭ~T*ux-MHJp~c$εUV,ili60~ү7Poa"Gj**y XM8p۷s;2o<t~:y2xh6{+8t֍>u7TTT`BBBtL% ٍlfٲ|WPH|eE L$L8W?n+ޠBׁJhɭȍ65a&b2*VßJ/7t:Z-v]MNUXVe+^2vy]X#*J=]|=FY)[d26jZv~>}?ٺ7xP; pd]{aM =Cȍx^\Dp;\F/7E=*]^ $hd2W SQYѼ O$I6ԚU|Į4 MVyl架5/e!7LAu6RJKJilQTDCVU>Tx14enjZ:6߿TTu?hlۮ=UU6>{}-D_?yi49y~ܷ~S0:t||e~π5K>݆lr%9w!!س=>>ߧaZ,F)<>>oB"s) Z͙C3y|g|}|.x11ji*I$tG&Zv||N<k$ pP|Mܫ߻^||k9?S1lڼQ>>xk>Pڇ%IENDB`qstopmotion-2.3.2-Source/manual/screenshots/dialog_start.png000644 000000 000000 00000136275 12536560630 024351 0ustar00rootroot000000 000000 PNG  IHDRzFdTFsRGBbKGD pHYs  tIME-,f&_ IDATxy|Uչ>9! S -:TX[ZZ;h?V Z-" aH99Z3$gp=O>s^{ z]ܷ-===qXZZx` iՊzB @(bpAu\.Y0000f̄q!==bFFpz!##cТgDpz"==ji,4iZ}>t]gDpAu|>~2?!f3000} 3000De3醁49,z A^UU@N'B~,#zF 30000~e```0FE^g```8uNhgLg````D=#zF 30000g`````DDaN1VEyW6nqsQvDDiژv.㐛 z ihooG(JynxG__F]Nݎ/ qχ.S\FGOP"T 33ƣ%ap8F$z㠪*jjj GUFEQp/d]^^:3#ѓ_v!_vv6ѧށyFUU4M#E:$%, !~EAVVl6)u8wG"zb$|¾iZu]GAAw zMpb@Qf0Opu]GMM69',zqQ477*Y/Mb>DO&FQPZZ$I:ViСCȇ t ̽UUߟ MӐ}MO 4@- 222`ZMGQAC,zB,:;;4v*C0t[*=&rAļ^)'iJi!>dqlÈ~tpݦ5QQ^^zro]vzLIGN}Vi\[Y-9Çz!t$:|>w4 999yroÁ&:6KVKQ$/"dYE]]]zQV>ϴ1\mwv3^f5t]aZt:HIOOGzzdױ5ۯO$ Ainv(Zh]]D>A2Lg >@65Ap C˃(x<˛FR*21HfxP__?A@III܀D"4-IW:Y,1+'t2XV" v2WIp8` IR8?v(D#}kkknLf2"Ȥc$zj#P/ AQQy(fp@<(_1*&)i"-(,,j7;t%m,itK ף#Q!"N'Vk86MMM8dffBCQ&l6N'dY>㱒O[|!k yI+WB|Sߑ,?:H 0izbqeY,˴C@}}=D4 . <WW::::騂 ++ eeeX,qRQ444Zddd󡭭H:nq!1 %V$/V'Ojur  Ԅ~W;,ERgEEE^pGE${f @ccV0(**oii1M Ckk+nwX5YmL0qDtvvZ<ߏ؏dYFvv6JKK|=PV2׭g3ɤ't >l˷yyy4|(*3٠4 yyyt`.e:zzzxp¸{ 瓾zt" #n/Y8>|8H +ھf̨w=z(:mF2|>:u$TBt$HҖ2H$ׯU8yT847#;\x!8:]D>mu EQvQu=OMӐ?byn5WuHkf:y" xpM;$rnGmD"zI4iX>/n q~B!dfI*X(6 t]Gzz:A2[(Q~ZZVk|zFq`0~AEFI9p8nʢ2[t!Ē&V񗞞4 @Jb꨷@ ʪB)A$8Ψ( Fl'ү>SGe}6B:`WWދ/6Ei,`ȚOOWU>Q:TUŧ~4? ˓Ꚛ! D5kCX,vmj""T&2&\>|8i'8'$XFIRjc$laa!TU՗Q!RQWU'N~Dʤx mz/,,D~~) Lf6?Nq400`ʷ*ΝKeף=V)5o޼MSSLv_y>AK&A>|@^P9ɂ|s8 Oi%R rVeZZZKtӉ.bvBf`$|6e4Did=i$@60d:Yifj5f='R`ֱm< ZGfiӑ9lʄ4t ͌[#ef^TTrL9Hթ  (Z:,pG ";vgl6z}BI5hfq&DdEq\;̀ʊJh2sEA%Vt*tCZ G'ឞ 5 JMsY^f&g"" clmW%(Kpf#ǐ8\?PTT%cc^zMS ٳZ^Hoe$iТHf$I,YMT,&ׁ`\HQ4;J#;3S!zb+2`I(!YmX[[%av)--T $j__yMsntYi"--t4 4KdQJb"BV8f9/E)Q?K?SƢx6Y}m,twM>#,Ŏ7ѓ ;:i7NL T$ ,%6Ir`>(]FHdR#+7ƵAaa!qN5cl/$IKBxJ@d**]NȮYc(&,W$AWDF1cWVˑH}8=;f+:;M9a9Ҍ wɪL݇OOXQ pIA"g@P}ESYޒhDR#Ƭ`H_Ȳ(Q0:6*FkM66ܾ3dmec=#^fI6쪂|7Q$t3>8ݤ.%-\g~聀{.`UU/ǛI!N7`5@t1dzIey>RYcj18X bg=F4?>*@*rG,Y~SD)bvCQX,f'`0hZ6!+T|c1FTҕl6Ȳp jڍrY@7yner u*&w66X,qʂ,E1jp?,Zf;YgW[e,.+"eHey>`Hv{贋sR$r򮧒o*RAD24J4R(WB#:Je0'O$ی~2:D B!b3\Zu}7uzL"X,FbT.zSY擤Wf6 Mw<̀%`0h:YHa'# *BıBؾ*@nn.v{|>6JbOH4"G `&Xfuqb:."%Z!M<uՒYn>fKQhC3YR*D5CmijKeDc8ӬeaX ȱj l2̀7ƃwc;1qU*|!.1 TC,%IXcN,\.WԊ(`4lc$DicIUf7նQ񒪴y,mRٰ꓆H:3cNi q8x S6 {.0hooitB*?blmmM).uݔ|hu^aV>0I4\@wL_%*M8bX#??iiiq)JFqYpavde500`z\ fPc̐+}6NuRD(QW8N)-Hj2Ȳp|2'ҍYp<: E>BF)aDpC\vQSSGR8a Nq\.1n#Q̪' }8J @$1uހi())I6 (&u ;wjIN BegqsiG'tMͬH5555jwXۚ8jۯp;Shϗa SV=( ^3fXhyAbbܸq 477.Hnq˃(..F[[ cbg69UnnnT Dg!NM 2 -͉4Ύ#h2maž(LI'tCҍB\}5jhn7tAa;HV NxH| "I`H'$gܹs5BDt:4#77J)XSg Vf͢[u||YiسV[EL2%iY9tb5DdK`Z1g P"nE :#1|(Ě@(~UUS* F:lnjokG999Ƞ}X=H+b8: aܸqwo6V9> !B(,4q7+K.n QGMudCL,#''瘟O&6$|A@݂15Di_zT 4R9xF~MVÝʘl|S蓼 VU tkdC~T9V Oayށw\TWW. ,FTVV%IqPSSCWsӧCQ9rqgϦo$7"''ͣRmm-%",X@ڹs':;;… !Iz{{'Љ .@uu5ۡ( .]P(ʸJ &`ԩno߾]]]طo a޼y8pCA qF6wڴiˣU]]u;s̨SF}}}1`%Kg FY;wDCC=O.ƍyf\.رP1ydpv֗nG$Gnڴ ?ylW\qmۆ 6rN"G'Q+!<;9p[nE0jEuu5jjjOo[ryCuB!|YgE>㣏>Bww7TY1m4w$ *B=k~t عsu{F8xG)Ax<(UUqA~ǦM(QIP^{-?|P[4L>>[l~c֬YBزe %/s̉Z!KJJׇ-[@$+P=DnCeD"~dǎt$;,طo0qD躎]vѳs*i޽4 g} pџ"(,,DVVZZZ<On㦛nxHd J_RRYxL]TT͆S,##]wcF$,t)^__O?i:,j96m`8MMMxwhiieqq1V+h+++4MC$ݻ(={6%"tttV`ƌQx8pDhN-qQuK4|u"4"Hޚr7UUu}ڴiH)**bĬ:233]ף;NR&c?z`ƌ!PTTDeBjЉ@wȄdldQTT7EgыHIJ3gQmmmӕpbP'WYY>cJ$,Sf߾}eǏ޽{cbXxd@IpT^jnn"GIp!H'믿>*L%I*dggwޡ$I8q"rrrpף D0m4jqZ\EQpWvOc֬YQ"ZV&q{"h]r/"o ׋֨:eZʱ|WQQ222  j#ztXBL:MWW^xÇ1al6J&_|سg%Yb}:4M"[Z aXPPP@\/Ӳr^\s5Ȁ 4$_jEmm-|~~>2224 Xeqq1 it aƍp\hll!D)hݻ(B4 T%SNYgצ$$H֭Cqq1x Fe% W}}}W EiAGAAV+";|QRLaaa-n݊P+ABI_MKKCqq1CWiiiC?:::h`~CGAwiQ=1HٓO>In8џ"8z(v{eMbu-Y42 t ͆/$ᬳBss3::::1sLj7T6uNclmmNׂH%KPhhh@QQ@D$^z nDI&++J-Bmm-TUE[[l6 )!v#D5==nk˟_VVs9D$AOO^/rrrg\.%rfEQh!GF=KQ\veqĹZ__O PSSCIsG볮N9( Zn322PTTDpWTcc#fp@eX>˃(0PGNVZ[I7WFlkkiF(Bww7'8NX,|ϧ駟"777zuu5!IxGNNK?i(n o*;H 3׬Yk4 >e%< |F 2B0}ķ|>*Wըy 7 7EXߟ%)I]. 'zD ctJEQ$AғT$\$ZudR$ `05gLYa#}ooR7dJ@Gc/*5IO(ƥme6 (BQwχ~b&42Y*ScMSƾDޕ8~cXR;pmb$ XO^'$b$rɌl,cy! vM&z6#&2~v|! p<-c;RHdfc˝~a2ld;BbpuR`G" #k Xvm{I(XxqlCXrטypq뉞ELõɮkwo Sehmmõ^ UU<~׿c=Ǻu3gVˈm*"z}8NgDA7•GhllĕW]O?=_u׭$Ix '??8#GѣDGG|>_JN8QgnٳaFtlxe=^ݰO?:::p_}Ǎ nHJp׾ ^@ꫯwO_~ gy&۫W];}/ݭ[føؿG1}tر/R+Vu6s=_]]ob``|òKю?I?())9sPUU&XV_ }yk?K/{mƍqW998&G}_~ nx^/~ˇ1ed<#ߞҥKism8xА!ix8qxa:<#on66oތLZ 'E!׽ ͎$XFG@NNxGKK q\ݍn?\P8L5p84F1n\ -Ios )nqLEHY!27:BQT,8 'HN6H99hooG͑#hhh?p Md@---hmkK|M虶sHQ{*+i:xcm z$o玄P(P(p8 I_uAtvvf!|pKÁ_|up 2yܹ1c.\0b;p>pOҌg;-ZJډ8C0zzz`Z1eaȲ3˶ָg EAMM `#\Te`-Ftu6r& /oBu̙[ (P}h)g8 IDAT#shY^2L񹮴4 Fx$I|1gG~bBSUs=ӧO8CCC~C& A|UAXx1 i,Y‚tvv>z-;grssr?p8EŨ(/=fCeYBZZ<ك3gBQa (2ܨ*0qĨCY ϕ9{[ xdp{^| }7?~ p) ~ot?g@EEzg;:q:::{tw`+?>~r_w?^}UuY:e*|>>ٽSLU+#̜9(fwW\q'Ӄ<$ s X6,]>,קQZZK.`0Eӵ(ǼYߌgM6ڕq%%x7on;P#ᨹWӴ/"WK/܆;{;,\YP^^@fE<y㍐$ Qa 'VQ`+ Ҡintƒ?:Ydyd1GL2&'g0& p]w?)8G#<ۿ]{n:򡇆%b ,[ Xu7J:< ߹v˖f E%d _v9~?ѻ r嵃Dc.sǟ׬A(£<Á֮Ey4Նiض @OO GFF:0~|(((oG(BEE9$IbŐf}_V_y(//sq<^Xt}Pe}O *> /!,Yu ׏ݟ MWwQTmlOB )R+%  T" t{yS T `J&wf?vwȦ@"׵fgO3y}sI\-qSH9u)ݨ:tD>F6$נ°{H+`UNs 'P= W|HJ"))x5*V@@`ww |E ntE C1fuF:џGn*@ůBbK=MX .jž6Ek53:tD^TR˛vD9FUt> V5.D TDn nws!''L/A_e.JJrMTU>iBT:uF:_йmwS$5"cU:w]8k'QVӐ6 k5a DQ!OA=.^g(?YcTEF A?z%聣B3:tD_D)eTaW0Jn@5$&QE0)n /I7^7k7:tЉ2NR-6(:HVa xnMB S'XZOwnwV3HHrnfR(LrRZЇ^UxԜoEA"n S:tЉ<2N灤߁(Xh*=Br24iUƩ];> lԩMؽ3ЫB1h\sOETeЋ"n mR@!_FнntСqdqJ9|\q%c ܲG嚀om"K:XmtС}yCbpzm[^8YYdXY3ۜ8[{]N8{&j$ `MMRK4%8O)l&B-K9腪#0þtG["0y vO={? Ũ翋A]Qh(SF(J3VL{G(3n&nA<$%Q!}l^7=jyΝDZcGILL[z: c/34::#AQƛn IM4f(p ޞ9-ZЪU2E*Ko:t᝾"yd o>2fs0HOf4ﱄ$'I*Je5#6I!!"VbQoߎɓ&1ֽ;,=zU.ӹKWv߮Seǎ|'bԩe( qڷ "7oקkatJ7*IIh֬+˶?l9-̃dfd qRSjREQA9UPQHR#k _/rJ6L ͛Zz+f߇,+8NV^͖-[XlקZjر3gO-X,^23Zn͛YgѼysDQd޽?~D6Gi$X;bc8~fm`Z$ݻwsQ*WB֭_~m۶[Czի+; XWQjjx`v{w9yqz-0X<>z GcҤ|L&6>|>1118Gjja{fϞM"bEoΈp\,[_|ʬ}v<'Nb5ٳq㟤Ʉ سg 9J(N:t}iBY>F)A[^v)u>gNR{Trr2 '##_N޽;WwF#vUUym۶@kgϞ4hpӞyш` ++gO>$0'#$Cjr(t EV[P :tC2Nm5"ڄׅ8[865l&t}cchX5q1I\Ѥ5vǪs>~/$ݨ!@$bRU Q$--YgqWc9t7mP N8&';͛(;,7$`ZeY#sCV|ylPEZle=f,7=&6._ /Gy ZhkOgy|ԪUDРBx?ҤI222fZ|f ;v}v|A+::Ç\3G*ULR*Cǟї$|n|>wH"{n!(V=^UFED1uA߅+x$V>d4ptMO~7ұC{Y\.q 0i5Ysz4oђ?Dbbbi&~)ZiرOh:,4 ]7e˩^zpYArϢ?äլEv>cVCbb">x|YqEQ6t(I$%0gY0n[K#55{;BRr L^^5Wgܸ'լg}4 )j֮áCX#[Ge3gjO4hР̮u"~&|& pyn4m^LPCD@%y2eWBrY@68P ᮻhZpUشq]vYhqPhZmHxx{T#h4ї*Fs- "dʗqPM^?JA1D"@ [0-L8. Wh}(~onnnAzKLtb߅74JnnE~WHK2Eɳ4 Ev*\~nђ O^ w8]u},@ M&_p8tޝz鍡CǿTB&ME<GAcPZ5}3NJjj*'<!qС_@жm:thM@ /5($Cǿ GK:.Uj:tС:tЉ^:tmqA^QWN^^޿AܮäkC.\.Wba\%I~N{ɍzĶЪuK:tgզ 2yݘLfRV)tȞ];աC?L&s5z:tġ:tDC:Ϻ +fRNgw[uСoB< |;^5s9lܴ)XbU ?Q4atСBQ\sMoQo&32.ǭ?M:t>L%6Ϝ8q(Cg`=m8|nСC'?& m ")-R$I={B2-H1rQzQ:tDG$j02u*/R `(>X,dE֡CK¢plI0 4$%aUUn#iWSUV,Ќ(ZVԦ*v U%"_Y:. 7Ll6Db-`{ɧ/{_LUU$ ҏ>b%>.;p7ۼV &##Qr@ %. Fls7JԪUݺѫWR F.IBBBh ʄUV:1D( ,];^zߟ=s2rEEoM7JNNv@dR&NEiӦ5-=9s/**Ԫf>ƒ-["@;2bpƏW!*$eFcrff&M5Ge|^:fӦMe iKdriF֯_Oо};CR$=Šs.Ջe~Jnx^, jhF^CP1 FQ/DHVU`@ETU=(Z:+W8߰L%,fU#eՊj-SX3Gvv6+VUx\^*W7<Ȳ`4c IDATADk3s{mdYh2c%;ǣ8:.}?{,s+ŵx"*UfDEErAbqʽ0+<#y<3DGGk3dFzO-n:06WFZظq#~&MCՈd2oyE~7pM7zfa|8~QQ 02 DQ$++ZŎ;9y$fzu,f.][8z$Ѹq#:Qd!ڹC lǫBllyеkWE@nNV߻cA8q۶cٸVqXVN'ӧOg=JӦMl! |~;wi9|baΜ|>}$fƌ74޽;> kiSKG2cǎ5)Lؿz66צ͛$!!Q#GbX"4鸸8ƎÚk9u6mgƍ|vLDsϘҥKh߮u?Y˖/_~e|lܸu+6#OYgtоL)Gylp(ʫTV YiѢ%kD~+V@$wκuvؼ9($%U)^^|ׇd0`0H|>6mw}w1իu}vUeL7߬ Vn7 \A\w:|8"={rײuVk֬AQ NݍWǿK%T*ګ$Wx^Sn]Ҹqcl6+xLyS6111tMUW^ɵ}~1(CL~~Fi CAxg\.ԮMmv>)TǜvI=xVS˷ZjT^]\Ț>bd~}VkáE%99fd2!M65t:YnwqGD99l͚5,YzܹV5jhFZat^%Kh~bhT*ܓ,驪Jjj*& ѲEEKQٷo. LZxפ b2|Ȳ,˜9{Fff&. O{GvY>xe)6\x1Wr#""yygs8Xp!'NbIԫW]hVȲ\#I+/Z$$k$DQ$x@bcc5ƍap88Jzl֭[ba/VꬓKEQdIƛzfQEȑxw֬b߭XΝ:]DtYKfnNv'UUi߾))) nf^yebrYx0D'j"999BII >̑#GHJJ~vc4III) `;x]v:ų=@׮]E$8rM^FZv[,`DQ$%%ݻvi4::RwժU"Ҭר-;sT$ٻV߰;#f[z:)))%>hÌypݤՠn:tލfMl5[VZP%) s ݺ8s,T~ tш(|>FAjشi3>ua3\݁iXP[l)T@QTA: TE󅼇 CK*{SF\TZ} +oѲ$&&b;Vjڹpڅ#o;vuFǿʢ$GEA,}_^=dBuEowJaB.z=\pZar+kSݣշpJ2N(Bbb"|˒G@T˩ ƻvb1<ЃzrH_o?ФIc=dO4i҄)'Ӯ][6mzk4:tDD\.V,_?w&i:a2Xre\W:?u\Kv;sOˋG:cUU=o>סCN:tСC'z:tС:t -MFv~(H[$IСCNTc횵T\E>O9LQ 3gN#$Nҟ:t#pq;NJJJSQZaFСCl6.I EqI~zy9g]YQ7n[B J}^f-e,ۀP:Dpa=ˍ4hP+PU{hկ__0//gW>ϿK9pW @+~ħ"4@7)AZVl66 Պ!Ap\yfl6&\1MbSV+q k؋teH3.>Ze-ylu}^}Etrt2hloוI+b aV,X ^ZOO`\EQQQHĒKiӮ=}fbi˖-uݸ\(dggӥk:ѿ^BA~:t$**7Qd4kނ-Zru:weV\yU\qEkhQT}|lٸ*L~PSO>IFFF2;k۶m+7чb̜W #??tܙ*x^֯_ɓTR]pY,Yʯjw^XV-_N|\NG^۷/c4Yd) ?~T:uD `5pZ:u7oQF4o֌ꯉjjU7_ 7|wfѭ[:&GAAǎCt/b&6& ={6~SMcȲ̆Z*ݻu###ӽ{wTUe׮]2:gС=8NEh4EllFB%mY)((иQ#jԨѷ۶mC^^+V3 ֭hҤ1k~M7A[1Mb2XaVnaظ\;Ξ=CZZmڴA$ΝGAUYvmv]vv\{srص{7]|UW^Ijj*@( 9tЁիSn]11~ɍ{Ef͈,wf(27GeÆ !V ??cc*cƌ%??ӧOo#Iӧ`GK1M$6mjsϱfTZJ1$Udn:,3gN39j_sA^y͛f#55xj׮b X~=?Ƚݏfc>s:BoC>`X:$}㉏gֻxԮU3f;`0aV<ȀYx G[njgbݷ3|Q;P?WvUZj Wo֬a@x<L&Ξm o>̝3WV+{/7oj믳<Ï`2[/?¦Mٷo??'O$&&XWN{}v6n'Ƒ¦͛(c vVŢɗEp8;bO8qF^{Ygc۹s]l6f9⹇,Gi}q#6&\FcDߎLx塇&:6>Ç ں\.[ΜqqqL{YvERR#o?Cb퐛̙pi.#GbϞ=Hܼ'_~&ߑƓ_*'ȑ#xgiٲ&HFmY3ΔrfGEEqerJF6^>EZ& EQHOJLL_LL &Qi2>SUU ORR,O?a2X*NO[_ I+6+_>閞]8uua)ȊB=xh޼999wt:y嗩QN "Yg9t֍ln7s!??.]:ӹsSٲy)))ԫW6mq}v{2y2>яSfM|`G1lP:t@vϫ~uF/@D}ΝG޽ mڴAE:tltgnMY~fNJ0HFDUWsՕWjz#XH;vҥsg͢<_=UW]I۶mP|? dڶmCZZ>WK?aڵ+۷v+kHsrhب1f_`1?jƏgT\T|4#GK̝7n@޽سgNԀ%5kҥ3Y>:v쨭۝;wfx<> :vnjcN:v^xEfO+^QF뇭۶eرdgt:ڼ9vYݭ[:@vՋ| d< *3QU̬,<^ކ,|nyyy89l63aDFI>}rݼƛ1LYo>#^Qzrrd6SN! L&|>98TWQ:GXڄ$ I"fpp1&NRFuY]a/*TGEzkk֮n&xd2EzLIII`.,c4E$ 1r5{}1Ҧu렜kBj=zIhUVWQ|T 6ʸqjU2} w릑bcbbJwKV%K"7o'pi,(дDQ,ϰUhXBL4=lhqkB)>]]z<쳨jP޽~ѣGs:n|>_DRZ??./#>kf̙3|h  (2n5kj.|Eruxb󓓓͛ooGM6><,kM\4/'Y{ƌ*vN8Y"':u ý܃ ̟7+Z'Ǘ_1GR u IDAT-?DСCvN'G(ڹUS5/O=$]55СCԭ[z-ZD~h߾w=4HHf[QN!UEh}/2K/b4hЀȼ ~I!:|0|!|)߮] lْ5Ҙ4qW`ZY͝hޡV|^@;v0u;ƌyo\o[,:]Չ1c 11]ơC tЁz^zÇ `ZiQB]DXb?b՚Lף592@v@ЪZ6mb?иQ#?^5j0f4oތGU*' :|CvEmUC#lE'1O4)ryv,]gϜz1Zn1}JNNfc5ݻ_͈IJJ^~%KX#jƛnfӦ|>|Ǥլ1O`X!CW>_~U(^J:t&N >>=&Tm۵df&III(e]#?zp!ͽpAe8ZPjWMB>͛cy=\.WvSUA`СjՊNШ)^odE<o*ILL[z:]w=ZL&|Ν:!dP~=e~7k K%cs%;~zf|Aƍ nl`6-;︝~Np8Z,(wEzuIZW W?߻$q xwZಆtҕwgl6:lTXh ~]oo޼ĉ\%~wޝ,ַAglٲ NUǂwSN]~Q6l"r0x}> 5C<ܳdeecvPUUorr=wMϿ`6IIIaܸ'x^&Q*'T\7| .kȾxde*WyDa3gT(8IX|}G /.@B|< HKKѣF'L`I\5E!//|ȗ_|tݗ@T5..UxGm4lBS^B$6IBSRχ`nc0x> nc2p:V#GxW?w*h7DQ$** Q #D~Y:fggcۋmT믿`0DIcbb6Fm-[Y#jj*2Z$kpErFődW_aȝCm͆페ql6dY񐐐@nnrF<1+\ nG(!)066!X&ɤɄ`"KI}2\~HLL@#(v Zt4d2QPP܋&v;n[{uvLLt:5hEX \_Eȁ6..:FCUU}Eh42n8T`ԩȑ#L{~ߵ̜.C.TKs7ױ,$#+Jo %LFcm6HFoߑNff1f =2@L?XE|A^ \NJ.ϟΐ%::1cx+3fLti `\.W1ŋA͚53}MѡC+BJPU{&ѳgpd\ :t"t!"աC%Cԛ@:tסC`QQ@w _աC?l^|e"z|?%t:tGd4V[,٫+7Ħ е՗|}u]SqD/+l߷Y"СWe/СC%uСC' \4tСPH; *z-1K.U#lv;rK'tСCN1 ?>nݺa۱l MAYvnaqt:1 HRp`@ I 6M:tЉ /-Wg-ù%*I eNK:tx{ƍ{ɓ'0qDLJF &'nСC'd FJyG˲q{ +09X}aV:W|@(P$(;R@4(pypDe+pшdB`,LFv,(( **J:tЉ Bkw I|`.)\58L=ɓ8r(j # }^Gf(Jv~ WhTU%::Z G̚5$IL&m,ZPgUU-vQ:tD_Q0J>&@ ܡ<9d'd;"¯ x<<9!)wVUI(((`|v 99$'Щsgn4~v;M.oJ\\, , 11>/CׯgΜ9_Y} RQv  Hȁ^O+d'2>OKأ}\^ᙕ L9QQQ!MDEE!2.@*QQQla ^իTVI"))(mYS$zEU!Iχ((@CBt_1/VI65> 9 {wɓ&b4/fرthߞ*U^HA:un:|>͚5c㣨 :ȋ/PoeAx^Μ9C.0h Xz5G%::!wI޽JAl2ٳtr ÆͱlټNmZ8{9o߁ lق=Ftt4~Qٷ?Gnn_^b00ͼLYSYYVMoqK/kMV|4jԐf.6h[VnV6n@NNӞyGvHOOorJ98Ķmx\8@&M4iu&(oɱ34jބ[U,,w!_K4B/Vԋ(7oԩS$&&{&EW ²Y@"A$`;P;{A)(K`N@N0""$AK^6Ll Pez]~ק5.v{_ǟ|CYZ6n˖_,_3sL.y 0v܉Fu>3o{Ǎ%fǠ( xb>={Hb6ɔ!?0jV j0 ~?.` Xd <7ΙC^=X,YƴAE9aEaǎ 8BTUjjjv5\öm̱͛7Dx kرG so؀ԫÇYz5bzO#G23V\ɻ˦MIIb/9E6+Nk:f h3+34M0&XpIƍ[rG"8?Lx7C")`s0|p}ilڸ5߮W_-0kLcǎlܰoWmXXa#G"++ >dBƌgQ8)WϟجQ&) x( iii!(..>eKHUh4bGe۪ѩS'DBݺue*6 :uꐒ :rsSV<7qkt:? 7Dǎ1 nW_}ŁHMM!BӸQ D?0sfCi5/Xɭsj{v"#kFAsrr;>֯_oCUUY~=>I&yOpN^^vp8Nѣnn݊bQQhif.[B:BЉ3FW)v\+,,D4IJPVy ʽ|^o B'WΝڬIN'B?\U.@qҩ1֬5bժU B$f߾}f B/>ZN CGh1FDMx%Nb$="LTWufFTӁǕQ#Y6kI/Ka?OQFhb<㔔жm[.#FIJUl6۶m#$~N]`ذiЫT_G^5@ݺXVvi-[YmTszŚ( if7/OsT ]$&֊λtR>^n^;x0n)KN_,*à~V䶱t9O*$,Vʣ1#+nfŢ2t q!7n-A\O>6*' /Ng,]W\ivݳ9scTUW_d{tҕcз夥bZk?I&ШQ#(,,$;; ]}8R>xYXӇ$Go;nGUT^|EiҤ z4|z|>ڷoϚ5k4hwNڴmf'~Nmp8D"L4~nӤI}w>}k3# 1lo>l6vK''':ze> %гy .)hsWK/e]… LyQ|޲SiE5"HqtMk.̛7'|㟼[L4O>s͠ y]<2y!UcJLƏ3h?RM UUIr9 lS{]iժ%V䣏>f5x˼rqW`Zдʑ 7@RR7[ (_#GaCiۮ--b(44nƢZ[z} :lrWy~EQу-7Yli;nV-[ruך6JUO'aՓ5}˜s dggsi׮M7ffΝ87nLIIIBڵkǰaCooGA~~>ÇFZjp`(?w6mJ($''6mZ̟75k$2޽E+9PO.nrsBaZs0Z41)-ngF U ո ;GIEp) _T!~\總 G#~+76)) OZxl;y 2H$R .nٔZB4R7PUw~ ,@MB:ED]'[oYzQQ=V(`1[!R/H8FPZ-xNTE=[l]CG{Z^{)WLG͊ .3̏ :W"H\Q/ؚ0%q2⡩x\|iNFC6/-$i:]v́[բYUxʮES QI$)?ѫ9ih[% Z(X=ltxjaQUZ&D*єBՂ3CDžLH$RO!@tbNlX޶j5LUQˁ8" $&NRa4#j!-].R%SezEaa)a0bFaZ6m8hTZ7'EUصk۸qm%hQBrƎjGQvm0x{h:LH$ROEQ(++#)ITnIJJ2하M%ME'ZÚVFtӁF;]5al& ؖ{Ƕ5H$)NYYΟba /ЩS `Ȑ!| `ٙ:T]Í0XVvlŽM?`p &LD4w" cFC̊H?0JVQ"9m=p(륬,-<ۍ$_n ͊n#~BarSOѶm;.ԙ_z vFF˪2mtVZU4QFgϞ3bpaujuRRYkgF}JLF}ͣ:Ý$@_x}&X:iiiL8P(đ#GL&fXY)٨d6+_-Xc탙x  נ]jʫt! q=cٱc'| 3Lb7Wͧjh?L)xUU))-! %lW9{/vI DT,+V| 3]י2s;v"!U]S옊uax"3(h]ܑV%q5Ʊrrr2Jbȑ#\ +Jʤ'f35ME[uNl瓉cb 5jC5j( |ˍ7[.Vѣl޼ڵjsM7*v_~int:Yz5%%l߾1p4hpcɒ%EѹS'|>1`":w_lF ~CY zU ǟyӻ7 ߟ3CKҥ 0mt4l؈w^^zevM0d?ҡCEl^UVѻwo,YBǎIMM,\ @aÆ eB|޽z9пMuCg޼ٽ/G߿9sr2{lڴmKLޛ9wA|sA |0o>7nqу/uٸq#III\u$''cY{X`Lnp8xשƍgA믿Nnn.+V|p'BpՕWKYYWgϞHo݉D"hƼy[P@~|u_|3idzCm~ibKvq\8v;#!BaZX<-vME_nÆ i{ XTϟϊKq\|w/YkuVxp"N.7$5- ψr%|Ν;ٵ{7>QFSXXѣGydʣ#rsp8|0eee5#G#i_Qǐ'~;l6;vIq c'NHQ]vSg%9%=̆hݦ5VR;4eqPTTěofTe˾r1ذi=.VZp8Ү8N^s ח"/#Ou$''7i'׾3GK~,ٙD4peAdUQ'tE~ճ';v֭g5{6Nhܤ C ӧ>|8_އG#;tڅvDؽg7۶o'Its~0@ @II .#GbX͊JV={oD7_ ~vځfq`|殻  6&Mؽk7mF˦.l rEQ8pH}:sΥ RRR?^.o]7SU<<>Xl.lݺo]jCf2t?m뮥UVA\TU]v|>oicƌ&;;-ZЧ:9s"?}|J3 C>dgWgpݹ1 nڵu]vW9sٷ?.%U_|A[os~i\ЬSRR"O :K' iZnHQ(k:"Cap5#V-[1kl3O?Si,9) ]zA~0/ `ѥPݎ>Bf͚͢ŋHNNfʕpUcO>^Ԕc^yt'ބ?Rt}B*^o4ēD("##` `f5ŮCcψ%qec{ X,Q...fڵL}n*aP'+䤄2oLBFz:%%%x< VII >=Ѱڬ\3p BRSSqSv-c+Z$?xM&O~Fq} ;QJDumֺ(u~ʬU>$ڎyYO'1 [rU[qa#b*1RU%RO;jg' кNn>3 s;Avfi/f v+'O& 2~}\м9u1={*=ݻu#99Vm7n,lczrnJLj! !W/iӺ5;wGz5i¢ŋbrzE$!--͙5{67\=O<$wnzZ[l!Ք jm]2j7Z tmt-_ x<{^. ;;4u86>^0+ 4{v\`Bꫯ& M{t`;q ׋2*EQHMM8afb-  :. ov0`ЌbcBDE!v6 Ӊ(~"ۍas4JJJ̲XVsOJJ¢y8Ns"鬲lNGܢu^!VWy:>/!j+E;H$bC|G+b0tDiyeJJdN f4'B!9z40DybfŊ2~ܺLLIIvV6m@vv6`o>ߩFi۷oɧbcZ+7meBǮn4-Gr1V` ֊l *~?ϞaԪU oEUSg>J.v 񟉉U옒J9ҚQZZZeTs$aW|/Sű⏯y|d%ddfJH5Ad7n~~մA}mV!%%@0pRKHκ|r!іBʉ9m\sR%UwѳJK$ CNf<S̤K$ge408p8ۢ6f@ 6ETQ\.;` "囬˯(Vk467 Bp*53c%Xrthמ&ѣQUUUP0 1Fwn,=z2wp85ZNzywK^VznݺQ~}tŽ;ٽ{w|/}IF"9O0 ~:n}b].MLmXJl6np`B0hBnozFwHyĉ,\SҺukn7aPPP@$1C]aN\ޏKPU.K$g1cȑ,Y s/$3a0>^{uw躎@q{xW(سg2_i0VY|9n;ZO!*u 6?KŰap:s>c֯_Oݺup\0k,~?7p͚5Uu#2V,.m|nmSڌyn˨)jܜxNFUUvIfp8h0&;baѢEL0뮻1rHV+3g/`4i|cѣGcXc̘1=zWKDr66A(@; M80tB B"F(0 "0M6eF-O[=Cm( N@OK4 @5¡ ]&LfMUOC7o&ѪU `BAtiCq9IHmӑ]t9r> )9w~-/DQT a4:v?}nj7%#3ɜYHBΝ8Z\Bڵuł`EU@0$%50p8JiYp+`ĉ-.fÆN^Ӧ$%'*D3u#R_>Wӯtv[ndӦ a]bϹe0r@^rk7cOKNFk{222ӧ7W^y%K|FqQ/^̖-[p]lK1IXVy]ڷoGJJ ֭#''{R\\LzHIIk2eFe=JK$g~r7l}8%0_|B4RnhQlXQ#xv*`fkH٪49w}4l؈Gy۷ӢE }t r d{ٷoyyMix ~?6m'QVVƟGZ<<y|^}l6/nN%WO.nr3HD=%hb:]x1v烁@v _!cחr]i&XV05=;~|np*'yA\.v0nt( Pl6rGu|>/EaoȮSgxʈ^"9+#zj&*NMM3E(O}QU nO)2%%x}z}hx !HNNNȍYN8$B!BPa5=cXZ7blDLTc|>zu5 /hڴiCAAaɩOiiqOպB/e(蚎QMIq1ǍE( *'p!Z$m.>zkT㿿3geLE9+)YݦRe,GN9fv*{xXt8`L~)@746Q Dr!tu]i¹,oD|n.hK _-ZouC#½))R%s C١)gފ=˯[-*y9oIK(_$,*JӦyXV~ؼ ]P4:oۓd.&^"9nsUz6\TeE` _FQ+4qƜԸz, IDATxg|UnM6wZJhQQ)l/E(i66z%JznږCȒ@: Iy${I~wQ]ֈB!9#;!B!lݺuy`XB!(sQ B!DbU(B!eB!@Y!DU1 F̔B!Ll|_o3!.0걡zkL>OGۖM_tiԱcYn#SƎk6+5ԐxzTϤT{_ Ζ kBt2#+|Al|%,9כ_ƚяv7CPpjCP(:wsLnδkG{J}twqƯA}R9r g_d۳-w_+nDpztCA^Ӆu$B*Hl|y̬,͉s&F̟lr /Ѽq?nVqŝڷnAvAtBK'bjK>B~p]z>XYZxދWpwuOM||ĵr_qծ|(-33EQ tw#U'GN`okBIO/VH^ݸƶ]{Ԧ5)>y>^oݒ(ٳցM0g=lژ wf=IA=s4%&^ϱ3tЎRtsS "EQJeafiՈH~s;I|b}uf`\ ؙ`AhTf %,\Zh3h"ءuKEˊxz&3LA!n&B kݬ ?m[ReghѴ1.^&:.333ڶd̈GQp~b8_Y]{iXχǽgKϳlw |ye3xpk0N/NDtFh4̿Q0 `ogj_RS7%碾/i߮HLN׭sVr|~L7{[[?0詳l=?t?۴F;B(֮]kׯVVV@RP(}?Z#SǎCXZZ 22p5B ciii̬жlz=;Ȫ?2ޡ)at(Jlll%++P|t:gn>o9ڧ鰴$33NWl[JUZm$X[gii9ɩ898`0Mmmm1h4R/o!''^JufZ! ڴi !nO~6шN3%JJͽ`0YKzҊ}E}fgg:kIV+Mky(_ڸWE!n!DiNuWw?!(HvZc>}Xb0TnT*PUIB!j-[Ȫ:=!:^_%'y]͒*!&RU뉼V !(HY!BQ+)K?D!BGY!BQ+I"+B!j%IdB!D$B!$B!$B!VDV!BJ !BZIY!BQ+I"+B!j%6ضm[U!]aBQg;1bDe!]!))CB! )-B!$B!VDV!BJ !BZIY!BQ+I"+B!j -U4.]HjjJ888{;"7a033Ã]0ix*F>`2fO!BTJOd/]mڡP(no4勴kӾ~:u#Å?HKO罷V8/W⿝;ym4p_B!zUz"Rl P([W.O=__K-gάj4,T*T_xVxxenS3 ₹ZӑcBRTJuB!JOdbز/JNN #Ǡرs z~k.ϜET2hfMZ1sYu[ۦ"o3_?vKff&666̛&z >!y|ľt'ߟȨbزuK\AԵkXYY1:ibB!DmW%leg2VIOO 4,ϏAmٙ/Oۛkנh8u/cyw ̞9Zͨ&_yΓ/77}/OOcz``t:|1nnn\ ~z&:ؾ/^ yx0 X̶B!ݪٝlt5+c9r8N11<:|pƌYY٘ѬIvѨaClll4lV69O޽zҳ{o=YR4 /]l9V+SJ ء=:v(D!nRel^}ݫo}a^1GFE\m F}f׈% dr9?&"={t/B!w[ZP^nnna= ׯQm r>,"Ǜn*K]:uKN\t?)3gןqsu-w,B!Yn4okEoo//6P)Ծmx qq<|^_jg\x 4h4bQĊB!wJπק^FFEpSZfg0ÏdF#~o^u&Q]8p27ضm#F(veq)));Nzz:^^^ՓFݰALl>ބUxL7™O!D% Q9󿧟`eX[[wb_z:' @޲m?{!!1=puuҒ?skרa1X[[Oۻ11ݷg a|sOBS !(J u><24qrv u+62 __B]U@!ĝakcSd&' OϿP(hݪeu&DVqG%0g B۟}I|}|)*!QLd3DUDYFF IxV;!Jdmm3siS}6 ЄB2u&ffcP(x{y1hzq;Bb#|<ӷcB™=~(Cv6} ׯ4 k֭O^4mҸuJE=ݳGu"Fa `ѩ}{rrs9{̓OVwf4:s:?o///e+Vr54S +W)B!]Hd/\Dxx8+~A-L{rFB*`0 ^Lӑ]%))+W2uDzț y|q1s[/j;RVB,T*UsB!Dt'l'X(-JdTߚ3gQ* 8YӦVM׏{ iJ$رs z. ylPLX긜puuc4(>a ~)SܮRxktء둘cϾ( 5%\?YM[nc+v +++>0S0v!B˗ͥUIlhXqqiWƵkhL:U|Ǚwӓw?>^=z>4,ϏAm͍:axzzw~\Emi|]>ǟ~6AA5mcKm \]\IMM[.-j{Zz-1w=Ν?ϙ`V&(kTP(!++өcR,JKbR"[٥BqJLJ$B]6jOӷOofN̩S<}L"x7=tT~ͧ`P{b%acm N/,,,^Μ=K_ ^ E׈% dr9?&"={thZl999B͚4ԙSV%ooz?D^=iSZnnna}H x7y <>|*.={:&1eѲE %-=1)y%e^Vy lpyӌͺtDNx Sfb?Z fjqvr&;;CBQ߿]V`ɹKDg1n+<7?۵̌ <|!?Dvmbk4ev- vT9*>11g''SRصg:VVV=v kk5m۴)tll,ƎuV jG \,1y ff;;"GNgxyyqi| ͚6EIN=EWm˯U*ϛ !uh8:58::ݪanCmeE&y7L% ?y~W'c4qppG)VݾknǶmƌlyYZZVv{,W(x}T>RY b/n6( D!D v+F#Toe$?pT6Om!CL܊@QEd\]MuB!(-PTs&+2!.-“?GUwXuFH/\7) ڴnͤ /VeϿн[Wn èg!77_QyF|]t:=1w""#ٵg/ 32xװm>C?vٷ/#uT5iZ}D! )-w?Ib, IDATpiARr2a{9:w@ =oI5 os 07$$33 Lo}j(oʕ+ d`~-z@ӓm1jZ2L1 '$Z e5 Wq"" YIQ7_/qsu{`cmc:&33N\\,cFpKZ .TvOoP=,_:mڴjd gg'ܶ6[ѨׄD_@۠ 5={pfƔt'E>rBA?/]b٢g4H>c?Ro^Lxq\uN#|k̀`8a"=p?$)9E}—_}3g1 1xjhtG0 u&233quqݷ4=<1$&%p9v No6F 0Eƕ3iݲ%%++V-ypqvf̸LO_.Ce2~{o/Wq2xj[M$[ &ŲM߃X[[ŖHII7kd+֚)z'BI'6o:z]͖^wl0>dZ4֥ƻD=)_mPOC.o@Yd q |*F#MhqϏښOƲE cx}tzv^1j< g%H>|W^~{{{F>mZӧgOj݊۶닻eͺ1k&M7cݳÇ !5-oM^zll9 3wrh48u:z> t ĸvL{Ɔ~ʒWvř޲ys224ύDv3_,_'+3G)t}ZhΌs<&!Ds!:u[W>++?n"%5Gs/;wGRR օګjK_$wZ߀2#Ph،oW,glڲy~+sf$z]`sth.f222t /\?IS?kN>MT5>, %~8p{[ZFכnp4Z-Yn=^% vm{0_F4m-s x9.\,| {`(5.;ҵsg5lgr):u耓#iikt>1'`5/x}N:U1 !Ꞃ+T*b-?c4c`AXYZROk0jgiAM'3Nۡzy̌ݺѣ[7_Ȝoo[E "#>vuu175)pctB8::Pz_ ܽDן|<^meU(>+++S Fyc ݭ˯Q^}jh'취v_.Kn_aeeE}accˀ~V|ݨ %we"+IjԌM5Ei8o//224E&7Om..y7M]tFUB{gg'/^w8)_z>ϘA,,b/1ƱȨkW޸0mE73+IQV !ꞛ_Vj;֥;6žfԄٻ2YqըٛJHHd94kڄM133Lp0/_/ܲTWqC^AZ/1pw#8$~S`i¿Q#xOxBmC^&[`)[cʯG'%%Gf=ĸ1 ,Wͯh2FY%*-[4/S\11hXbnk;Cicv8ۣV9x0킂Soy${n.CgiiI{),U$wZit|w CP͌)֥sq o,ĎwzO?_yP(prr2gnlٶvb1k&_|3\=p@ڴn](n.)56[ӷw//Z @<=-aiiY-U*̜xy@ތY3Ɵjd̚a*}x`} >+UX[[31,^O”_y${*^\#['V-nN6L!Y]Tbrykw$bAo0HUUނF5M92ýX5#&UK̾18ۘ37\ZJ.6_c^:}yb*Rr {-%,z5=z6 4yy/-}Q*@g0T +v&֜G_1s. ۝'_Bm(uL}LW<-t +vԆt%4vuNeTsІ';p:2:e+(X,cjjԁr,mgSq1ϭYVfdG?#DdNNl~5 JQ*ݕlq F>â'0+_Wh+5>N*~8.gφo%p*BKFG&v_ˤW;.ffgN;J4}^Rj+_kZZՓ|pi!i&K͜_8 Z&֎l;Z14RÊWׇszBwS٨L4:8z<}1Ğ,z7#-SPjem, dgZȖ1yԻٙcidRL5iFVVbdL2!ڵkWpB6SkzKu+ْ֑H} <Ӎ}7y}vuBSy#qY~/õ%/uUj5iF @tL-Kp !/O/n&we"[ړ FW j yDfˬjOix[ȱ𼏪e3]]9%Y#%SGB';p4Lc),#\b=|/8@eavc1?^V'<1_g#3Dߖ{17oH,=Ovv!29PɀMޟVVڌ~_3־jr If~ `AeS+MՄlzZU* eUfdz=nnxyzT]BQNGn}{D,ONex^ô-3[E1~yq2Ŕ毣l7W̫.3SYb0E1+tBkYL!$./+r =s:nghRۇVeL0?>;w;1 ~@=_* !BMKdYYY$0~dsrXslmm7-]ƂO>c<:lݷ+WѾm[zɫScW_.Ɩ7ml9z=^7׮A2q4V}-_W z"cִ)$'5 JEpwK`Cӳ{[ںˆ4_]@Ll,>8;9p54k4b=PI!B$Ȗ"11g''SRصgW.ҩ#>޼̝=///N>mj۾][l&oo/];UYQQHKO'==>OOztZe#Ə 7lœdž Co(:Y;c٭;vvUB!DYH"[;3mZ44ݱoaa%x7d iuk}8:шO<:JU|ˊI~ 666,) |"u+]WWbGs |}|ؾ$B!vkX۶mcĈUR͔hBq سw/3g?ivv6'G"W|5ڷk9Uv>qJh4J~Bn۶m2#[V.,9?CrxzxoiieWB玜KT>?qj(ZGGGڵióO߭Bq$iҰA}υnFYu&jlfygynnDİk^zjP!9$M!.-“?GUwXZ+N9Kƍ1Uj:kptt,thґJNIaϾ jMDdvaeeU%1!!m3zrssX<9v`_ *.--7mRbqsq㠹)5 7W#EBDVcpB5vnnNM^p继Oo[cRFJJ ]ھ2bB!*JY!j{{;-Zرk11'RڹzGS9z8!/ZmUzEpppy ߦݺt.]e BTSբP(V=J' Çvж` >>"geeR KjÃ,S ΕW [GvMBQչޱqq zz}0 iݚڲ~F4Z-nn,3c_'0 ذL4BAbRo{=P(l֔s!f5~DFE1>s IDATRɠ5m*b޲aعD| _\|<z{^233a7գ[nc+v +++>0S'M1sYFÿ[`ff΢KٳoZ-Z0ixo᧟0ɕr=1аB1T*<27_OzzF1tMBQ;ԹD6ZIrJ 'M&;'% >ֆq^ae,c:vÆ}Yr۶w:u:F|2lml}&@3)x{q4-Nwx{7e wzcT b x#"REEł4AXP!HB Y9dI3,{i&:k߽gni~vEDDZ_˖-$Iyy=kb5kl=:gwءеFҋ/ҡCں}$iƃh3UPIu:ު5j7Ҙn;o,аJk_,сWMaa:!)CNnSXZ8glԢysIRXh7mmZK:?˵cFK=*/UK^Xm;vf`M_ze2:۷kWV.IڸٻWcGߠyyyyӦn͚  ֈaNY_Qۧz*ۻzYeffjbăVΝԵKgIRlQN7no7k <ڵՠ#{keT_bRR-7UxX>\즷#orXZ6C~ {<.C{NV'^Ĥ$K Q%w|$i3ZV_I:5lO.?ƍj⭷yJv ^Q"#o|=.36a(P&ȑU#fbc%:e6M6]w>QW\޻$)sڲջwIozuʣ{׮޵ء>&߯O>xuCԪ%Iڵ{{ff4g|,!95Vw*,4SZIJ\\=VXÚ5kHl&oooEGE[ndV_iVo[cMfb 3n^TWTl'>꯿K/K9" ApJd-r罹 ڲm>dv٣0]sՕc]e‹SpW!7XlE::վG633Siis=p!Ģ)8?tX͞tT:aZivl:Ţmj}l_S;=ʋ xKlEMעOV}{h^kP^>ZZkڷNu _TTT߯@ATthdheZЯwoײM^u8)mx޳̿SҴg>FuET^=իR~~23*((e:oDǿW,{yEG)?NVVj5v'm)2 "Yr84$C'DŽ`l*ժ}h\cXJLLfӅCk܍c5vm/I4|$SlLL)44DƭVmԠ~k?+^ RfMuӘѪ_Stu]Uzz{W#]?Դ4=qhga&(6&FӦܯd"U~ rr곏ȓ;N'cdT=1ز=0cbEr86|mZڽ[s,e\!*55U;wa4aVt[%I!%{=葹4nԪe ]rEٽk:өzX)su ~Iܧvs߯kG]-???Y _3NUXXߧZ1/\Pt>cNקqh@_+==MAa|-A0b slemެzHeeebQuõHb())IYjӺڶi-ө-+$$XG2c}t-k%ZOxgzd\EDɓոQCefNN բys];f>ZJÆ)ܷc(|>8Ͽֶļjڤ$nG8olǿWj[JߓaY*?IvE'$$rQu֭S[3?_]G;tSy={꼞=uv=8a-}E͞H* EݿﱊX|[w>IRTdD):ot'Wi!ZS8tS x2sIҒVlloV={̒zd\-_BCC%O8 Z&G3e{Sر:YJNIQ^>;+;o07Jw~P5< ϮAUP51U0 Y,;o6 CRzyz7ԯO5k|ZqϽzK\^QC.XIGWN~xE㗵jBzl|ZEEF*1)Iԡ];m߱S{U izyt**2RkI_|^VuQŎ>͚Ef;wj-7tUjڸ?jO*(0Pv]?^۵SbR~w7LcԳ7\uj+>ZjyOW{f)k{ߪBEÆ˖k֭jѼk[j|pffj ]rP= ڥ.1kmZc幥/h=LՀ3s[Ÿ:2]f4zȣ1QÆ Vmu4󨖯xEGTq7ߨ5j0 :D]ԦU+;쑌 Պ?bQXwםٽk iS&kū+|+Qf4 $q~nn0Q>>>iƿfՃS>f="I҃ߧڵjy*^Z-/,dW|}|tAY6mp8\ O)__VܓujTx?eg?.gxڵj)77WYY ڴ/PꡩSt:~jukԨ᪱}uTE_IS>2KCyy tSy"׻0uQ6}m;R}V͚5a\LE.}ЬGoI7xM}h6V[v]qTO=֬]+GC[ҤԸQӮͷќ 4c߯um^ZlqԱ֬],uQLW᧬'1)ICG\+G^oN))tӱ{{-թ]8{3F4?-{^,B>l>}v%oSy'h,cdϒCѹ?նMkmO%&&j=wq:2d(//OwO_>>zy ժ% ojx]WLw=Z MuNn.JN[oU5oiM77V**2}kԨX+G^ 6iGԴikhfǫq^yU7I/T~6[ٽgni~v_ׁcGªG`)=)Rj,Ȟ /8_>?/]ճ{ڱ-_Z,ڴqc~ў{5v Α7m֬ф[i/͛ѽ$C4|y}wIǔN#[ lX4)uhx衩q5IR}4_?IRMt؛q&e3K%1lk\.PUGpnGջW/}W4d HҾcNƜ"Ep񛠊ٷ$ae5jPTd/Ʋ֨QCv{`7kÇ^fMJخ3FJe -ps"J oѲV(%%EDDH* % (Z[o^ݺ'-S$iݮ333z>˖)<v],l6,T;v=, w9gl%/,SzuղEڹbcb4w=iô_\;uؘ;e&M8 Y,ѭ:u-[9s5a8荷ޖRۿ?^_|uڴnH[Ji9jѼ׫Z7>dd(##C(׳v{8KkW|>Y%/o/K5k8&*@gsw9[˭u3AGC ԛoaC:fӢkY7vIO5Z \`xǝ2 CAAAѭVZ8_O.~F =lkF+^Xoiz~}>~M̝(MrF0ZNy@//{Vh%>1i]җUObRR\}HmW=6qծUK]:u"ȚDHpN&(''WIy{{29N+//m5ŝ;=g[ffjfZT{Q}@w L SbhEEFjӏk]YG,L S"0%,L S" qT<Ι Ңhw O]6R,y^>uy^Y-@ŜOԘi}uՕکrre6}khNSars".\ݫ>6[^ۻnq)ב ֬)oMfab9Ra!ddǫ>!%&%c| buylݪ[OP>tao_D^֧}NC.XCG\?~Z?>^oY}.^h3Uf=(=;vTn^ڴ7޳GIIZvMce+""B]:w_(vL:tPn]%I_l=bM^9ֻZx]WLw=Z Mu\Z<>f:`koz]]t֌J.2X# s-qhIѣGej ˴mW[jת%Iro4x2׊՞{5v Α7m֬)dO<>6_O߯$iwiwI>9}_V'^Ĥ$K J\7"<\>>>ڻo) Yl8;sZۻ|][۵+[mӔiuu~bbyE ի[N d%iku5d@uA^^^ڲe~ZA^L_|ٵ[Cؾ(׼g*??_NS޲Z[`^HNNoxz/l_ݚ5Pc[.2JGF,[M辻p1|۳q`Zz֬]jxլQC5Y"Y8r$C~l1EDy{{BC_[*##CQ:]sՕھc&yRbR5l믹F;u-&j?$IgΒ$5mX_{>魩$M~p6lܤ'͕UO>X6Ԓ)5-M[7)fMG4@5mIR&lUfMeǟVOmZ$G5iH{VMf|X];wVfCնukED+:*5֬YS{ ]ݯj߶R[opnXp Y0 gֳZzW}7~G~d7ksfKViO郏>Ӧ*!LL^^=K~|e7j;7g}gihk=U{:Mi!DF$I;vԴ4^Vv=G?p9%ߦU+IҾXmݻwKce U^J?&E@5ӗ_f={&MR:D={դq#}Gi W#/T2R}NIRcWZ '+vo$VQ}_>ŖE * T#oEv_oј[)""\5k}g\Z@B~7mݶlݺMxXU7nbW^!I[$g')77O%OoC[>ڱs)Я^^~ylPzz,VkUydj$0{j EGGСdkVzt몂]2"uA[n/@A~ki}բY3-3[-5$]<|'բ}+(0PNPFkn9ԫGS9TLL> u}S%''WIp<ʕ+{85 K+55R)GVBCBUl#GdE5]e&y:oy>RL)$4R@Y2 IDATZTg (%jV# 8ZSG קԫRrYԊu=bOAD)1F0a(P&ȑpw9oWLt"dXVA0*,4 xJa@ufF+9>V"2.NV>CXКdu=i㔙Y|_|+*2JiէYZJJJTDDI8N|EǾn;V77}OÇ [ᄃQWTDDı8o7kOaZYܩ'+^)?P~ӸO4 I@rXzE=c# xBM7 K0!߸I7AKNSy%';'Y&jҸyryrOyާsڵ tUWP?Qa+==]O<>W/~Zm[vTϮݚ|ף/yVOSxx 4PƍK9 x(///MNJN_LzqaiQ=۷P]Nڶ<ߩCuAڭ'?f=^\*:#07j;&)#&&^ ݮu? ˯˯>m۵knߚ;շyjۦiM 7iæ_ʽvmڨyz x{VSIMK$#U :u(_6lܤ}Ͽvm{ߺm> g|ըa!oGs3G8ɧ^Z}m"]?&K>VjZn?QaVlyhGfLO/Ӧ0 %];kVUΘ/%/,SNNZlWhhZvQ9hִbcb$IzGytY,WW<%/,SFF$_&w͸}N>rIJrJc ..NF’JMM=JLvvSR)Jgnnk<'7WY\C$5-MPhhH̔K?_YZ^;N>\8#<ܔmgK\\=ǬϢQKb׷Ry6F@1'V[S/,T 7Hծ][۶m_8T^^^pPIvܩ/Ծ}K/X׍e"@%+tW(??\bT o@%#A)d`JYAD)d`JYAĬ*Cr82ʔ$|mnd0 JNԡD5m\5k4'I֑#ھc"£%APi ]TFMGVW=ڲ/ܵM4%8#TgWO Rmd`⁳X!OBT,ݿKZ)6Zў}UTY@W-jaRf?~`B<{E/5dHcH-0 VմqS9b((0H~ݠ|gcX תiy~-~9nWueO xĤD9rDNgKAn:.J3>&_d>JȪcy~_^^:JKOS``B] !vža(7/W 7 TtdTАP);'ݥŠ>7}gu+%BCtkK))dW-Pۢ~"CTaK!. x(%&&*Qw *[hƿ gXlG*((G6[G@m;OfIcd72'Ȣhw3Pt7!CVU7TGXhz5kB>r:˾yj*+ˡ}+/NA!gR_R,PNnܼ\w  Qݵ*CyyyV*ԹCwB,3Bjj[>TvhEyyzוpZY#ˡ]yyЮ`R -jjbAi,.q~m^|yulUQ1 $%%'mut*^JeXԱ}W5lDY7hEGꪑ3@dU"8(D=qw)){ڱk6jzd0 Զu[)77NP`7mA6-=M;tPP`Z4k l8 xGC!qw)t:Zau auJTc_uIx 0Wp:mG[WLEڎ B 0dQ9zdi +o[ JL0 +[V.AC/a#{# NB:{V[gfftFg|'x˿7 US>7ߪ&:ӷ߯9+Q -/#KK-nшW+ְK.t:M{Uy[Y<@|$˯U#/¢NUCuZp(9YW999dEjܨVu$#Uk*m],Rf/*=y|]k6hP9;w {=U(''GO?@Q'-7 B핓#__q8񑏏ϙ^n,r:Uթ][W_1R߇oԠ~}IRjj$nڮev”p֩˯wݣzujuQΝpP4EŎ\-DYZk:uvmG{D͘|}}%^-7S&u5oǫ>m۷k}j԰|||T~=mݾ]^^jݲ"##ؼsRbR,:kW%X.ASs~jִbKN~ƍJz=;iڔɲ,s$K>~^$ͦ vmTyl6=6s>B?^rrr+;;[5NjSK+^VNN7oyRHp٫+^Vѣ vMY$i̒zh֣2 C5kCԾm*9uI,+W4\%wFkN999n9~JJ;6MuZj)ooon9r0ܤ*((Hޅn999t鈋tõslԩ}2sw[)t:u+<,ěrss*}nyDqqqzٲb߱U~nNuW[*bQpP9aUy~'"an@H@頜Ǧ:YWjܨjV^jkO^_wj8򒤧kæM םr:٫ȚUۺYۥjA6YҨ$G,J3fu5 *=cvJgѼ# )"v/Ha6eEQM)9wu)Q,Lztud}m)6ٺD,kOQWB&\1 C<4iRJWQ.MG4'gb뺳 YuUKo';0p.n7q4`chvz! uݨ.׶}<%! @,YdI%! @,YdI%! @>EDlKW67IENDB`qstopmotion-2.3.2-Source/manual/screenshots/capture_frames.png000644 000000 000000 00000725002 12536560630 024665 0ustar00rootroot000000 000000 PNG  IHDR5-x)sRGBbKGD pHYs  tIME 0uu IDATxwU3sέaA& v,Qn^"vM`CMkhј؍-0DO%QЈXK[v8^v)Iyzs̙{<33K.3fo/Rp8ñ }k^YB>}v>}ZpE5K.zС/>|[!pp8c}3d`1vѢEbywƎg-g 4p8;B0ZKTZovkԹ/ze'hp|/ݺu _I)R @p8+lra֧x7q8񍉙8eW1f].sp8LYߞ)Wv9ap8㛢0C5kae1 W`JOp8F fueba!)9(Oayoi==ji}ǷǷǶ[Z(Hf$5,RJ,]5kQJE AsK -t?mRJדNqf[~ZSH!Bݻ3h>xztY ܾvyjAቧ5y3~vYl6PS^{Q5}Y2 w,\_^u[e3wlеQx1O=~t !fvX.8 Ƿd %('5)^z%zktܙ3g[oQ>j/VKv#c&HS|YpM7\O} k UUU()۸/| PJH! Ð ֒J&+^c-AD mC&}xazk}~ΝKMM d2}JZӃq3)JSOP[[[9}<ϫ,쥵FA&FkTL;=QcW ZгW/ޞ6 c C Zˌ3xw٫z-]a eQp86L,X?9<?}Ow RJ24=w箻G>'H ]g}ƫS执&Lp1DZ~s5Қ˓Jy9yɧ"p:dS"/*9yϜӟ+c1?cs5{ggTWW3z}8S(Kax'w,T7Fk.O=>GSc#7fCk3_?b … ر?f O.\nG1ŗ0+/CMٔ~oO>E]Ϟ|EX┓~w|\zt'Ogʋc̾P[ہWNe71j]Fl6l(i'~smƛ'gӡl?r$;t?Ǩ]vJj^28yk˖5N)!CctRH&aek !X\_~7zq86LQތqx+31 ߟeyԩGOuu5oBkk+}R?ߌsˍ7MοT*E>}Z3lPV{VʫmԮlV<#qѻ&bW^!H\p8 faée̙L睊0` [oOFD幜;@Ν>]:uHKKk%$t2{S,]T*Uy 74`%͢7ߤg|:wC6ݴr5b+iWCbJ$sD<#:w[oM׮]ÏUWkm4i",dڕ۷O>xscE!m'1YͿ?+j,jZZZijj7I=x7*aqc,B5ޜq8+'T"O1kTWUqA2R,uy9}ٌ/}z\xɥSQ>u&|p!Gwמcrs55ZN9Gy=T f2,Xݻ!xZw" NVW\~T"Ԛݺ<5e˖ѬYZRior4plؤ2ʄ=kLœQUeOt\;R,+$HT>om//xixRU0닲-p|=v%Jfs_t8.a<5*L@en1|sha/K?d( yp8H:BٞZϢ&ԔW,džUzק*$;X(~2s}<*7nMp !uuu,Z+P/W)cL,j\;; W^lFmH$>}Z,jtѡkip8B2RX*.p8ۋrjp|k4Ep8ñ!p8Ƿ6t8m3mwՖ0.:" C<# ï`\.oskW+P(L&yMW-&k7Rj}tkOGky6H+) p8 5vK76L&w{MdY>=&Mfl |zJBoz<{&ol2nv00d޽Yx1<,[nTd8sYhRXkI&\uU lLfa77N;6Ru8z';6 555TtgH :,fbࠁ 0˖+ѡC ٘o]b~6n':t@MZ>C>JTbSnG#J/9ӽ{72 nZ7ײr{FR̙gNࡇի7.jʞ-ښo F" CVXqGy OǎI|lҩ4Z|g?)'Gq Ð OHg꫘={6O̻q`Xkݽמ{R*GavcAyz ŗ^no6#]wW\A.'ͲɠAxy7VX,Ȉ-={{!ӧO'c= `s5Dk͡'gS,eQv꩜y۹w(y睇t1w\)%ӦM㢋~0cLN9dƎNrapJ%^u8 Ǝ6Yu8:xyQGH(fJ%)%?s̛o\A@_X 9ڵ aF>g9~}=#G$Jѭ{jRx\y4g(;XL\x o3gr7 .`g[2rH~x 2!'t>k&NJ* /N:ǟ`_pQGqYgb<ȣNj/c>c9|@_q2ЧOviGol6̛;wۍ PJNIsxa$wΓO>}F ȿzO>:Eaﻏ#Rj%Gud Dʳ>DH{W^yo9.O==~al&x}8@=u?pikʳݔD"G6>ƘH@Xf?@xcYENoB8d%K0rHQXk|/zM{p{1|ȡ̟\Om?9Z1YEF+gB% 1ѝP -ZĐ!C0ƐL$l=???9?)n:%_ N8x&O~.'pB;%Kl2gߊ:#) tҏ<W]yws|)n_ئ )Tl6K:״[/]tʕMkͰCY|y%W-5p8ZŨZt)UUUqGs aa%t]dejwJ1l0կ8kϟ_@;D5s|BϞ=> 2}! NQ]]vmĉɠ,] B>saĈE2 |e˗1%k1KҩS'465H$[qMv8:#)W?c dY9`f[^z%4i2 b;rWJV+wMBVЫFqu'SNeM9ҵ+: immZK"`3r9 (J_x>)%o6{,;#Wj:,zAΝ9cW>t!y_ne˨ЁˠMOcP,TĆ10P,Кk穧baIIΜp=zqgrUW˵~u.HйSgm2n챲P(Oqu{>^<H)I$dYvyg"ÇG3$˭cɵFu(x1hlv\xEt؉>m_LCZg_k8ܟs]'N|Pk-555477WB eQPUUEcc#tD"A.CkM:̀ Ð|>lk-Օ0eQPd28,"R]]]d$IR$RNSS)xFWWRJJ-w"J!FuRFT*Q*"PT*U/z篮c BRWWkk+TDJYXP(ڮ|m+VƼT9ϨP(|>ҶUUUyR*0 pp8_Oyrfڔ⋮A⫞훾2j]q8WhC~Zuep8o (!̙^WBP,6# %%tdQjx3tp8w嫇kW440ot ]C96(MXmw>u Qlp8-֖T_*d*[ո{džޜJЁ%ľk%ذFncC"z]`wp8ǷC#HN8\8džEy?Dq6URdU475{p|8Opl`$Ivu:ucǎt҅v۝>?\ǿ/:uD>_;v\mdÉp|2{'xtre!J)RSN0RV>k~ZxW c- Ѿu \֪VW.WJ_ ?95pĉL8,1H)x(wF)Ess3=~1]vᐃf7f<_;cǎZ#>ʿ/JA|.G^7^gXta=@)żyxGҹ3}<ݻqI'L&}9|ƒzirAxG}ˢX=܋&[Z89sY|0s&oTx9 x;d20N-ZDkk+]tᦛnN`,\{f| `\v\|ɥ\pE\pd2>cvuW~w̝7[ng{w+$;p8A%K;w 7t׿l6é'K/rn1i$ޟFkMP`ڴi={}6ڈ#UW ZzO>EZsŕWrݯN7d [$͟7T*Ÿ#^@y>K.TI=uyjcem?_g̙!hhh`%gSNa- _(H&)Dl%ѡC bRr]l%T*H$B 盙fD2ZZI>R8pp8@j_SWW95;\9f3tP۔(5 IDATl =w~lvq=|"̀y]8cqѫSk!g:K.6xcƌKTbmcp8Qp8A6޸/}R{YfN;#…\xEc}Fo/ȇdѢEՋ|Ç3}\w5~i zɀar뭷pq1idf͚ͰCRj3)^п?F6z4O>D_G,+~r;j-.p8#R)ɤSB0k1(Mnmm<2,\ H$$TV(HRH)1Ɛ#ayS)A@XkIӕYSe!$JS%s6KKssv O*fܹ1~7n,YY} : y\plxUhiisZ"CrHJ%0^2\n2Er@jvqU(E|-U){3gG6q wL)𔇐u8Qp85|r-ͼ,X>r84 la6O>/rp8Zޞ6ZtL}ejjԹ5XcNpv5 8{,ݺucN4йK/,Éb)ƅ߰Ù݇T*+ױ:Qp8]s82N[p88wkm%WAn`k-Zkw73ډcAܹs9}9sh7n})O3fu|+7L&! o~8#l r[m)%'NkAA:NXݾD;:Qp8>SgM*Z1cLr9)A@Ϟ=ܹ3B"ϯl0|vCyҷo_l;Q0m4jjjXx1o1 .Dŋݻ7:ub444>f444P[[K&̙3|͙?>K,.]O>!ѭ[7z #kWn\;c1g1~l 2+_5ld BXdf樣o߾A΋/o5jRsOK.aҥy}QVXMMMs9P6klR̙3I&qsEѵ[7|Cawꫯfҥ̙3vۍ_lV7o.3gdvzL̙392dfb̘1viORӧs[ӥKNJF.2rs+`c`ɒ%L>0 ?Iss3O=z*sr Fˆ#rdH7v,Fge;|- 8[/l s}'k]ZEMݼ5RkekhBcW%|}帶b^~ѥ~mrU+u r}+k+R*o*ڽa~bK>XKvlӊ~+b ﭵAX/RD/.QYR@&[nf}=l1b nV:@AHP*{p!{-|477qïGJɂ JE @!bwO#LrER*8hnjxkJE8yǙp$ Rߏwc uib˭8((TUӧOҙ,˗/駟Ψ]wO2v8*׮ke-x:v;&L&yhJhU"@ +0&D`(!2#_L@`KVjMB0 HϣHC$! V#UԮր RzX!4-$֒5!!L"!i iRE5H!PB)tg5xFD"As2f~7kAo0%<Z.[NϞ=IRhQJGXEx<@Lkrh1j2U c20/_*JRۖ$SHL$x~ yKK MMM?X0d m-63ϸ ysqǡ,`e_Bhzj?7V6 #Ws.dܹ.kPR_[?,zEϖM_O:u*QFӻw]俖@G# O '/DdrEdڌBJ+ &Q8gBuӱ@B!lt-"|fBg1(2KKcJD@B#C,RyD0 []NvA&RX c7i #J`$"'i=jQN^hvmfҤlH onݺ3v~tލ+>˖-:cn6… IVhk)%y̜9:zFPJQW׋>/9tTy 8.k%]v%3ϐLxsソ?No,ts?EJAdY^y~$ӧOUYܹ3;`455Q,535QNJ֒ɤyywڰdbw".\紤 L+2R ʣ$wO@)O"%+=G "PR "m%"$H IR_B$ǒP"*P@J‹~)Ye=Be)a@EIb!AH C⡄ė !VxxBkPB!PDƗ)%*$J$X] II %| )"i(,HQBD-#HHII$ 2AMFVBXK$Ha5B$*'|BFCIQ'I Oe@ JKJϞu\s͵:EPW_*瞻9󨭭eѼ/_v-:u;&o2m4n6jkkX:{;J<?IA$f$ID46,(QFI-acbT\ږ=067̊kPHZKh <(%P&KO{!dD|HP&2RIkQ=#IJ /@4Kդ2>BE&,$bHXw$#D]9-ecm4"RV` C=A(@Hhbe<ذ Tߑ!ň-j` )6B((a:zXXU 5A07l U8 v wQ܃:?s"IH<@OzƈD4& wr A:[!BCR|RNXnᴨMFP)$>rAڥv7MF=鋢8TB#p<£@Oe8Y\ՍZ=PBRP.s;KF-V6sI}DzR5@S_!AEѸ 7ň+*($Jg*)x":\Ѩ4!kKdL[b-d,"=E ]JK0ICl^#B΅vD| xASҝvSchfE#'=O^ktZk{ $p]DKlzZ v$ZQσ ~1IE5DQf"n$Pk|h*.4w\ =4FXC) !2R} IDAT184/f4%Oy AJhBW81xY]vf8-W.7: c)Ǽ'lт<ΕzcD`oȂÒ8x[[Or-#rH/?K/[=FOcem|?4k. A$%}2i좜%mƑЮ ClG'Z C%1jGF8.)MYMĔT,)c/jc_"=לAF^0P&F D03J4t{ ʦeN:$b)S1]:")XD5Z= yb[-jtsKp>-qhOb_+wP6smNegkHIq(PPI[Lא֟.So3ǟkkYR5LR \ip^nI7d"q\i^.,]w8rN-LG<ɬXrjeOfĢ,_ޤ4&{6,o$/}~9 '2:1ܴ ["@ΧGV%w1 2qnLZHo{5 nl褨6I bc0H☜h4I!#"1J {hy8?Q?{-N׆&iZplq; x?L>nףv~+ה_{'嗗c{O%ڄs t45yӛ#w!pc8#v<"s ă=6/[L| /9) >8֢&Fd" /-fފI Cӵ%BRN="so M'6X(=Q<~V O~|\h,Z^z5,D$^Y@<26.`Q\/N+Ŧ9שQ!. ZJ7smAkWPi %y kz•MP\9S5z&2¸XKf"e~!1颢MRU_4(XKQIhFZCn["2Kۈ9HwXN ͋yiҍ$C<^ {Q̄SY_|xp>1vbl4?-:Xh;Cnq0ǵ_E!{n0 yɧ^0?aXͨ'2p?t&hᤁSbkiy|2R3Cny~ApΚK3Ѱ06Z  X:n@XT &phZ"8 OHX6Ϭwv D;EB&rf'xqi`EGsJw[Ji TRPW0FI<,{gJGtjlT 9!$Q:#h.4:ny)JLZQJȁH% LOeK g0Ë.GdWʰ4?;BK9E1'\`zE*.0~F?IJ&Jn)`YEcX'}T^ݵQ8ՑQAUH3֤Ҥ3FV9%IgR9THN#Z:^I}5|gcgx3lȡٳ(h#hѸ#/r?FU_^;qhSԐhc/;QfDx:5Eܛ4Rp9@LgCQp6nn=7wj8:tU "K.I BF( ur'iי*B{ IѼOɤ[^"1[L^ ?Tҩaӕt|s%RdҘUϬ +M)Mu#)ּ>HY:*K5Ryf A0&{̡]0qr̈9 u[%)'"i+FC`x+*hK3C˄pLN)8 WM؂g+'j=)|3ﴮ7#$Ό]Q8r &=v/t:RhvDȠۡ?w>.IZZmsF8h.w+9n+`r7 kL65nHWO}rPlpa2I#JsݰZ0MvPcL$%Ie5mmVgQ:Y(Ԗ0}-^ Sɰ:_I)lSh^e*c傣D9B== }K\|6_(Z4]娸_P-4 X[td5,]$ttiJ"=̥~.˯j }r͐IoKGUp%GKHP\s(;3WJ.~]+L<#'*Sp\)3U D빲bU33%m(T0=FeZ(-ıX|a0&ݓ% ,5 YNW]^tuPFԦD݄Akcm^YZ"l+!27!2ʤjrNu94*9eU`{O:N`)C"}  ~zGahTΩV6V.vƁ9=ݭtw'oD*Sʭ&{R/mKEߴC* O"8\As!< [(7?xbSZ0ݠy*n/@ mhLX+R7zZu:Jd5#϶VZՁc*[-MM gu:lѭ),Gs|n":zlP({hY尥z݆rTą$E1b]tL(X`Ā0nGKK9rb"SZ!7`7y\?t?[p6 gZ{h]]CNf2eGyJc NrT_v*bt+"mO֚;XdbvEii/}eUA ^7nI#5MAVZ."l򒧢ʢn~WRK%㫎ײk+W*RV?S`k\i3s\HfD.ɼ~UPsڢNv).T"t!RLeb$efנ6Ju.TZ-]|ce@KmWo$lweʳTH+Z}q׼lb9lͲ+.D_j@E%ENDhIV:nܦ֪j/6Zk)G'}I0l90j!Y|FXDzK62rF]0{*J+7 =2eXFYe;Fygxn(4g`nyktwW8=vqGmp+^Vsv8r@mYOi#d vw܉[&Ъvq0L-Jv&eb0O^+?Cos!tnph{G邅q0.kghIXT^FyFnKG-6 \|VR'@I۹̅Kz]6kIloe)Nm%AD*97J Jk% [RT-U3K.J|2m+J\Sj +5[c%s35PB({|Mi=wVX{2 Z6_=_5S*z,A|4?>?H;rx&4*0)W{+w)6 1}`>c6N4)lnUgz Hb8#nܖq-~2:Io`> fPXQ6 k%wK_Դ!H4( L#?D%M%vN󑨫2OFsG90a r`k^dDExByqdQ?V-'ܗC"Ұ  qn`܊PlU 5lsO4"#܉-wg*$nFp,dD$[7 C-qtpק9b1bVҲeWAiW#AQ6R+rQٗ]ZVz/q:[3_npXIBisyU^ʼKי•0)墒+L 2@E1Thtږ)!LJ"րfPRZU3EA-F/'rcGA(ҜE%n2@Fٚ;s,ئj)ZXgu\UȥIfrp,xҢISDQK z$|=kTGD+T.c?\ z%rT{T'ܨM=MVYT2O[ʉ|L#_GIYwc>qtKcd=-ᖺZ`j8Bˁܴ3Dt4pXfENvf#YX[=y!ʈɉ`R=ht $ΉPk鑥 -;qwF"iΡȥι4D,yGv {GjBvNIEM;/c>ʉ=PTj’mVCPen- ;Aܹfyjb2@-'O}Ğe{3pw!ϩۙ' gᴖ@ίx+G#:<-Rm"6Ss}dr ١=wÏVIcj*.+te_<Ad9T:2KRŊ̒|^4Y&R`}(ݩ`DfX>]P DJS"k cv9sXHD˜ OhڳGf*H %GәJ8[ pS =,u0jXAեr&Z݈[\-&pkh-@4Ef45GV%8=Ũ%QaX_*AŞڬr& vuw3v`{%=f@l9zUi&(<iB3{Vnl{]Ϙ6R\< . Ug5Or2+] khu['1hvHڍng(ֱ\{Y[Zg>@7*-y|țY%{F$uez;'4L^_~%> \h.0;^xTL+s GpG8W9e.D1^gƹ.ъȟ.9Ȥe6CӊHL ̈́hQy5i ec%sOGOe.ʲ&a%W9]u-yN&_. ͖JIdK,L;FY53.&j+8/_"*0safk9TTIT_-gYJ/3Qw i.N l.Tj'ZR+GesT8Z?ʢ|ƪ٬!Ttf#3IRVS!mЀK' v\uRUcr@6G^@3oOʞBNϪ!AC$N`diahd%zde4C# U46"Z?=hhn.)Â&A2f+H :l+W7KK"ja?^2보9(w45Z|7=3C!l-w GMo{`-7.ZGMR`H-v4#bhi욱^i[!n[7 ,ն=6 IG`tjlP:d!3|0-*ys"tT(*_ƨRcL!o WzjŢ-I%uq+%xEaݤcMV `:WX{f*5S{SDۖJH%n`~$͸"\젮 Y@FVX4{ʟ9ݶ܏6stl.xTQfBqYfze yQm[NDKU!.dxH6;0V3;i/wY URz+^0Q(n1߫:Y9jc_Tr+4zld;٩N6v|x;6\)ډQYQZx3AM}dm&qVOjeCpΞ]tqG!cp\nf#_ótldCߣGS@i@H IDAT9$RmY vwvA8.nGe1c,ҩWtdŘHУߊ]y5O}`2*.)~F*aj QgCTGd%C#,Ե )3‰,EѥVhJ/~Y<=iT~ zjVYa\GvT RـԮtU9^‹/r%Ve2gAe l><_H*.eB*wLFJ)YReɖ r%Jbڗ-,\B%OGRgB4`(t,{d 4QTlVyKz|۲qd摨SsKL$Uּ܃ǚRժ~q;Y8t\uSZPaY"JPnޞUaa>7 OFFnN,aeNdbyNn )~"Ds79QX m'ʏەhգu 1]{~l. M倌r&R@003z\ytn=T;5ijA73󛖍獰 =uWE=`3&eS\rYݧN"ٝ`r8p<W+pdSLx#wEp2HDQVSi$i!#٪\23ƽNE!{e]/t$v$ D0,dBgssYU3i&F_n\,at (aiK @viY7W#|@jz{*}:e5+(V"W/\rz%Ĝ4}AciN̰d[ 2/%:h7";тKF6\=(KT"wY% +U}г=N7/=Bݜ3>.gFzDĞ ve% "B|j))g uVtg\5;="Iy%r=xXi7v@8=7g u 6AJ#poW$5P)8Rdeq^<wIIb'0c7&RRY$S3 =I=[e cj2nkUP:¥kRZ]RPo'aYZ,WqD-â}0NyFDP+Mf H^Iw`Yߐ臦08%̴hi=iv$-F߳;yMܩtPAm!r^OCzJig7\N&pvԒ Ąws%$485!hzݞ)&n߶sm 6уi& iD$7F #+t v a#&X?ͽwC;F>~;=ç9wCOP06)z(}'O.FcC­07QZB̊8H:yV ~ށ0| }Eآ3ds|՘U`5K C+=PEbI6 $o)d-YVIL&hƿKy,MQ ڟ&@]jK{kv+k.O[^zj*Mծ+i.rH<2_h4e%^&%*-*K$XUkqW }:c+?іؗhbڋ*-ͲXf&9Iy 9319EQm엀z=:S [ |WB-E zRJ+z+q ]O+G LwYi]*"{yoZuxJJmn[K6^Qb`csC6P^ѕ/{hh [3PR&JTU b5,uO<!qQvJV)|b`<pV*78OTɯh3vO'`']t^|t"n9uӫnC#l4o(nG-N[c*I RQRtUhe%OwdL9:?r]IDt@ e"a[.KL|O6.ʵʎ3&ڊ )|^HΜJNZ ݉ʪAkd"t=*hLE\bZUyQy?3gg]."\3}XHW>K}kQ͡6e|\ɽ2֧P[ sᦆ(aDoKuD@G& Xr@ ZPH5y +zXHiXmSOx́KI 8GT)Q[ գq霵q#9G@zIAUh"~+`lNern&ȺE9c8h9):ݔ!c]O"|w>;>x!~uzy}m_%|_M|}??o?G~|w_ 5 Bd69tŬgN-uC(x}ޏft~{{qJt]w4&Ё]9p=bt8o8~ʅ}g6~g///8޽{|a_ ?|۷k__.ݻϛf~'>/28;?%wB7̖pɕ5M8yp[&Lk)+Wl܏tnBjqK(whG~^˿9d(]3$KT*nUi6¢o[.]eN+JUHfHtFXwLj$Vuî(fh}4t_ %ļJu9 %тѨ/˂Nq jҊ2e$L=,עe)uqQz)$NfTRꌫ'PaA15ú; jRRn1SXѫ}%OPW[Z<efW%m[" 9"-ZIn;K[7O+s(BK3mF:C8^@~0(,TBK'7 6 ls…zRuZqHJ% cRd K3<v*-cfDo~HLRL ym"8I~$g6=p%gMX]rq3*W 9xC񐮝'P܍ZElx;2&-M'Ǐ|{|/V{_G{c/<|,> F8W<(ŖѶ6jI-]˹# gQΣ>#pԝt ̅/hF-: HPK6"(A,OU k; ,=W* ieMZ1]M*\ofɤ:*rsD2NMWN+Wh<>bYQ4!ZNK=NB BDs0k*pL{v\٣ )4dD-3 pdĹ]MzK+-hlg I͎Wk͑sH4LUC%rNVsBSp˕8 dhKT6Sbe= fYlHY#_WY ftpK)@+ex"Y#5MpJe 3kFd99M‹ҫj  8`l5]!0Zu_^<1mn Ti3H2}Iz>z|'707ΚB8Ӝ!YNHϸ92?1οww__OOO ??kW9>SChΦʽ۳s*hpR &KewH I[rYÀۀ2I{4IJcW`)2QZB9֭~QLsRYS6%Zt<Zv!<0|-n f%ګ7IlQH2'Tp4jyN,{QFl-p?#ht`90#52ۦ#K+%GEƮ-tOlĔ³o),U![:<(aݞ3ڃ& Dv8 z 9+C_+Χڧ% GԯtG3»c_7s}&|//x<,<,߭w'~r v֪OR07"&Zy22w^*ogԸLud!z,O=F>4K5oҜ^B2Wd3$5急2iZ1+ 2=u"T4]1-3EnђOhjackЉZ3f^zrsŪ/J)\998ʒz]3JKT(>' SkMГ ҆ZR4"{!AHt"^*lP,۵BRJʔ _W`WnVL;a{6³raJy`j\9Vp)% iiY9*v*dQBM'U +GhRvy+dLL6R-q)1t,Å-nEyM[{L mVzlj88iOOmc`})r(Fc9| {h,Z8d'esuBr^)؈:9'&OCkNSkjP?!6嘽pv&Cg#n_~iofwhovx5?|^~#|}t;/}Ennn?oeG^01S3?w}w%-u{xC DKs)Ȱ,5E6'TKi(KyUC9[#{[S>{O?4U5V+Pvfd;"V{u`F%<2fL;Y &UwUyܾA%Y-O1 %ZpʍESTM?ey+g,Tא1)PEeO qZy4iZ/DqYGA^-|nB\eGi0 %qIfʅʟDTҡe1Dzc披l]:_@"#9ˡ)JIB^q\F+u}:EڝqQ(F-ϕs:`0R:V lȚ)j OۉC3jP7fn9>ι2m셰@>yISm*!9߰ɑc%c}pV~t31iSQz@n9SN<Gd4N rX@C9$'1zl~ Id{ K$R7x`OuX~󪖂tUÇVrjx㇯Gw4W),95&VvnY/` G%5"r] uZv=h 54D&Tt땟~ y|^3v"J 0%H_>3Yܝy LâP @3ʑKpce_n|6OO4Z%bKWr9?5+" m^<-"Id542jg9fi]Tc lh&)NP3Jە2fd9[kTSYbU~]2NP^o9rE1.Nw ̔\Lmk% i7t Bgs;?ѣѬ I j&;(n(!ϵ97 a3ݳ-]|`"0nh87aHG5E͹iYb$] a߭th7Od/u{ݫnG5X;!IDr'Ohfy5 B[ɿ 晭RKàKP xC{~m_x(GiiIn-?9*k%u'IShZKhܳTiCI1bdIF$B:"U>Z"ܹ߉=\df1j5Q" _ZVx[iE IDATb s 1n# rhdpdE6K\-վ:iBDlrg%w E1(YI8i.diRUSvT8}5B>zjBgD"celm.z%-ֺ*|9޻*]䂃OAE\\ At9Ɉ\D&Ep@ $:);B!&!-MN 6}17.Up/ɲ?\sInN[zT9hr]躢ĐuA:7΢#e}͊hmO]9^`E؊#֒vPŢN4g *yrKXtQ|H c ΎTi&3Þ]jBa4w}C|.'_{n._c=3!4< rϤӹ^è@Цla\H/PIӜG G6XN,+ ,V H@#9!@ %ąh.5d,iR X|ꤙCLBtPS9D^WG?Ӫ%(RIa5:dJ.G}ת5X"?>bkeaUZqO,? V>{C#O1|i戥6W'd#dʋ1qmW#WfݸDVT:_r+jmRwb $::c7|,u7ָX%Xs VYF]v~َ!{Y//yopqqiޗ?cOdLFCEIGxnqvuӀMZjP4v*<Sc/ 0 hhCRZ/n { #u'Vd #K"0~rd]6S6WXR=FǐV,;|M/tO&Ƃi.)J+hYy2m-`)W쐊 iiN`O}xRh}@Q)'-X*7۹Syᐙjîk bvRcF棚#tAzǥKy|I87ytΐۑ\u?$h[w#\pQ_)_] `LM< pǟ|qA ?Wj"W)k)s]WL.vh2*"i[rVp쳭ҍ.pI0a4 VAPnAM_J}ZιI\M ԗ̢ZVVz:٠^X>=Y-QأzCS 3,g!G),۔ާ\L\:bhv1X@h H3T.bKy U;HZW\43zrl /t |qaMypi4j Z2pP]Ks{3"h]F`azxB5GYH WQ6;.b)3D|d| RqiGP.R;0`tLAzNթկY+9`qgM~8M"`!)C`XV,m Es6s.5N<4RV_p;g2ģr]v]нҞ؛Pָ$5C,?/N&>g4ɵz@NJ;14qCxhRuN8[JNdzIx&T"r!rI|s=]SV=~4JvRZ!t],*w,M>dz)؏>(㢺uLx7h[i {~3r<|4+D2h4xBo&Xe$qp+pӧeƞ $KULnu#rgژeEM f%QSHbiy[meJHE%ю JMJEڅԑD.2TkTyiRj,Mශ,3z)9ٹBS ѶڤHoӝڌ#'z;3i{F+#hb!PQ,x ﰄ|Q֒lsg}Ekcy1fo ,tx(CSX@ eoVΥnψdsn3*`d_.J%kʍWgV\L/;؀7E_o^ h4 d8' Z-RoQ95s=4r0%/?c|Z3|'{>e?_ݻ>z|ɗ| p2/Z|'"«_ZOOPaq85.JUsC2d!k&C 4;ܴ+:n adp` FQT h5(eeAg5=ݳDT4 Oci6KM"Ћb߹7A2KgWjh 0L uN(I-- ʭhFT_Em$0RF rkj]C:wTCTUhϒ)d4I!= l\U0юd Q3F)Q::-MӈmحBa.spKNMo@1}7zUлf1 wKWD!#hVn; ިdAHU13W%A,ni,jlTWhGWu57Fy6WKIiR[ ðLJ:y5 LBeZud)!aG@ ;CHKU( k&hbJ˃&&p *Pfk>5x]l ;܋gUNU&ze3&RQ]O;4yҍڒNIɐln龤\5"dh42F לh̞"ϕz &TSi`0bIoEj}Ij֮P9Dy]#MUq{!P.d}NGU]gՁV}gIVw%t 0 Iq.6FyUZȵ:*<;3j}n,H|e)js[.UPZڲH_"#}'!ŤI\]fi*Qj)4קUbET#ϼKLx ItߊE.z{<+>h4 %ɿlEF;{ 3nJH+tG2u1܌K/.Jwm و"ބr$7R[S}{ytʼnF;nuD\mc-/WٶOp-WxU Nc]]Ukk>OO_g~gr}繨*WWWww;/"___r~~i8(I*pNQX<]֢hudno ѿJHOFmϸ#O\wG wuX}fO-|9;a: eWZ#Z ?`;!bY ɾ2U4T8u<򋵧_7 18X zfϔVdoyKH J[FDQޛڐȱIEVq )ebL'hi%m6AhH OhO(!U:VA#pF5+9,Jϒ"Oם=naF@1e 腌3ɹQťhGlGTUl]vIVDbuNfPO/[ha \FnDk@c$G&iFfFADYnOA>޲q0؈LȉH2d-E8eS.`5OHȞטtܠ{&ܭ lKEofKK^v:MxG+lE2̴ڿ62*9S0rt\a,vN4_V)K]j,qFt ]uم 5'Y\__Wq(#^ ?9\o]׼7۾Od#Y?c Ff4U_j{yk_{ Aoo}_˿=8? 7N}2J^ctġk?7'G~^[//䋞j9jna^%{pۚ+:Xq 7":'ˡ|%}/nK1Mӈ{&#r%WeOs94S(5IZVk;^P0* CE.ugH][%n 7/& 7GO(Oo k&]K7{hϒ,;z>;T#'Kրݧe"̴$O,2Q?E% .Ek ne>d|XIL1J*"DoYX!<,EuO B: ;oFyM4׶8S11љ] 12yEEQ)o/R'8%ΪO_H|+ hGaWMSD f9aGg Z"Д&Y̫rT*]s`X3 ,Tsk3p$EFu)STe%[I eҥ"arN}5߹݊Zr: kzd<~/Y˛V^|ΠI hہMlh4Lw4VCb10A`$0f]Avk 9=O$G܉h9{k9w@4uTKy"?zn65w|˷,u=qqq~ᩧ{MM\^^O==5/9ooCo?Cox_[˿WoFuG9u-LTDҗ⛾EUy[~?-PM$>a.q:p*Zx]Fee+1nO]qhkC|pCJU2Z/B[=K½jGC|ЄWknrc ը}#Y"_01KP$0/1pӒZpg&=in[U m*Y-}&hM)N/꩖WjGQrW[nc԰m0OҩfIõTGWȌ̍$!r N˔Lh9Yi%e%`/w$z)|mrfzeQKv+_յ%6,ߏ>jN: n޲A*!<}(*"3_.<"w <mȐȎ9c:/Rjk"%ٶ:h[dh40kZEGM*R$h20;6Q&UlϴނEYʘLYIc#R8yH ,21ShÇXLt>=Nxz0b2؜ joMFzc%M1^VCXA%_#X&x첕18.; b"lCh9% +Jgt%ٹq6<àkk])4!o|#ߊN'"/Oe\\?z?Gx^V}GU齳, ??|a]w0'?A8u|>?>[@!_0^x֑n4sBΤyT}uoAQ^,f-iYCwc3*+=`Ow~\/`ѺsOLhޱ«V@zi3X/(ޖ*V%"Q^<ׅlP9"7@HT-0Ow4ebh/Jw íJ wgT.x*V"=& 6<"Hz.=x3A:cdj˶zRT<?t֟Wp*!3%4H6̺ n2'fgPwCOL2Xg}NϬ᱕n?IC}?H{5 {fZsdV?FU ,8̓a5JHLlss@Vfd~S%7:eDFhXt,iP@|MM!'R{]CL*mҳL=ci% 'wgHƂSܗYңe-ᛛ6#BF>*m=N 1"QlS~>`cD F76k{3d"ٳ98"d}zGų;qr:˥?yc8RU.//_UsW~Nj_[_{: M^< v1͸l 8 :(jn &r ;q$]A9Epć|:4լJ+{}LֺUғS!i2XH.JhRL 0&?8%մ*ѡTV0'SeJ`y7y{ܖD4s!#%:xZFÜS}Jm*.>9YGzcjuا),=EltپPf1bn&9*w9v(Y%m5xUYdopdSfIhڪ}dz!A-0}p)R鵹*.Dr0q%8RQ8zTmG E(ϓ,U?N/q^Bqܠ0,oπVyzzF‰RX%˵`ު12XZ }Jښ wriF1D8kh2)w.3 b t`g-_ڦL ͋=M2ar!zBiZ;e}ꊊ!cХZvN=Y.,ZK9JHoxj>>>k>imb XQiTy RUzFJMkBvhjIݗ9(2 wGw/>c?VET ;# z4Ly7NuIUdfnmeݫ%J+ONi=| ^Y8uЄ440CGҧC YP J"\l6zQnhIhrM8Y4ZZSQx;1X3{rV>w;dddd(9YZA@2#׃[+;3jkwnE ƒ3T vB69 &$P9Yu,;,qպ4RɛYhqȶrKͫǼ% Ӆ(hm*!1iZM۽=92MvVFŲ,L ߳a\ [ _ Q;!80|0D3iey#X8{~z};L5F&VL:7z^1x#nD4z%ZDl,l :(˞ӽE5'f,AleUKUW$׽k鉊/l[[O|e4Y'޳j6*bzY.pDaPtT[\I(fC4!WteY=w6{%!AeJ2=._+Cp^Q*-sڳX@ybe .SA2i36AK]LwzwKdMvEk0Ag-fnF1, =M%u5DrS[7 s[ڈz%w{vO^Vrk-y?1)B17E7=h[ 'M*"eanp@z# uKf} LZP`.NSRў?|kdV7&=q}dԶ  3%# };OOW֦Ȟ [bk%e8Oz3 m`n,8=ە}Y<uL#jΑMK4NVFXz-Ꞹ MI07ۀW)[hE2Iaw= P;W\=/cl{BuD XoEma8lZ}H5:XUMY4ȕznERJP tIbGڤc!N0 Њ*Ggd!Uk#;Ojs{&a&^1 rl,j&2\^COHS-1_FEC hGՔ\U_m395fOU^ {lncRjQf:sJ~sC) !Ko1>r܁mt2&'58 jd\,2Ny9[&P3`4ﰺzmGS6b (Y 24*@`7J֑J̩rtKm:e7t%4KRRIq5d<ƩaI6C: g,8ɉa mO,5%k&T#;2|`gdyb9εʅa4ZkhZYZrcأe)O=KO+^J~w~׼;>>돻C O?xէ$~&ק;Axc)=KuM]? uLEj{k#֚eYX}/|YyFn~ZfQ)ʨ֥@}ӧzi%Xiձ^@uwωX\%# 31{NEjiJ<[oD*jlrXӢsl\?@ᒍQi#M;4VjhIE#vVmoWd9UL4XܔIpzeͮ?oJ9xܾ /U~9m58q\w2*=dюt(`riRUT>%sm$E X31r`)1{ W^W|Ӳ+c|u $RX6V0]1"NM n/Xt MQH gɺrQ"}E,DzV+ѳO2طG-84 (vs RRZسu,E1@t܎WEJ&>m_*~[c_O_ee21rز1dtj>r#XqG:f[VȑiڭҌRdT ۹)-Ѣ:4 R$m9c6"Zn9ր<v\˳rg WX9,Y7Z~fi%;ԙÒ{1f3xصru”SSE!nDI U'VHNhYs ҸA+ @ =jvi*l2DB{Ђ)6 K\FVOtFli6A[ d=7W#͗$Wq DX [&1vUeQq"|Ed8'<_7,,j͸3 wVdc×AK:ʕ.\|ؤ]nx O]Dg>OX}J4Lݥ m lmgDWW浯+_J=L4s -jVVOD˴R .UdiU 5GZ0L0)CtW\^)va$s%Iӭ’)fl?AYnɢOx4Z%d6O7zż&Zf\2(nQie!͍¨,QxuzO?t7%))9کQH4[ viv dDcT3=<̏) isK s#RV3_]h#9E9~,km|^<44oD*ϱ ~CgdjI`jCsPa&IιMY#1o3`.7ƩmZ[]'q48B ,HJyJҰD(8۳!ޗOٳq'5? Fyd`qVǓ%etG2 Wp:Hr;u)0%!XƂ n0BNnP1ʧV^x34{F[8#E[\jOf?Rp C:Y{Bsc q9!֤Z3rv֤%'HnTRT# D%d26"z2LLGX( s'ˏJwE+cva5鎔l1GFRbiՎA"m% q/rOKAZ#u@ t:;ǙbǞ_UIvTBN³@dO:BST1dHTif 2Ԥ6.UMvMۭ[I~diZ Y}eUhc*0T7MI564,uA*ZX* /_ڴLz,X: vBϜC9bcXndmX^"F$m%" T4^q`RV ;M]D.74 wV6z";-= \o;瀓l\i'LAwԜ;#NeddYgN}<`k{qHs@/5))*+DiVp,n=5LIgwFEqh=JeOk>{,=N 4𱱔*N<.;vd> G+{z`Uͳl3)̂H,2NG hat}Mf0٦ZWvrX8 Wb041T"bP5&7_Xw^QLѫ+}H1 B0%o$W,~Kn==[CoKcAӢZ ;-rÚrU[C*4&FfA%uҦ2EOU0Z4o*q]FzBjЅ 6Tr͔T . '@hݹ,K*cҢTi~>Dφv^)ZxT܂ |fܨ.v|<̓)K/Qxٚ Yq4;u}iǎl"0rL HeHx @(R2DA ( i;_t]]9yk=TC:. A=g<^u.P11wު>:DXJ'#U撇f+kAU$gTARCĴS5IΪTw?lֿ͜tlߛ(#l\U*zO37#;yr w^Jl$, m-oͶc乡ө7KSd\ğg_Gd̐%'Нp=x3YFgc=&gȱYtўِUgF_rf.tهݴ}~M9#ѿl=c'RS'磩@*Iw'pQ6%1l:mSN7 ǮJ4W16`k9JQ@8Av/1rY\&Jn |\e>ULq`ƀA 6KHI6dAF+rF:nƾNȇZɳWd1Ǹ}oz|+cd42'{˘zqI?*mf(%#0|#K&71[cρ8C׏׏Dɝ97m? }779v Ԗi*nd3k]ĚwEʾ{̇mƍ“;̧Gj6[{F*y6)LcǹsP4LB9e쬙8뢎V1gcPh`}j, b??{rp~??rj(^VRl.0;:Ӻn8aHF։eL50`u?B˩`t3WKq44Sv%wz`5㼱U|oFZ@Fm1w9$,LaۧG6M FjX-~dNFJ}}#v}XU- T7= νKo2!=8~hAD({jԙwi彵,U1g>sy+s 93YyZۃWk0r);99uI~}7[5?[ 9dq9WRJ ZL`ns$eOH3efdw0;~~־lY.:vlyvo3"{cTSI~CyB(5[yˏX1}iҏ.aZeԔ%*c<7}[VAhݦ}-٥=灕tѸuAt wżܛD#ej0<`4C3}p.Z"u=pN+eKN,h?O4>ז|Wuȴb[Z } ߋm\'xQ7l`iu0V ׾?oIy/|wj7zSFQdmjW֤-HgR~6PLxM`?'±Xp%ZԘ=~uVHϰIƽa),[oŭ)-3THn%Wpe05^0q%FՍ#^Z6<-mpɺ()T5U8ظM}OYׯ }qŰ4ZJȬQ7gi V^,/E3ڧ5F~ l0Z]%̴E8t:H(6^y1Qx"e2NEKm#'tmEs$Ec :qfpdJ>K3Qu)X7S :=-n$\i-ռgVdFI:Ct3VvYgͶ/`mj4?kH6c{5Ft>R¹o聴.2s(ESn"ˎɁAt [ sŘ3BK[ xTGL3mى;%)w(*zqPff'lCQ3޺YiծrY,7t 0N,cgK~gzj!FCF:m%a({j'͹:tm:`& BrxA"וywd+DEK1|.>䉼8G}2[CNGHJ"`b;mb9nz/HsniĀQBmWw* e]8C`a(}_pFmmӊ{ fmFeeuaV>؎+ WocJ| OAz[* ww?L e ˘an %{x&PA_JtyN"0u[,u-O[:Ɛ%z9 +vkE6G2x2Jl{Zmf'ۛSم8ų1xM%#-oK ʪ̰qY!-!910<<y@nI_mttqSc 5]Y9FȻe2j|ZكBol  .Mh6Q!M{j `rAa`1I,uJ9$y8Md\VgHܟ ~31Qơp^t^0-h^t1e.umru6/KWrʔ2ôu)8?cc0stS6 9 C(Q{nY0BM,zJ`2^FaZw0mhx`i݈_3a\2!0s„y`^1ȺqnnT1kŋ, { Bwm o7(ɣ6!6 f.yp[Mqpu$[?xW~*/0jY%bLLf GҺu;8ʹz XC71J'%Gqyi\^>p;~!9#_uh[@ ^dv΍{/t_v .y&3,;o6ΒGgofoDjưi(gDaQM`*"{>]T:,ꅚbL.IO9Y9OֵZ ҿ1xż<`̃Ge?7FN98. ^\A=4t򚌱a<0'{$]?~~=~@~RhO #)9 ^"B6oDhuL~8*i 46ur?c?#7lzMy=l 3cH٬O:Y^̔\5\.Et7ʟA8HjZ#=OI0ڨt;ujnT̶Jf22<{`!S#5Sv_>ϯrnRb fGL(Q͜1q'dx \7=w g+Qu[-t)"ֽS!X%[ Yf?c<2:Lm >*Ah.: Etw.Xn2f N'گSۧj2z'Wﳍu:JhbܓMF*o#S.߸oUҬt?@ʉ5Yۘ|{\ҕ )i0gJ&I83}1d:$ 61;$Ag7TlׁFNyjk*Gyl 9 EhHa Ҷnv?0s<wUհޫZ'υl=4g>ml\g`e{ӊwgjaQ^⩍ _uŷb &7?$!א nIklKaRֈm:\=mjoߚt0C2xyp1l1;h5]>Lu1 Su(W'++Y3O4z[qF?]zy3'~W ַş__~Z}>1\J{o},بve\QM{\W s+y[^@I`wE \7wO\W6ȹ :bYwPJbM=Ct(h}F& T=佨f˜xs%Hĵ8ԡ%+Rpr2FC:.Xy#:oRX\F0k뾦iM~𑞽oL~({ʅdŶ쓉 y"GK+cՈ\67ܼ^z[1Ώ5gN=-<Ki@Xn &nvʖ6DdUM6=\7XzJ,Ǔ~o 6joRSƒhe4lqM[)5R+)4;ǾЖDNI'(Sudg[MY3?k0b$d԰)=i{فevcqiO/OMbEU DOfÕr*ڳ91$>ffΨL%rGj{Jsb$X"`)0'g2pI {_fN}A^[aB8 ძL`C qN0<>~ 'TۺޡƜW*|_g~g7ȷm~Gٟ孷znjjă-^r"HWdPGʇvdB:s#Uw~ޕ y1vʓh IDATS ! d_c_rjjm?5XA6YqYA9Sz3tY|j$1M%}4f}ڏQqyȳAѯS5-m,8M{Iώ#nFB紘~ I@/FGz{L0e"5\n2DueŨ@8Q$á4g~N4k\H Ӑ+\,mgn.Gh}V:;LŨ6͟u#xgwqwd8C6Q!PJLl 'Pt4zhL`2[r~:f[|މs|Kiҿ<*h8s5YHc PF3ō˶;rgŎf|us:e^ȍ`Q4F-RٮRվ PTx-̍9Ӗd0(f\vlZ>Μ_!?"Wzz~~/<==W/#ECs?Gt1a\*MׅN:c±6TgQʱc4Xy%GAbp\Wc_;-X) k bUԼL{.C ZZX`D*WQCJ6HQSqnīFyuYOܕO4P*LՖÃP2I-3@jZF.HN4P5ofx*{s6Û9:zUk<1zQXMfM ɔgUY:u/U݇Mc):k)GZo$Ww ZǑSzf,9R&,AՓ,Kɒ?ȇƒav[ET{ ų)y.HmA^VwoMBlcNd0%["7f ӗ& m^6',ll}Yp=J`ASgAQ\؈tβP+A\ 5@A}vbq+[:V>v!ExqԀ5ȵm4%/ q2#VZ6oC\֛W+Rԝ`1UUҞ<;n.H=q qiOnOK 1'%k<|OYWW30~|ȏ~3oͿ uwCMXگo2+FɦGql8\'T{]mBFoko|$ޑyw(7m\f4C,gPǚ7=Xjj{*q5YX7vrau|%J:.g'AEF#PC0F(Vʆkjr#gy7+c83y'rWג22"G8/SRjOCDÃȝaCv;ziEɢv8 UĔ~Y+cݱ 74Ք<່;db{ /ivDopvq(`4[|_pULE?%;k?z¶\._7^O?e _W~7/}K:>_Wzux`NOlIx#X0`bd<`|mL#aa:9怕Lj*uQ](Sv1n)d""XK/??-/qG^K̲.ʜ\ln*;`%!:֧?0R\Q*|b!s7X%1`d1Uѫ!BOhȡHא#yxZC8EPJJ$?R".G;y' <(.ʔ,dGq58}E+m&3©y&߫+pwfغbSgE6({o6gwuqdWwfrI9Gx6 ׫q(9+]o ^+DW{tPm8`avx_B$+Mg˻%L F4lMuw{kPB}"mvL[W:N͉P:*,mǹcxd=T1ln4Fs&ΘDrl\" 7}+Q;6"PYߣ_,2V&[c<_6ʑB녺-͸VRO(|_KPk|[?ɯx?13x7LZ1LDj>.>PC1Oj\2}"4FS,.rGge7X5VrlW4~ b xKEL ]v.V]$Y}<'_[|h|8:BVK?GoGR~` \}Xg')'Zo䌙8oJ SK79%OjYtJaW%C_9[;M3F3_xYG F]yohoEޠ; 4p}RxV{h>߿L0Hg龕NtSv1(Z u'#;aSuIsNdO':#?;ڔ+2/ٽGg zo/i`'IZ1U)X-wxd o9HPD;%W!Z:ʈmJw9\]r'G`^h)t[%oKo$>dFqp2NZ{ lo_@nWmp[Rt#=~n'cs5YlnxX%k_T\Z)ݨcK!u00o[oo&_׹nT۶q^y뭷xxx`w=o_?~gק ^嬨HfûF8ژq,晌ȁ``-mp0іSP.t wߠ>{ï1<,^%(>G,:`j}B&]ghtjCI`*l: +ZLr#G3fs&AG*x#TX*TKu[K{te C~&3[ 2[(uusQDž^Z!H;RSFKQ҆:{^|dzbI#&:n6'Z}?;d޴Hg-9eIj9Azu{ =N4䨎g\]T_7fx6dYߍגm]MCn[j6-idˤ:UU#B,ֵ*U4ꫲ;g{sdoJ!Tk-mdzΖsK=TL֡aTԣ`s5\çO>V )亷d(ңr.͌ݟ>xffᤆBv,| ~O6*lc&q#PƘ+\pSzmjtxcOy|O_d&7/_vۉX|;oog>YC^J}N{fTBQ2J}̼ͱg)sdAr*R抖wbgߓ[G{sۤgǶQѦW1gg0ksU۠[ۉn)U7WC1jp(=;S6zk k z,<^ʼnn8{4Ppy&mu)-k:'wU@2SMڪe0r<vf;;>ͦ\=ux lFiSF:5{_3d1i>BdRLޓl_O(TXWHdCEչN(@TA}[hg;SVZpWgWz4ua?c'~?c?s >zT}OypqW5 lIP-k͜Ŧs$;~E€m*V]EF$ZT1jb{pyfb4=FuӴ[WV~JdD_UV B A u_Y zx❬@&\\\秇*Ȗ49f)u 6q AW kA7A; 2jZսO傿A~, ioܚDk2<-l4#:oٻj ︶~1N֧n  g٩Ak^]p%hrsS)d|6EQp(iXݓ$Jҙ yL_m<xQ՛1TMQb>{;&bbr<h.˃Y)XsiY7LAwgX]=e)>f)Ppm2z34ŚrZ8\ۅIR 9hTÁil;QA.zlREKZ7g2̆^'k f^ֻ<Z;k^/lj[T1p<1XޟOZ~ϻkd$Gio۶z-=}|S1 IFQS #{Ž, 'Cgk'$NIsCTΘF_ކ~xܙ 'L] "mSf~, (MMv%yZ{sTL F)6- ='+dg۩x0Ѷef2[ V|f\e눷9=/q*R'?cǽ#̖N Uo3 *&<Cdo LKT,"V|J&GKWs@p֭3fx֛-;4Ix&"6Ӯ =ac=\oLJԖ֚ Pyfޥ>ciFW)hTyM S!BVF+.X(6ɥA8g瑡)W)? unG<~%R" Uj&K2w 6òhz,HOb-ԘS`8oەcKqVҀFƦ- 93'1\2`0?Zl,Js5x8-jkc/ɸ2la{;/W9v1Ys`n2BGWUWA+Es*OSq^,ԧYm%xv԰!޾Jb˃e惙$.^5gU{lkl%1xE`> ?cT2fZJ gN8sy 왽gF뒞,Ŵm6YÕJaCXX{6cDse?HYŬjJBpk#m1k6vtdeXZe7kǴrp{y^glc85xBS-k&莨 H厼2}W];(NQZؘ:m'w#so_ߴh*SH]+;J7"y*'4ޣ獣dfuv7-l [βykJpK]%aUEz_/X wzy j!OHkQ[&_ϛ{&0XJḱH vqeƦCLIx^$k`?ms2Bpz<D#SюԃA֒U}uX CaDmC(A"}RەGbL`>*< ɋY UG%NƵ#_OF:ް2'jnY̑aycyl-x*7\m0؂KMNM }ݛxLw#օ+O{M@|.n6|3rrkq1AUP&q FSsWmyG; u:-QBҁnV eZ$I )ac190&X.2i7Pj"styi5t/yʛٓLj܉ţ8$VUBLW `,"Eۦ:SeND7WFώ21z=ڲ=*m6 ~>F5͸R'q2Bb,|,.g%o-`(ПMGix!Mi72tn4C{QΈ+YOgoz#0GxɄ`MqZh5ZqvPmon0{`zyo# l"cBwzG?H6 ͫ<,Ů@ÐwON6sU}nK6)!3wS=| 3iWxGŕt-Tipu^d2{v1#F>]Wᵚl&mԡ:0,w<+:%Tr75LUKZC4 (!F66r1w!z(>L%y<^a&#sZB;9eOw| ,6浘d΋,KV7ҝ;* ^<~w>c Kk^<7znpl,%U" IDAT%/ + &96 E@?B笫0R0: c;n<𒱜5?v}kŚIՍQFm6`Uc?owWo}_C_?~4_7xsd7Kc#{(:ZSd'<=u7U.iE (SU3X>1'(|]qX+ESx.P"%cqIfPg>F4J-ErP^:u,Oѿ;L7qx޸$rOÃ`,yp<$# *B9ssFu|:. ytw_= 9'C6z }{h?6zS} ߉˽J޵kMweܥNSj_Qst2 ^ I{ڄ`WuV]6+YUzC:AM;ű6<_--ȃS[yGAI?fg^L]O$v/ ^w=M.cᒄ# Ӻ ?[_q޻ۖ]}1\ks}m=EK-(B,p CB W9Nc%8!_IS*L-WUxؼ"Zn>c5#mR "pYU*Is{ _y7]Q ȭJ_.13dbec#6UE:E¬>:Be֫(oa֊ O6舷7W.c H vޯIy6Cu']E}gwR%yV#-X%#yS0DȞ@'6'~kEIDZRH7ģfdSo eG0F$&QCۓ0>WJg ${Ed4hAxZFj !G} 3({IbGdJ]^}4!#^j0ߠɈl'#e)2a)f[U㵌0\JgTvc{)1v Ti!;"5fbx2ov]D|X;$?;"!Yv|Y;CNJʬꝪf0*R"*o wpKvɘJT(,he=aw5imл%M-~d&kE&*jrFV ^=7%A.r U+~Ua/`Wx\y2^_:Ɛr$w U :I6U h+ˊLd0g Zd@GG>v,{Nt T( JC}î)ݩRk.—^d 1K г)=Wo#yŃe%Kԋ$8Eau`6xG,E˧ S98_wQAJ9K40Rl:<(#L4<{r+wb- ωnՁYx;DjF#VJO߬)~$J_3E"7W#L'@Eɇf ; %P<;͋X>%J i,q.mB>%6Z^azK ,vT/M{nlք3&8L5+^J(N0bjNJ"QINQU/skӆuq~甾 3qMNШ@}/qo{ʍ"בE BuhU>$ijXRd{Xz,kTrQh_b<4V׾C{҇fA$uT_C@| Wf6 rpΗ/[w:W*UZna' C{xv4"T6i-ك)ዓCJ[)W<6auc&EWƈI VVsƊ)O&~JQ#iUAG~}ॣ c8lRSv{plF& rit0ܙ}`Q$,CloWrܥc̘u~p4LИDٛX6ICh%=1w&6Jꅪsº"Qź9b,(DC{GF6pGfkՎ'aΔ_On&A(]&{`>e#uL zIݲQt@2j;%vYs,њTp>Ɇd$GGGh?4죓#Cř"aǞ#-?H 6R Ϩ>޼'=#LmN,J7kުdQG߇5Sj'9~G:'uxww(?eͭX Fd=޳BfXJt*7CH&"M(G!lhfϧ7ww(s {>5FB-6&F̕a2XWM<|8zb '7-p9TW Famƚ+1TܧPR }bY.;FdƇYdTv,?H1zJ%wW:u: CIwy]^_PcVzLaqcs3lmdU9)D;7nJр" zxEFD KzE~CcyaV&FM(oéޅ:$NY`,L1!.aT<2!t_uG,:4-ْU>-5HNb fj,/7&iW˧b@IRqXqտ얤}>{fc9 EvMrr ^ P$jF+$4);7{t=5,Q}ȀDKnL檔ZyCd7ɓz3=iv"EGՠ [ҞQM3HZ!<&d2{]?Њ6 =bu!nKzCp,e8 {|Pb9LcE4L$2'qCK~4kU%0GiI0ewjT-LP3⛈k4;RN &jjЏL[}> ]Q!TBKŬi.'%!|D9`,3j{Vj1)IDu%.!-)^E@-N‰h8QLtXMnĄ iG"E2a[ }uB@bY͘#4t<(׍5QrN<›QK߇a/tG{]H،]"JHTP7DYe0"P]D+DZԹkQN&+ݣm*Vc蜒rlur!t fAPnBJD.}0 5!5 ƾD6mԽev+4ߊm-k!FroPxatUwdD=c8:*ǘ7B;3th , |%-){>Sr P,zJLqؽ_ePJ}0c$36G6R)D[ I]:>oEU0hųH4NĪ5K[f#1!q " #9#+%7n%');DXKe)d,4)d$n!A7r H%gHlWb}i4ʔ[!Ӟq})jneUCb&"yΆ4>}E$9ޯED07P2HF<+a2Rza$=Lȕ^E]}b wj;RA>#GBY Vibˌ{`TXQ5gwkގ te9Xo J0t0r==6#SbpeсLnHYߗ#ùD٨n(R2躢jN/ADw 3C%6(6zN\6\^MwϤI &wj!V:⃑WwCJqR/j6aHοe[v=$/"QH-Jɕ>cd`H8]X+-nLL50͡zaxt0r@X⁗\iuÝ(R`F=M^%;,eA52BMlB43^I@-;Ҹ\ilQic2\[uѲ => >h0 31΄(֒ <˝Yf5-(`=^W m@ݰB*mz}'68^'9 Kn5RЊõdʯ?Q"scЌÃ?` fqd$W=+R(Gb:g'-śR;$(:#Zz}†k;ώ"a0b` Rdq(iRR)r\66]@; ԍ'mW8H:b!!*'8cƕ P‹#ъ,>2E,$l6+(:'ڎq g!I,(/iI;{ZJQ!Y69l?c2"kɿD=@$:h+veEGO^29جajƸ W 5ƞK2YuC|+ gALEa͍} iNWexmZfB)XQ$vW3>H\|FlE)>6G3λ CKUXO;Ղ#sfÈZ`V.nI{O<ș 2tDfjVkh AAAewCJ03/”:aL+UjT*bE%D\0EJl$.<\^mjJo"!vXĒVQ*&<gJVg;tM`nL2#:<7|9K[茈 To̱PNJ)4TVʈ/sٟn-SYsp7NiOQN)OdR3#O =ۋTP`  8Y3r3 ҳ&v%|HEwMMx1J գ[KxMybٱV&aL&ؒzʼrD႙htIܢ[>u>dy]^o;Ը@Y7"7wJq_:> ރ\Kx(thvFDDc/81xULVTٞ\?o~3w(a,X Qꔕ{Q6[7 E,[sGF!Z]CQtvlJ/p UAFä36q]1 aBTc(e?J5ŸT$ڱQ*-%I03KE?l\])1Rcy%MmsVZ&܂ӣb/xrXdcGy~RҒ56\jHVR a$%e$of bl,LoIH{uyIBCJnyr ,avs`"Vx%V |oZ>>!:R9z tUH6AXk`넏y.Eꐔ̜ p5FFkI VCx{H5:`&[heKe6k8-iwaS&vcLV鋲v Tr(klY1=G1o:뻘}З/ s+i8bnU|EqڄzuU^FwFHBQŘe~ZW^ý1< 9LfO(VnI*R;oȄAB)uy}ASa>% wAZ鲣}ӸI&Qc>SdH옞qp)C" l+>%HhI&+/<ÖF+Z""%= ?A`DUo`щAag GdŁ0(<"\=NR]D'gWOlC+Qr9d/PCzdbS$KCRKGe8ĵ;ku~sľhoXEs_ϳ[):Z$ڈ;R!)^>L@!I{Jm,Yx$Rl֎q <HJ0&=/}ɒ_S;1$e%9^d\HQ<{"pN|89[Py1fX IDAT9Ԟ%G6 ~>d^ֹhgL#X Lu192W8|D:>bhuMP^ (VA ~D\۸v{pLʲ`Y:U eS68vVrwya=żs[rgqQypuڎ?7 ,` /:vW>9OmtDh49Ro&L,Ǒ TTthX괎Jl6:Acf֐A5 JPRI)29~Y';UrM>w&g\v~7n|ALJ;E-%Lr){]^&Oʐ)o(}+fS1V[1X( SG611C~:7U^N:ŭ.]h'G&&2,>wh! 8DB>ev&0uBh6{kK= VT4)Y^ ybK[$nmzr8k5T m+f  - "G-<ɏr`GCUFb}<$=A`3f{0^qͯ K[ :C~E d,[3z4'}\2a-"Knc8;FDOud@ ȡI *F3 Cvɤ!D'ķ(N1kAeb=uOrc/Pzٝ}XAU*V VIA~7y pݰbqej|I[H#Ӑew_W1m]Q@i4(E%dSL(J\*Wunx6ǯHQ>SAKVa( 4&BX+ډQ$?byiGտ۷v7o=~7mG7kОgj7נӽeJN@Sl1behkǥE)U ụ-֬⡠8 QX4ë9U_EΖ"07DHw rdǒ 6<xb 9U\CoLs& LÊa#N"sFE3ݨJ&|b`A5uȍ+砯@qKI+ 7m8Gh\TAL?"=^1z-D>qPbۗ58ф 6m}41h,dވKdO=r+(dÁ x“1r/]e۶6r Esx%j<8>i vgjfʌ9ꔬ9+H|@jAt ɯ#`rRaD)#paXazpUMyESwSka:6N)k ;&t31 TCWgxGنu2\&Zc5bc/5, klי>d򱠺bO^+*3K)|~w7Vea&zR;ȡ ^J{ߋJ);<{B?|_gc|%^zGGf4jFo^!012N?+cdGG?uTxw)4.AQERfݧ^{oI`d6y0F4'11h<9;qNll]bLbK:0Ī G /ZHI:Ǐ5_|atd%` 42GNyս-o/"HX!Y;I4$)%T)oG ;6- +(:3j|r5Xn#/a)FgJ5|< ͸(ACxÊC,xO;#"~Z?~;̳grV.e Z& k+6zP-?+QJs&'fetn-A֕ޝ VV2ʞqiuņ]Y"}c]s4 usіx$wrvK`OYG,<8Wo/寀G^ g7JW@v-真'_<糲 Xp&8?SG1 chhKmŬ}L)JQQ(G_ģ椻04 4\zti:ڑNG'_`fqs(eo裏_cRJy?~[i|Ϗj”{5Fa$T{" ^p:.Ι3ؚi ܄yp8Yrh~-O|Oy 0akaN)a% Eǽ7 ړ ;9Ϯ<r*mel*;(W+3*۴O<>+cqg7}) 0a`섋 ckSns U+[ׂ\u~yu\? 8իO Z3\!uԒ iayj1hR!1xabPINN!Ko1VDSmI|hvtSnp/;~!>*{Wwi?}{Yօ|'|Y|u QWNǸrrïy|7Qُ8?/_x;/׮]|_^C .3W4˵t|sAgɌ]記*gaW -'/ zh=vHlC&5 *nHWg񉥇4%S2^ ܻB顳IG1@KY&D/r,l-ktAae{%Q?8wO\=nx7Tא%IL"iKlc!)R7 K~]X_oo7uqõfp5Vj.kQT&7H):͌@GMSsBH^N4Skx6}: -[,DGl;RV ad$'- A+N>qv9ۓ ۣ) `={R^$3p6}iӟ)[/Ni`*K;lYhX)uϑDFmߤȚM4X_tA jӹ8oM_&?!>O裏{OOpNOC[fNNNj~g91/{׽wn'o Gu~^2n޼y9\^C LAv5z<.YK;Sы b Q%4P+BaAaDt[=%kC>oue6^@&P40ĉ8BEY_0C-ܥ p]!)4 Kl8qXplD`(C("@FվSNͨ \('vCО~ϜhqO;@ 6Ot`F $C Dֲz@4"*0I͢AQx@kV. c1? B(=V\5p5JJ1U2wѕ0Ni .C4 ?qRn  wi>x:w^qvQh6] T.Jf)p]Pu?/Kp\Ilwz pF͇х64|3\nyu\G"A$&29>4>qWn0rQ4; :=hAY3|76(G4 _z./CN <1s'^Ox&OPJ|cfO7yk^G3E+U*jňİߝ|.[XUi>ǖ#nA]uCއPPЊ2lJ?S\N~ 5VV*w8g)Q̮`U{;;x{~?<׹xgxGx{OO/?[|Op~qc|7|Cr_}z!~/{a苘?Fשּׂqڵ4(LdP`&t Oxq*kMC%GCA4t:. uwx1 ǞF;X=-z5ۂ%ّ|PcsdBc$?atd#FcJ˓VGB!j:ZRɶ, Tc>!0zT )0ۣ-oAuFt@RRxI)hG(C%OȔۄVqd -! L(kd'O~*c$P<fX,<J1СyiN u U)Zq[cr)!Gy4mWOD{m %0G\de@h#iH ލ4*߇'О.;Q>۟'oDZ^ hT)G3F #9qѳDiLs91`x_eBBz_e/"{=2-_q{WMx?_gmō˖/C9&k儸wbNɆk Ŝ.93g7YxSܾ}أ6}wĿݼ+K O!^Z>1y_ZTaxC0@}GHq-g)L+er1{|TUĖ :a^At#\k%Ro'17nܸ?noGA雾+'W]mkR&jNoA?οHǺdqw?W!7o𿽼.ߥv)Ń9ӽMC.wƙ:IZaHI%87%-L.UYpvis[vNacl|S|Mq$AKvG[llF4MQ"ƱKLvAؚ I'].s=NT\0SJlOhYJSMsP#\aeutT 6%jtJnaEmOC2YO@skaP8ƾD;x/0tEh)ÕC$RJ!Jo-Lk2еL fQTjãSBF*P8L:{5P: 4,/$ G8>sr*Z(3"|CH)BMɮtb|w|??}g);o{-73Ou W 4MHY"L*Co~#P Wds0YBӟ{,so呯y=WցNGMMDs'n7};ȯwqwj|W}=+__/pqqqu 5mѣ"9TN6= 4L.%ɀ "E0$Fofe,QSU})6} wch~>=@k8FlƔP5OE+C#ZcNPb#7ӽ`ђ2 ^s܎G\ӟ{u}l݄'D| tjQՌNGu~%I@a-s^F+^ *-{,u{O^@G`\t缅A-ub|5@(>,Eq& /Zҗq53`edۺP4hRrg.R8lT1%Ѷހ Kp!0GpҞ"Ou'?~?aRq<3|sS{okvw8ܱɮ1nCcb<ڸ En3&BBni9QK(N$>&H$(H hԀ \rU[wʇkh HW5s{~TSʘڑҋ7ziIcK¤[NW?_0 f#Pv"V$2>\\A>测?3TT^.h΍kk W%1Ȓ|x.kC`bX6a[BHENXw)^9V  M}eײUwʴ`jHJD|z(bt1یʖ}UZSġ1vH=0#al0]LXҭ%5t!v$Uv4Lli<ᛡݛml39qozӛu/h&ݬfŶ_y[90s^ohlSxNТI$Xtr#ShnEMJ s*Lm m(o" $':tjj\0U880yBabOu۹hFsLɎRR+dJx9Ti<4[}'cR> 57$Oj.0g4hHZ짫2KbYgb#&Oܥ ;WS8s^O<1kun7n?dw5;q&@@ pJLNl-D6/z4ã @͈I<1E#[Yo#ir~gCfM=c -#l=B y4`í[LFmŽSjM#LkitCiݡ'1cWf!b6 脄sN\^G 0um&u%&fM KG@+&(p y{Q$I2ibvX֦ݾ) ٳ@S-z^[ieÎ!S3kj3bı@_"H!g~l}O$i="G*pk'HT`HY0'\7L4:;!!+ߓsP^銝!{fS>g-c!6Ynj f~q$=-?gwBdHqEN׾?Or⒡edtu'R=NQ7vNCuӮl Y}Oe>{'#re˶}6 ~Eт @c=F!: ѳP֦֔QqY}J"&$ RhnN068+ĥ!݂Z]0i݅YL%#I170GQĪbfZI@J_ V"q6hÚfz;QԚ֢x},>i6fT1(yBTdhK#&$}U^?{w|w{STy?!MoeD tb,-ҨQLޔ5j*o9Hdz\eH`cĬNC8&./vvcM[N".T줐,@+b>@76Ԝ2:~|7K3E~]"-S\GM `mjI͐ F4J" 8,.8 (B:&11eVR29*LKr Τ⫯&@燑|1440I)Up8XpEkNh:RKaPl͒7yU.@ ]HLeŤ7/^緉<(Mݔm' 4$Tv:;K{'eD&7\'rg J`~::Z)T V9MӦ}31l3 \WcH]BȂ+lFo5&DC5O75xF̰ Fvgw:_ ̋Nr['-[d8͛{i-'RcT cm2w7&e)z>h3TyO>?~;݂o?їw׮˝]=4ZYT?AbJfeڔLm'ɜCMhmDH$#!tZ(*lBЈSb:% iJEE"|3Nf0|Dn* omB'E :ƛ_$;2 uU 3謐̎FEdomcS=H֫;i9rfoAmJ$q[[EiZl{c3ic Ɛ!bl&Xxh15W&N5.Q"Md϶o5nڱ>|-`׹tWskvï!Z?}~u{tx`j}̧cBx(Na'{2`i4"!U6rY\.yij{O‚VqYȹf|H@FT"  o}`C4bXkl79GjɅ1_f5OJ+)NTv)]0c6S^LW2km4aFPa2:2`4 f@gk 5+٪#{U?$:1NN\ }eyCbMe J91)FB//'UG7KO t$H1C[d!x{*HtPkY$0G桹$@/-zfwoϹGsEN9Cݗ|^N~CdV:TR%͔Rd+:o1Y6BL2;/R=QiBz&Hx?F7Xğ|wc:xc*:g,,P[#gnb&($ϔyg4(UXm4hʌQRuyŹDIV&5TZwDMo!6n7$Bl.F؋,fMw#{ճ+:('`zċ@ȕ0Ke_pzA~Kc:1+?XqƖa/vf3'9t9#9Lzc; lWÑBD6C84me(7ٹSeWx^R6ahE}|Ƈ~[;o~ ЋOf 0ZaeC Gg ͩ{3b=KXoZ#LlJc_,%g±5͘7a'q/w+WiiaBa&v[a ,B#j3%Jѳhh惟b%ޅ&Ȍ⭨))čG=1i%Wu@)@}E?`1t@h$] /F ӧSX)$@.АuzFИof#Ng.A+~p QV0JAMI$B7'ߒ@.,.lR#֎!s5JaLI{..J h@W6W}Әa418823M dŞz=Q}44n*i0"!LiE:"4eqkFB5L)eh$ę)FFDy"G/lbHRAv P=w_ 4@L82X`V෮ؕ}N,ݻ?qiCq\ kv AfNLhRB2MVOgg:}0v5x=<ȧ'̓)cbIIڴ$ƖfZl2CJbHqE %lHpq-D^7ee3Q04VT$xq@MZ 4s7jFg.Kf)&JcN%٧f `KZ sjis9 "kr\[N߆J SFOVF8#  %,yA4=-b_71/PcF:5("^-Jihb1g~4Q$yEVEso"5iV ,`N n`&Pʒ3`hkX遏}C+MȒI Q+hJp6 M<#"7W5_Yhd`b^0YVA0݂KEImIjQB#5HТ(q"๝T zBe`40\ rQzN6 KN!{?PX`; H ?,2ҟa ;X#/\ex^sOf(Z:P2Ȱzx]br0YuZ5%uҚɡs:s>>X B ´I z30p dlСl&CZJgA ij5O g;l?p<Mg;v;RR:Rv[qږ/7B,zdݸ\x ϾΉ11ŘQx.eU!ѻ^̩g~2CVUXG!p9?wò9IA `;FЎZ:_EUKϘ0r%67~iZ< ۪[sGq 'Ahflwт2CFަImaVPw`$ReO.&!'?4vs yܹ~ca|(2.qّ6E@[o`8?-]"~i85J)FQs(@ [#EB7ޛ&76/B~sCw8q/廾ԩNb맅*)A =hmj!4@^s*HU hqDD- F%Vt1vDgJPcs" H'擒"0g;yQ#""b ؐ D̄hTEm.N4 kk֨_eAՆ jkXr5L1"G󛜙ASWk1-ЪQ=cosF*ʰL?]X-жz{HbyH#n(=lv56v xk .m.GeU^~*/n8UmxCu`tK_FQ3~sfa; o=IP_@@}sĠtXF$Skۘaa,sEQ.R>#ڸYVÆ8Xo8<,W] ,s#3bmP5pjցb\<.\;Rh.d6 .^O8*;J,c_a~t 9ݵiƳXc1][{yt/?x;t=}n˹.t#DA7K)$]2g'Ϙ3iwnł|bRf9Xd#w@@l)R:B`BoKgјVL1 )d:6r.X} "N 'mkB}YڇDJ.#2L)XRF6]"$%Ug(3R(GȊ$XDfT4[+}? ۿkvKYkl6?o?_B… o-oy /^tBqdΖHDh QqՂo1i%UZ5[EI|3FdF!`[CQݡah x{/p%`sL,DBf`fO%|I]d(p՘Ows/jUD+mA !O·['ٛ1 1EdKnِiяK /J%1 ɑyά0ݩgnj&,`gwAu/e#Jϐc&zy4m_svҠ澽DqnN9<\4rppt1VA1+af^8WYe,G2Jauxs kb9MFΑoS^/b$ftѱՕGX p45wx.$:IHlg=I&zr3FXtlJYǀ64NE9)%U bn⒛,'Q30f~&IO1Ppc}u:uzyz5U ,%Mٛ{AI*$'vQp<ɵ琗au#eF|]kr< "bs/DJ`t%fx. #]F)Fat@tV "],rrA~n!ywOoQŭ9j>[JZ 狾>*?}CUy׻OO|?%[`X(y ’1( [7ՌO' =ASlDZɔ^;:65Y<(5 VY$!:ߡo%ms"kdU)KjTkt1 j`4TU%'E09䫓 ':+bH֋L4Bp$* Z6qZJ dLÛUeuW9K O|d's?x׬i$.2鞓OXiR8&b>W"N;Pvp>`{3s Y*_sh9Me HqjEͅŎ:\e* l0;Fa0+qNm7*;{gYY-7vH_#D&ČB4{8Z)T+ˬpj3#Jq G7FοϹkҘċ*<{^Ɠt[,'wJ `eyv?Ϧ.f jT 1AuhWd. Ok53#b#'gڑ&fJ+:>Ҝeq/5b꬚xx?V> IDAT^%:ɬ4D w”@ te>W?w3݉d$zj?7UiʚC63)&`ZD69ԅ3B(ɛTI&Ք/ iI2=Zyͯ??=gϞuyίʯ?\xpw+7cY2Hm#A53Hl7ZJHpj@l=)<&laj. l4!B D3ଦoA\8:޺5/@i&d ܪK5BP_O`:tߎZFC~09DF%E4DdA佁(F Fi:+8X&f$}Lv~m0riF>^O3=ƓGd2;XJe#ͦb&ED6€tFTaaUP]Ų`'3& 0f fv5|spƨB9o2 {N%1'WwYT* .6eFjN vk⎝CӜ}Y|CD1;&`mڞ_L<{ĉ5 MH1Bb}#*3rDiѐfXh_Tsfzx۷7MOO?4x;|kJ=ww}ɟ䟼=Pm?o?h[5eSk׏sI BEk%I@o,j[T:b NE BSuj&% ΃Y+3e1$!`eFb|+Hfg)P4~8 F$z*'OS&IQQy:X92"UwIFG kBNq&m9R<7)^M@'F  ~G_O'>~.骺&:櫪%KvUSN} _ pmSagL&ڈ*U#DTˆ=( SppgpxXp*p =hfI,BA2f-$Hq<}߃n<l r\qw3KliH"7ZFfK^!-}{#3SݽǷuA*(l{͖e謣نNJ0 L,MFN'g8Fcfˌhep/U6G%et\Z] ~Wp5Pĉ)$e5J Đ8v _0q+w'hWbCdK`%A3"!&X)H3aA5oթ\~74-Dhp x3%"(PLݾ|ZӠ"a҄$uߗ[=¤B "PͰPhX#?}AZ2"r˳'.3O)Y-9C$.wѿ/05R$Kj& @Jș-HL@-B/@DeHHWdRchc)|?}G?AEͦկ~{}@bjq]npCk;Q^IlɏB>8/%~ [kaN3)!r2Y&Bqm#X$*`4o`4{"էP}<חh -i>X=LQk ^<8qx]~~~m/eh>&*k^7,~k}[suUw/e3#OǔM-:nWhd3O!=hQZm]KId褨wQ4iFS6yB-1Ҝhq%Ot.u4*w>)j Fy~SZDF\rzŽ;Vjz̐SM*66rdwxp̓^S 0y 8k\\7U;ko %Ri!#Psfi5z1+a6h2 1p5IO øKc!Vkp)/"7ӯi~s~93ϼV~< ت|3a?Vlj\#UQylFp[CVFG_xQ1:k[TG0Gt6`R ]ǻ4s;h"tSIc6wd9}t̆F2M;료!w$ZY +\Mq!RD20b*6M[47jcpzHw/#šLfRg 7-/FrOBwhw>ezإYU+G%=L!/sn.B獮m4 ˕uӿgc^ $G7?7CKz26EZMI_/ZL'}ΞLE7lcCc&Mn߻у5'䞯|u?;kvȹ',z\rt2m)ڪ251N1M8S윓!gs&-HDm> y=i$v )Q5iZUaۂbDlIXNTOhgiل[eYZiR&fL Vm/I#p GHMʒ-xM4wzK"c^)dPtyURp g"ťI]Ow%^} W=4GeDq[I+)|g M^|fKww<^ɓS4R]5d2H(2i6f%햨X|Cp{jxR{!o -Ծ5F`?O?~3ϼ9sW_}zCz6qCM+5EVє‘ q4-4e6̱n)ᬢF;^FZIkAx&U-" O3 N̂Cj l DiDJ 0`)J*CL1sޢrz qao᫑,oCf3q;3+F%H#ڑq)>qdzHwאwcےBy;S+`Hy11ya ŒM̒~'RC}Qn9 "8t7&Q<E~=:K/":dg7衽{/ɖ7ǵqKNaVQrp: cS*It:qk_;;Nxn3m}K 'Lew;ܺ㈢u# ;,,{FRJ"MfA#/ʤMa3V e(Sѩy"|R]̕vX(ȴZP yxdV޽qDVK ~l㒣Į:M4I=ՃEFjmVc)hQAFMtrB27`JDE-#Ilˆy I yI@L flSxy!?=A(|+M4INPTkcĵ[DnsDxG=Vɗ!t%VT5BvdKT37o~0+iQ-dž"P[%}R:LTT|6򵠕4s[[b稚J2b5JB UAc3;[Qܹr9qy\;>I=Fq."p,{L8jp 9Kw)?f:/4>}^?/C[77vA,7Sr3!?2w>}]~f\x0vz}=N9pxL;a5\a5CawGT3Z1Fo)!PLvЌO0Fnџ=nl&ajĨ ;8svh_CVTH~1ʆil%6D-ebRsx̄+91ɚȦ4U!<);Isy`ü283ߓiJ2mxySӈ`Ho'odfasԲ y Yzjd) jXqr&0"22d E4 yx,LaDK(ʰ;aëM4(xEW#,/YapAq}S{,c_i<#SNMJ=JȪ{P`rfZiud:ܧ^s\7[vs{}J[cIPݡ:}KnЛz<~?L5/?ãry}=Af_Ʒ sp@.tL#^HKƲ-ýHxh 'ga0 4PCS&Zy1L.(W+ΦYii@%Ya,)5~g,?[*hxFQMkjK#9Մtf#c@`NgD3xThT"jnػ~=pE&+E VcSceb}~Qt؉r,M%lyƉHqgMm IDATWg?g8sqɟ%"^`qۇ O{?JySI93[y`iJdqY?_`DI(I.qU6ȭwor* g?dgzޟ5nՑ43lp'u0JJz]LZ#i]> deX,1}lvvF:g,йuR+a9:l'87pa3g.129T"BV)M+F+QVrf^?8O]{wp;<M۞p4v`;OIsð{F"ޏ6T{sXyuvubųEqcؾt{32tKt篬Y2]DJqRhy xD@+U'-ϛҌ Mq 1ht7D I)%ߔƁ'zW /8.Ay''LSa=U$}SL;DmazŐ'F!ґ*rE=eLVĶ LФ G |) Ec'H^fA6AZs^ 9* ҂#iZBgÊOAP.A0HMG&|@r2eD)^ĵNCl9jN;oDs.GtOd+-;xU '8 R0*- foCo=&|frOqG(>Wŋ/g޺*\}I mQ=_aVT$:-;mIV "-{ K0,yK6|yIO}`;\8/E=$CM0L6s qkR٣ åJJOhn&5̎7uȨ**gy7ox]gl+Wpou0 v3Ee+bM^Rq\|hEp%5nփMIcC4hq}sPuHpUk(]ݖ*`TGmBlIiKNѵ~F:'i;-#tiBEi.G.M %Z-\0OA6aX"ZYY<NF8o"f.wͳ'=0aEih^׬ɝwc$' Cwv( cu| 煴L. tjљ\ؤ%a\:$#qAc 3 `HzyA['1?xkY2yhrUG J0tȮ 9Š?™ c5gs6GN6en;Ƈ#e\-b5|BGCFH$ Iս0oc*elHR+09XRrnh}O~yLtu˕Wl7 Bؔ.q.J4}s$FD5 xѪV&m $$e\?:ު\x>)$$Dty+D-K)ӈF z7!lQJQrDD{gm (poB ݙg?zy6x3?8 ľfHBgB-S̴ nL0E$) Y+1vaND9VxhSE1&22$Q5UBR vTO$!F9mQѼ͛_ㅧ_XšGI`2gá T:gHx,z7\C E3aяa:CX5D*0΃DH]P'u o;<`c [}1zd(c1K64Š#Lk n&FDS;ŧhsEvU%\7WOY^yenE#^jfƘGj,mI7kبȁAKӃ0Hxg]tRb{Rt@ȪX *tu})HBn8 Wy~,^bjF!-Ⱦ&q^l֍.OV)5vFV2az9(:'SU3:54B=: %fnJASL{.>rx&C\zp|NĠJ[WvSKeu&OuyO%|)əM`SjI TK VTѸ-#xf[yy2nN2_z3Z)Xș%g|wy +OI|xp:/]~V Z ٮYC| 啱V [j›VR Ϗ3|cRqNych΢xx.o}&e)Nc(]gN5\o?mNnAIwVR )>wZ!gF Y :Ԏ<I qy&6c:JGߝ܅-r.eǵ< 7]8+8twcF=2t Sq~o۷~v[SVŘ*#f6k>wɝ+O=+Nu Ӻqb{r;3ʷ?˃{~ۛlqgIt"6d(mWxa, SWɒR#7ɶ\$1%K+m}ǰ~;-ydq>vp{Ǚ8Z4Q|E ~'|vb F篐D)ӖNڭC%*XyJ79u*3ibh7 [<Qt EG.J-עCiV{αO4iUްnxW {Wݱ.fX$V/Wٮ.ꄴ&KO fڼ I@8L#R(JmFJ uP+X uCp|1ve Sxk"{®뷸HE}xlR5љT)ɞmD+o!ehV#!P7jNU!WܽgIߟ7n1rxwi>>'~E.·M1~ùsqHlC<^-V ^ٿ+l.^׆ KR c} ՍGe3N5a|JQ Z1i7iQ[-*q* E4dQ h㹧OYooYx':ï}f5\Ka鳨+iy8q[|n& Mb*+u͠Fͣ5{ 5ա3R̰jn$i,|7d4>b`șTD-;ή\J;Z$:8`1ӧGoSO9O!6i83|җwbMÿbiM4kEl`_H'-|껾ćX-`ckn3a8 2w6|y; -OVX"0jH9vGOQiO-yG#UAK]cqAag1^Ohizx|J7>ԌX\5~Q䔛SkQ^uiohm pm*npݷbPjBf^LxCZpF6b)6*nly"Ug9#5h5s*;/+,֭qo\xn9wx7ƽq2??_>kG ^HMǬ9*-xkq/̓&gŀ՞b'ѤDQ_C λ1ZTB7x? Gc$6rdG߁Q\{(OlvR2Bu[QbH2GWG[k:HcLF=x-r];Q@5݀2?RmTh  |ٝba$U3GDž|A٨-?׾ޖx^#e䝫%`HvXVNBu@S$A,}WɨԢk*i)C 91H6"6<?olZ1S$DN֦y= NER" IɘpQKܥ7Exa(Ejh2Ȱ,ZE-I k<ɤkhA7AFBQb(,HRRSAu@= ʸ0bVj3I5A|@Iɻ\~6tL ?7 QaMn&`T&F{b288̌0xwxF“rwqqćWSϡymYUk9v>ED($JSc-jabFM*%Vf Qbj褓/^ws{5g1}AJYbS9*1ލ{=gsk9)?qcBՑFP<0gFd-,kP+(UZ@ bhPj?Q#ς'x!ْn ,NIæ/Y䯒I޻_cX]\\S$Ҷ[\}ZΝyu) B:PkiE]5jP |y IDATJ*U=C,j\+ A*Ag"=2bUj -Q49(QۄVVь\&T{ECbxESBGlf`,%K,|/˫\yAB2* 2摪2UF5.>7`aml7¬ lg$i y rnY钻=LaSd >ئ;͑"7=3yS销ȼs2?_+2>5H= z6no@/O2pPHG`f3Lq &FCHJm3B5LF$(Ҋoj e[缯XAs135S [[Sc xPv :6["lmsaj4.Q&c\abĘf('_OV%IDŒ>y}TYRʎrMk#MLaE{-LSX>䘑#XH gg"GTAXprBz$\bQ6@ KDGБ[#K9{Y)y~ٖm8g5n(-|+šHm1xC9Ugu9g=Bm[!?)Oyʣ!"]GƿBgX}O7n_|NSN-WjJɗ}t-0Ҡe0"jL [қ$(!t;:876cB @DtN)z57|7])[(SQ2L &eB3 w;$kP iF JI7`=УfUaA|7EIZ9ONi*pP,l:cγDӢY'MJ`p֌iN`O-Qȇ>ٻa}0FjvGP+ap8kr-!{oph!#)RKCPIVk4sGS@֡5ZoDAh"Lai{O f͜6:/ZO󈊏/$7aZ(.ƫrw?5 Kxڥ)Q< A#{<|02[*5h #KRȫfBTFR ԢRȵ"*P232|{w3PY Ɩ74cQyb"&>G\g-MA !9e |%?JUI%X!%QJ3#jB66+)FBTt[Fb婟9,jnIv.f<2XieNUZJD ldl{L3A] :x dOrnFFFKp.ltGFm=uɹ`e}6R9 )(S$Qhq!|QY :6kB B<ڶ#//{$:M5Dv/Z[㛖G5Mj8q9r#8bfml_9cd>#!){{{Hh-\qUk\yo&{qz<""0kaxRbXxH0pumׁՊR ;G}lLwxlkozbN!M"jHZ#=#&niw3I&D- 2P0@ xfTa$'%DG;4:29U4DD$I*R+6\ihLϏa ^<1#eLaJ*5˚hk=:jtMAR ( :rl|,Mxppy\}( 6 M 7b"cӀL+Pؕ 43ccCر6œ@" $1F@DgX{gtk*C*^15cUR`3B.Ģh 䀫4#"eF *FV(*"9L-+bXVnWG T3Vȅs˞~kb#jP3&P뚱UX.`ypjI]'y9|72]O-Y,DƇ ;2g?0p=k~}S{`kkr@ gُ.W,W=8ٽs\8wz`̬֌Q1RVUUl*y"D@Q`0́޶k|$c\8zDAHIp%WPHB+*aPt(N 6#e#d{¢ 4!!QPX.zGoz547dv1V,50[u-M 6K-!-GJpj`~}: CX>"C$HkT;@K\&g5g{ٴi#fRQ!4HT]!Pk嵯}-?淰^x ;3Պ#|_΋^\v饼%/kZiچ|x?z>78yr}mokOrew3OnK+g|3/Ma=/&ȷ۷\.yܭq#{/7x#1Fn6p ^Uz5_~9?/%w׸馛f|wR!GϠmDsBx_\r xs~'~[ox{&'N` !Q ,nC[ͱ=m:U-F^xiⴈSK ]HT+kP,(1eCID H;zLeK4TU !WTΓ)G "E@UhjAhDHb R! /^(QreW'<-h'>*#|xO)Lܼs 4 v],s(oE9p2r#>JZq-\)FC$ ^!R*J2db~XJ;䂭tP :##``<`XPzOEɹ`]eY@#J=J*c%I B2E|@a'E 1>XmuL^Kf3yPHȅ~ƵsEjDy;y胅sçʘ([@Jzd* Ф@р/浺A $45k 6<(4`)b(\:lK1wt:YZ75." -bP?V^pT riN9^~z|מ5WѼr _l ]KưRˑ-t)c]Z|Scʄ6֑fc'vXk5u Mau`XNF4m|cZ UG˂@k~~~9G8&uQaD)Y3CArk2ڍ9[G6C#<T˄H482o, a߄;^:gS?SgD#R+˾mn&^s7[ǃ>Haĉlmmu];y7{^/r ׳hpx׻o<=vſw…LPOqs\jڶ\s$9ppiT\g p]wk^Gr'_Ue//y +^xXﵨ1B3322Yydnj Z\*5`IaqT@(.´PN6`fh61|wgDA,¢Q#bظFgFϢj)`F"k"@!@CRQrFZs Ai3EwW;Z)غc\w $d}0TfGGZ#<3Ú4 Η5Lt؄SYtM:4pp V#",&&G`*=NofzЇ5Uf슼Z(RJ^Z}VŦDl5w$Ę+Hy 4Qf iШ`jF J-XBE(f$\-i\߄SG&ȟ421!)gce#6!lkt!R 'qlHY&#:$Lti_`w~?jeolP&G GTV,}l9%̶Ѱ):D(!-f;y泞M6E7ѣ i>Z<ڔ=0rq.^_|?[ҧ?MpԧK{\bg+GtbMw7nx*&gvnXI3b 9ziLQq9N'wc {[fc^,|O>ҷR]bEAOV}9S| 7D1j@2V @DaT%N#(a .ގSC h83d,BZ"VB?q~1j._*T_XlZa^ux??/%`ܟ{_,9 Ї>OO7\y|[n8?kO{|+-o_Ylmmu__[Hy;:O|ߤֻ1MXlh@[ SBb!X#E׉TmHRh~҆`F#BM`ӌ9bE]+3Pa֫F*WiKt΋TjHd(1-#M ϯrA#XCȴk%Ց<*f]WSCpn0'^Ҕ5]xxO! `2a1ty IDAT5Fp;&Y hz$@ -,)A- E\8+XLtmm Trf"!kCa5CD1Z@'MP>xzO~go8pjd>>>ª?*kT6)NI)>&/H_8,.C6X7'ҝNQ}Í7B3*;n=GVO~ғkywpӍ7RJ[G Ox<_𴧡f\y|+n6=ʗ|s:|/y Ǐ~6)%R\{u\wuǑZ 9//BDhoqprK.(?Mol勿`k(J=P X!mR{$4Z+CEuYcPi22tǫ'zl@O'B}Բ~ԉ,!~Ǻ?`vyMDĨR֧_~-u~x5?~w?;fWZLGmUs!2^}<%A CB:ζe62K9&G24FBMoc\?Eϗ>yW\|/|e:t#y~m6{Νe/_EvvvZoxS~4= ތi~3pjQK&8i jBZߪhX'4jj> UsH4L Oږo!dM5Du\TH\1c={ۄEK5R30d.jԱPVgYIe; !9aȥPCR4"2B脢-O$F*2?9Տhd5Q28qLWHu֞TI2.qa!80!vϩq:bF/ 'mO8Gn@1-C`Z`_\*dv鋝fGD\*xC:hŐ Stm6J씀B(tI] iVi6#!FZ*6mFN*ŌG,h"!aGhpdanbQ+Ĺ5jXm_:U:S (0uGxs 4=T jӒd$HH^xHpN=Tޥ^|l@|eYjX?Je*;A#8 !sk*y 2+`DԊ-MV PQ6]#2&hXM1P4H0a,1|ֲ5$k# Ց bюl[n.BǒDI>֮ޅ+㟜ah3ŌYAC/Ky[2?e}LY 3?`\_#$N=|G3{[gs^W=R w^>{{ EhRC"4M IphFjΨa4FYL"ن(-%6d,bZѭ{+a R1fʌgvg!v'NŋO'xLnvԡRc_{xZbhz*GGl;dֈCFE)781w/7V crQE"o(Omw),E,4ӿfq6M#Hf+)D\b曍ng ӟȵfa]y8~EqBT)714]T::_m%rQۇb/4@Pw(7ZuXEI1Rs,Ļ)1Xmy[ ŝUM%8(/7MP;cn CPJ#]hcd 8wzfH+ K pb I#A3GƻtS1k2uB"8md  3,?wUX@GXf,A5i~~cǎ,hB gȩs DkGՑҒM ihjSvS [N x謐ur]G>*cO^W=FQr @2M 4$ 8?%z7ax>?D_;PoHU\)%bB%SUDw霽QY/Y ɼ /8 [ 9>_Bs)P>a~Cd[b. ~Smad+.&a\LsA5٘#MI\W2;"RCpI.H@єHhڄb &]I@1w60 !6EФtMr}l(U5BЄQtK-,a.hai2Cj#8[݉g~ ZM)4vX5<*wY^R{o:+F9֌w(š$zDݐ\/XhEݎA':QJFp 7RLIS XLӘnBw5~c9o/RݾB E;bxD" 'BBHyBD( AelwvWwWw]g9t~ɞbcW9E(} n~K|gٯ}>¹~pVbj=d4 Idl_s\sYnXDXYbNNFŇ)G@YlAW4g4$=imJ:6~'tH{7w8h"6)}nb:b&$:X]j U D/+W7i/]>h^OLS#XO;-joЛUqT[9 NGnzF$!3 sE]*)N8P5K2,VOXnز@xN$)z\ArH W%j4p &D2) nPR,kIvB@`#ihSC{#Iި;8fW~Wo!?S7+/G|7dv]{r9_?GyQԍ#g㉇8gl. ε;3NHnpfW.Ex咰a$qQcT yVv%F,9q~B9QqIřzSMvS~Z(^꜒5Q}F=jʌD6fS hC\"3ϕ"cC[29&wX,N$Ku8'D~Ĕ8xkt;|g%6%lmxW2w$eifa r4nѸTN-JjQS[&eLmO,a.>8nA0.$e=:,C䗽䊒ۙ{nxqrO]yK&|s~̵_C|GN3[ʴa8B8{`ͩktaRoxm'pY F#DV$n(QaEqiBH]=k"qtbhOo&<50}yz=H1*^#. x[> ߉Y| Wǭ܍Vգ͉Ǖ?f{Hظh/pãGj2zR8!V8WDVX/#9P)gNݯ|o"?O~/]‡ _]}*%ڐzsg?A{؛&p)p\#c_Q6eBf'ޝ)'z )NIxxB[ohy`PXF½ XEedTR(beQLJp,FE~I{!*FP_`Ow.|t)G豢`l')7,-95NY0?=Qud u5ޢA<;9Cq8$HƖ6q#_Gohlc180A 3sʚ'6Ny\X}m9?^~C|' ?asoL |r;J:FǸG(C٠L,Eༀq&G~zo $\Rt̙)HE9րm2Mn'2Ѻ0-n"3 yά½ g@c+9)T7PI>ez@q.Q@ 8%+9keA}ƥbjgi)L3u]9>#'ЄH*B6XJ3qJX=`(tkv )| i)I7J=8kuGVTKdtU ݍ$;6,q1܇1[t`2&c#Ifzg>2/-N^ WYn7$Z^X,cW _-ә#oۯ~d[|u޽ڳZ5ZXwQZ0 dNqQx'tȇN˝zL` PFD|EOJNL9|[mABD@+t )G*ҔZni 13;"t1'B6SK;B֨25,ԭ=&F2#8B3S@<>8jIxMσ?b)Gr!߯F>x嗾 Ix>EBD2{ Nc&̤BgE8 |r1!œ9Y"MʔC+ SMX?2vC]7"!e3 .2QX7ʚ`v<)IѲr\2tA41-XEdaJJG>c+ Օd.6gvnn*Tŝi{f5rktF3߽+Qg;݌oΘ&8VeB%:d IDATb?%q8vvg3kcejidZWJN$er|hKhmd IdLYBZ#;y-epz$2=]4g &]{1, TH6~$3G+W~Xx~q/c;@0{Qh3wl&Gn}W_򥭲5n'}xg l f1q Jpr^.Q)hƻF1CI5ƒ)(FHBt=Ɩnh mB^OEo>aS-y`f$ =f o3 AeEd逈|Bsś:`kt3U(6lMᶊ~a|"J+v}K;ksz'!m:>v:Y2FNcmⵊ)r!.nhCed8C[Z0)OHfa!Ւ1s ) +kz¹3q+}3 ?Nrƹ~//Q圤ʶ7܃˳~[zv:e`/Bu%P8q 1[pYY; O.ʗ’M45Ojl5V̄`aA]+r6qoJi lwJѺQs)srXs6&;%(kFMeB-&jm:O 7&TRfw.HL:c뜥 S*1<*C]8 \ˤ.< ڛjJdqduPL1$9Sv P#ߍ q*nC&we\R'P 8΄Dzй+G-:8'9*JIλוg[!jn+dpv{;ہǷW<;&E#z](N/UiIDA\Xp~-b2,M sc4,lA~zN]8 #}?e=3>*jDuZ8!"ҬRP +>ɸ2,G&,X fD ZA3Y/w_xZ7є9usI&mJƌ* Fw qcl,f % z t6[.!JnIДRz:h 'eu.23 ?/?R=/~?sl>q-VlM9;9t$`{ݘu<#0Ɔ+΅/Ǘ5zfO0 4g:ve\M.UhJ9gvHٕ ˌIlVY,pYŰʨTO)@N+{ Lfb+L2Pl˄؜vA[77nn 4hµ 8z\>'?˿[th${ב7%dqFZM2\z#BDb{tl {36&1JлMTsBɥP'8-odwzn7qNB9c2cRq߻8l2y:!wKyn|dJ0f|rxs÷+ G6/:[cqS.* dǺ$&4[[ 0r֠H8.]OiD5g'HUZ p.Q`P z21#mj=~wW)_~Rx=~OoBeJǷW\zXچ&NR4BZwx 8 Ҥ@7W ƫ}r8.Gܢh(> ǬQ28$\r'SҊ'[|W;kq!S-t<Rc ܾh[=p3۞Z8΃$<óg3랇+~sxRɇ[c멛A;IXOX$;B'%19&xa;3,dΊ@\)19 3 ʜfRv.'ekEɚe3jTg=V8+%+ &B-yv\K S-()OToЌMڲv[ ǤQaaՙLrFsԑ6uc?v;st'A%C'6#MI9e,z\9{vfVzȠJ[:ݢ LVLrKh(DNr } N'wb|و!kLYy颤a)ωҐMOV$lqઍq֡Jљ5pE福;XH J`PoQzAR"a)ug\%q2ա= 3K})\+|e?oJ-5"|_ |'[ISh39Bj[CRC1_;[9QzB JסuC`xFajg9ҏ{g q4q1r=).@8lJGr5$]{h@9t2ZY'Crty$I)`*%#<^xff&%o|q1*W?znmdd¢=n]#*x)y8F|f8{Oa%4ua4p+ot::j31̙,sjR]b-Mi"Y@5?˜zcQ^Y{fY I;Y31@'|*4[Jq>`tjpG6m;D#:Ant u]9p9'>щdX߳vGcGIMb<,F3->3̞)ivJRUMę8LڠWXR]]VN7&fh5Rޅ<%ZqJ#[SǯWqMU1qoSRcȭ-cV(gx˜#!Dl`9x21KrxGJqR V8S4r( ݑr"OSf#]3)GLR-3ޏQ,"afzkw1>*JR VTkc~xG Q1zF)*wS\+(3##I=;-5u8|:tpdWJ' cNDos]]㞾?[ܥt[dX<9mx{<2Cred!җ#QF  zΏߣ:pJ(${$F(oE#3sE#W-7cwL$->rD#FpF%n<]F4sى\.ECW޸OMbf-Hތ13Opyò٦v8[|k_8 [z]ȅ$>4Q{8$4DJz+{&ra];w!W2)ym.MhگI_@'Q޸dt&"MLjtq箊to+޶HBspFFpo䤸C]Ü2}vZN3KwI:"M)±NQ7f9s}]Y]GQ4kUKu>{%ܐ %qr(2ȅZR޴5-2Oqha1&ť貜3w !hm|D44P&#*ܜAZ%NOpNYQBϜTR\kC n ~+DB]`tաk{_6/_L{#сg|ѭ=o77書+/8NɅrOu}ors}uˢg6:-u(}=҅xud>R.-߲>䍊&'qv >m~Wzbm9-Fxpox8xH.$ZED5LP &w4O3jI`L/!v - GTMP"Eɛ>>G/m刻F, U=κDb~p8q?OW)7#v3 jVFf΍ 0&1U,4P߉ ˑeݏ^WkpR8h|l ыMq4|=RON'NV>Ǭ#x.sJCg$U:z,s;<;s:u,o Fƹ k6+On+6Pи'h-Ѫc$m,}$N[;U `6FNpI QD͈&:OאHv8<ȻD5GRTz2rutzU,9k  R^64 zNgWxStL;itvvWӁ5wtj8៻Y29FQ2t:-̶Ut!{R]A>>+bƺ9X7GGQ57PE-- g"y l Jd8DNqjFn:Ƙ qӏ #1Y}D8b=l6D@j)T {rk8H\R-;e8 @DZt:=rr"1Tha,vgRF*vt}4%Z-XoroR"N5쪺F;^p^oΣoƮE.0BCC#H- "(q4b$Bps9_6GcdGe:ލ2YWh쎉v>V., P9ћ&Iѓ2QI $Qi^")QO4HJhaJ 6rɔ{g7q2`4J8op{ĹH30Q{aG ggZܟBuNg] пIΌ؁ES=獜9 JޔoͩMς-ɒX[pD i\*K_ (t!djuz:be XulTYbt~!`=AgɼFJja~pJ}?H#7#9gr&&4pnmsYɈ)m^Yo-0o[ 5mf~KU#2{XW56y[ggCU:o'ѳ&co9un  uRgmJu4[cdgL7RK1@%(箨HA{86G}u>FSKcGa Jito%,btHSDɥbXjD8G | ;?~GIW~|Qԟ7>ӊ㻤5Nt k,B oy& =!.8N Z[huO׎*wCHb@Hs4ְb0s]B3P-Dƈ@i' sdGf[V,Ŧ㽣d4V.$IPRh1>s;v\a]wSN?׾%Z7#WC&>OcsꩦOilu8fsXmA%rPS5&߃41vOPIW[dEi4.n ӆ )GӁcM;D{҈!п$R0[F1wŢFҷuG"'}ӈjRo>)iP!aE.4@$KAn*99cY=6ʽ'+[ |hhYH58?nFaz=¡ 1sKUUp_\]&O1qoq35 sUE$GQ*d60 73S`8EDӮmUVfT+[Mh 뮈Hkbl!-,k%/+k{!K7&7Hn8Uq?фpJ7!0̽&?Yx0 FA΃2«9!Ui]AXCV4GBc B@`߇F{L̟繺qzDR N'Q'ad?$qRugA?jf=*BMNWgߏ$E szJ ZGrb;g;"bkJN)x&< @}7 |"畜Y%XGnJ.bƊLN䗜9,oL=1aimfu^ز64I-GQ=JMFCٔ m `'~PBNkzlx7ZڌرұX5xN};ѕdMd)&>rrn_»aJ-_z?}qڝ׸uLb>o3ڎ'ۣ@5;a:?Z9<5pW tx] aP,#a7$N` !uDM(%vI0 |ὠr Ao=FU);~?s׿?LkQ|7:3wr5qRo.ֶ,1\{sgUWm#E!ۄ[ / X H$+$^x@A d:Dip޺֜s \VꞺsYkR鑕Q jqrLq0e.a pʍhv#Y`滤|~\,4n:*6bqM("'Lk!%Ij քab=,4"R{嚜g4&<ʃ17T(S«%W/} & =ڸ1s@|L _Q?o(̀q PW)8wDD|EGv}C[ ucό G|qKf{?҆I9 ϶EҰw_3w=]`?u $P1,^kP723h÷_*`,JՑ&sQ0k4iDJl&3uI飄&=#5vEC9o+ zcbtL1[4qW85i9H h$upd*QL*ͭ9b-YG]b]ʶpr rln38B1I;@do;RJ 7/R(B(dUF0 3s3l af.iˡVRhNl" }g9G(.Y3*e9 #dx҂BmV#crZPxWivꄢ˴~ē)t1JJs:,t",h~iWGC/x<?v8ڀkEzA& 6_|rlؤq<4lqNaGz53xM,9}H0GS"#Uj6zŞae`d$w>{,CG JZӌy4!h479Y_j\~dzt7a/Ʃ,TZu #(ΡLTu$02=H (:zD}|B|ĺV5RCĢ3EKz[05bݮ"Lnw7AoS>ӽo?~ SjPoF7yr}u7^Ui~7~X1ԄsTH 0ZaGdp-KA" a>c)%.lHPd6U|$MԱf058Zh(L9 ΧvK9G}59SVNT M412"V^Ql!#1;˨0aH}fqٱQVZ94Ke :: phB{"d_?= =~exZvC7gaerDV]8*P<l=`yAsڱ1ot3rJJFV"6ј^QqgRa}0TZgn3Wd*F4'N|}N˨GYTQ'?6' GhAj#ާn,Nq/@:.Cd HґcߥQY ks2/V5_XY/6s@AJ{bjdԾ$ћvݻwߕ+<\cj|˫+C4MVb߬}]yݿwjE`kѺ- E&Z4eSHWzڏD;iSEKu:M0m,RT1p;EyGJ ,}Jd65$"I4{vA+Y ,T*b|<2S"S..a_|I8Io݇,#|14fS{PQZu,>p]C uQW\E)9D 5JP5i$O\]Rw{Ûұ Gx~?NHEzO^lRtupY:܇Q7b u( 䀃8`BzG{Tfd0'GEMFL|-KDnˡ*xg.ߗ^z_~03'>)5w{]ܽ{{+Z+on|yqArT'b4h Jf~:bZl-EiFsL"e!13h0Gƃ'~K͐DJ)iT}p_<R@!k> :GLu$a2wN9[QFSq@dU7౲BG[a<>"݉ }6c ۯvc-oT)a Z.94'{rlJ(IލNL%a-ly-$:xtH"yۑ") `=|As8rzB̔II(r¾zD6-i2= _Gtw3ʳE &hY7w E6zz`kNA5H,`of!WU%gljD_@ ,lSplD(Mc`P\˼?+_a_kac;>DЁ@r\Bu |3 iw7nkJGs\r> kDc뭣9au(S$Ѫ!5C{{#eb3/Fƞ,A1BsA$aPNLwmlFmߍj}. d}RU, AkMxji z^ uO-ۦ6YF1 bbm,RޙRµ `^ą! :Lġ'S٤;73> ɎTHC$2 ΍Q8 c4s jc]%h] : ز߅!x(X%?Kood~mN$>lv{iKP+)S} M E3y/{q9dZ3㮴 T*L2ٮH IиD dp Bse^tv㧜MKd F G'[-N uNpmOz|hXdr`֙MұDcաpamcXkO )"9Tn,;QepeRS+;57س;ؗ0/;7'~W@ 0^ $GG~Ϋ{s)ɵɣ?JD-1񕥭gK1C1RnOq< F/Ъ^GGXȮ$PS%ىjCV f3/׋ 5o詣@.tjs鸧e@$ + YNsCEH>O&W餜0 0bx"\!_8u\ 5I%CALJt Fα0g3A06 a3NLC$ԥSARRܘ+u:.)  %yO Cb˜FƝ5Vw< 5*NJag U8H;1yxDUY }(fi>[ Q{7ܻyigfȦ`@Ze.tZW.!Z'ٞ$NB%*ȤzEaNn]hvve hwjXo)Qm{ZAH u?qX|£gO<8Jߩ66çADF;9-尬%#9"+l:>Ibc1ҽ+P,E`;4> %֤%8,{CP*(_Gs|WҿNywerSM `[g~ch#Q66N\L·v~c|#]x`&>uXI3o!no80bQn)h߯aT4TeQ(ݲ,eOHX ]GvAan[e*zgC}Fr *'аJoN nF$^(%/4MHE&a6Zۂ`21}mUq v".~bx A2w3Z*HI)]'gO8+q`g{grBntnzmXoP+RoNm\!w #;t[g^ݢlu՛cȓ?6ZWI1om~ [ !,6ZHBVGcmT WFlC %P"s*PŽq}&uUơDO6:d]U^\/w~4.#!th7}H 0zARTҩ"~F}exU+ͣ\ 'Jd1ƍ^3&pB&l"hp$,:}QL,a - &G I0戀S._ت/pYgo*xa2JӴcRC Ae@%GWG a<Cۈ ǐ"eg9Tǔ7{KAzu#m*ΔS< )%QgZ0G<=̇H Ӥ_po7?Fnn{ZY6AYfէ'0Rc:&q)"w;/=Tg \TenW+rpr~}5yY5|7H;D"-F`PҠ COc~\ŇCTBɳ5Yʬ#5Aiv5c ~S|p$"zCJZOhb!g:ifBFj++b_6 t#!dil4ziO$ |PWMBђlP"xSXZm=Ž* H HwU:9L#)Q)s"DN,)y7IqsVǰ/A, IDATWݷO42x=51xDiD7lȚGה0}P(m\/*|V_ 9yx.`i5QHXS(3IHE"%f!O:9IGF49?5PY3*c})ßxn? ț`p|ӷ>ſtgOf~h8x 4rK^$>q$L[A7~n<>4>$|JPKq:Ok( 53Ji4 oy%,&x fnID3b2:fkw9|(8R1=!Z^<^\/w:TU:=Ix|9bڇR !5 Y[-~]LV-L @(*csALJcIIGfX M}b-K$],1QOFJniP$d4ϝ [OlکLmǔDƔ ȅ/YnL}Vw3)9Q92hQ`y N䢄MQS%0 W,q(JeKbDHk+]^:}ۋ+\tpp$[w9QR&fs悥.W֣E1[H="ńBN!nwllKxN˞^+ҍwzKЪQ[^=,t Ǜr:Cg8c]dK$_M&ሉu(G2g$6'?lǭ挂5C=td`<5@%Pj^\/w6g *g덾Th5k ,0q0bf4/n9Е/%J05Ll/$ovRyPI"=UX(S<}]#h4+%s3OYaIpsq{FS뉔#U6Ŧ{7Aωطxx՝E]`#z<"1BƲHZX1zl2e3Lxy*$,"Jx?ѴƟeçKY$E|+Սgճns{p].P9͝eĒ~;^,|=JNJ,X%yϿ4| O?7oK-ld"K"p]eSE"M\RZҔQYZMMNIa9vSN^xW-mCNNWM[#ߙdm-c@ 9)>>5A-2ێ lA6'4Vwu~#ޞ(K|fh^8@ɘK8$ nJ#63.3 ;L9aW(X={f`4%^z\YP5jiGI2{euyJf).tC%[6MiQrUBJ̦/eru;do|lZ9+*л=nxiJ.ywI4~W(_eDouZL::A7T#{f9V/׋78C"2cBohNu,;^zoTpqZKz BÐZGٲ0fZȨ縹>["pRqҁ(HVs6i)xm& *E֝I.}{62m&\*iCtbaI )\\lx-jF;WF^< oxBejF EL?})Py,i44 :&BKKߟx>y{p4qWxxYؔT.9-Զ];Uc{B; jM:ɔ.f z@Scks- es%%~t:rh'+NYfg97ǎ U9͝Z;:m Cډ'@Dzؿ3jf[Nx_,* )PƝ]_O3m))2:>d\l;É ([CEIa Wj%`l 5)7T$7S'_(wQ@`H뫱X\&(z ~~B3ڇIϪ"Xq|4 ?\WS_CQKGJh=+ȕ ɓ`R ɈM6JkJ(~6 |u"/׋ 5rTOO=Lp=Zdjl7d+Ho3Ǟ9Qf D2NGARPS#܆Yb oO^IҜCg t}_2K5 &>E;Ð(s D$vrr.6ih&J*bܿC%½r|迊k7.6x3,1lF37c7p 8i!,X= M!̊mx.G^WG2 ~y鎳Bo+s Q)Lz 2ei嚾8S.tF"YBx4bqRNB]pD{ OW\^iN=ۅ'OWOհhYZ;av??G/;D7#l&>O_? O2Z.4q_ ۂWz=`Dw }{}ڶ~\SB RTN. zfa&YEAjBH-'uI#XY-".fPSxulx"kJpz4d{g 4*sCԍGޟ!;YG:v>x(OѤ|(r% "N)2j.DkTy<}'u[׌HQtsEZ|s u ֻo=2>g׋띭YHKfic|')3E,mRmu*h='ݺ; klM d҈;swD)tz XGU$P!gDiYsIoHO$㔖J&owbPJaS> ڎ o`UX)$^MI87aa,N9[d _]oIp͹u8~0.^2eA6"]4sv;skh:ZlTbl& R[C%S4QsMt6spb\Wv{gF;-.̋і XKsT}חcp7aOL&g;;U^y7o>}`՛?9<݅A8pBRNB!ƙ֝du4jqrzŢnK ðiR W*YկE2HI /hJ rLif./4_vt*|Hg޺+yHW 1Q ̈w;xJ))= |dDG[ Ri:1gGVء ø`*"ݞKCK`~zqK%@lzqF1DMQJ@hFeÏ7(hHpwƾc#jƼ&N&LRlHԍ҈b^% %9%,wa3Ms ,~6 H^ڹJVQIeg;EC' ^==?9 qCcY뫅ذ-{:֤&$fa^E~UoG@[W&Jt[))\H$m8"}}ÝqS=TH! Gv"j!x^=܇'$rT}G)f& zn)o@BR+MIrGNԩOK_2{;)QFi#=jgS436R#_aiQ jubxzdwj-XWڍq'8TYx?fޢHي׮;߆Y 8_ m ]ZrD JJ.k~4>ȽjꙴmI>3^@sq QԡȝrVR,IU- "G$|t8 >JMqoM@pHTHPlcffA:hѣ5GF{ \ 0B7q q%$UT39Fcv"ΞsIxqީRH Yt@ y9zc}ކMT"yGI5Z Lr49;k*f5R6'i'=)fmAP0@0y lk 'i7Dy4*q7L[ ݝcLL%,eRc ?2(oQT%]sOP?0܃ w~rȜjKF$ \C>cudw} ;`Ga҄jcgh9~1 , $lN`\\$$#aɌR;+9'q4Mkm+VɇF[:W߰mvno*CqܙuǚR[ 1gDQQӖO_G ^d_3;/9k (e NR-&~Wmzw|_P*c{,ă竿3w]jwj3q$=B6?pr6?Q{xJP1ttבt HW tntRJxVyEtY{,cII)jB$F1,EUh!aHZD:3ú!]a,/Mq"F ;)Sc5 zqSOMFiA4UWDŽn Rs#6C<2ڧ pda`u :n8V%zRFt5IAdqD?p53/`,Eiqjx/hF(Six6[Dٔ' /އK*jh/>_ -b"dZs<M;UȚ2|^26txOHϱnVﱾHwd݄$<0mA*KaONl*RtnmMrR'~=(?opyW /_|u~>_K5w7+Mp'R]HۈCc s'O;I^5&yad<}y}9p}t(o8ׇɼ8P`FEc.!*;lMh`'E_e_9#?;tW?~rئv ʗ&4OL5Y;,#HbC ?ж$H3̩CǾ&ZJ'pWbiFلY cU/>B [kFZ1abx, IDATū ;fu,ƣ$)0h`F྄jUj%LP#O1ZbJMzB֌v9³< zQpXfƈRRy;UϢ˼\Q T+!/x?=_TjDQB⭆^EI"z5=|PG+yåJɩ;Bdf%}$xjcRM3[k_ݟ .=wSQoHrP3:w2k;ֵnpu߯PF:!,fLh&ѥN_Ui3a/59\_M}w>o7ZJTJIbދ2g&!գ+"(|$I~G%7[Ou__y'ܝNl/&w[rw <:Q!'6D#k۷zsr@&'Ɲn;+׷gM ~~6pkTAxmx.XIݡAj];t2Vt~}}we\h#PP5Yt{Q 3݅T#7IzsNvj̨ץmSVP!x@j=Q quJxYC]q؛TQ,4dvH"2dU-D-EV\U9Hvb ;҄g$D}ɯ!Z ֱK߃Z=YiZuQ|8++a$V$JNd[+.U I5U+p8wa9>\i~VW7p${Q|=__SҘ1j"ՙP* *sf!@b)XtCeCs'}Qmu@~۵ u9KBz. fN3)U5e:%0ą!8"Q&E;5ؔ)0ܹ;oNhԉY7vq4ٯΑYQ^:׃Ͽ:эI6ߚEerś-E H?8ۻ|ׯ|쓮y [l?G_C/?N~p?'}.mm+NFfGma\g.\.x+z` \Yoʧ||AĎq:q.H|g2zhim+ zXѷ 3sW[v%JޮRׄXR%߈Vj ŔQ[8KyũieJfeQ03+@Q(^ΧÅؔmyo$RZ{/tMA{/dLrL ԷJ>H+ IK#Sk#p߇i}vV!(Cfo躩a:|5g5 C#]%$S#{]KwBrH4iI۶U~/&S:m*n0X+:~0m5L6=yG|^Qڵ<O ^ܥ<Y/|^*?5 =>q᧮7r2^*οg/zӏUԇmU97??$~$99F;I6r݉Z%nG4P9'>hldtQkGe|Օ|&1188.~ 2 f"19Qf6B@?["jQ F[ٷ}V80FMΙ59inwNQGQ <]=.ڦHޘxgLY?jOYL 3ds 2dN(VM1]N0y_PF4şV"YJD ItiZ[̋t2;V-Ykh%HT9Ny|zn2&CtPD*o@aw݊0ծ}k߮$S jU7 S^k"K)u)Y+ۣX`'Z* vVgBjh{N?=_jdy_J '3pR XӇ%[,w/(dtkЖD wwn\0uE'̨F#@ڒi)NLcƁڭ&"RC)$$2MzE}d5k՚azY<~G>y̧^q0]Pb/G`(_? ,Wo;GT?|66;lOB|!J૿_ 2cA'8Z~u{NYҐAφ Uʻ[8>ƅ|vW`@r2dFbQcbZEOB60uNqjSGκ $rhЪ`̢¶Yk:̬adOx /HȆ2P.DQl^PewuFzf0'4퀒1锆zhD޵гړ:gd :@@"'aгڥaD5@2GD5U:i&2:\֚JS!֊3GU@oV>U$gE iaP>Lrrg#}oTS U_}j7HQ`TTJWW<5l֪/i_t7,f6+Q[2Q|=__T!s6u"KU^ E$ ୎<6&4yGhJ=g `=rqG6 n$RS̒fޫ1&QImJQpnݓ0Ό6ѪN!5:bvΛDe''u}}o>>onGnw[^H$rU>]?_G' X _ z8#]ꑏߎ|o=&o~i\opuSO$/ZYž\]QoI J⁩W21 ҕv J(x ~}r}4o'\FMw%gInfN.H=-hh7-Y8|KiCYup>+a))m<4"f=ZK[!FFy5eRLƈ5TAK#vPV백-9++p6UD@ᴩ*X8k(rfwPM K6 &j&}*a> `EZYTQv]o+?[@W|y\+k%4Ұhy$ͭj1} B ԎoMFo6&:W*U Hq$'(iNC-Z1>g 5wh/|"K1:ɸ6TlٷJNlDMW,\~U^7QUfTBp!ȫyضZԄg+(6;%Sa-~9VΔ:ej8Ʃc`(=9vU0 'm’q^gW^E͒sFf*+V-tj2Á {d wkrk>/~\PS7~곃?pl?\X.\ _o5F3} lq#`s21ˡ *: ,isBG_/:>BԇS*᷺5t V]R]KVo!PSvO5JIgJZǶ^N#F RC*ޫ1HSb[+!4I:֒B|9^RL11?SB$hzO러QBBRDл -_ Oiիm(_OX)kXuE.2rBet~O_UT~Ca/&U9 JYo%BЊM.Ss!HAж@k2kSuOBCMmaCHeIKIYF!k8iDv욓 S9Z"N,=zgͽ9 P29`V)*ٌ֫P("NtԐ<@#zCK%Ģ vˀ;)y}I[t%≉-xɫOy#^t&'}lTL3WV2Qw68ufw|:?SY~[D m.xoKʋ'*B.i𛾴7Lw{3x5+փ>0ݩSQv.;# gI8%Jٍ>ZfXgc )~H`*"VXY Jm=ώv"&8*t@ɰ^QpӉ_ ( EǤ3/JX ܋3 ኡchEg &0|;kh"1V&ZY/ ʜœBh%M^1iaj3,"zdrD8LFת(&pܴ[#F!Y=+UqS4 =kXC> x LA"bE&.Ox=lv.%ߧR,.~I^Oo\YCс^\=, "f*3#>J~rԐ3l gKλ?xe#S_rj{׿{w 8ї׍s 689^[y}A>>cF^;Ij,1}ꋲZ9Q}D#`p\F'JI.7jcs"ORd̒vvv4"mpUUj* }VQ\V1VJj<+}Yk ;URĘc`= VeV8Z}0+i䙅[Jy)5Yl-(\ @T^4!JeYOm .s.Q@DQ^&[(&RPHO,aϲXTZjG# 3-WRXnu,nQeH"|z<y((^h<UHI[ꐲ:Ŕ2,+C^e*JsF.ը-JᳫzFHiZ &(\$_DSJx22Xt5|$,VL[0QTNO MRtaIL=$lL4FVӦB3104ՉμtN uBBZ^呄 =pU嘅O|kymV]Ζ,mp~?7W?~^AW;Ën ?Nn?4wy=tx / _"D~滯wxf)Lg;wK~ۘ$'ϊμ~{!t8>)DGdObs;\E=Qm5RUϐ6c¶ ¬POI# |O :#ØZdד&)FUc\+;,^ÓyDV '8$%49ZMyR օs,QIלR 1kH6 ACb@z=3PyzpZ͊x'֪(`_[LL^哃[qOjBљBDkDSe.IlExuQE ˑ!b̶ֹa}ga+ Y5̕y;PA"+Tu|dQ/WuidǪJ<U^>#o 8Jpz/4dvcZY*Ul*CMWe!&jwW"XˁLAwEwPnKXSLQ7f@}AO4-vؤXjI 1çVJA81cJ-oB lNZ-s2Sk#3g "6[T-S )e'y;GG;?Wŏɶ![ / ^r&̏~Ͽ|?OSоx;./ezrW% mpASU6دAajaD3tÍc\h #lӄF a`̱<vQ-V@fJSfELYVN]/l`ZfgHTQ<#MY \&5q fܔ`8p7o1("Yf\;)bRjCjuTQJeTQbaZVD;qJſ*dL$Էe},& Y}P;VhV"'8]3}kñ FDcְȍmS12L gF5_S#zXRf 딉z-2*Lu-u?8i6bտzP#A&k6d"2ilQ8SE!Q48*dO 4bD\LD ^WU :EX~V ǣȔO%XI=wMS@^^jӅxGωOo_/>'?@n@7;yugoz_ q3h31UGٔPm:a^e2T\ܤ[׵=JhY?gi[ea-i#fÇpZ~KET"QGir[87/zMcʼnUo5[z%" [%!4us|:̈́ ] H__ ɕ{jk"zyu&M4=ٽo&~~oWe;`K^KV ~Eݳ*$}) k7pnΜʦ s\;є>˳9NOq|#U:'qnF;8J=xc:;SS(1fy~BjDQQmY4̌įmNF#pmd8MlcRw!FIx z`h/5g"mwOMc0M|ΪHaΪ/2.mLAvhLddyZ"!a\KaVq!cdR)VP;3TI IDATHڲ̾fé*$+ 5%]PEI5T 8Okb82W6gpÖhs(&+<ZW(εRaT[U< {MypR Y`>iƕ!V=-)O7{2;9[Csͬ&'NŴŃp\GBm&!ɘu1&+ %d7EkOm.^uSr&qIlHGᘊUs7 :'|zp=W]peՉ}g^Fd e(bN|u̬Ȭ#oW~|q~ǧ0~oO1~xH~+*핊o"̼㓀Ǿ'8p\g3Ճʇg8իY`M8ia,''lghzlu&!1f^IcS8 Է#^Z9265کbpJ9:Y+G)Q%j'jlk NjNQKyfjq= TSuB< dq/SEFR&T"Yʁiِ2Jy#ERԪ0OX\876T๹J@fvi%Jшi@-b(k׮PNtG>rڲoܗZ#ZWG̭[ҪuK!JuNgR"'׿Wj@0'地>PJ>_B0YP,y:EWS4jM@ r'-dŽ)j#2 Zh$'DMhLh n'8b`n) ZъY!޵z,I.%NOAc') :[Np"s5`:06 HgxJ/cFbkW[f\J*EP^D75߾qwW~.x iơ3ǩ#VP`NxX_3Ua^}W1>;^A5b=0DG)a͸/Γ1q˖ 棡|17L Nˌ(.K2kkX5D9Pi؜:kA+ڼڡ5^!W(H z*%/zg| 3Wh9jpZ[̙!ce5u:(T֛~qbNhpƖZѸT<Fo<g8iI:aJcuגyгlƐJDjX_RF'ͶO!R%)jA X4C(Ӭֳ2iRnmYJZftSs]i"E&Y>Y;R1$bb53 Yj~XU։m^? KJHoGދXoo~&GEeCsT4֪z/8ԄrT:)lm\"]F_)#uIvn ̵h3Cht}$W~jN]T A&>?F}ű H-:qWUI@c6@Dp|}S*zok7 yBIhq-컩"y&w&Y2t,!@S&Y%sVWDѭ +!:J֌<2˯#yfȅVʂ_@Jع#vP2OUOZ<DC0as0pv?|Pq$+ @gu#..,Jp%UVvGo@oLِ(Å pvX/Y\M^߃OXy ^VSÝ0R:,9];ft ޾\cfN>Mϸ L\f1hlMi&)\Ge˘LύU( NbqG'Om9V/T'x/Mj[SX7MsYx2MPŒ1kj(BˉZg GJGe븯XxEd0/gA[ƪ(ARz/VꕀZTjh.V)UPD:FRъs#K5xy*bs-t-֖VO)7(u>;gaOE ™KS 0:!.4X./Ԣ=D$M<닯E*$|,X;L̺nQi7YBvBjǯy&m12o!G)^rW#~8!c1NKY2F0J-S,&oճUjUOR S]ج9* 6pWřٚrN̫'q̄8yqv^jAF֘ u|sm ]WG1f+ue3.\/?̦8N;1lɵǟ >\D^ٳPje*1) el 5بq\T'G&3:sD;Az%QN$;EZtdITu{)AΕéIF8GkߓXdE_CH a<(sZnm%$Z[U}|LO!Coܑկ&Y*\y2Od%=*]<#QJ_uu)Pal,YjZLp\W TWj ZJN"VBhe$f1V T@uxеr0óD']Ox{EkV\6ō0Tz^ i:}L+VD4k*9E+vDqDCI߻i%edMfs90 :r$yu[T`̑ fs~T],3lp<&{RmxVOQ 5<XO -D``"ܡjM齈*Цe Aq?q`i=;zQJ{w*.9&L:0s8jݶmrNL''.c#sC7'-y~4ƞ}27`OwX;Xs8'kh\4?D5aOƒel@"^vfJ991Ku ŵ Fm5QޢGև#{%;5aC6ZyIJyvnf q˘ DYI#K*6ʡUk5L,Uti| Q9sFƪ`tVK$͑ nm 3έ:%zDdU@{}jC*@gE?jY5y!˲ԔQJ]\'"eg^aT?u2.ƊPHWMEhڂ[WG5Yżz@W@v,~-8,79|=__`I@rjFgE)aunP2H<C*,Ht݋aé~TUɸJpzP@O >a zbV*94A[grV> NYK1N2;qLRjVt&fR7zdeNSujF4Ś]T}/Mt[>!mִ&L˅ V&k`oqGt~6zw OFKwoD$+ I`LON >28d޻m~V<;LN39 (hjEPA<޻ZE[åh-GlZr hk- ɑd}wZu?L;$&^ӽ1K \ e|L2M,HɦrB0̲² Xv)8ѭQqtnm`ɩX&d N0[ BGmKi=*xtRwn]sbūGQTEB>]$DXtȭ1{ь84ȵ3p[vbtbݱҚwUQ[cc;FfbӃތTjj 9{| nXDIw28 7#[E=.InNc ^ܭ4ְna-f#ޕO"W9}#)Ig'Rv, 乐#a9vqi.aS][gUvm*-I/v>1ENr$6NG2Ued>17˜5JTXz0l)2cѐ^asDCK8 XJם ќ0./ڃYMЬet[JuÀab^j#zT*nVl݅q)G.M1n$}Oo(GDk EѻbQ(XM S;a6 4]g3 5ZLN,6s,BJVh5 ~=i3nϋZh1!EK4D oJj$TB>r$ ;V3$ε֌*- @vrّMuACW9"OZic\݋BSlYt4|Bfw'N̈́ ;?fTH@v EY׃Ģo<&Sh(UP=ŋm_Y.c@F'E" n rlsJC>Cx$KmRV#קyV),a I/[%z˄6GZh_m 4+%O]='T=;:KhVYA3ldth<Ê2`kP|HЌє pHH) f)2,K2uWڝ-: (csAKZRLPhHbAbhjxSλnO^T2N͘1DmM-hPF[[% O#J1:iwEj81ᩃ˯-5jzB׭5VE+lP a„uj",d gւFJNFJ.%sk줬V囮DS'Z:#3.9|FeKbF̕9,JcL3 z)z+*12Y EF~K̢ScpV 37"u^A"_ xkKBdX9?V*A;z'˦ (&iI33јӴA_"1;ѪvxIQ(ĢIGyx5V#^dNGO\jhm-#J{tJ"҃]Jyea@qx7޳FRBHxhj,;kʝw#&{ޭ-(z*8v\NW<|taxUQV;g&L8al@Njq c[-3N\ET@-5Lb<P7(<U(C2574rHL7tƸ&*MKX)i# HTbg-|u$ 3[l[7\GH -Fx\H5$*h񘈒@@rC!L_i͘gTċR~^F#|,dž05Çfτ0FZXpmy%6@i,1zVqemQJΘХ *Дh  IDATݘ;/Ěgdz˥Hct1EH]s 7`_쥨B$8eW%Q"Aeք3mVE3V;<)NH L)qIy[@4a}tMAEZw7; qwPHIHG޿+6Jލ&GRGb-.,Lq{קwG uSX,{mkR,= 2[$1=BEpFTSJÛ2 9^#TSk_bG' 9?+gb1R;Zˮ ƛQJN̺G.Tx<4Q1ݖZ[~J+ WGLОV-?ӈ9.2V2ʦpzfn`,wgso"B.d#'siM–B"#ѭ^v簊]y (^qچ"%τAR@QO@s#-)a.'LâFL:2W\ZmxE蚈j7xWZP(C=\C--hUh1Xd q#rcыR5G4^i,"XlL 0d@RNaW*Z+[V[WbĬ,c,c/d#QeYe)uoE ACb& O0$%F !acF(p<;m.YxäScgoJq -f6@A,$e@ˈMĨ/N >E{E²/{ތJ/3D=;C=1R(hۚaZlXQW,92bb++,Xhfj罻9:jr/}aomL(N4:Pi! WH'*CѺ!j'bjףxDJO#_'raP^݋6ug$+CBHle@.j5 'o~ޡn~}dmѕ# ڌ^)])M{ =PQAdRK]:o!|W|]2k )|'lZ&LyfM]h۲} ҂@nDq-a ޥ Ki.MT[,t<:#y슅Fz #NjN@f#Y2%7xȵ97b b5H>+aOǫ"AK7Viv 0PO@0jڏ+:;ySRes 9`7'IkZL-JNJx ?¬.$) V"L3F)m,jy<Z)YnX];E7P; )3F6'"[Y'mwSǙbET.Hʸ@ =Z xZ F>WCf0RuP\ z GDH¦$VA4KWoA[Oމи'9@졘z#4PP.![Utw{bw,# "rvIWnIViK'GUbUH#@%ACGr" *RJ/ĤS0,W̆2!>5&츨ɶ hKL Ê[]{%1i CʸvTmX[`4XhVz6@I 4u h&}!pOV ^HepլDih m%ٷl„5C6nJ%u!pus1'[@f4-pL SpHBG*Ruk5A*xkf %S h^R $ƦK,:$dq δyXKeQ3c dF`9-.}ܣ4)=S&=@e5tW& KK Ln/&  H95=xE4aEc`u8ܐ6fEaJa(!6+1J*Ţ/C77\MZ0o4[$BCȺ5꠸VrCAbhRRk<\3]CJS8'@ E$RkFkBeey$84@1%HaXc$NrźFʚ[]4Vkk2o>3 *R7$NȏuCYe(LTXHs zO~x)kk{ Kw³U=pinch+!S B'CblVcI51V >njN 6ۺ+ j`UؤwtoG 6Dxokuǃ+CFQM*^"#kwZ&츨1[ĶY k@tI,#.ITik̓̈ӪZƛq2m baζ$ĝ^+oFmn1z˽+[HBif:PE$,IZ tHJ~k,81*Zu؈Jı{={:]&PBiF &쬨al$Á B+$=LJn7hI(-R1Re!8(դHhV_Dm#sGNH|3HrUe< Qb!bjI3#vx4ZkHL#x͑lXvLz ptb"Pԅb76wQSF$ftnr&' -LfPQa5 Ȓ)Ӱa0eH1-!G+#!vU葻aKMl3\P9ul!M}22`؂|nхDDRr>"6]QR50I iFDsESպi8+-TEk,j&JcKp6Ň8AjPK#=I:AEh]A2Ep Z!ݤO#y mY[P-GfdM&(ˋDkr|"# ځ)M5tHah#!h,]#L!hnNnLب$NxnLQ9yV<xtC#"u .e*)A )UGu#x<$q♪L͖X.ɩZ9$ >a3Wb 6aŽ;5)YJu+oءpmuXywJjkX ~CR|r}k3ėGc3Hd]¡ت3-SF+ERaj2M!/BRݰMR(ZˬUTr3uՂnHl(A ¸ڳbtTѷ?PkONa.=)B,jwqsiqϚJ]~^ ETihwt<{L4y˒$$.uۃϪtyh>RǩÑ7X@N~OxHsym>Pk}ּ'3G7UDR(YD1 A:>kNȮrA<nA\EV Z5tuX7+mMi:kZ*#u7_g@PmƵJ)&E"9zWOBu"抎ZNQ 5}„ '.jfU0n9SK; 4óI-&Ƹ\v@oHI*@K,}lЊۧnjyHP, !0I-.%9_ 4 c Rs2pInC ia2 0J:|!CَEY.&|Z-2^0TsFH3%šk{l:Ԙ x&5E|m4)+$TyRkaԘ"c. tW)g=ieN MJغI5Vgnܻ-lT"\SVŽ#}/>CTz#Kg*=ɤ?Xw _AIϗ΢̞x[㤏c xtLj||%;4Lj9VPqXC#S(WPra0GQ|5S4[tuqGAbd'3mFqZTKbj8 sfTl„5̢#M@3NvŎ5\ x6a!9m ϋPDJ4V"dž! CJh3 zB1%PC:ϳ覌3wd%i4EƐ芷 c-u.^<(5vSݧm'CB*75BSvI L'Ɍd ictpLq ң@ҢYoҊojD!hZ\4<dMZp3ZH#zq!χpT]0jJ-1. 1QGԨ M=<'Zx Ne)LfX˲7Seɬq#eZ ImJ%~E1Ԙ"ТŀTHRδlSFeLq &X/YF=HH",9JU*-+cLJf.Kwŝ^%d<-lP4n!KhX/pý,֩.zĈt)۷Rџճe} VzQf|b1o0S?x NJܠ17k1Y¥sj]DG%+,I*/NJݳI=NkAWÞPeFJңIzsZ/i„55/z tB0Ud °Fr[$:-8sVQ {Ƌ \Jt\q"J]"/$UV=ZB$Vb֯BkKCU.}<bD5vfcHl-~*=Us'kaNT5%s4g\I#0hWYR2r{NC@H{K򀙄4wBcIa|YxekPT1J׫VLfuD[DXA(TH0bwm}eQһwb1*%A:i Q8*Y#tźR% u`cD=d݈.BEQLB=1Zx)c>Z1qY޵x[9׵h<{CCZh7 2X NՁXR#>]ȨUg#U%kcC^l܃54m zwC=JոlUt9YnS7U֚<_W 8ǮQ`߮II{wWAS |rb<.xձkr _^4Ztb#j>Uggu٣m8{k\.f8t!w/".G8n9W-o;{'^${^wy}ϟw^666L_ IDATcO)?Gx韰w^666iu0Gy<;?a޽lnni]~y0L'.iagPJ׳wR0n9x7㢋.:/'?~RJӝÛd(_7"[IÙgr<YjwO|O˯x9g}6ry?x ~hn \ϡ7 .xu>\^U_;?s^Ύϩk_|c'{<t|7}#gu ?ELUy˛3L'k_7~7r`~^8p/)dR_ Ev l6{d^IqWzG("ȏ ~w|>?3b9qx0 yUW+ox[[X>\:|#r?莋@X RQj/2 `6Cw9¼_s'W[_WWpu̫q]mk}wpq/\~xa[<_~(T^ؽk/<^j?{g";ҢKٳgq9+P;0 '}CZψ!KgWH'T[̆K9g^,K.8{U&9~ gi}p!ȃ(hwb?1g??syHJvobۿE0!~VUnk_OOu#wLQ.~5[yk_|{Uwݳ{>|=RQG[;sf.:^cxwgAfR q<{Ob&w7GpW:f<ʧg>sg|^vTAj^NVb~wW_t7 cgt9+NǑo䦛oBE9s< Oر>NjP67wq#v.zœ fkkkG'Z QM}o-gG?č1u==㽤EꪫK.^e_"Xn_UyE܈&V>P)_2QAv?rusuu??O7~7k׮GSRBTOx|w ~{x>oW>)ysџ78A{lG8 f{{IOz/~s%Xqxas9s.~~?"=w+|#?#޽AWGS<ѩiUJa\rsFڙgRJo:2{u|7o?ww\||w|;FD;y6~7~;͟1EZ++I)H>'IQK6Gwz<|NKHf..{4.B9xAv9}~#O V|?r=:GXpA677svVߧ4օIw_eL8{vj.Wj{dx~z~z }?ٽ{3v_p8r 93vx:س{xR>x$ibcc~yWzq'r/k?ĝwwrɟ{b|>_u'lC|?>p]|!W=ivmk_-_|Ջ^w9|Cmo{+TɡÇ9|x 3~y+FnVz _ +9sM7{_=r+FjZtbI3\tE, 9~;ꅕW."M~בROx_OqTwu?/} ۼG?c[y3ɿw?-s\~\}5?l>y_'^D6sj<ރ5/k.v޽ӑsbW\sQUZc6Qkej*G~&`7ǔkP-g}ϑ]j;*B>nv0d67wqƾ}llloq=;&~<眳>dzgccd{k{sc|@*^NOB֎;*yM+_g rqgK89;X.Jlw:{x;?^dzɾ{0xTa3k%_%lllr>Os糵]wݵs/ ݏR &jmkI9??w}w$?S~K/؈_囿O ~ o2/~1gq͌}9g݃msϹJBo$)h`(!6mSNcnw`#8cblMCeNBU:ec0B~`d$.}Zs}JHW R{gko~߸|_LDؿV]G VNn<{&{s7&<6&i}oy w0FI3f3=7};ǑԮlac{ o?0O{;t 8ǟ.rnL4wuzg3\m?:ܝ/ݒ>w3_Қ_qEe>#w/z+/xa}k=ɕOxE3c<]v;Oۉ~E̹kxӯ<3˷W?~13GHSysB&LnDw/nM}25Sl~{fZ_߬Ӿ'ԟ{[sju?H)7|l&Ks ?TԳ߹k^q-#&|F"sϡ&;!٣-Nԟs D<15QiSْ//X,ػw/YQ^1n7-}ݙd /kloR+Ɓr,4E>{c)l_J=EjuGxLa&)83@G}B1 ?駟ggQsN[Yzݻw{}kW\񨷷9/xo}~Ïwއ@ʞ={طb]1͸g^FX,C>֞={`fg}̏O.?'556~~kDžbm4ܿf\\yVV{X__gphyؒw֩ {ec83:ȁaX0_~95&63pl2-YT=0mW^y%wy& @^ 6S*X \pEU}{?#^xo5_\vvۭxW>w_sg>;Xݱ'=I|Ͼ؏LE|czVDO4o}RkY;fPᢋgoS>o??[orjg&D| Db AN۵ٷN0S?]sSveF֒~/? /Nfo?3;2J?36.{Gsoo_ҿ䵯~4Yk^*kN^0T(5}Փ뺮6׭.^_=6'vx_bo|ӛN@Y㮻bee3VpyU^TcfM~&`|8#4jːSuY|~,YuU䪫:p/uw=wfMe߾}SSkeccc<~Z;}+ 7Ylp;񇐩YnG lllp9r-r9/݂rE6>z\ף_{i؋[|<_}Oɧ>.~yorgoag`f\ 5 C}ټ?@\wut3wsUWm~]<~Ї>__&Q͑$rBU^Weut,/̶p˗x}/򗿌76hafq~R |>gG."?b`ccK_w~BvGI'oy[dLjd䤟]hk!GSsw5梋.仾eZ|'VNfvn>d>sNvy&P>Ҥ~C?iYNduR.diOy2.K_b_g?F=ZjSdw?g*@_b9܌Xޯ5vy&"\coq{v{?vr2,yv?'}9tozӛ6k;7|'ԧ IDATaf\t<=D׽._73.~O$9oxP92ѤNʣdj~DEsekұsfYh-;Mfz˵/p}n.CaҠ&&R ԧWAs9gh />Zآ2. vXY*}Mdƽ9<e?ݯ\~9Ull̙zf++pܲs)5Og3 Vآ+_J2}Adli|sNv4,:b#&fp%6yw޹G48NThC{Huc}ι9Aڋ'9U@{Jp~̟>sqkCuvJVJFo rن?99m5>3Γ$^Oб5™!L}85w.76QjN;4տ5`uu4^:2`ejg}6{~,̓E|Ύ;N~k8n),q恰X̩~Sd[v2dcI>.K~mŕk35~Οn֦?<4ZBPkUz~& 7sΜ A0֔$|G0[`9]vm#qbf<99k `GS=oeϭ8t ;v}Ss&Cʞ9 ?}Mmѧ;vmlgr[t}ױg=_`u.,^C3vYgO=ؚYWcZ>4g߾ػw/;a;&0jHǗ| # qW=mS[ۿr+֟ %\p}rۭg7o c"39JOV9Â~}vۗyY,iO ,3]sT-}kg麵lbL} szk'łԫ j۷>fҟe33b:>ٳ| \~euq+M_Kap\q1k<}`Fv'\~Zpk({W19<%\Y5~6r]=wg٭#N> /ݟg~yT{\ȟ+Erz-sl{Px Av{DOS}yWݞ?mclNys3<{mPݶvnBR 3/Eclݶvnlǝ(nB&"RPmc~qrm- cJScQ-Ene#r`nt5t Z8q"GmĖGly}joK^^8 GX~w1 3YqBWkDSh\6HNPqcqB6eIU<ʉIa:=G<'3#hfZOoT33ݎ߷\|ɥ;jjc`EO<Pl@tY(T i$Z FVY`D舻R38!FjTP!S9 R(@b$+!#jӠ2ZhFGZ(CCt@lV _g> 1SgNDVI-%3HqgP74zZ ;2[Q"f,K_|utUR `udup:b+XـPJ88s 5f J#(^ (!UQwD-R@'!P@,6EWVl$&P^ dk 7 P 6|:ք +M i#Z6T, QKϝav.p1h3'kmi/R^ Qav!$ 1PDBmhC:<Ӭb8&fJ09Ah4qܝ>HFsYxUO/s8zj:ԟ* }Nt𑣯 NI'9:ŽN8,e1eq+䫞9ݶv6 ǽ~B^Vz:5BJYEtN:ڊҤG!dDUtQ̤2( JDEQK3LVh^ 萖GGE(F  k 3, x(xn%b:j8TFVQ6ֱ̈Z(.c-;r҈p`V5Xg3 ᶁjcYMe t C}@AG!$+D2d;NqinXhW5͌i[d q`F-#1J\vB- RV(" vx), ZjU X ZJ1PǼ)XT ::P Y@)QEJ`A"RFW(⠊N[vS =#HCP* ĕj0 f ^Nk-D(a-Q"fTɹE/14 (]qZTd*S Kw޿KQcƢVsaUc6)ݹ7*EeY'@A)E@UQq8ZQMN%f:$L>یHaP@8LڔfYtk# ỏh+4Slp?= &{,Y3:!ǵݶ# gO(qQjtTmR[@˿34(8#\ Q *@Ӂ *X( *ȇ#M34=c 1*AoR&H(DG#Po1'ba@Ѽ!pqA։XhP;4F2akRHuE:" urU:o@#F)P+"^ >"\Dӊ[CѦBhfqh"qJ-(ՍGód ϐ@" 8%7po[P,pF",Lް a\^X%bzBh%JO*8J0RKM:Cä JӇ0/ԑ"GkSӅP6 m8 Fs*TrC L"̈=E@8`n$cf:mj 7Z"F0'q`kb\hZSB%fQo}WGJTXG) JW(EP JiTT N J>!}PkmA\ uw3'&gHc 5hc| bq ( 64i>+͐QVk]cLHJNG" JcFGՎ(BӱvLh[0d@}5ֱ!!O.Xmө~5@B Ng,LF:W$ӎc]EQ5bt:0R"7f#!RˆҨCK,h:m`^jFơ94vVJc( lzWf'QʂQfJ+%jԒ!l 6~'k.n#o.t9ZQu(3QBqwh;D%#e*w0ŌF '"A@H0)F# k H@wtḌX֠:. :cAC ߠ%hR@G@DGhBtb@Msg1 05Ak!ФՌ٬c6ہ2XnB0Vh X ɂ nc2@qu0z[M(<Ai 3b424Ɛ&1&֚c :{t@+JA!4vZPYT$M*^1*ĜZ+(R8R(x$YTiA-!DQB S`p$N*$f*H#%]|A<H3FOV5 &f&XT*baEOu?l])yǣI Σ !}F4"Bu,A741Q<(Ѱh&5A}$lH] bFh`0Zdl褆fdAQh7DR$5-N"aˀڇ0F((&#j(x{\veG,yS%PLx#CH!<DZ⹠2"@5If)A,0{ ;͆Ըa ãÈZnNڦlA#6&k).PW@#hUjInzs4FDyǯx㍜GJEs>In^iRPE,iLJiќsKE h\$ː@ x  e4mwZE,_ +Z232g꓌Z D05\3GdHJ1(zD;߸k>p&ػ i85CNQ'KL,KLi pL@-î`xd/&@dO/ yK慆1 fӽ.̎,4XuPTa=O|ݻw3Rˡ*L')%*泼-X0F8cjԄJxj:N : F |NQXȾX4Zxy!dd 9A@ɒNF]̐(L(RsK,Xg?Y;??q 6" ސ4"Mcy!X!eFX8EC a mPC0 1*ʺT,s72"4kX4zGDA0/SP2,R-Q7j-ǦArd^S?S wy<3:!ht2ki-sG%x3QB0]h&d0<&0bLh)l!F#"C6cEG}z`~ -1WF Ȱ'%& < P(6#B?vn~ R :_zBCW(Q&v`=7J #T"}CZW(Z0e 1gРb!oR tTCq[ŢЇ tCFwh5i{ BR#"yBX+ :(;'-y}̰ #|@Rn7xx/7p;wq!A(0,CS! lMQKAP}RPIͦTҎNmʴܓ"6güN$P442UC1KS2UDF" Q ]53+B,@a(,&r(VRORNяB` U)ԉ1{%Pq1z<^ KTb}ij)~.LwbJP*Flb$`5Z˰%M;Bz6A/xB :adԊ Xn̑Bbt͘I qBБp&=LO|oۏ@g@EĨ-#8x*f'6O`>Y0 =歷x^IdPTv1Dn>`Kzh;B <8e6&H)NGXR6̩}O6=v;eFdABg5HsJnK.-iR$**8~NdcJ̸{x`} ̈́jCƫV \i2PEm:I<x.XxnZ 4;fD4F790&pGer[d\t@=2#W~W曹q<ɊQ1L (=?%F Յ MY HS"23JcddҪ^}$"ۜ[!7@)#+g j@#xG"C(1f*=={[Z"ω#{ vF<ԉ7 Ϲ[{IAH1“K Hj jkC>A`r0!EiŦmvn j`5cŷL~Rl4 ٪8.ul9N6"ntaT+y3EROjʠR}d8b2Gg`ł<hÝ,D>vEN9%Ɗ%+"3q402`EsyY:y6X P就r7=oy[RynHjLY@CřPML Gy5QsQ FD*Fƀf6KfPuLHP.u:HSS]RC% nrv:SN9lHrY: 8%/o}{qD留zDRQLJ2D$lϬIh8Ӧ\LgB`(`)\/d4zj{R! 2 h6 pth0˴,Bf)Q(1dDk0"^?v 'Լ-믿Z+l IDATg}}}D20x ]'PuM,O@cҬeXLL4^(#Ý㘬nuϰj3 x#| [ cJrIw5Ni ~y OGX^ڂIO靳ݶv;@''J)<ԂH#%6mz)Ryq* LS;i%pU']6Ԕ(#^ H9J4ThH~C3tZ<-c)uaPA<}I$2QHt +7oXnwN[𶷽o' j:)F4ph@HI u*gj)ut$CpZ@=HbS&R"4SB~2 lpjdFaiH$mdV̝iNA`WL#"=1IrV hk_\n8&OV3ci2E AbSVRhj~pjR1 lfmB (m0tJM3db !DH!RrteEfhJZaBN%+-2;i|bb@<(LH _r#YJy""fWIk r6dnm=vn j"`VԤKa Eg 􀹑d7Aҍ=,'ݘQJQԏhuYtӂ6^馭pih+P-X@QeNNO؂&& <7蔲Uddn/BŬ!Rh΢xP Ⓣ@N&x >:G:d i·L%icKʃ#t3-P%CQ^RL\p|A/ŨȴXfFYTb!$ŝ4'hQуgEHDA-&)Vf8w^+-Nqdy-1n]AU1ԗMnr[DW%UӹŐ07BL)̗3\ApAMqqBF:Aq̓@ pKFȢJrzA n)5gIm|M%P,{#Qu̅ %(Mp7ٕ @x>q-792˵#01tQNR&tZ+`f9>~OРnbSpjR>SRl-L@&MR?yL+3;SPdsc2[eڭM!x-,FL)P5éc#&s\=xb,d!Jd dʘ̝&+5 MG"*iQ dm +ma f1:fрf) :{1Y 3OaG|&mZr x 43|Vgщ JI[^CS WD]˴PP0'_IX'5:ųV d^ygݶ۩05K*9Sa13yk^sH(Xu5Vq3b1$3t8,lb=yըAhȴi$`hy[CI_gd kSBPY&Ef!t*"e h38kD ,[4dx;x;qcV씑Q l`{i9<} .dBdOFHal&WR,T9S?gS?M)F Gu˺q_tYP?>$S /H eiG|iSWљ— 5:x$l5-B'*"KStVyQ АVb,QǽթCH(d4!i*-PL3*SeX0y? ޗpSkˈB0xqQt6 8pdq'F#%iU?+4 FD 9Ȉ竧N87!;I~1~Lr#Ø0ṫExbBb%McFD2qy]^v {|+udiԉew> k(NjR< x {(S --/5֩2#Γa//lPҤŌ]tSmpp)%W`@ƶϡ{,S W-HZ5Z9C Z`ѐ췱8.ëwsxʺࡏ|G^+Vl8o(ޒxNLU Z*"lF*M{<6|fgWTSRJG,߭15F_Ac0dz*]V,1'<Wz8۲$GSI|DPM~'8>a%I=;Ta2Iv$gX?La)Ldh@BBDM)"v" :6 ڰVHq>#؛ 1a**ª96|-P ؀ge˄ĞOY:TBgAޫ1)m W/{򳍞PI3C >Uhs52o*$Q&r5#k6HiG {)] 1:ld>XS\L޷1!Ahvzb2=i~%QXC(oYsйC٠V0yu6Vu* בCTaݔ}G=Sȇsd\7=V@W4iSd8QJǽeSx8'$<1;Z6lNI?pԱ/#I1SuteKϏH|:*^yaF#MZ&}IA҇"{>N[QVﰚUd=F Ԍʈz~M}8)GXPBR"N䷈̾uT4JE1nJ/!vEyIGiΏ {$ gˈy-g8m^ʹ%]پp+`mɻ(C1Jz-;bd\.A!xtfrDm磘CMePp>UY;?ڂ|/+ OKᖧ#/4mڇ4:N˗ZdS:Rр D.+#oB@ߣiEe?r#"#csy2RArCϹ F0fcG1=SLĻ~xZ]J*^bN c#-5+茎w?#²(jLT*Dm,zTmbx~ߣ+gת3 6ݒ4K{T]'.i썞%cx9/&: T=hQHd^2Avm jt.xUh,gĞI -BQkF'd@e3JHS mRFZ1=P0~P~~O͉c.Yp#ƊD*vaTh`=wPoT}xXM($ų2! C3o8s^^GDAѶik>XDWQ=}0ƄʒX~~2Tz [.t[oPx t&Oڊ>z$ T(#QT2:.+"-)aF#J<E, X##tO ],TTIlbEe?({Vktz# d,hhљ̱س QQ&fy;{[e #bBFTqT*]4 ]t}(FeW'R`^蚾G*l):Yr$kZэb=X*s VFf,1wƍFuA-%]ë7Q+* Fft]9ttHd]GPԞ_ p%7kt -,>%c4v^,EH1s2s3݌*a& 6^wlb{4ZTjo_4qkTg)b6QGoA$όq>" Io0Vq:ʌIV FD` `O>/nԓ0NgZO19mʅ=8fpFiƹrzg휃i>Wt ׃E F.㩑Tj(_iuzcWa4 2 ꁘ1GYä\$OCIÒS[yV `x WPJl${ [5$euJd2N.F]N )3nrW^;o2Mye4g\Tzg ã-,lY5 Ԟk≷pJoQodA 5O^h{XGQxFl5"pAݔ )Te)g)tϵqXl>F|JdL7 9XNd*GMQYg ; S}U)Sfv[ڕ~ _ç+.x9RP#}&]%-<) xQwX O* %%낫Q9L $5+II[2H2k%WR\%56]ue({ yc$g268IN%JNBj@~,D&ҳ>uL4rff  Wvx%AFz2SP% !>QY͠N \mx$"`z H\@i>6 ټ.`Y{jI1Ú-_wI"A/Xñ^014V ZcIƶIse4cBX02 E6>Nk5KpizzV =48M8 8Jn]2pJQ:xW`(:9G N2bnI iQ)7nqz*NY+h`ǘQfUcfx̔h724JyDwCѢI]{HPYV/Ԙ 2AxdL zD͓PeڴcaB4_J˞.vυYMYl95V7/G.i`I6W&j8Dci WOHo8pFD߯,h+k/-ZM#hьsSJ(rHeʷPH7gOއeF,:! ]V\lBu-Dѯ*A dj&{$΃Bg}K2m5'4z)j Y', T^|bET$J*y*T+n:Lc@)~Ͻ$g|Υ(PvZe附J똱uh9w z4oNDCMeNLkȊGlO|IJkH4>#OʖǥpuP;©(rM T8Ō5Vg/31'\3<H먣ȕJp6=jrUj:q':%(ݕ ="Y]2n=yKjo&T% XzOчɘ֍WLHu{ CPF_;}kZΟa2MؼOYZu 1\T-CTVRg^Q=}`C&؍qӼkZ+ 5)#&kIN4~vxRW[Ci}0&*S8}$,`u433U=}LTDX|A0oJo4h|%\υ;2X7 2',S `cD9jGt;Y XSIb`dW5o>*F$r\)J(dܫq\̯G3@AOsgR\1ɓLac#ѥsQKO Cuy 5LgE鲀,sf'+D3&-UBL[17`10@AJz)R1N2XÐ<yD`H֑[|$| DX6Ft um@4 _^׿IPQQң#SֶBHpVxmR5[{̖%E|1Ք2̍K2WE$%cP P-l03a%0)[4w+QUrFƤH.GkO &{&tD686;B Ɔ&x*)$1EX+tJBJX %4V&)>@c1VfNJ'/*FBMA]5zFDfWlТKyyw0 O,gwt/q`.49X ?SJoJDʈvWؖ>| U޳s Fj#u mrSze&OS'{{HBW-)#sr5ㅚu0=g2 UƲja)N`-)\^xE\'X&z/[|wG|e OUʪAkN\3?PٶYh`pDsq7+Ϥ4Hя:$|crؑd@" X+Ѽg#r")jK~^'y擟$Rr˼[o d("}c1`kC6g~ZyQ_,(j[/?I,.N;BvGY[5~=Kp<.O)Sj,S_# 9f{`d$2jCYG$2MYeYc/?m6|>lg̍V,&}?EТbvuhp ;ӺW 4(Pþ2rM6C{[ub{, |q.>jIeqMieL%F-+uYY].zAK*R&x9:]O>tBwXVczgҡm]1LXSueig!v NySΊ%3LՒM(RlFN bli7("ʇDEKIwL }P]00+ѬͰy0ߔƷT)hh CI:&>r*^{ 9*w \tRL\w7vkc=M{xM^{}Ǯv22aeA8Z/bY 3k5I\\e=>0ra  qјFHM0()3A拿ܺDAK aeNH$kYi4wh7OyY607:{k؊:vg]7ޡ|#Hkʍ::uQN%яC~1F-rE8ţw\3PbLh>T#)M8kʄV>q+eɨ)UdX.y(sFKz4V66s->˕orgz"+B_[ *cC)QIt/ͼx1o;l)!sЩK/!jY+*IQ쌿~Zo83%v9` U%jb.`0h'4ږ.+4Ꝙ R3F(Y e8FP`x×VJK84P?-:e3JW~.Sg*MpKoV 5]E {lwʯ^َ5 [):[/G_6O[Z6+5"#U*/Pa>eM+ Z⻃Pe=_v9Ϣx4K*2w-VWɸ9 F\up+*EHyR|(P|]7_xO4͡J9!ՙJ!ATf S+)]{^Nng+3.W8pg/RY1'A[9a=a}=o߹Ʊ/O0O@mK_v4?#VqmKLɴ(B!I:a149/0BFwN{' 䩾LAhҩUV̩ޗ k2#mOkyRq 2)tV>Rh^ |[x.1Qݹ~8g'τuo?_֕[/|O>-ZXe)ZX?5a~ BNpuX.j(]REZ/D6lr.(d;M~?= ZjNۭH\(ۙ6/1lRԆ^Nyk|#7o6oMq5eJ'̷/?yMp/AČv;wbfLO=1X4:Sǜc}PJ0c2e%;})A,ьHJvu8kD4j4ίAӫ wD|Jlf=ʵ3"rQg+{iސ{p|XՕMGW3Ͼ[-n8)_~Wξ1SW6&#aB /G꫔//gFD888TlMYV2!Ykm4f 5Ăʖ>VƩiOi d"tyC|PpGm5Mw]g];sÕ+OE"b5 1qO=Ļǯr=? %~!Co}5`Z?$?>[ީtLE2@U8JW/}_ă0uvgQIclḚCG-,=SUVjA),mEX jBT\M^XQlyꆮzjVku̓~H`j +Ǟ?剏>N

_۸EXaea]>?,sg÷zE8vTk_]w3wnG>;Hc脲h7Bҡ۠b3V`{Ѽa5i ͛:"A4ʚ"3%bCLW|,mKPX6҃?h1Jq>gOV](<<ƛs{_D!1{a.#|~O_^'}g{λNNG ^y+UƻO`GA+%ի⒟ $'{OX\TyF %`6%W0^w+`ӌV~fԨ]\_6uNJٷ~nUY.T$U'=˯c}z7ns&xS>+ /En;]ez[|p.5p/pK[1;_~S\/"kwyP;kXוʯ ˲gY`7 //SOx;|텗Sm%aW,ssnhTRE BIM;axRn/3OlxWx9K;[Tc]ѹց%p'#7߀&Wl LuPn:g)7~:3vfXpb{`Y:Hn2~ª>ldǍ/(>'y)޸0L6\^O9I=t"Ġ&`RW/L||y_wOyl^e=e5uEuCTxgA0[<陗_| 8=~W9;9CNSkƾM@ׯ_C?И?pl}[W6RWɖf*h '*"3kv0yEDsqù|[<\= §-~}5=NZwKeU<=Ż|^^SOů9^`MM~f$Ono2b㋰3d{Q!hYL̺cpם~}e_XPbDEL@ǔ)D;х*׿->T=AuQu}zmlBd՘_Yn_ݘ>n3l&~;%|*5IPմ4яL.w~|8-ܼsl{|#6g=/X|W\ơ̰qҾs߼PK7nK)MȮp4uOc(nq7H%cfHu/(&|_7+i-r5M%+%Gdwxo䍷w\9 IDAT= iCu׿9zQû6) ]MO+uN*j,YѣT,򳟀k3wnߢKId@x +}uCֆI{[l:)|4 !X&/I* ;UM$y+?O(Lb;{ :{s6V Syp/3NN9YW˯kPy{> +p\~ȕvrK+wꎷpnv&9헵Z>s8Lߗf}'׫lJz}yf7+=Zk|x8X,fdd9-[qd#6 HAb8 ܂t8hh @iNiٖے-KԒJPR 3y}ro +buPg}<޳ůʯ}ɟp?LjvwxmfFc tʶ`}O&'~n 8Y]]$-yMA77)*XPZԥ-~{_p#('{|#3s\sK%NRn*̒UDZeHǖ)F&&wYk: EC2?'M;8_=Z%anSSN=|2#S9ԼP":j<|}ȿ\8H{i>1B]X:;-h-^kmC>eMİ">^#뜿C*/*6q0{Bɸ|NgEE(z&x^et-1ijꔰt-nw\AOGNmR%/]Q-M!k6}p|ErW &aP6QT鋤 ͍/PHs7T:1\j$Vs EgVWׯ΅+#8ą;(Y8 {DfAcfi<`m}nL^VB>aΛJ!0 y*R*!%nߥ(2ꁔkՒR_s&[wp}P)`Ŏ1ŹZ"ьƬZ,TjM4ߘ3lP;|#a;,WǐNνѐ7&oBx"Y [ec}lh2d 7_gr}[-\>ekaԴ-|N m-YIeP"瑳˜^٧I*3w '֖OjAW^y~(!|__֭[exkOjTIڠdSX5jIhex8pa9 ^7cW8tD.76P;5g-[͝G+ Wk"ٛ z@9(8\p|sF=Pf3J( MiSWƌ˂M(3\—aW1CH!BaCDdnLA)V:S};7>wc=kLN'WFwsu"V~~H`},D3yFV5tzKhp]~GZj=O/t\lg[y|7_Gv1mv-K бDk_K{3OLfѴ!'lVӏCιTF:C4%c,3 =UQ`:;#^|ud{/NH%\e7Dtϲj.LԘHb0d`Ox\g-D(XqTMǏ~ llU7gbxT46<ʵ=wˆ%8~jL|oqG-9h9? T zNl$2%,6jg %Aݦ)o}TCТQJ?ol21WS^KEH2yb AiLʇDBg+&JVF r ™}g.po$X-W?`zb:(3Ў%ũ]3VGO貁n;<nr6+炲CIb#]d*->ѸSGh;ǥ?EN8s#x$*x_oXMk^oo}w ?a_aԕ%EM檗Pba#VN%(!@|^ Sd8.;}}W'T˦u6{k]Vs7Fl̼w0a۟fS߿c+x :;" pğ櫌50ٛœy`o5k=KB9DY8>7Woqhew ?O(rËj 7m֖" E>Xw41 [5Zʒղ`T4D$؍?6RPEl.?ʢn9;ɖ{SP1ߔ$S+<&sZpFIuEgaO Y5v I'{/f,ĝ[9`4I ,:O0(kh@AÉ͖"]؁,zY,(FbMI8S/r:g ũD/@۶4MCUUL&~ /0'yo^i)Ω:&P K&CK.P"esDUԾiJX?o~%Vg Q(ox E-_RUv!JXɈ =+GV#?+?ʹ_7gNC̆5~O1 hZ1[!kBUDxcb8v.ysohi+β{&M;"X`ˎӊY(ɼC)L%>msF+3k>{P$Xk&Xսs߅Y`Wjxpя#w$z0ckO1;cu ՘?|k0ɯ㱣z&WIVE:5I'LWѥ6rZѴG횇J#>^&gPtJX+J|WStSF8*Yz<{p 'd ZJDfyZ%A+ɘ]ww|ut!Q. f)`q=]bV l&'Ɩ.N4+=}u@#1SD6>E]f01\IcUGT?LI)jS/xBF 203*:FGνDϨi%6lC Xa}]c Woڍ GMXӒT%A Qq[m:d * -ĘSbl?{Pu !56稜4%~WwVfD \Ma$ᑤP*c3CV.6ܾE#)th&FEq-ɯ1vfbٱmš{3&Úۏu90wxq"k C{,,=׾?6YXXto·qT*РYPЯ6⹳=ցOY/}pE FMibGzހ[wg@n&!^{񫟽Bia=t]g5ɜS 2~W:[,R7?ljZ) 6v`4o3a{*W<{cִ4D^lT~E,qrcw­<_|'aR43xQ*18k):JYvwÉ_HFZ!ѥHsE&nPYjrkxzNc;p4/;['?I{9xtc^is^F/@gN@'XeoGtjABn k.V3G~EV2p u=e2n8wg[c"(H?x :OZR@Gc^GI"J̮+|ӢU1$bXLRT LܙYؕȳW%9[:@J$D>Z9D ByS$:R(" ,<*>>r`y&yٷfye '3^+鄃;8C-pkGM)r[p*ǙL&|ӟCGѣo_Ť&QKU(LNhhUőb!%yIfi8c<:po5XYQ=|1Z'f"XU0N'W)$Qf`oQrŵ#tӎ&;_bo]c(T?b4^ohB2'O84GNdunO (T/yb3Ȗbߙ&;dDgx#$qn|G{A-x =zin5Qɏ1{EZ7x $llŇ!O2d!k3Ns!+wi!*)BhZaЅmuc!Z,~KJPdf4uǓz'՝1fWoLq k/-3٭II :^b3Dh$udG豇s1!ˡbDɰys7`aGnaYh +w*=&5]Hב5 䟗hgwÑ>#_$Jߓ"|PL :) ,0^_?Da*z"8/Xg|gPb摣o>7nueXADya% ؔ1Yjt.vq9&_E)$PM0;IQD6b1t-mh0g-"UȁqIgG]9z/b !tf$(Gh,ཧ 8-v,-.alAVP:ag>evS~죧8kٲ6j)|J5'](ԧ>u=cmm 9 F"CO7""D9l [.%AbKGhf-a jo&6Ռg3.邧@Љg]iWk1lj!e\׹;*[1kfx Q'K1M U6Y&M~-VsPS(C=VOϽXX^|32W+ANL@ IZ17eERYʷW%h ܚR(n^- +ֱb#0y&#G-=΁Ù)]Q1W%*c9B̲%=)&Q'R$,vHz>Io񩣟gp,]guY13/3kt]GRI7ٙұ[&D _ok:, l>0/"ԧͬ ~ꯟI b%)@<(R*⋔ϒ?\k L.0͸P&MIMC180VB17,SrLLx1vgO=ȉӏ1X26(N]|/}>hNg 4H20,J^)X,ЯNQ@eˋu&j(h !ƣR_?BE+ KCHhXژQcI(1WSDTk~}B%nm6b>Nγԯ+QHHJn…x}!O]hJSеP+3SH400܊tm(dR!(zNlB%=EazӡkBbu`mix©2)@ U(s'QhcPZӆQn>L IDAT*J؞FHc<*j8 p+_|ZEb)EiOPp=F^DŹXfŠĖ$B *(K>zdJ}`g#BkW7蕜B "ݩeVJ v*&PVe<2b=5{Deyb֠UEL0Ѷ38t6oN!^nBI^$sG > l:Ϳe.T⤥&$Ea*Td?r)3=BqtuJS9 堽q4(44S6U zMj~D &$Be(DAXBዂae(>2#ΪLoמ(tQnz _9%5'O065x;\S_?+5 AZ,kؘw(:|b捹.6-Wb(O *rau3gŪ t3()&C)G{T'YXˠ(0NQxN&,iA_ӋYI2E҆|"V AYЉB4r,-h3/zOQmak6ApơG%nl29#z~Gb.i~cȯpok,!663)z{ͫ/˧JG[ڰ*DHNy|2,44kk5RT%,TMV%{W/Rm ,c,` mFd,'RI&] @ r`{.R+A+#1 ۴>/:4Kh,IR0nfqy[TobTsrTq.[M5NK)r_2V"/I547:@ : i7XvB1PVZQhMR+t1ClkV"&*S3& %"  1u  éS]aIZe(2pI:~ `LBL~/Lo! ?HFʢD,elI񡡮Ǽq~Bh#bR\",\E/If@W_1Np'‚RlrXYCg,UM)+0ʢd#+^4v'='ޗT؄0ۆ! Q(QŒ"]gwYPLeZM_}qXm[sh#4CM6ugIDD ҌFlMD ^[Op7(B1# C MLu8Rh#ᾢ b{%)ʈsoywޝ1K`Cوm,a c9%bS:TDrK I " !g?6)Ji$wN"QC7$0hsxA4(uR*}z氲@~{y> kq}n>y'y7[5`0ZCEJ-b,Jk*E^O9tD!X-G[K]tƚ@=Rzt]@bȒ`t6;QDn޸eL-NjO+.5#DAiGJ cZbrp mz~$ F"*O2#1 h0K=q|gs~ɇq񷟥bǶo* V%Z852`,f9MaiT\pt#"z)Љb)*+i:t$iix7&#W^B٬Q^\]0fQ)uT JE^ 6 ha&,a씹3|SMZ$$zPFEڀ3[[C60IaEG.baPT~`*KY9uT/o])VgȽOƳNb^#WyĒbDHI*&D•۹ɿy4q~ 9yo"L3EUt*&#$HS[7$/V?o$VaZFzDݒ&0ݽMQ^FŒBjl/v,Tm$;NJGF0&]a(cd a(EYC@ nmd]ܧDdH'ϣ- It8CU8x0Q%P\ & 6%Zm)R_-+Mǯ<Ƥ?'Q&aĠhJ\җFF`8-)Uň=j21ل8QE*m:!h thȸ3ԋ}*HN>@9TbGNiVMv#- Ep0LX/")a!Ra,,,Q 6zqyx~M]q3X퐤9TK5Qkte >/g|z`-D F,Q;jqdbXb o5^ڣϦ[|}u(I5XL%^~P3;3pk9 eiPJq.[{b3 (+a){q7%)#ƴt]&[#B"P,)rtNb&OcS;0yu\^8?Сȅ[;`H/FE9? h, I={ܪ\IǶ=KVrJm9 ʢt" ^O~lrs`5{10&煊'" 6(({%=WbKG#8D 6d$7PE3xջ8Hhy֊U~] tq ყp*x8rVYnOrn9tRw J*Nt`Hd}l%ف__FAAG$=I!LSt1cʷ?I|/ɰ-W8Ԃl]Z IchĂ 5~0.r~!DVHtk b*AH<cW_Mh`';[d]A=cM%-NY.xc-$T,H C_DA'$"*ZxY$y%M(%(te6SMH! .Mg/7|ɓ|BiyV|zp G<)tJu`1Yq8尅e00T"@iX#t{L8f6k4 =T+>WCA]Hrn7C08ke(J)U٤<8~="ӌMHRxZ'cLaT EC2EsS~ǘ~26 cTt)pp]Z\poyVާMB(qeBQEBKeo+" 'O-ƅ}X(zeqEZB?8f%BЖ.h~yt HQDh hmPE#0dq;C#E!̜,Yl̨ 1ZV?%'ʀh-Wos;©6IPH LU⡻ kbPPUX,cMcIB:I-fT8)KML |QP*Qu yd1?D[n݉GS Q#.sSniY `__&5A I%btiP!RäaM,?V٪;~_~0cRi/g^ݢuBO J"h$6[ZI:\p%E2?P.*A=!4FXRVH( FX%1R\uEpޤLUHAU02.4 zdchQ"!FQO0bx7Z)$_JO,sOv4l0>RaME[͛,tw4._qyyC1n[:x1#p@Bꈮ뭕)7,ѳp2_W,F|xHi4B@:8X# +DYh`R0T"pR7۷ ӔH9 'fJrHJ0ћsi %%7+֜fuzZ6@)ξUD+F𑽦F`)ۦ̣H|ָ̙Y:zSF7Qz Fn*DX8?iBI1GmУgJRC5d$ *̔WҖ?V7l88R8=rp2o Ya D :A 4Ӕ{&$%%D!QzTS)d>7d :DՍTq&(:5ETY2+R1XlX$FqƜY7e4wG`=%T90ebw.rPW8/4mI5\!K Nm#(W'N2և-%T uKe_\vJ^epo,Kj?  CS#* t&K8zIg=,$Fe.I, 5:I !lX lslƣ"Chܤ6D 2 --*ޕ2i&zPXa5R*8E/y}r@Ah-UU15H=ֽK3~,tsF$N2B>"tfb'JdRjrZ0G#~D,-T:^A LcސKBJbɗU)hTD"q0vDpNA4!!aɖ \]=" ل^]5~5WW7ܺuq|Meo+{]OfgܻL(_nƮ .;eX91e#ܱ %‰ہOl1yJ#83ϡp5~왖Ia^!>D=F &gO1=Ae!aoe6,L gD;f{L^h'i&L7̦;00|DheI[4'FF&Q|kh1=ؓ'ጕ+PV]s6ž9'7Z |5UP4FM;iCz#2}w1 V2>()h R2撀 vGr(#tKgtfNe@$֙D!cGH:H}A8 j'ܹ{{^]՗޹z躓9iK(w|.5uUnPVlRrve<н2Q늚nJDS}8t2ߤh &rQ`(0/V7 Z)9 ¡߾ kK%'BtKC>F5anK/l~o PELi.Ng=͇΂\JTɒtֺۂ :-l6Ym<h?=^5f 7k[@w.AZdr1CVJ;C$TȚq@J'4L*?<|:[Kncw, Nd9#4mX&9h Ҩ @"c$Eˉ7=ՙڐ|JB)x@iV,ma$o&/3O?s錔 &HJee퍫5XFu|X̼p/yĻ/8=+YP4Vw|׾ C~0Ƭ?\F{W@tjsSUP c+뺧NS֥ IDATۼ6$11VAф'I%PQ9+DZ 1 Qe 2s7"u/}eKGn%:aLc8$`]-qK}Qx=^ߜf@)Cj@cvp9ScBP܉rS]I$MT<,xPE(OOL9?< Ddo ,+o]|?sx o>4w|6_~y%S4@k 3W^-᎕oKPVHb"Is>NWu@ӹ k[U@_/=&#$YtC#Yq2*9/H*:6Sޒ\l"A"#jw>7b`CLPap˄//q|zgfa8^vu߳:PƏ}Sџ?W^[g|{f“wmFv,FN\UorEwge"Vwځ6lI0 Qw /P|Bs402 x=^hQ#W$ӈ:MDF=4UG>lcDQTNd)\ ~eʠ~$M@{ֻ \OoW}/NNu;sjt\߻aOg>ɻ?˷s|_iyS%= LSf8.e6sg<\篎bzjl3tpRHȲaig_uVhnϔ$3u l9F8Ҥ2F,rK2 -3>}56o'YpHcګЯ+o={ WW\6}g<s9uƟW,Od|K#62F3QDO\\l8=-ܻZ|66H$u6[()A rf̛ YNyGz{ɴt07)#}QxxAѱ Q6 ˛o]ÙH*(z/S~n Ia'!nh[n>>>>sfgO%gNIӀ#ж-^sX3b/v1Fv:d8zؒ*X#DTpw: = GdafD9ztTzW~rU DELIiQQ) fQKQvYۙ-Mo{%w~s ~틟%OՊtZρ[jՁ=W8?/ܺuʗo\uy ^DfpaȨ1R1R8͉,8vF)$QEFCzsx}EM@SŻC6=i;FHZ˔iLA@"d6k ^G;4:_<=-\k?W~)gn?lRq,Z&fsA3 寽2ApvrJoLH8=aBvPnPk&cH4|@eȲ"lX$MVL,ܴV0m.NF`-[Wݝy6*>OOĿ|>8'ѱ#jћzrxHO^l)Y^Gno瑫B4%̍& ډ(W(eCə7S4*<7Q⤃ݓDFoB  s!D9Ǡ3{P,SDW,JG s@ [W r<]l+[/\2WēOp9~~fZHWpԅNk+8py꺱/\e5-P~7邒Wj1rFoLXL֑*~RHք$؞;* yg8G9am`n41N@VQ/GKЈɈ)HydQDž`_Wry-e|Ku^|u/~ͷ9>~W0 F7GW W\__LJ̫*棐xA]>;j2 Fo4Q f$ j&$yuZ3CGFg'ކǟ>Sؤ ؄aUn(Z/ug3DJD)?wM[zp{>{[o33)7gpv剳 O?g'3Pe%$&\֨Ӫ q rЫu}+yXsRN@dS̚mBHéNp{s\ȽMbʾ)d&CڱBb%ue,j%NB|x]ȄͲ6z`n]йu1E"͐OfTҸLt%[bH`8K{FL8nJ J{g|JsE!ٰLP# arcʈq۱U @HDNyR(e"uwM(G+*q|*;wfb['?O ` _x=`nжFܬJ]gg3wO#X 4='3$AZoQژEaF+-.dʙ vJqߙ|sRT QՔS4Ѥ:QJΣ˘Fp!4?QBGNEH*Cna;,W^#?QНk_`ڽB7,exw.Vֵc1Sf.Rp̔NC},=QhnXKY3:u^g8}F BhF8F t"~g_CyO©g6-ɔ6uuhdvw/xwf0B+9MgG LxfiFQYʰ]*d+U - k}BR H>lGׅ$>M}PPgjN(EMR{d 8Ԡl2vNyC''?s|!XB~R<%"MΝ-:C{%t7l 7Mkfli3#pBmCX6Ó4e"Ҝ>OhX$ :ѭ &4!t1cM'/FQa  ʆ{ Yޔ61L26N8K}6w=co^S [WT8J$$:n4~<YZY4pEmd@!La  j ס a2RqTI?jX [WTzD!(5SӁ;%<GBrr#;H [êoUxwy>_+7 <ޣDZz 换YF&G tW㎿S&| Qfm4xS%njO"9&%pO(NVPZF2hUZo9E~^r>|˭'6W?YZòbHLd4Cpzb̛-te#`T ` T[NֆfB!4i AdB |BNڊtc;b^)$R#8Mg9~cp"))X * ǘ‡3o5BI Ƀ֝j+}_L`n\'WWw0F 7>")TՍkF. g=c)s%1 cm<̓ȑY|Al"BJ"}-AONRK]&q"tMDj =n%LJq 6S%ƸPO#(!F$9rXBE^৿p5L$Ⱦb- HN=Ѻ_f) )UNkG*q$eHj#3H>,6jOHQ(nrC3xG_GdS$ Y&Tzo`!(H+Ig2BD+dc㛄)2pے`@ݯ}CCFkу2o8=ͼf$FI^R0CAk25@:kU +J`b/r;L"uAe UX#N?r$$C͂D>RgꙙD M'h4RdLhdHRd2Fgj|W}\_gWꉒ3}⥰=k1گ;&]jܬ+D%4K7VRlLYݰhd2E FO4S6(ԐaUmطUi"DDJX4JϬi5nP ݇05x̘Hɖ-Q2$IԀ)2S.*mmQ lσWv 'zdunځ ˊxP|;(= b8? RZbFfiE=z'H|6%XW!%ĩE+$U)I@PHD#R(MaĈT0wTTF0%ΨG @HL`KCi8Vұj0o2ۓ|6*4J!z T6"XP U2BΠ;(p%h58&s{';DP}{! 9[u zѢF|FR@j qK$Q|t4R'aibMT[G4JN'؞0NJTd3>DGx$ u%U'ew CFe B:"1P1D}|ahGcĕJBI؜dBݩ!$F4PўIoDgF傈1Aw:J͝TnJm.+sXL{~v4RaN$-h8fhޝN55PCw?PG!`ĺ&m7d:%e+1Q"m $J!"xB0"x2F(GP)\ ShJ8"#-dV"2-Ht4Ah %Q8u'ݓwQr" z.8b(^v8,|(iT"$)Ifp@wUr~G"#zcgi ZM$bu )";) PkĈuh SaW2Gq0At,!C q,FaYJmF46HbN9 J}0.T?:ziv쬄 eȭ&%#$zg ~Y#űH21DG~D pjy N"V~ #IYD%G&t;Ұ4x}EM@vC-҆M'z!*IP-:ےlO͛ై7yhw:Vh) uH)Ia+E .E#m2: M6~q5 R,⒨i}HAb c(pI(>\inѬ BB4gSpIx.$SJh1L F`5ᬉDD4B2:)gXi*in$HB@*J (Xhi@$zP􂠢 HU H H ^vΙnI6\׫y9gΜ|tö']"Ox:r18 P p7!CSbWJC'@dԱrrQN]!%I>/$P #()K,H&  %Nqr#@+Z)C!MR !9-A:T)"! cNMDJfK$BHaIxx'DJA(pi7ȵ+4B=-!B`jedj+eJD,F&OE"$Hj_䅩1% $FUev|By)!JB,B\e|V?DJs QA90k*8PfG'[! 8GH!$%$@1*6sN \'RJ8x.ys]r@v "dSƉ].D!+EZJ<)zd*o8'4%$ <7q%bJ%(9i2*m|D(LGKԥdFS# RGD(i # SE\ A$}f ak IDATWV Rh P&D4yk2AF8B 'dATA!Q&](1ؑyp()dB%q_ E IҖ_I2N$$DqYJ$d"q畘/P!BQ:> jaZP<$E(u5BRiJ]:MBK5IF{(G2QDWD9~„\'R]H"4Z. cRdu$Jq OEFdUpVY|_kPLRO(A)u!#Q$(W\a*o F E,K R>끒&Rx#.8X,P$M@v|Pxn?[ ڔ`Jg%Иo b~ |zjn G(+Xx$.6jؑg]I%19&wBDC 9&EHB-\҄+Vz6BNv񄋌1(orHB"\HAG: 4 \r#NP[Q(WDj\ r8J.J*dɇ|.6yH\$H$]~d5qAP*F^p]i*0 S~h021xCj(:F&FQqh@FUU"B SYW#A6=҉Ayı\P(8^2N9>Sh'çLN_9ƯDD DhWkȘ|(x$J.ʍ8 9XI M;8&rb**,īc %ɵ)#$KI^DlV(|Qy'&r|C8n) NS@s4(PvPJ#t52%7$9CĮ2P #Drqv!/@8$]wn dFKfc2r&P&v40gǚP&bcR(mvoZ{g4nH3Q4:WQgN0 H+R*}vs ԑ1Š vwgX)ԍ c||"YH?Vb\bW"b K&1&Hq瘜3Y7+B QxDN@˓#7syd\EJ\p bIAF9J HtcU Rkf*7P!Rpup%yvPg¬=P"X"=$"Yi'L޵8Bt(4YέCdy/4-:mٱz^\"c\XP-bИ^l6qS[Xtnd߁a 룔"˱;ۙ9blI(¦ѿ {8>X,J.bX)Q8b5bX,$(sM 5Y6bX,@ߣ~B֚mY,b$ՃΆ4?I)f3ZBiFZ,b )/֗=RI޺J)yXQ7بRhRQ'%ȦX,1YqupY,]ORJLM6_0 !@! 0X457S_o肰#-Kuy~ǝYl1f,==WTX,F(i'^EG[+ Bu"0hL7L"^JTveX 5y ve7.]cvbY)kD)E}C#lΨ "R !KI>E8.+銏*Kb h #򹬩'UռhlAYy9Zk0P&!CƤ$5uuL~>hl3<,55Jʚ,KGj(BJ2F* ;,ٵX, JjREOV|̤\6[8 ݸ*:(G1L2:v-hgXT}}*L&MAJEMOJ;_X,ȂOMڵ5ʪ*29f7p_ JIbHO` 2Ea¤јqB0u6QIkMss3'n[dVv'|}bX>7 ߣ}qAڵ-O^a_@j3v,R*~~[K/ScX,pbmм$$"8 Fb(xip8K8:Y,b6 EϸAIIǨ3 &v<{bX,?ɤ6`*5Zkz{{bX,Xd 5=bX,vbX,+X,łI _Iy0[ v_q룫HCee%eeeheu?#G'Wj Lk[uub!H(-)s8תL6@8F(sRիW}ZB9daۗM:FJITWWo-hii!LvL]7뙮lʊAc8cjjI$gC__ }!(פ<q]= ;uuu-tttPVVFhYz R! RI.󨩩1]]]ry6. !Xjq?+))\IE># xeeeTTTl"@JI[[J)I&<Kmz{{!LR]]=H0 QQQAyӰ}j,%nf^}lhZ[a>Lr7oP\,6ExbO>d1Ӧ~"g}qơbmZ/3gl2̰Wz7|N^xE$߿z)zIvmҠiVY{KK@]}gy߿;OAsi𜳙2e }}}Nf\rDaH,c.br'}}},8L<#رc+p=Zd-r15HPZZɧg?}w60O.GA*<8&͢8=>mo~KYi)=}Zk>CynTUUqp_?߽L::n6W^y+?vN{*a-cEE]￟l6ٳO$ DD1l*" C8}$@q (-)AcwIG٭? \ t$IR1| d>q cIRDQDUyy9ݤR0xw\% âP2p 9[mw|jG4]]]yW0a[onb,:?իwz..K/E,+0 9Sxtb׹ʫ8#8iXA֚_\wݵ477ÿ/׿LfScŔ) Ғ^:ƌ HR,[/?cn7?>Dt2s,GbO?]ydYf̜q[F,ZtK.CJoo.nhhSN=DuM-~ N6:v]]PV^ACS3>D"Aǜt4nΊ+390:444$tɔo]s ݎwٕ{ !u5h'kIzzz6ڎ+VN;RUU8qėyPZO`|u]4ŋ Z}}FG L/\rMͣ)j /]]qkロ e츭xԆ }^&Ic2--k Ð_ys.h;B\<󊛌:7x5555TUU [#rJVX+rtuuQS[ǒ%QRR´is=PW@eU53fbDS36l6y23vONGGAλ2m:i^teeep2S]O!}#G2}t~⋔S]SKl^d̞֬35 Ƀr֙gH$җī̳ra8F"JFGG'UU4778x/° 5IDgÉ3f~G?x뮽׾yNJĉ\vgL&{ylv% fΚEeU5g-<7n==[9|\{͵̞szaK.;d9H${78cϾ\t 49{l.}<.*;89>h9/^xѰ͑;'|Byl񣔔l򙶵SYX֌1!oh@)RqcǒayywOo^@E8C&檫⤓Nb;/cŏ~a6s?'NOCE-FoAwAsf[no6^{|#FGᔹsy{)،ŅO? _3fy_?:+?¬Y)d8蠃x8$A #kVL4'@̟+.?XJ*=YY~1[mmdY~񋇊GBJIOw7u(R2fKmok% C H[n%4--kq]sd |;7"4NqĻˏ#<\8,9{vR ,_#GE{Nٳ8Y\Sq3i]PZ;A%Yd ?ϸ曋msC*]2jqZ91c$URªUpqXz5/ O&)h/OL*dĉXJR)38cdgN;[>mmQ2?s+眳0 am>Ï~d}潅pṄavmY{Yl[ނ(2eʰimm-oNtf457QZV|@cC˖/OY8_s 'ɊtwuH&yYz5|0aӿCcp55ϙI$yfڍ|gG1z(֬dDQĵ^3deq }#/.jjjj`>vmd 'p̞=o]s-]tӍ,byݛ7ARJ1vn?:whaѢ 6]eU!dɓ79]ץ?& `ٲ$Ij -c1|chll "Z(/+#c::ihh #=ϣ ;˿Ii;v,[l1z֟jjkkH&,]x7q <ԓmޞnH/"Й2ݢqʕ+9i4S=gOuj;f #F,].,hJS]]oeֺLֶ6V^=/!. 99mv[r55j9 y7h[BgG;O?dQ@뿗.)?uZif k֬᪫fq,A Ð~Kr J8K/DӈSQ^ΛoEԐL1b4'k&IDATϹ׾NYYi| 7>/5UUU׳tMq&sU,[ﻟ/|ak8~_؏G}(PZq?k_*h7 >քaGc=&5|<(Xz5Jhmm J)ZZZPJ/~uX"0 Ma:~;򗷸K2RrՕW2o|zkHpqsEL4&rIsHRޜp O?}+5[n~J*ִp^{y;>,0W/EW;|۸K8̳z(-+%Lqݵ 鯻Я8|֗{9<.9#|h$r0 I%S8D8Sa1qD:w_FE&q1a„AxII w>+WbĈhill`çܹ987sǰIr yYU)e4FJr7qx̙)藢??(X۲s9<ɓy'!ZLǍǞS3Ϣ.nFz{{q?YpR孷λxWx=VgH-E|$)vm_UUE)M7'#u]'?aY8.W]yŠq/ ZB֚SO=\>GK/yy8c:gY."N7S%Ͳ[~ox'I0Eu]5kVQS;|>Ϣ /2aRݘ9c{,3N<ɓ'#_Iv%0^K̙so,v:;;Yt799S5Sqeo##F50*<ŏ=Ʋ1bn|rA@Ǵ1TVV/fDczRAww7===5LmSkM[[L(--˗%"ijj2yZ[_:`ժU455!VeeCLR穩Y/OMKK Zk5jiiuݢaĈ]~8tuuIii)a4***Ly{;SYYI:)c ( rJ)V\EG8Kr(Ðt:mMh7Gkkz9v86V\IUqp-+`P]SCyy95\DB֮]K6BNk#{vZr<%%)<[n%mmm yr߹O;m,4<޶3,TMX>Xe3 Ð3X@yyyqχ8;}h7x}PIPc%JeTMhmbHv@Mu,Th=rBD" vdX, /N,b7IENDB`qstopmotion-2.3.2-Source/manual/screenshots/pref_grabber_windows.png000644 000000 000000 00000176615 12536560630 026071 0ustar00rootroot000000 000000 PNG  IHDRsRGBgAMA a cHRMz&u0`:pQ< pHYsttfxIDATx^י 9sx&4q(LN&!NPHdBf ,fmY̌[ [L[ ,Y2C2yWժ^]ݻ]ף]k[^v&34\{Z3׮5< S,jJG59qJ- =4HsqǑ}]3d?Kd8|DT:Z-sTr|S#Pɝt??4uk 0k<5dHխG/OPƍW/ҳ8Y`{`_u!Uvѵⵣ?'?ʫD+_OuV^FOb>%W%SyKSeW2{^68ﮫ׉S3[O"^z*1ŗ^Vu.^q\/2145v'}}SSa]L7 QGWX/$yOt_B9q}{U_1 ϫ8{9%ozFtޤL΢ctZ% ZԓOa9(꽘5cy^ϝ_eeli \,.b D8.ѼOyDռ溚ȼX~2TsM2c}y6d>#M.#.<5>k-,3OϞW^PSN4Y5ԙNV 'N'NOqOhs4qO1?#ԈÎ>5Ltjȡj0CZ8jӁ kwwA%ރk~{{D{ߺC][nvݱ~l'}ppx4?5)>icV?J8a{~@jR'Q#'ZSU]Q]V]R:us@ujٯ:ާ:ګݵ#;[TVaGbn^Xo±<߅y@պ}yXGKõیVf9 Dض7 -6 pBs @ d4 h+h&DPNN?8v%]d@~z xBFɘe^40f=EGU?LE}F}0`" '=&"w^ \q }qpp.pNy5K bb2`;蘫g~ xV? ۉ\ (s4`W׽]< @zBgu?8 @P hh4tBh.Y.F!N)#1z>ɂeqHbաꈸ$\])bKmQg\ $Cˤ|/:szśwnlhIA'([~`>t4PLC|j=WOg@Yكȅ?HٰZ$S0?sOhM!<9Yx-lZzadhm 08~p|ǎ $Pw¾?e Ͽxp::{?9G4YB硋s]rut^ilyFS0?E]͟x.ϟ.ΛCgЩI踫󻶫|p`IIGyNs~jOSB:5? ikGD.4{S=gywY,Zn12x69^&//i쩧}_2Pr+L)dz]<|ÜF}O1P-Zm8}rߗaZƝ̵M(oC47$94>&|gfb! Ȁf4DSȓрMMBc7 Yˉ@hh, xhGa*  85   @x0ǵ, <7j`>`}r?dE}4$g[`3MGGg2=yAT>b0 qbh [`l/7 vR6tsdxK5 g"s|D=Pw ?* p}xN-NTc2穤#C6=x,`W/JK7 m`$d%l˟MrXEՒ7kg><ǩ/3~¨?KIH{@M"iKL*KC=O ,B5҈eKТѮ`:=gi<'&b^4}deKS54; B~x S ?r8:r~!8JWN{oT+.!Ͽ{=ZG $t:;s:]tui8XuEkLAmȶd*m>d4eJxuyxOBO4MP]5QNA'gL9LTǠ3̶MO\.G:W>uźOd(М\p w0 O 7#y+ X}5tA+VWj=N8EKe0 ض Ǟy^ǻ{l=9 `*y/6d{yܸ:ޗy!lS4ߒolo{bf?G@SQU4@lkh*OOA7 $Dh Pilr\`Z,:n^'V*nǐ%Ψ;:~Q7NUT8YP1X]ZlٙUfimyz\{K;!{)@܀z0TVz_پc%DNe2Q`YJHJB _݌U6e/,<%|pX- H7[}f䴁עh'BOAvU4FN;HaD#j@z1E/ƻ@DF0?)[t5S2MG?,aI~5yG(4B$頋(iJ޽?Zvz7yOY>$ú]V{]A@ζT{' W(t|pur0.`zqP$t z*B&=(꽧"1 SEK'''Pй)#iW'1=&Pӛ֩o}⣸%ǚ}uH  7=S^zE%8Pl(L2yq ,Gh,h[E VK`2d~_|JAja~{XN pԿ-m 8wy.zZe/Dm-vcEݑ;p~,cO w`yx-0=߄Esq- ]5Z䙨'@kX4<p<`< @lk"h"x(L'j4x4Gat !SdGFbN6ZG5̴jO֮iC!9 n|(~d@u$wG'H4УDhE#EΨJ-~`G4JqǴz@˨nW%@H("K)ܬ16p~@;RX>J[d[遭UЃOvE&@ܧQ#ڕ*&9aX$?8 ,;)cF b]Ϫ| oZ>f>0~x'aD{ڈH4H Y2,!fHᘎv p6yF<ƺxMD9 dMLA?+ M h.w_t3_xEe߻W}y<]Ob'UAԲBP,#gE Ids:cj9Pj PG :2j: NBՅb527{ebA}zbtt:5QNBǡaШF>LO]p+H`JBحpRO5=գ=HAΫ0@\@\=hḿBs-N4וYf>_^-薁WWxC._U^@^^=VWb.hIT_ּ[p*hYwtQ-w@ /SG}ܼ 7#f&cbh^#|q53gAiBc4 pX8@h hPC㎣t,c0Hdh(x0rKGm>Cx?N>t\eV쯸C/G2ƀRNq AM}?mڡǍSO|66s}x"e//$,z`yھW=ܱOՃ%?E"p (\F>lthAMy[aucX'pjv ʖnVEJڱhI&z/imA;i$m#@%iO]I*j8IK6!0Uo|QؼAm]mMvZvU{Cat:HJ?o;L㖑ωlcWufPWurP7Q0t? Crӣ+!$_baWïG؃cE06=h'@27rZ$` -žW^V>q o6_.-cgfLQ ֵ߂bkk_Pk2pva|y>d\֯p_Tr8w]^u@rrk~By@ܖC+;AKEXo X .Ƈv>| |d\X1$ 7i<Y" t4T &qsS4 SN&b~"-!vi1`,tR"_5:.*i;^wFgI:ǀpllڹ+S` x/Ao@CS*+4պT1EF _8މ<.dԃ[PeΝ3BIfBMR/E?N^<$P806(vU4 ̸_mN 4F`*,_ e:Z$#Go4t`2 d@hi{p>{*_t捼 DC=pO/++{|7멫՘:u|w'ڧIQBGuPGIW1R6~gw娣: NB8:2:ܿ:IY@>v@ۡ}S.T_~868~<.{+Fd b6. 2(X*']@d}"ƛmvxW2߱6l o7-f@&lo#Ȣ ]cԓ ܠ߻B򲎥_ֹrQNd]5- 9Px~L92B!jLWi=4 ոf\%r-["\+B\7||pa \KѳMFYfb*y ǡPK$tJfȯ9qz 4g+0gS7,{wz-%5O$mQ_@ǼHX#}C548k=j4ȷcOy l@d}ƛPN!Plx'xj7Ԣڍ9vwa<:C)Ij-rhl䗅ܒe  nfYj5mh||!9lh~dMJ-\@,d0t] P)q*uX: NiETYdM4ʖa8e:d9(k`,ʧ#r})*2]Jj_Lٌ)е΁,dL6di4'͆$0NNT_ ZY=[A@i YR(K_@],#BrH6`Y2ɮrcܬR( TDzn9 ? ?Yɐ\#p,МEcx)X^Xγ؀l6 8~h  gdy_9 ɾd ddACr-À@PH.$YJ-2l ٔY$۵uI[wIٴe7d!Ϯ9n37IsӝU8Kv/~U>  'k,PoCx)xFPH؁g~ Zu`o}/9Th 0!g=wdddsYj;NhSPG.nty9ߔg߸o湀g2V=]b!C\1#WrsV$ߠy7* z9QR~Qy¹9/ܘLޏ,@=,R {= {f޾qOH,d { Q= Ɂݴgnܳoسoړ6>9p0v>k"986rG9kIg檟~1lOW|R՗b.uRp @_3 n gMC%]# X΢x?Q86` ٮ: A^6k.wUh6Z3z]R? ms_oyTnLtL%_lc(Yd- $ߗ;7 W Ȼ2e'hS`6(Oe˗U׭vٙ 7hfivEK"_"E%󫕁( ,g+a< cؔWXebi&xd0of7rH#eh#i3)W̒mꎿ'3UVa䗸h0_26@-%#w7RHIPG5L\Nj!b7WbӑhCɈGFo!djYF=exv@Zed#ͨ=(ϝ;uj"=d;M~h25UۑU[$hgoUӠPgoV>ZT>V|j>B֔zq_x1$ x?նtLJh Z/ܢ|V5s8ݦCS)MM}8YCX{3Y%$+.W_TWc~6azH8^x O15)tI`'7:c/b $[nH,Ye,+ڏA]=BJ/P#C,L#(<]qÝArC1jry@52.@;PUMYy;%>˄|vB\([)pr#XdLsx3#jqW9f R . f^yùtP Y vXL-S-mk[&5a@qf2dyX1|/O;ԵǘwnØx8J) 4Ǻv.fec-)\97De?.9 VsLD8G2qGa7=qeHu?1H~2CQt_ 썋l=[XɡhOxFq3,md";lٌz|dkld{|̸(EHGK؆c8كdd3gx}o+ˇ{Ngb$@W&86`zu. l2=8'yp,w{ wJu\kR!+Q7u%W_d*كc}*vuI wVX%=Mjxu5 Uq(_ݠ bq=fv>[Na'*ylp7 57 p,7#f*aY|d!%!IS&_pr{/_ˢ3)BҌn-cґ;qCCqMyo^ݱ)yplCyHA"R&o|moRUв;nB& MmjJDf@Ӡ)]m'/sl'Sabh ynXRwNedeq~[{pe"{lL}[m2vdQk9;cqQfֿS;'V>Fä@7x`SjQoūtZ7f[tS~N}'Nɩ3N~/n[MFK@/ñ5V9wQw< mthp _BIbx H4@2 k!}W_4P9;㻫{&vuj_91F9؀cyNM {ցs`BX4G&"SjAԤBp8jgyv28ރg9N/l^ Ի1wv?cni)7a₱k;0eQ1 _6jVP S "Uo]s#1p,%IVȿZ>O?o=3&Q"!c(Dx)@-c+jT.˓My _Q]w8%Cd?;}k^wHYt\͸z XqN}Sd$JKMC3~LhڪJh5mƯTmG֯$Vr\ǎI񷿩בi2q݂ʾ7Ap|+9;?q5kW3q5 mz9 ?5ej3p,b)>=wj'oȓ B=kܬqSs{f* ;5p++1ptr&l3Yjcw^+_ۨR/8cN&g Rb!zWY@lq YC0Zñ[:i?f2ݑ9~FߔKY4 (R,4Oe3b%# c2yz7K+T5[?}O\UL1jy@yHcI8,qf(إXfWV@񲳻Tul8y>Y2X#a8u;vdm ;4ɓ ^Y3<1O~r.iBzJ`Y E:qݏrH|H+y"Z/B,Q?MMY@kfԻ@~0=0Ƽ|I(( |F:S?Ap!#D [_h/Q?|ildKq#S88Ri3H(juycR =8(dȔX8p,eN $ {`2Wl,GOB39^)| ɴ W2:5 /[i Et׋POj,E5;_T (؞7p}tN~0j7!k8~c962 ,{99삜9^=C8漃.,2n;d50c4 ˺$C&( @cdu2U O$8>:kSV8{AyG24Yr@lxcc8}CJc|eZWkx2nEdQḓ\8F v1\9YNp(29[GpBcw AeXE 0РcFNqmJ IA2h \ p,@]Mpl9@\6G8(l`,W*8~Hd g 9I\T@iO@YPHX9( :Hv2ȎB7yl!gd;Hnг?Zzj\YkWoVc>IG$ܬc=4xFe$-ůU'R|hϠ cKhMMoM+kj;ja-y_˯Xo5-TwI{jFO{*@o|o(71iԏV?wق?i8+/F}0HrkGr?m@I[g<F snYx/2&lUƀcɖ cjoMrQ̦5ǁ (l#Cމ^fXerd%6N=SV!%eܲ Bj9^uXjx/8@dFW8OWWIc#KYd W6tFs&?Ic+?tҝN%u޳9=F lp#;Z=ލ.dHwhݏEmږU#Ü(7m;dCSr12ˈEL{s>.eCߢw $Ax/J*<'{ ,dEIiRLRSy Mb]S*"C(QO=qRoAOvՠQ?ԸL& Amx8 ҆9 "";dG@+pHQFcH2Fww䳺⛿OeoiE#׿:ЗQ!Bףowhv5j^C+#|߼@-O"h-ÏՊ?Dp; rv>^X(n;/m6cjrԲG~67P_}/{ `#'sA ni05#Iљ5//vZDYF>0f3:Ex-X@p#ɛ2 Gp*PYߐ)X5ӽ!P;ӌ݃{m%2 6{Yb؃cV!eK]0d|0T)a94ù!N=Uؽ!?J(Xj]ץՂx@1$Kkz%:S+5r@>pGuwBaxdM%&;-S@dM7 !%z|cMzOx?1~7n| ^~pーϗ`~G =$_ZŐ kڒt4Ge*zT _N3>1SN҂lry ri/m[O5ZhmBMҎ1G"m  G/Oq5rhE!cQu|+cяLp5^0#GSkp4=a5n>5㐇}hZxef^MU0^z`e^-{US[oFhcu7jWߨC@_ҿSlO#CN6-87vOǿj]j״j҈ýw/mp .;U8@@BSc$ BFxu93\SW^daxfV)4Br ;\&,8g=uW Y\@^eD d" wvW2vj0v3.v-vMss]"[#yp3oS<݉aä4Enl|Z, "1EYdS ;Plʹn2n0X@9O ޑRnͱRe׬7CStX^#PmNxteסـWTgd ^tZ>רvpch iAx6AXPo4ཪP=qL:=0kH?zX\2W,6;:N.stvEyŠYZr+70oK֑硳XWt'V'=tZHm^4G}|ޭ70.=_1eñTW 585KY`UQ&h?A>uRaX-8𫇐0xqfؐt%YoZMuTX2m}%_&, I,7^-,SZ8vtI(V⚋4{B6@l 󶖞Gk7Kbɂ^h#-J#.[-As,4pƒ5 MFC8x7#0 h۠J+ rd)B}]"vI=]8@  ?`A>@r y7yyvh=u{vr zXp<'(;F.-F"Yp\u@Sk%&]JQ|uByuDu×JQw|Le7%76\ڟvPH#i3F k Hg5 pؕMd5KdB p?<8F1^2.$k8v5OۋG(w=>"!Oovz}77fwE}oQ~[շvuE}ޡF9w?x]{ztE,sv7$S/yߩշM7w oU_~z˻UvQJ=:A  7}n3P+ʼLEpGm٢FlܤFnڤFh޼YjmQ [);Pۂnn*wTw h@{urx5$h?:>l_# Mw\^va/wcH0q44Ƨq#)\& 5lhFh (DVzԆd:4 vܥ2vrɲ1zD@VQo)bաY̴5XOJK1cjdL5ˣH3#PZIJ3OlI66Jw#i=9Ӷkn[.hIdC#\D0}(K%k~D48Lǣl& -tIAlC\^RecټhL-{E~Q̛/f$ٯ?Ⱦ.x/ERc,|` p .p,/~d0E&-Ԅy\h>LZ-9{V mtP@d ңU8 |&p-ڃmj 3j9^* 툒 1 KfkX,l2kO Gx:CU./ ~@1HRQ3%xFrZ@,Zj '4 b4CF.M; HdO![ (קAIh$'b^1GC#,4d<)m5W Jdw|iz@ 3RjY=(h= M% \S$%P'8YeCW>hkչ%&Y19E2{-g@. EX>'.4bj>_ i{/vі"iov8 k F{?b F~E!(F1:Wơ(6`<D 94}ThMG+LdzZK߱?==qͶ48O8ٮp2E,D lb5 q5jB|2ߤ?L\+Yo29H/,/,"|- KYr ǚ/ySgh h1m7ĖBˠy k][fB7)ڮY@*nfdy6ډv9mY]nIf'c-'ȗݕ o@k<p] e~+:1/iXԚfL|DDhTq>8~5~9(e PM%|fF "|pf`>J&aAc"bL 7 ƘʠGXn1nd:lJ3Rn!v9I^$$^B&WPVC:A9.SzP/^9PF&c`,RZƲ3[n2IҦ&i ޏR6Klq`H1"0W1i@tFY8n LC8j"IZ&CSoS.hMs5hh-e)p SWMz*|1#` (xvAy6gݯkpvL?o21}ǻlكeWZF@l2/@ ۔dI|Xp<%cXKg]Fic%8|b%+iX2x}õ.wr [ZRld&7&k։_f~eA57D^*aـ+[ @sP[2MXH EˆLEK-BZ&ok;\|Ds54Z0,h&>Т5 T'~j@S`ldiC£&' orDФ,E1^XLEQh84  绁V? YvgqꍘzAyXꑑ=;L~d!öY=" uܽ[.dHQG^±tQ'k)q*īsz qO-\I 5:ƸV.ur gLz3"ό7>i6tv$vn;HR#ޏ{/ 4F0? }hF_,ͱ8FU$pdV̀;~y+oki8FMlydMoi8P01 E֙d{dcŒEN`V٬#`+>8ہc3(0c0a0cQple  ]dAH(@ @MI BhMB\dx3@F7Ipn\5 "Ty\ xO$;k6v% #o5FMiDS`"I0x=f"4!xqh|Bc>.FNkA{B'% C5Sh084H5XNL " z9} Ec pd l85 Y+ 6@06 , g/ p\*@ Ǧd=ʹB Kr@rm@d ${:fݾ$2 XvfCym`c'ۿJ-ܲ `8uM9Q%,SoBeK`W L󒽌t 25?H6dvFY&{Tַ3mُH"ٿ\9&QL.daY\_&׍ ѵ3A ΁<5i?x-@jZ0TH>`Ԗs# j ,j4ѨFA5 OđIp@e6 FJ5 BClcEL$b:ULa~8"K??@dWr?J6W ـrH602ÝdUBlJlc4o²]wiJ\XxuvdMKX~m|f>|k rsJĴW2裒4d2t@FC1od2^ph$c_}hWvx,q7O&Y}Hg>dvXs9@5G^KX~AA.Feq>se7y=Ǖ@r^٩O6H6_^lq0[c]Z${,u&{,=tσ /@'2&5,pi`٩E,@հ^lm5B [.lT[5kJB% Րk@n 䚟RraR]@h͇O>"ӎLêqꟃܟfܙo(4 HJ`ے,j%ji `'t$p% {FaE𾨯>za{qLD88>8 Ȓ9NZ9ڀlJ, eME"2ņjc 4v0/s vYqp,\$86@]6He>* sd崐lrH6,S_ɾ ?!Y'\y&,#8k;k,lZhX2$GZ؀8H6Ye^8Xd})вYۥ. zp &_p iPԳM6#WٮMܘg)0S]vaњḓWfHy.шyϮ5Vʆ1.9LVwYdr\1.YWR#2% qDrǩh.Hgpas'#u%?Ɍ'kL}L*w-4R;gx!Eg:`>Nс$iP(_߂HEݱQ7.2]n8n88.,e^)(4U_ J) /𖨗d7ı|q>8wc]5Ǣ;wfWB}rNmCw;e;1+>92Ynͬ^@^3۰;b>kmx :~o?K&iw,Hɑ|6Y>',&'M/4L|^ Jj3u [ޏ85=G$ǥ h0I#g:Y8҉$I(%I.9#Z`77$'hWc05}8"]] 2K. SARI"Mfö=F7)peaMxּsS^ {ܠgF@]qTݱvل3Ef -Ky3ȐW g ! PnJDRf,s.n3u48Μ)6CmTPGh fd>ܘ&?1!F30/N4)"a24ɒNƻ`邔,@#|PE]LF09̅[1F2#WJ,IId@ kC ;4 Zy[]qz uq;i:⽐oWSyt6Ol",sXX 0t3&l2̒e. |V܄gnċ*0PlGGø&$FVu$F»y >z4Aq7z;luՑ[ԛK\rG~9 t$ld9"T{b=iJo%oFK҈2(< 皾XnM"Vdpϥ7")]2FS(|`xAA L1ѕ.wh{2|""2ܢ!a= h^Ί,Ou#M^#N3-}bkk&^Ž7 ٰݨs6 ̟YY0*ĉc'w6Lֳ6=!t 0QWG0=s :ia4 ~K0ڃi<%x]N2Ўm߷dnE2[,mƗ _h6ڄiڈ/E‡c#^F. Ssrn[8g6F$1$1Myܵߵ!5cWfs7k]\nPEsT3q_Zm3ЦzV{lmlF, jB^ 4~}tK2Eג. +2 ;QDmV11uĕk1<6uB<"k?ǰoA?_N{syEf.nxޥoa3j퇙L>P=@=@@M{ j6wg# -zbFuԛ{DӏOg O|9dW)ƀzz= \{LޅwiJ.n]=gQܴɧQx}?=~r@=@=Pݏɑ6Q717q[/oVq,Y67k5.]ՂD-:=@=@ݨ5m>l|{脋WO`یZgug H=@=Px/v;jMz{{{{Κz75KaOWOƻGFzԚnT7|5~*η-ƑqzZpf?2rzt(qiXy8$F.n߫ kfبm@opo=@=@5kc? O\]@ :qGG={jZA߀'7;=@=@xX0oEz.` oFÀY뗏=i5Jwpo=@=@5!nUJu.߻vU ,l٣wcGUΚ-"=@=@p* s^=`_vꤓ ui8#$+_wMzz=p=!|ӇV?\$  7VEӇr4pCMzz@xasdI Wc =@=@Jdgc,,,d1?z@w G±.M]z6*1=ƹg^^z* 7kgCpcYP8V06iwƝv<* Wsl(6"Gp\ 3;f^z* r$`,ˑvηXF qEvH==@c[c#!8@8&1ŏḾfv̼=@Tt>8XplHp\|0qEvH==@SV!pdabf&n1=P95 $8ƕӧO  V[x"ժ hlnj.|s#r";$ƞ@ W% mVLSm-v@@>ѨTGυ5n1=P9GU뮼Xs0 7:5{zQU@NcPnȳnͪ.olB4g*1@~28蔆3GUnR`&=5q w̎ןy¾!/ŒVa`\ 8v "mCPٶ4HZq:@q\uu\e 47;-q(&>rL\A5YD1=@5NydOX88hBХ(0. PFXH9I5fjBpm|oNg+,$;Vxb W*|6=#0#PyRersƹ±o ;#f}+7t-ˬZ:v7Ͷ=rh.#@8=f\`F~"Pj8^iS K*J9^p-R=R9 8Z8hr]$'~" S0篵NT.TKb`F#Pj8>>:2s,i qr4ô8:Y@7DϬcwBqiF`F >`iEԏviW9.91vK#@nЋM^'t';P27%.2Vhܹ~a ?0#к#Pj8^qf^ýf> yzB^.;8g?HcEsNc"4ZO0I+43Te4#P^8&#\M\-1-8 ]I%)&W)9Xud9N6RfcSV!k$R?aA#qi.:Z(=Bf+L7_thBcZ&VvG.ҵ k1-"c)%g5߳گ +C@̱oB96oț9.'dTyتQO7w=jC%BOiYHZY&_@){8R-+űZ=Xj8KD@e3sBrIF mǑO}*\͝oՏ7#h7WTf'[ȚHʤkȧ5<Ȝ~x3j=~XQp|\Ey&s-s8f~NN8 &5Ɍݎ{z'[w -K3Xo82J{ofīϒ9 ^Sse}糕yȘl׭K40󖶷ñ]sd)dkN5RV^\ñ nI妣p: <:~ƶ5rT^ze3 -K0F߀QuQӤ=@k8O߯ >`kD3nx">hO?Iqc{jXxG+ f/Wc05<'Xu,i?x8cOfnvry/g3-[WKh}Cp$[)XnP=\?FGخɾ^^8uJ+7L|D)`ԍTdJ22?FtTI%{ܗ s\p8BE6g"׏Z\țP (x'K^Z$5m>z\>ql_b|sc}^cNn;I;}\X{q챖.55O~X"KEpf:`:LƁbY.4b}rdG[N;/\n2mArُ'ݵH ǩptrz/M 2 ѤrZmH8sc{qݜ>gi}煸lm {eKtrKҗfM\xf]Ndpͱ\5ecP]Zjum oƙ tmM@1_^ҾN66s@[{kB_TipO;3Ou-SBݯ=ZlL.&?. κI釐g> &>cQw _O^>Gs5Fme ڡRy/-\{t˗%sό\> ΌVa了㨚tX]¥iEb@]Ws騄'].=Ws`y`j441+v0YjTIYcjcy yfl`HZ lnF.]B7#,<.UpiBPp4TZ5^,SD63oXq\mrZ86ۃ#ȨÐi80`ljC\<q@e_8"{ȸ#GF =!k;y욫yj{>R*UGڻ:,7 E J\?p(4աv5ܸ|ZM c9Nwnq8Qh{oXj>aWR;fKі3"&#0@@YXWC/s,l٤ SL$ e#ĵgl۶5Up ]rmi|c1Dc~jSߢ8)xVeޘp3Vm4ڸNάCpnw9p|GD7z cb`F\JG̡;[uq4#zsSh&A1ᒘtO, cfb~pϡYZd{BUX¾V)'%=w,Qr}**fYzkh٘XzɁF_Jx?#i?Oxg+*3U:{O`:F1*KPl65Rg+醩[ >(@uQcN-[cڄ)w .QH\_zdNeN')v礿!8#d8]w۾vEt8xc}_ Y{K ֋$?ʋCd}s=$y`}5d¹.xpTKp&մ+Xx$=']#t}/CeTi9!K$) P]28d|܍Q~ȶ\csLĕ5峛ǡ_DW Ar}, g v*u5O u qY#X7M*Ð++bK1׉}K) c>_J.@: h>/IJL,:&}W.#MkӲ6%z `иVrdK kn؀kN5Rc!w HpE@MaoD±9eV/^7HfgB3eB_iCg1ƌ 39'9POxǵ{]ZgOic"sWsu eF~=20=?Wc۴lǸ3Yvq^G鹦;OvGzFcvUqcC!c vA4#-U ǚY?۷j \2MyE F,{v!pld]l˪M-s}'Ԉ_~qg %m I'2it4q 3+Wщg+lv+)ʓQ gpymB ]}'}v-Ϸml s7 =fLFX%6([X~8 no!Bp[,dd2kv&vA4#-lGPv0#PO(ux5wKdɋ<2EV=0N"1cZ`r7#0.;v8ۣ{Ժ`ñ4iefF&V7PDv)1MiUo#0@mEp, [c^p, I K-Z̲2#Pp\2#%s,+? c,?oޅcd!kqkϡ"@8caF{BOBedB2Ȅj 5Dp"ρ`FT(5o@Xs@qZ.>T(6,yPL<ᲆ(،;c6Ce9Ob{:SiYBϫQ) WBc7!1fϪz6ٞ(v?^f|" ܮ~ՉC/nnt,JW#s;cNO9G6}>P>2@)#P8~?<`c2OX2nX@lk`#l@‚H~ S}G m+x?cq&IsXD'h }{ 9lǛGwt&Cvi؀EѸ|%wn%q0lFˣlp}r,r;_qَ=fk5#>v8gJk~1+t|J,ˊKk%m+Mw¾|9sC,ieBu9 )?Gu r^C_HUb@f5k&og}4pLo6ol}eY-}>]O8h!yIgj5Y2T E\x[3fsV )Ҋ8/?,vV8PJ@3\b*; yx{qco e$ŔcD(  "w ^̱>3lYF ˴qР8 %\c/] &BK.bq9 u>qY`iJϠ;xdr\mf~|֪ f| 3O{38`%2lj-{Zqb|dD]$ދ%u\3ǚuJGɧ:@-DpҢWXǵ UțBβE깬K>[_ bl 6KCzN q?'UTSgbP0_d}YJ 64d;^_+;G-.c9և[ "/wP2\/a ՠ< 2֯ڃqmAc,ϰ_3qµM'է'0tmc;R_ 23 P cd--{p,ld&3ǎ2 ujS#0@=Gppk( `G4f;v7eA . oGڙp\乗"RDdFh-(5:pǍSO]987{%,,dM8n-VyTKr%x#0 Ə׺lñ? 5 $ A ( Y6]1CggMYpK{8?iЬ!068nyR_ ƶ Q6F`ZKJ P<…Q3gQfXHYa,dI;Kp\ 0^F`j:%c4 t4"_X^ijoBZg8nnߠ66ƶnJ.7jkJ0+^tl.hް̣jLf9ngN<,;:V훛U{ '6 Sӟ߼pWظ#0@Dp|p,;V4{3G]}LY7E]ޏ,0+p`- A./jCezAڦNs`Q&lGpu۶v 1s]1qx ֚;WM7/ xS?N8eFOYji}P(뇳LF-c23ُ %Cn7؝,f܄cq^M$WbF{EW,кfgYd\L&U*=0Y]Hf7pl2^F#]Vaad?nSV߼^lv ֺ|F`@ɓOYPMuu2eBjEc7/d :0p_B2q^IJ;fF:.ZA/V %KMYA`YVf88 U"f$/ 7NLqqEU-tcfkA!2#T>cO<`ҥg>9@Qqn @+7e!Ϲ9.p[ }NΜG܀/n*G|Gqb=1#^Jgx`8lVGY@d@(Ⱥ^2QCpUB eL2 I_YgыuQÿ2m\I7ZIϵ F1#CJ dz/WsD+V3¼ezJ-fQ5Cyϸr{#W.3#0@Gp|95oJ5*}LY7B\ٳR{(ƥ޽>\Vp\XsO#0RՂիBњ5Zl8M,dYVf游 =-Jp ŽI[#/#0@Ep,0hZВup7.E YkT<Ḻ`F(5pA-Y^RLLY?BF2Ḳ[_ǭF`Rղ Բ=-|K3]inp#@8F`>Zi zcYPY$d17ńci@.\~b zZJ +U[h޺UK y!  )$|p\\*DpnI1=@@:\J؆5H8?defs@q#@8N׀gzO>n߮lۦF:) 2Ḹ`ĭ1c6n=zt8pZcZsnT/g*^DYNd2 ?t zƉz8S01Hټi(Z`YȺ^2'۪GmՉ3QI~{rKϸfb^w+ᘍ}{nz  oܵK6ɟ9˛GИ8pWC`DB {ebN4 mUc~tWɵ%k3N=@/--˼%_Y^lv#iq~ Uy8.6u Ղ#{=@Խl86P,-{XHY% ̱ff6S:KjB{%Rd3%c9v$>y/#slXXm ǡ dd2ܐ~8@}c c9!y/P!7y_8TV5.n Bx^[+pS-F&YN2,m&lelqoKz+ mw i:#"ycjhPxX`cj=[l78ov8LlAI2Lxz  {`,p,cYzG=!/ yP= 3왯M 9_YE`5b80 ꩭQ$859 xk Iad59@,;=ox}uԼ^r =߾X dǗU_5 r^e2Xv\^jf㷡XC1$eƙ8~}U$D[qURU:󄊒׈r`8 2W(:`^TSs6Fdw%KUO؞Ӝpv8r^E {qa\{\_: 0+|e\8챩7&Ra\nbñ4qX\`7|r ` zOCe8(I7Y@7P:Ut v&ߐe##0Ee  y^1Ƅ_wR<ܣ4G­V*ńcYh"fcA4*9.2ǖ= s:) J+z,iKYx聂= }r9نc=6{#Ux y%"P8Fížz,P]۸58$猗fTelWFHy^RͱUW;>'^ꘆ͙j׏ׯ=Pn8cؔUAq#lJ4GCov"G%#±1)hӳgxcju'pLycQ3 hˎw!NT!O2ZKa}EpP?KΘz=Pi8 rh RR5my#@8f'Vp'4<k },9{RplgCe&kl2Ǽ!ĽODŽB%PPypl9TVaz{|tϴ SNCO@=Pi8@N96cq%n t'Ӄ=Pm(+ϙކ)mecdqk3W%#@8fTmJ{pTpBOkOkN"@8f'TNz3p u!/Έv691e,J,[zN@ Ψ`jAQ%!΂e e~,~Bs̡4tD~shvw;ǔnIJzq!du @XoHJU!bczj8u9N9 Ḳ׭pK/|$P]dGK=PuplF0c@&WJwq"ns-WqZlڵ:xڸeڰii1;/ =@@U?Sz87[tå\"P-ps!ekaղօOQS7V^{Fu{Y;A=Kvʲ63P5 0@ʃ4U;k.s=;2vmd5p sᩪc45o!$Pﺢ\UoŸ1xZXJ)?ΜΝ^ZU_?Vn<^~eup %}?8g:H7e9e9ĚLӬLf`;c)d5j^dC SMߗ߹3xv eӔbDm{ɊQCNs^"s/d"*>Ok/uL1xL&8>w:u{ʫWO`Ǯsԟgϫ3gfc)_ Er8vh-&XHrh÷l>\L(D{}< 3Ǟtp5'\ǁx/ׯ: @D{*͟ [B@W"jPgJa{>WcYW4 n duTF91 @^{{ٶmu90nJt {M5͒9N&;=.p5$nN}d:\1n8` ts fSaR{?wS15fF F 1їU RZaWCY3Nj7yY}M^z^'2c;O.[]1U \^pQ=_Q?o*U/j0]r%K?qU>gef]k1u`gJ4n.necN:e {Jd7niy%_.}c+IlFp~^h( g3z:<@8U܌wYG{EQmt_c: p|k޾fb 包xZX }w~Kxs)u]c,10өᘝLut2=Pk W( mVC{ r,YwΘ:zp\ȶ|hh:6968p:}ZdmI Eo9j\z{ؔWCYphWe>Q'TGmګ2ˮaviQ?r~챳Yfךcw%OŊxX 7_1gN=P  =U?!O@)˩ ʼ5ݬ, uKrfyTw{Znk?lQ݂o>/Ӭk-9g=6#'_<#^4A6Q=@qU\Mv'\8#AmmNGF˭4`p@fu`ζ.1<9c Syok_Ę@ @>=D*ch[6H^֯OwOkVw Wu;cz4'2z}f]FGqF[rwm\yᘝZkxN5=@q:rѨp6?( ;/ ml7f2.?뼎86q,n\kcv v \q u)fudokT #NokPwMsA@ޖ~o-~9x~`7u^yᘝZkxN5=@ꁪ㷸1#Uȴn;Q^kuwM5˜P{7?fݼ'p=%2u-ۼfW7f߾,# Mp}l5/GLkcv v \聪 b JᘝZkxN5=@ꁪce }c1(kcv v \qXtV}xcP:k.=Cg`\k %ω@@xp\%pi55uT<>%XOkKv_!?W?=;v^kzyXJ+D/ԢWTcP*k9f5P'z*0JDp<`@UQOGkkMD}2UJK/@u9J3=@q@ D.Zxku1qva ӄ$=Pn+A$'#P%8޹2ڵjTŧԨTQ+gW[Zǭ&&ծB(7 p=J T"-CGOϫV_pQgmQΝO -=d)PoSx`)xd&TZ5PLj}x>8\I"jD}2UjcOc'ϨSϩמQo`NPϿ:~D*8vjMLFElӠBsN,p-=U|!hӳbWm9oS2}mՂxo&.;ٱK2-{n%2n y~V\rܯ]|[Z 1qO#P-p|%ue1~Wկ]?WgΜ`d◉YݷMg"L 6w;5Y `c7pu;)[I9N=l7Vz1\{rt^I^EE—e\|۪k 8V1YToܺS_ Ahq^#pIΧ9 ~YpxYb,al= pJzX߹g=qԵ(JTuB ץj8p\2>8 W'ߡo( Sl?Z]!!ON_U/acѕ+WR4>(25ZEb }nκ*[FVMkN#K,}{.c|>K|bGs0usL̾c S.k-g;9DF4)ˑu|x]SB F"#P p,޾cڻoz%< 9ܔ|1R  _ypN=@@> :@5dmI EoOz$ 1Jñ@n'uEz1T5N|=@@%<@8c03cvckN5"j!YnPIF zBOuة=P(7ӟ&j@=K/@5;xxz Tq"Pop_A8~[jFlctLMTCCjTU4V<+Ej>*vc#P3?>=uiu9ujḥj29*9 kئgK`X ǹ/I;T'oj+%-#P W80>p:v:usԓO^RW\QW^UGMǑ4EV$ Eu㖞mTC& | =Z\7lSr~qx[J±3s\ c#K)dϝ.>SO=~i3hh:yt 8nQ=$B8#(yT\N^KV/i;9`y_Vٔ:Xsxf&n 3Ŷ#*rETជEG_Y?y_r9ƈ/EkGHj_|Iq闚_`* Ȅ2t5DXꋥB%c|58?̙XCc^O.< Pku`+I?g=8=ph+ gmG"IT{݃fcb"OY2!=.痃 }U}![s W Epd l,nMfQu!u8Љo޳Ր`/nIǙzֺy:g٧"sNv͸f=w=}QˍKǘKE2>ub)5WWOH'BP2zcBncŦgY^xA;wc827v AVE(8No'de߾lor~8۶s, əP]-w+.9c.q7֧rd.T(2 &RwRc,"cb'P},<2ǡGڌls`(8v3-d29c6pZ|J8.%qەbqe!Xkl W^AVr 86 "`=.5B~`[pU|GdC51qP`gv"Ǒ7ŕd3%,1_ |qzu|c˳9Ą5R\q5 P wXk3PlJ)E3n0Fs;@v HEֈ^C47CK8h%s h>8.h$5u3Y֌uîQH߻+̱%*/s*Ok*X~Zm+%-#P 78GB˓2 &RXJ)$c,`|%w*8dҀx>ۭu8q_J|Z> om2|-V cz\d1ۨA6IJ ^#^lq]"Op"POp,ZSFNdu. Tp\pr/gr :@1;u2=cOJqeu g=FJñ2B`2cvZixYz(#F#@8f'SNۧz<@8c03cvZixYz(#F#@8f'SNۧz<@8c03cvZixYz(#F#@8f'SNۧz<@8c03ńЙ'T5<^v=@/>Ծٳ r#1@1XҰP=@@-z`,}&B2I(6ˇF`Z@3f9[^~g>㓤ᆼR0ըp?z=3pLc1;ZXx/=@Բn(8cv,ܱ_zev9`B c厅N@-{pL0c0cv,ܱ_ze &{q#@8fR Zԧs,@9'P c厅N@-{p\`CbXjcӿ=P8==!cB#Pٱrcz=c hx_-7^/zZ9! fqidaZ=P[ uF k!eE@8'dŒ@y"@8n=,;L^KzjO(y*s(R VCʎ׋qqϸ"@8n=,;L^Kzj%bEp\[ );>^/zZl8 ed<*40y-z-Ddq"@8=@.q DpzYv=@Ԗ5J<ḶRv|^=@5KŲc2qDpzYv=@ԖUC< FḶRv|^=@8~?1[O#ג A@fYE"@8=@.p-DpzYv=@Ԗǵ@J<ƺḶRv|^=@XJ+LyE?)OڧgoAc cpǭͧm:=@Tc#P WQd=Pc3s\CafO@<3K+XVQƳ,oǕk!1=@Էc &>"@83?=@>XgYc WQd=PM.nMDp\ 3;f^z*灂Xp\Ń+(Cbzok xq}7yz 1MM|H}ϲ WQd=PH 2豔QE8.#1qWuq}7yzr7}3h%#@8\z=@8$qߌ@L0czr *r";$ƞJKRfS 򟼐 #S{̚*$+RGp\ 3;f^z*qcO5Fp\FcO@}{pɊT w̎ןy vyEbY)`YEsO #@8\z=@8B0!1n1=P95KߌgKnc昌T(5{zqp,L8qḾfv̼=@Tcr#P WQd=P0p}L fxHq}7yzpl2>8gY WQd=PcȄ*&R}Dp\ 3;f^z*q}ϲ"@8\z=ǒ=fƀz"@83?=@ϤEp\FcO@}{p܊z"@83?=@ϤEp\FcO@}{p܊z"@83?=@ϤEp\FcO@}{ '8~'>O4I] *# ##@893=@gԏ*4q D;F cG8=@q[d ᘍy9gz( S۶L4#P`zr A@-K+XVQ$f+c66\z8 t@#@8.NǎqzA8ljcq[dLlsm̹<=C@q)Dp\|01|tC=PO ۀXocB#P oA0=@x $ qi[eliй}C@0pުvy`cV6dAe9F ޸` z E3 z> :סoz(Ps?oE~8>|ؗV6-p!F  oA0=@x|sCpRwᦕM38q.e AϧA: =@{ M9!q "@ ޸` zSdTRT'/]{I?\H z> :סoz(<86DZpl+${L8&1ŏƍcH=l892s^v2ňYs\|6<c64\zpc`ؗ9nAYEp\/IDž7n Cz| :סoz(9ñ/{coAs1` ޸&qƝz ǦBǑc1Q(}lA=@T1j9.=(qqeDvD;=@@Np7M߹gZA8?p>c6z*>u/8tHBfA3=_Ǖi1=@Qpld#7q#@8fz2KȄswP WAdGĸ=@dqBO:"@8fz2Pn9q0{!! UV4wzxTu 7|$#ᘍs>m*סoz(c#P ޸` z ٠Ӡs=@8&1Uq;Ɛz xH z> :סoz(cr#P ޸` z ٠Ӡs=@8&1Uq;Ɛz xH z> :סoz(xooY#m C@Hr@#@8.qc=@qѱd z> :סoz(9[`q;Ɛz  RZaW\ 2p=7=@1A oA0=@x o86cfxH51|tC=P5Q<q;Ɛz ǒ=f5ϩ AϧA: =@{`8q+Q+ƍcH=ǭxJ1|tC=PǵQ B)~liй}C@ [mq1AEp\x1z"#liй}C@ *ƍcH=rc)+XVQdC٠Ӡs=7@&<07v!=@@> W!1|tC=P0F #@8.qc=@あXJ+M` AϧM: =@{pL2c07v!=@@> W!1|tC=P0F #@8.qc=@q AϧA: =@{pLc07v!=@@>8 P=@>hÎz(c^.=@=P\+n@iPƓz@Np?oUF<Ʃ]=@@kᘙ㼞n? <'6=@=@8&zz\vy* ߲zzh- ޭ9&Z><zzlPlTzzh- ƈ5F=@P"@* '93pxTc qr= RZaW0so?=@={R RO=_J9W9ǭ:>/O+UH\%4#jq+k WΊe|z\ԕ+W^x*r $_skGw~}ԮkPEU+qNs=Ἅz@J)$cL0.9ץⓇb@*8EcS^6z^xF@}x@?O(\x՗3/PŎĕplpߌ1GLԷ A>pյ^+pL8zb=@8./Ӧo 3fzz =`gUTib+O>O;WoEk ǥFʟcz|= p,#*\vhQ9o.5o.qI8d1u29j1;U>y[L*q2s̆#=@=9>~*ƨVc|&u{1wk(~ne>GǟTNSqS1 8poPqk SsKJ8fczH|B/=Z^=*XFoV/wKLǙ{zYPu|8^o.5m\x j:~'oY-8)^^5ĝ.WwV77:xo+yJ\%enS"3L9[E%=@@= V~8v 懗|7V=5(g}^q5f;lñ r3)HxOCsX@pLE=@@֚cÇWF sвJz/2@;#+w~{^U\PNėc6zؚ^zID1RVq[˪Yi1J| 0sD=@DzSϟWW^U{졊Wͷ,W7o󜚹4UH\%4#joQ :UM7Ԃ[_{uAۃ؞2s,Gz=@@^ŋu*n $_s?[u@^ݼ隺uKTc qJ\1 y%_qw|1cL<УGٔ@*v Gܯo*n $\GpYf q]v=@=Pm  =@=@0@=@=@83zJ{c~S7Ezz9~; ?8=@=@j\O8zzZ>7_-xn[?bI^xXVfzoźi}HI7[ U6uDw>Ӎhnć}z'^g)i]k;'(}χq|qߎsM÷E91VXdda"o}}㈜ r>P7~}[ߧq{;nv%7H:7`[7  nWOG?1}ѿ>|;& njk%KfW7 ݂k'zM>_Wo| }z{=V{.w_эogWَ|] qL6utwݨ՛NI2oE,M}]m [FƼaރurܷZoCۛݧ_nrt|tч݄͞noOV;_-x]jȇջ>aq|z'?O|ꃟ Q7swKWU}_V+_jͯ}w}[}Os̽~s"󐬧ׇd{喝ߺK}V-uWn o[v[~U^𢡊}P}?TgeY1sus?< ~{U~;zg۶_nMCn6ܘkU|F2DM7rzuש &ӯJY+JanOOW#f@3gM3ٳԘy--U%i޷ meK0M&5WK)ii+髚 hejZ֭P֯jڰʧW+[s6QZ֦,j3։\<{_ްZ5_f֮P3V/ǹ-SW.;#cL#&5i9k9ӑ|NG̘3+]\K|O0i LY_nI[Ghi,ڙq8 hk&$?[M?GMAc4Q(YtGF30 h%#5c|,Yۑ~.8qqF6I8'Dk H]K+4WM>hSS!TEi-PKE rR|љ'xw&4 >&_vF汼>'V]J^Z݀vo:`zpFhfdfռk+]-ݽC-k٩٭VۣVߧV39w{o{~*y2sWgM+ڂ/k'=y? x#۰lD;|I\ kq|{;o /?o\8qvsrLqqo났PFu⏤ ]Z(OAxH43+BS(dE QX>./PdPx!((<2E.Š2ȝL Sˉ!F::̜bLd9]E WZROj )RNmYMݵ4Rbkɾ[)RˠCa1ڼ7HP'cs7eì,߲ZUb[;(i}ldl K[-ŴTS, ҋ VVI^@с> [w1 { sOaF5˱KRJt+QW@I|D,emX' `?+kK%΂Xn"kk5YROFЄqwRts#E65RDc=-Ɠ"O *kna>94,4;B2hVfHi)4#5LNiIS=hFL"6)c5C ߨh򋌔,[f2"t"0'w7 oQ7x[xwܱgfJSp x Lt,G""Ayo^LRh!+RiiN-EDeyyH܉ A~E 2)@b+ +Z$+&k"$噘 SlgYn:-]FKxyq 2hAFOO|Դky<_s<`[ Rq.$tZsIK@r(ٴ0"WAtq.ŔQLYY Rb+@1VP\U)U㚨5WSNZ\u(k@-j1l8LaTG - H'%uPZOenPTJ*~*~MՏ>DuzQiœ=oE[~mlӟhǻO;?@ 2hGzA*t=1 }9>oZsZw=p/a)x+^qbkk)$%.9/DlcMl.#oh$RP1fVJ9f1VruXZ \8-UdGlk-Y51o Zwhߠ56҆zZT]Cqm߅dQx^>Plq&8ftp2d8 2BNp D2Bl5ᴈeؼ#qMcTrMzoFm,ŋ +9 9LCS4' bsAr< r)Ȇ$[ !BY!&ȅ2D+D ABl@ 󃂒TC r,xc),,ǥyd)͇ r\,ȐxCm,b)硳^q"*͔uR֦Քe-nMTk x+>.݃TTģ| j x?:rudŘEGH&+]c.9ħ*mc!R\Tajx5Z GRx!=_ba9>r?fABv'Ⱦ%yPZ c)U[nx'yr̂r xxd=^M=Tb_{c%ZR"|Xq`p0>R|٧{n$ 2n↋8@%7̢8:(!QfB!&J !5G*̈́`x-3W!ANyH9AAyqE [ B*=u^U'nu2=N_S{Y=nb<ί .ɨbO]ril!Ni)$3B:LF:RbȰJk2,b2 7#ǼOAXOYDzlH(,H9="9KX:A?9y*cI eAVI"4Y"1f,cFɱL3Ez.T!ǜ c"<Cdr 7}0c)نCK 29B&bdž @k!uH+!xEz,eX3sz 15Ai |©qʚvEY}H!7B 9FOU 1 ^-#)Q+fZǩ,ԫxIYtD()4qKH;H =sXHy/Sۡԁĸ[sZ81r^Ǜl!܌S 6N@=Yǒ}J$72 {Lpoucor|y@94LA_)I/s)ǷG;z@ALׇ &07d&O!d]CqigkbHqHA*`>6{iHYN,ȀyHB 2r!ufyIi|:zr"+=2=ve92= AvVpz&ȆJb&Ǧ #9fe,ǼLNQ^ြ'bj W8H@9=v LqK1@Qw %zC\^X0Ju1-EH(:j0ͷ%1xvhǗ^d$I )NÑ BRTJa p]1E J(_mGՕC+ \R^SXE)[ژr6z*j(DBqڄs Zb\ *rSP2Phſ J:-Dz 2+Ag@CaF\XVjEY[{ cÛlHAuȐ]`!>%ȜGy`AcCjY X"H9Q 9V IFt䘉.A1dQ^ W r88q\=Ѥ c^|=KQs5NC[PN|;(]-,=^*xx+pCaj-(PbZ1v B"5vXR +Ezr1ˢbꎷbJ+r` v}/ {|S9,`AU^ꏇ*#Q^1 sZslqӭ9881fe6XU(ؘ9R޶s _?u1lg6_}JsZC?a['؞ o'/(өӗ>ӗ/󋂳_\2Lg\s&cK 5>_~12\vx_??3_/\1Ʊ kˈ>?gqL&wiƽo-òwVf.=Stz/HNЧMF94Oa)|䅋hgĜx\꺓}#_Tߢga| 9ɠ_9qO+k!29yCmNa\;3\<΃ܶ<'Ц=9ygо$6ur}Ųgq +G_}: }՗*]|]toХoJ}~[wktӗ?(~p+^\ko=}kﱬD#`GOt|ew B_ ׏s]yfۋޖ3>7:F[to5rfrq h _gѯOL?.`ecXd/mx1&&hGwxQAh4Q0& 2I#4. uF_Nͻx,۔8=f$ Opq긇>sus{c #NxF zls˜mi"1inFWm]w/z oYg;,D\?~&mbuXך~>~oo+A1w0$F冀vccn]a\}bz,X 0u263ZɁ4> L" B~A75&NwN%;Q;)`t4sΚICfє a<;ⷱw zOQX&x$(1RXxn ;;mLrs |oMs$lCna&f??)SpOD>3aKu_d%VCIENDB`qstopmotion-2.3.2-Source/manual/screenshots/mode_playback.png000644 000000 000000 00001004210 12536560630 024447 0ustar00rootroot000000 000000 PNG  IHDR5-x)sRGBbKGD pHYs  tIME#I IDATxwU9ܶ KA(رD5bD )5Qc4VhLb Ē(hD,R-n;gf~{Iy>+Ι;g;Ό⋫G[˥8po0$ C|گ`w>f̘^xM/2dKÆ bРAV!\;X߼{,64jc]xX`]1cLf}|>p8(R,[tƚ-:v7|sA1 p8ߨAczzEk׮v=)%RJa׃p8 q,"5p811S B`Yiq86B`ַFJ,M@N8h31`ZXu{c B5c,Xƭv8M#X210t`̚>ZklPּ;=ִ][[й|M xyd2gX_)%K-K5(:v_~x)%H%kYoRʊiM"Eyu 0*Бhi5Rp|Ðǟ ?$--Y|#NdmO?@vk=*/K:'gǢŋ啗!|_z3~͆ 4,ɧO<!LÎ7vڑL$*+QJaX,b?= gMW7}?Ï:/.w?  y/*a/֒d*g_X3f%Çʦeߑ\zUt܉ s|lNtbp"bW^}8-kdb0m2?=3gbםw "F =?0Zlx3gA`wd>{f!466W+mlVϊzd2ּޝOgVP(0wgmu_{G7>/FAMMMagu8YQfQBcc#oOu^qc®iD]ϝw??8M$xv.Ϗ?97P]U!e~R(uyࡇ0,ƌޗۏC_B*3 E8hiiadwC6%˗ִ,%-hrI?䎻gC*O&At܉!sI0lYif ?׿OhGqPquiii5y}_yk-k{=xWBгg5>"Gbj c B)%o_[SPR>TzHkM.'$RP CҵeS_Jݒ%~2JtðMV\Imm-l6g>RdDP(֒J>t ҭ[7("WZT0 1Pr%=KE"ֵ+RpY|9ΞM*Z*曟 di3;L|gX2ʳt;UZ],HdK)d 6o׮"V]v477ϒhM.[}l6K( a筿׾UbCC8+Of}QQUUզXLf=Np|O_OԨX0cg͹㖛s_(TWU]p8H*]ٞZϢd)Y6#; +OKGU&S vyAe%*nM=?q8kBAmm-/fʆ맫1$j\=; gϞlFm3fL/atjp8J;"p8Zb c*plx(agq8ź-p|LSmv-˻+k[Z$r_!D{U )MZ)e,hR)x|%%ñƌsfC {>SLaԩtԉj k/~q/mQDW_ H$ƛxG˃=S3{l20BO=3w.S7?bZ|97t3;{(`^Xd O? [ TN9c(RXkI$\y l(tza77N;Ru8zݙI&;1 ڵ]{y/Ajkkd2̞=п@V,_FccWDبv-tc UUqվ}{ڵ??fȐ!EƏ??mN"$?">1pݺu%N馛~ZZcO6ڨRJ8㌉<LCC={EMٲV[sӍaȑDQʕ+7Hx~<ϣ^z}Сd?C*ZKUUo>~>}fMB![m ?|>Fp|- ࡇ 66DT,Zk4)dɒ%466Nѣ: Ƣafѣ{w1h+.e˖rJ2L*Y1|hSٳg#{kueAtS&?Gڴ ꈢ]RU]+_0,ҫW/>#<<}QpD"ٳJ%inn!Jҽ{{f444`N:a|Oiߞ:|ZK*;dF3C}:^s ڄfq'3f6CX,kq3f;dp8 C|GM(d2E)%?cDv o_Ac$ õf$ #;0tLElFgL__Lj#H&tcy__FSs:Y0ce}eʔ9 п?7p=MMM̚5n> ?-ܒ#FOd!8I\s4662m4dE]ptؑ??8S::3< W^=^xsQsry0\C޽iݶ0:(-FG^wJu}Q$I )<,"sι\ql;?4;6ߗRra&08z!~XRz+~2dS -ͺmcba&8cKTߍ7Ƙ**t4hOZXt)#FZZ⿵iBZJ)u 'ϱʂ f[xΊ.SYU`PA`GnD:"ϳxb1D{~mv<'oJ2 ɐJ5---457s1VKΝJⳝMk!CXbE%Vm5p8m/ZeP)]e˖QUUEmm-}4ǟp.YJKK:/וJVv.$C_3'Nd TZk=}2x0}>DJA*ێIncXl9!}Ν) irWXK*eR}a6k#ǑH$fv_n/d=sSNFA]]\c,˖-cǎH)hhl$|TUU|;cփS.X!/c ---39`f[^|EbqR[oq̱Dz;r/3ϤGtԉ=zAB]]/w>˗/}{ 7ēO=|!_|!OKﻏ'|ކIO"LL$8ctQ˄+$mYk9u:vb&ZZ=V~yr^Zzmԛ=܋)%Ade) 6Gy38l6y(&P[oM6qҡCG> n:kg}ݧ*nK.Er/r/ruŤI!&~ZKvhjjʢRAfZJ*+`("˭um, Vt:]rKD--TWWW,Dd2A`k-d<7o#˂\3Ȍ39}„JɗD"A*j~MMMqd]7ԴNyT#hNʴk׎bH6]E "L!MM466VⰜq8Ǘe%l,Xͅ\^zZ?~/)k k Ǐs^/CUU;sY\.GkQ:/)81cF !뮻1'˱|o|SL&{;~a\{5_,Z:2q?|&Py0-WbQr |~?\岭\S8|>ϯzOu>VX, &wp8_cyfU)MZ 0\bUﷶzRfUWWKYjU&Pr?zʲp8ǷƋ^+o!(d*T2P8v5"<2tgq8]|uwz.]y(ER oN'v?vindpo""L6ÎAP:r l|̼?Wޔu [9p8[|^P}P ɐUJ[s2],-FZr8 k6V:6d1/?kN8vhITDp8 UplXCܯWE)E:SEScCogq8 Hˮ#ر#:ts:ѱcGr׿Сj ;N8s'N9dsOޝ.?#t!o̒%Kx衇XSvqƌy_"l;={??k %Ҿ];cR̟?~Ν:Gޭ+'tDo9{jg9q@yktvi'ͩ!y|GϾ,^+cϽhllO83&fkL&_ɉ's;_{1;t:S;`Ŵйsgn&N8,Y¢ŋ%O?W_M,YK/.W^y/Ͽt:G}Įyq-̳nd8w0 Yt)g]vo<׿ɤ9dY^x>vm7&O{3eРAhL>șFq_pY?ZKy'"Zk. յL84x v@eO҂H&;Hys}lrX'p86Pfk>?8^{5f͚z,]_~?:b r<A"Ay'bk-Qi z@y۷P(PV*qE @_<455EAbɵDH(5HctZ~vh}es̝=!efmޭ@A IDATe'rιQ(بW/λ1]w .8^Zk9`:ǜy\|ŕ Z؊5f1Ev;Ə_[5dЧwo1(={=7<.Z^ȋ;jkkyGm( |,/^LϞ=y6l3ŵ\̈́N#ӣ{-Er3w'Oa9 2)%V.O<|aʹ뀸#ZDySsa:TJҩd]{3%---xG:!!AAetKK ZR$Icr09vd{+Y,]vC457өsDp|G1%ƹ߰Y՛d2+ױ:Qp8p|SR7>5p86p8Xk+ B6;[kZyZ/!egw^<&Mweb„ h5+m8EsE 7܀RO?kN8wc B͛lj'رcSNh7n})K3gu/M7D:&oՀ /駟rG|>*h]'RJ&MW_T* 'z}ztp8|'Ӈ:d2c Ƙ@fP(!=zSN!( ,Xr°aj NZK>}d2mDi׮K,a7fѢE!Xd zcǎ,Xz|ߧ_~xǜ9sܹs1ư3x\n'j;Ny}!~8/oǏgȑE͛O<֚/e˖xGXre{466rgWCLkQJ+0w\&O΅^H]=C9wܑe˖1w\vm7~_V[gy̚5vډF:u*fb„ <ٳg3zhN;%H)Ō3袋zܹ3}eeC^z)lsr嗳3l0~_tRf̘wIE'|SO=>SN9FonfXk袋H$S)3#Gr]w30p~mnf6B掭n~{{TUU}~ |pIWM!rm%9QNږ"ζJT5 Um3>K|Mʭl)TnlΟv7\[ŚQ:ѱ_BRV~> |;/|O *m]֮= hyUsOn=)_)<To p]w-[8hXR$a@X,{pe{-M455rCJ… 0DGBgL'HpP,9hjlXk8yǘxA@X,2q1Ɛmi_]K*-܊;BB@Uu;x1zM*aŊ\wݯ0a#w݅O>ǘN])5\yÖ[nY*thߎ;nD"geʔ);vGL"wŃ>Ygɡfs9g#<9b"എhv9k h*Դ箻晿c;XZ * {Dvr`;`isMuYI&N2B(cI49t`@JK]*DYCIEbD@bxJR9XQ&"ʐPzZ"XP! i0"ħ eR VJH ,Z#@Z!e,`c4ғ(e^Ezlieg,"@ E"ddBII,-R+/7#5$lic+xDF0ҠE{$Y1ϖ7k6cɂx*EXiQ - FZqgn Qd%Ica"³x$Zl|/a,D^k "V[<,j֏G4V$X!*庄@!#<| !H$F"Sj`ز!FHGH#U܏(I-?~=A\ĶҔhe0Q_I+< xd1 %B }H'ځ{4H6"0V1A WB( U^lNs/^olTWW3y~avʵtڅgy1c[\ـY| ֲ{pmһwo-ZD2h3hIZ,RJ}]?{35kGuB@)EmmO>h.R),X@SSc廞1`@.Rt҅\.O?M"䥗=>=p~wcHR̛ R ("/#1cFU.W9fSNۗ;QFHP֬ZWA9(ZK:wFkҥKw}ۊ]W>w=cHRX 4V#TH!(AGYPƳk"/(a|R#DBJ#%!#iRĖi!hDP$ BcBA䉸S* B(dIh) O(X B$J"%#m ƣ(%EyVYgRGxXwҋTR%J*U- Ft̖f2ix$VbDyRX$Vxh[CI m-bC U#DB"F GJx$mg 0x&Y%R!,xжVS">dV E,$*9Hk=0~,Ml=1FISPf!FĖ !c%gG`%G%kU(JV&aD$lD"Uhh))z H`(||*n*[cXXI$dlEVV[]RFhzD60)[RXBal15$Q, KbF#Ax>T!-@$&QEVV#AD!clO'b+H !b0[D6 ,FHPb ?t=-cۏhkTiae aIQZJJ SB0P&0x"Z24a,`Q")TeC<+Ee KBi|<<|bc%DZ~jX ewaǢEijj"c!" bi0'qƱ;{aa .de=vgԨܹt|DnPȣuwlfl  s;w&tX,bbuLX$ #?_ӧs뭷RSS4*tqG|cAO/D&,[Ad"*JXi\\kFYBQ(jITHB^`'0`%RbǎFҊxf{B -- bDj%%V(0%7B[IHl/Y@DcFX.AJ2Jz`%% B,S2[ |p?@4&4Hex#^eٕGX!@Y#u)FIDIH%J_L(,qMJUZD`J2=RbD>JDiQO(bېEXAEIf}1B(kB"b !HP&f-*X(M-C|-MH-XVJG,/D'Tl,߲䂑Q,$h ⺲ ]YkK4 ebqYM\gKQX(+e0+A,|C[.EgEGkD*b.=+# mG"!=M.=Z%VYglRHKJQleBu "l^Vo+tɥ#xMlt)::)X]XndELX[̼&`B-V((aJ_.RlDU('~Ϫ@iX0BR3Tq-^ݻpZ,`/׾e_O5{~w7'AssS)NGN+KbEtTWW܌RxSR)"{7UUUTWW!l H&D@k ZI?ɔgd2OXD)Ess3۷:Ѐ1򷵖T*EޫNc !BAmZ)I^Y`>) :d2%WUJ!S__O&X,)Rt:[Ե&Ϸ ӯr\vYT !oݻwon s|x󞇧<"v%H"]rH #W Li6,$*bB(GvE ƚX4XE_*E(R|a"@(m+[Y|}V*D:RZ RDĮ*Q!6"Ȱ&Q D'|] $J@{7xz>t HHb&JB ZM4x;caIH!*M Xja &hT݉E(9gwg̵Ob>:tVسO5\`y0W^4]z\TԌYkDG0aE3a tvCdmZ 2vT VVChEn(8,(o~'2 э[-D'ӡM_h\bM[u lUX.,}?0;70Uk6uT6#mQKncHdVK|WcldPl- dwݰ9Kҵ8i;TУ(RTNy whӐDUsЧ=,v 2`Av:1/,pQޢKa[dX^Лgc4 fT{q|n ѱu_Mͷuy]<.ʝsdSd&ʈx5C]WB|ӟSSz_8Wtcq 1Hy?Gk1{П'?ẇGf>?w??>\ ٻ_Cvtp n*%zZHf$zQ ۤyjȥZ:N*Œ¨r<݋S wiWxIKviFy]D7A/rNA[Px4Tcxm7g%q!,R h8sYP km`1AA%4 !hڂ*{Z.zHLR-B[ؠSn۴`VEgh!k3zq~Cy w0c hw-)|KZ ӟaN 7ʆ(X656Bu`;TJ.q5PIJhQO>\ 1KKӜ=gh.*G$-CY1[;pǦ@Q CWr9n=ufMD1kLU4[C[bV=E=/AW'Ǹ`.|W1f<ڐ"9G_\Bƪ{YMmx*H.# 'jO5ZmQ}WCۢ6իW|7}9>--2yy{x-~ġGȿ'N EW}b]Ղh 'D(NME J+xu@a^zREty-P5;InX\QAcl(܀8Ngv֨9Y%TY|vZ'5<]Ib[Mb6~K$4g?]N+c4BF'5T,X~Uk4"u IDATR.'-ńX7dk1f?i_HR?z34ׂz%s-AԠ7]ܲX<[qV="j5S;NEnܻEgt<tߥ€'eB kiW5:1Xmgphayә` QL1TKw^C9|PXvDH[RVekt;g)/19Jx,==nT}HD&5bmeƘPkpkbWm)dʫYsP:~#9fw+5;5']6QnUͭf$F\R) *DK.'}cBŜprە]Pu4%w j锏ڸd/j6ш,8ZlOO|Zڈ\RO8ԧ~~ƟliMWeh3ItޤɁV-vt}. )簛:e>!wxKcG̓;EPћ y}Bd7MsvmmI E\O)m:(cdyp\!Quҫ$Ϳxto6FsNVP\ ysv0vG|8Z8Yً>c|i->]_>0}7HD%[rvLaOdFS0"&Dĵq&E2#Sn yfNF볗Q0 eóhat)ik,[?2TjK;!Z-L4Bp{8l mx, u5SPKOb֓גxKpGVq?PWfXk )g(2YP:o,8DcҖybVCMlMY`OCD vul'Y@О\]k~Xh;̥[.5Ŵ`F@w)/n5pߨԵEzK+łV{x&L[PʝM3.[IOw9=*"٩2 2+60CTϽvcv2N:e7XSl69+dPs[,4_vLF۱]s~LZ>u~s>PMPK )z%uvSA##C,KO{~/ Kr`gѿy}g4 m-F3!ݥ1;0'F҃4RW ~De< z}9C`%׍ V7גǒ--{l▂͍lay4k+SŽUKt(hNK(<Žn <زI4͠7ޟCOYI=+a-gh? 62%x4E=ٛEbReֵ5َi$ 9 AI@G3y7 =P5]hkgh&-ƍv'mۈ&rYqv;.7URe]PIpcUSJOq(8fuQFdAѢp% Y!BCZB1-L>iHY9^8m/E*1߲S(K_Kwr o㌓݈lvoWP[9QޛjφSD(u75*k4.%ꦛm~`l&2L2:J)MwpêC]n\ Gݟh;Xm O`9Ϧzs9 +qCTgE-*6/Sd.f0n8K+ jl|W|Y7ooV/忌g(3B㉲{7^k]nIIV `84 : f׈`_`gR6|uH#ZM tQM0d[0ail舤C6nI)zDir>iīhFwٔq u wgXt78%#&oO-³ƜOONm\w*^)+MȃݱҋX7V]7&EP_:Iן$?v.R.M[,쑬I,AǸvCVD-SzZBq+zMǝ۩XFm4X-̓so=CBMJ) z(8J\AJv̜SM4 "$-$2-J+B_t̸3(V>MXY,xӣ5[DۧzOFJ|}b>jb2Zϡ>Ɲ&,pADkN1׸!C!0͉Jv'OP7 0Jwn|RKrI>Ek vO}YKnxM}d&'&F)z(߅.dML^BRdV+Xч?|Kacm3l%"G=^.dVUKti06rs^ ^t˞Tea|-6Wu7Emڷ6z;;mQ^_VsaBՖy6(}?vl3+=_r>J?U> qh֏"=dcLn{Hn~+V7n 4e::cwТKޮ&jktWOX퍭G&g$]¾Gf@Ԥ#BFPcϮ'FSyASFwXV9ƗkZ]t&  ]11V/7#lGo$~-0uaI bsZ?[&o}ZKG)էIfhݎ=hȲqqM9Ǖ'qjA'Ӷ](tz**)}嚼bGڞY.Je"KToc7 Sy3km& P<K.u})ihsJ㉵ÛS-.T51Q[ qJnɟ`峵q=?TgE?ۓ8|&i:l,J^w옚„ -L;|/|Xn U:[QKSa<*dKeњ=B'uOeenz?+7`w9@},AZ$bJOS]J K$] ZxhOTӔy&^÷'K j9=ZB4 !v,o"Ia&ƽhۅ=[9tOr4(.齴uӉμDC\1דSxz#XHP u%'X,Zn҂\1vJ_c:&It70@<$}ROLusbٸ*'D父ˈutе5&(#%MoU$hL=pNYr+S9/ɛ<$q 0kαv}TedDS ymtx:sDk0ŮsW}Wd6]ų\)'k2ԆMVc'(PYC]4,BmPB;F*!O=̤\TaMTF[Ȁz=9dDM1hkϗ[paXDxbhy3d9˨-8h)r> 4WfˌmJ-.U[&-o6jَ}=Bezh)Cer$]|옢IuN,^EϨ=XU-J r0{+fцמQFsJ\7sąz:õ[\X61gmIOՁvֲuҏs٣]PLGM]ҽj^5ݓd ChP[q;e_cMBrBv֠W5ofdoEM2V1 iI㽄MoNMN9?֛n-ФFjvU1~tGޢ;Tae Y׾\hb(ˡ2A%sT'p|zI7>C0gӋĸd/N-|KBxuD1 +i *l`*;6KOy&ͳɫ D?9͇"4%uԉ@AAou0og8ԔwGcM]{. *EަAA(Y<M57?$~!u84 GRuๆRٜ&^]AiKSbzTܥzazh-Mjl[z,Lm<+JUI'-D~qg%;rx,<>4qr8;LBւjm{Ԗ06߈*G{B= 1a%7{10%ƮcK!de+*{*^d:qPH"664Y9CE倣V'1۠wJb4j" *[tۤժ.P-w~EAIzuoyP8ҐJm[#f:Z`͂3{Sj=JTܘ\T5dI/>˙cޠ;6z%)\r59 k*HgAlQa}uJ>DӍAnx u ^<~uepe q EM5Fyߺ/Uxt*zbи{l3X<՝+*oW3%i塉DHcz}(-@ f.>Ʊ^? EEՍ&j7) hG6c7AGO+HcPSX`=AijЎVVi׃lTDO->AB1t@F'cyM$N]!mt0e]hmbpP8hV.vj/"=9Xz,q@xMU"+Wr" PXL?;'`]oL`D/g .FL~iF0XKbPխ^,ւKlNIJՋhR?)[en?Sj{H˲и-<''C)lfbSZVJ=- zx{QBOKZʤ׍l'$;n!2B 'ޓ#Surнe.%_ >A(\B I'f(4yW>k\u1rNo=46@ z&&oBujҘ\Mz-m,ޣów1S}K٦jW PW\xqTX&o51ogԼ12'V0Su'C3؞&Ft9MF2W`mc΋'{)؋s| Y7wcтa5Ht_ma Sp{,n1m1 >'6V2NS*7DQN߄xLn͝+/4fPuW#̾Wy%?1=U9%m=\L$*I0F\"C8=5BPbOHi!~x.q5 A B ,um,'F*+z*ME] 霉ҝb-5awω0z+`5e'k%E_Z`Ҧvu4AZ!JP+xev(7Gĥ:uo̽&U[gQ0+ޔlZѐ,~Y}j\Q>'r܁3<˝i\NC%nX[߈3؇v2|hvG`wOog:Ԝxz#ck}kSVbdp>qq[Ve>^N%O*NRƜX l`2?ZTyr EC"X׏<De/e:yT =|E5ИvrDMEZ=K'=)K6vB  MuৠosUO@OΐɑCh1%]>Pgnfqs\)?m`O3k|Bʜb6 >ˉEc_ӭeJ tnd&bzbuCUQ#E <-# j- S-(LTYqY {Lrẅ́#LԨۗd"` ש{o' u@-=k儻Zs2:Oj]IO=rwUqƳt+ WDN 8W$krZ^|wuHɨ:-ɬTaO!KẏKN=1|LކQR iXxKK299 ΍w?M{,JCሃ Aݘ/cV;7ۇ Ķ{4nN#*P?%Fzat8ƖB ը0 ]NovI`|P'5y4rhڮ5ID{OZ,rY [Z:iHA^cѐ.FtJá)CMϏbR,5AP>>IG-S1vc۹~睧ɗ|чus'.bzD7Aڴ n,:[E"mL;ۈ6cl6P`} p<,1V8' *=tBZxxoX49"g](4WYc>zYqR@E_M۲E$p٣}Bt [;vb&+j qGcg%MЀY(>7&7} )&gQtKtivD,.:XPqJܼKUkYW|}UL% ڊxAe#&qc!Hgi09#tnm&V(U zbheIUAEs1hY4'7U {p4c Պs*]pUX,s iυ[*sO n@rzT1MLg i5&Q9WuluG48\ICAKs P2žd+@!\14Im2WؾAܨt u~I[>92ɫ,BsnRNB`n /Woen̓qV^d 2NS-hH^o2Z O H]=eh(7Tj)?&tZ>6F~rW0ιMx/Mˍry@r.q}P*>1v!{G3Dڃ$ʼnA{w%/pV R(r,ۊ Hx)tjaV+t J;d/Aid8Ú>'UpW MVPx.wOҤ1ŻYTEُt]] _|W~lo*vq5#]ywl S@ۓv6U#,̈́O~w"1޻'ǖ&B́˥ߤR8!0 Y1΃gPo۴ʄ*TXP([lN k8E LNLD{ WәzS6Y0OW4}k /h*ߛ %av|}F+urF$AWsr/: &{8RIByف_~Y/k9]9>xt!F<ѲZcs.&9YSJ{Qޣ _ m ո3x3CmЩPFn{rzTQ5pi}:yY %01,k-#~73__/?Η|/૾jtOz]#hX&c,6;Ї\$Vx;鯯fE#Wr8GEmƸ)c p(& z xd$$B[ ?VMS;!D*4H8x@Xͱ;7ooxTzw}}x苾c> ^~ywyx_e_?8E0ۍ~|?(Z4_U_R|< m~(ga)U#(\v$/s R#PfU!w7ׯX/^]n .gG1un'b8WB'?ɗŗ>x~ۿw|w/c}|ͯ||)KwT7.~/1~կvyq7V4;xc'">ȱxeˮ&9] < I鵃g?ЃO_|=v'-Fԙ߰P6A!28LP6BA-QvzD&91+p;j<ȄLָL ~vJs{zbl&;45iWy]+&/dBc6TF`y$,B5iP=SL6_ Ar_E⡓~b%BVf;8{:Șt=;B,nFVavfKuWڝҗ^csl>b˭z?cKםq`TeTC^J_ JEm~wbAklk#atݟ<8 ~NٕIȢ_O'7Qr,'jaڪ]NM#zJ5ۙAr ijEͦulO3X}ܦ L-1t޳R2~WĥK[Cu3ZIOi,8k ̄NAH]g 6Z5rݗ7QeS(lteW< <=4-CvS;c}K=+5˗/-_?o?|¿wy7:ԧy8~/w5_+ ?BCP͊bݏ܏RvZW} U[Pw"Ri]ubvPt(W "oAmnDޢP}3^]9yE /4j4W)[MMᾱy b9QЖ((zxj>gKmUXT<[PsKƁCRdŲ<$Js]e&ۧF" =^O݀t+=fU๚[8a]j`~bMAr=Et`A,9r$+`ͭ拼'B(ܕrk+HTT5fǍVh ݛLex/,! |&kQ5 bъ DS:or]I|6>|G+$z8fkk!p=jҨ1a4giCTD5/1_woݣ(?jA=Xrhr$mNm_9C=M3TAR֖VJÃ=hARIec0 Ywr'AVsPlhnt$Oo0Wl lq5*&QqŰ|ʱ*n MFQ=c${~wwk~ͯ~4goM~?Gj.?}Cܟ ?ŸիW|/0GƋ/9ϓׯ_}7s)vS[p¸awe!FSzH{I6sÌ8Sx'\9oU@zר{w{-bG٢ʩ1i},/%Ҏ$Ԏj7CO{NNf(e5-u ғDM͂WLJ 7j' %cJ9= enS:7{.b:p\:l蔐+g:҂6{hISm~ϟ3HƚY/8j)$x)z}@γ'Gk`V ^;`/.wUttYPR{.GPL tsάB }֞ 5i[2f.,1u-_Êj²F2s|Nk>}T))7ܝCI>r-:ty${DmW o[k%ns%*nɕ쨢&Jϒt6P.ǧ\b&m z#RuFENX1G]IȊ+NrSP y OV jFe'>l@lEֈF=o#;qӌ*uuF,`t}om7%_ oʿ~==o~uDI3C9| ~_O|_oo[W7ߤvi!Jj.QhsоY}dVȰ %J lSe;~ҹOIdBxOCYg;еz`iNWmnUwd_ˏ3IqfVuycd^ץRrj US:yh'-vEƞ˔i\+ҩA9=*"&w^Rɺݿ??ͻol^/k5_R?gtrm߸sG7m[3=|ٗss_3/u{?<yփ'e?#?_Ii]p:]ЪTjVCT i/⯓.eb^H343?sW d(eT뱨vF݄Z|jPʅ(>9 nySBN"Z0`X8攟B^Q],Ǩ(iXՊFkv|ג]MOUЕr=EmUKu'UX82*6n!^BT1d4eaUkzKsZ-gLW)4_Lt`c5::+cY2,f,izM Czpl,aV'S*L#{h5&:nFy<@"&(B2$Ծi<` k Pэe:Z4.e! ֨U eEҷy35ZV;ֲ^b4ω+Es1dޛK#vsǸrQ䡚 #KLlZ1w $\[9 D^wjΘIЬ錘KIz<|Yj]E"g;1mk"&>;9hi6-61T*IZ8=Wq?/_jܾq:XU?0֭[ӽ̸3xGh]=3yh#`f\__ӗ2+g#gPQ DAj2}lܘ,gfaυ&1| YP@h%Z}+5%}Lљ\yG[ &DAx{LY$K Ɗ`e!?GF>Ϝ?V'nj 'OnĴ54p?P3,ɫn N|V(ͤbѵٺYekμm6奾d3ȼ)IIA@ tPKYlb `[R,füsR7h+1eux ,A̯DBZZvӚW~!M̮a1#8y@-kSy!ɰ3JȗyW笧oi:ziWigaub3k8UY9XX*]L`aer^qe;@1S!URwmxAxEKY(#"t"xn=v#M^"kztЬQmO7Z֯Yqgnݜxp#[S"k&e}X9ɦZȺdH 'G/""RRf0"%`+02Hu]<63Eb7g_J$UoA츯dZE8a|}^ [oB_*_{ Oh-ݧEHLF_Si.Bo+!9\E6Flcv#m!͘:"*M%_$K=э܋[ ^i'n5N6Z*sg y"<3C^xy$P[i,?mV UPLiMUge:d!kMRx7ĐV"arCkKE=DZc:U|TkzALZN=bU/8(\5TǮN&@aL֣u4慵/U8I%ƪ"I6w޼lBxcE(1J[+51hy#|8S5<yc'hCəpQ0հ>Z)E W(ٳ)cK aT0Uk;xC]^bn&u/`*" ig%};.>ۃ՝̓;= ~Jjv,<:;wt;wbJQ"rŔf]ްـfbCWvmF oo׽{S-*+_'}ҳ>zf u`<247e6o혳W$6l\a tX= A j q.Id=*6JԧE[wFf=P?lƑ*dG.Ť5ٰY_W+CAF *-UG: V_- ,WpfX4|ylƬzG^;$8v1= +5eŏ5p| /U+CJCkA/NJ"ȦU s$;l+xZSV)mԬZZ3& 'tR%2WGN'ZZUKIjzvV)r̍j wK=2Z: Ţl~MEKSrG%Psv1QPZ^pj8C q`w1~ 2n\XsJmI婔o$FJvT9(ZWn ,>89`q3oT+@q҉p!>q~2C,*1;/xquuo& L+Q!=v}slt$S~3EPk=+э'?(OaιV9fa̻"~z2aCΝeQq-:ibzpR{+ݘ`L=& yn׊{5iBߏA: h.rI8$wM)'EDzMC̦F&5H99j!QUN5vaSI0=hwu7 [i2s* =&RkC"f,aXLYd[pit!3d8 lz)/쌶 'NehVMQyȦ7QuAcc-CK:v=+ $1펖iUd2Cѩ+ rt])sHvCK*soCP-&-aG%^B&ώ$ְ݈,RD`t DM)Y3湌N6TRPZR:7zʠ%sr)kLQ`3lȓ̢TM{J&zlj ) U5mTrə4 0V%L JNim zTؒNĎV sd"ߎUGh& ,֢qo%&VMjNPQkf*ԻM*n5tZk xRvT5 %|Q8O+f̼-K;VR^qu A-81+yW1EMnՂ0i*v7)I봦NWXi^)+ff74}6>k{G@2Pߓin^Gs>$ +-/}9ayRt. t%'mxR0قP[ vK$n6cg%NV4r./)B[D5]ԈKަy%rD->nqn>eTXp'#'R7JP$3p[fYmiH6#3˝3%k!$لV&Hw#Cw͊[R%I?3%ߓT$ڢb欇{o]'zDZsB"+A*0bhl) T0*$ Y{5INggR(VbyZ71\(E29^&"LDjY]I?/r ,g֙dހ{q\BTg^ܜA/֞20ZO^ SKH]PȧBt;ZJFu i٤~Prad@|~*c9y׻+^񡾮}=|>??g>ե$^5waf|}G}O7֪W<5|&!d|t"96;-;6F[.O#j9Xz'rcѶ~_kk*GW\[^ᶨe7n-1ֽʛ3(zJ:Yd t zKk ŰkϏ3DLEjĐQ]re`mI:q8`$=']J\aDZQυˌ\\DNU٬fR 5ّD [Y4t Guuڸ<5Q+'mɑ>2ʌzp(3ZQYB+*ATAlU")Δ%RukMҤh0GFH՚![P,z[];@JMq&2Vۻհ+mw !` bJEvg'b,Y."݊r,lj|lE1iu@@"-QJ컮PQ 0ɖS fAΩ ][m1n} 3cH9j` BŢ4Y4m:M99' |{替yk_˸^ 5x;x+^Q+A?8oy[xϜ__⻿y_/3^ 5~׼5?S?+_laύg1I:&e3wm(.%gNS80\J7@Kj5kyc $5 Ly8ZXR7`aҩxneޗ$߬cኃ#Z?jUax( $򤽽z6UT3IWOT8=)G4+F.I*4,&i=w.\c- m֓iwꇚIl\^"9Uv%}}5KU R5VżbZYuG/"16flwiy0<; v36G pf0hl&EyK>'{ ǿx/b~ǎw/E/zHf7WU,²,|eG苾l^җ?×ҽJk9'?0__A_tS 'ַ/~1oy[xsAI?͠$E ٖDLZuM]I+c jgGxJ %zSS6)EƬlx7Ge_*8JcfQ^R[ h/SIVy0v7zHV:]%K ΖXr5D jZL|J&V`RCNkCCϪF1Fi)0cWL 0K" ;G0L0Q⻸N3d@׀Zo䖎XI Xqz!tia:H(idgL%2ՎĝBL6)3M=g(ʹܑRS+J ^i Y]$rHv^"y:!xaJ"ՔjjUъlɼ@&S& s2Na:fɺgcYklYD{ɝ5&I<}Okd/?fGg3I IDAT۾o4Q{}ܹsϽ>O]'? ~dбz3oK|=NDH\!R唭$B=ŭgCX+غRT~ ॕbR4ɴZC FzYY;?Y,)\}=2AA /\7HkhI^: g *+ vN^ Hr-rsglȘ4NeTD{iƮ7g pn*2IV&zǂ#Y42v@UkZZMsjEˡuޕtcr%}HE}^tv?qyW,[*6\(z|EURޱƋ{<R&\LSEý3&zD 6DV={L6r9KC¾G! ,%IӺbvsjלGݸ"m'Rc05;tW[瓛 O&3؇ksow7搓SH,u*,0g@1˷yM#a--M] c2kOt~Wo1Ν;Η}ٗ~x.փ>U_U,>zֳx_r}}}?s͓`57Z~xG?X\p:v?oxww1g?s9xj"7vP…+'* "-ȝuRP&ܒ5R)\;kN NÙ}*hn%LO'9+``b޴FA^ܘiXVVF ̳ڦN?3'HQIu.KZ ؅O=WRf,ɧ 6A;{[.[$Bi͹2ӫ;F(Q+y9}n$3p>pАFiབྷqVjI83r#e-dY9e4_ʌ1{k4m=`9dfyV}٥0 ))yFLJYZ }&$zAř}UL٤κ%ZeE#`~x6=3:ne޽f=CBW%u~ 1b3Y>y˫bjPka~UPs:Zz11*Jg2$vBS&K/%)c*8'<1h ٜ"Z-Ub2Xr!ڔl{{™Wװ,u=quuMox _Ȝ__5~o&^w:uQxoogx_w}wYx~//g]Wx~=J#<›fz_/ß'?-|"W 3z7__moDxa{[Ҍ sXn>ș$l}'.u ]F&=Kɝ i [?>?•_}&A3ƊȍlW!h1(VPIҫǢW*و3n &OЍy"H]`Ե2qyTؙ*J1=9]&7Y \s#.jgMZDmӚǺ+S3v4jl9.^XH;f򂘆mPrcwLV٘TآiښH9X #{ l^ZqS"n;WhS2oȸ`g"*yS1*W1EkV{0ۋ,"p[uiAm,󌱰W̪lr#8m/@cN(/[ZSkJXz;iMXXP}f[EtaF؆3I+zxZـ vc&ag+}t5c LC/{sF|-IcdZ^qmda 88OOk֝9C)GӰݪtA$aΌIVW;KuiM}>-HdFbݶ ookk&N'2|)˲suuw|E/zowR{,}q>5u s}};>O@s003^|HNM>5vZɤd`m^ sMgiQ)ϝ1))`w3lp0v77Ŀ{?ן vw<s؄bN8d;hRt&;;V%Aԉ8U,668YJ p(ܵNꈮmtW6*^sv`!Կ?K~>juh9dT^u3"ǴI[mWnJxdt03D-C(87^.V'J@CF ޝѶu~(oX[ܩLIX?;ٳ,Yyd0ț2^Üag=cyRWX1J =V#6%h*֌C`ꔟ!( O<}WcpG#s)dEam(@qA{r<3ݴ:<(`k D N[I|GĨxpN+A~{_G,tswUxw?dg(UEMw"wKGMb=UMYC O}itsYn6,H:kphXBۯ[Qv¼ֻ̭ժ ]FP{' Ba9ń$bW!d)yI Y~_x$+ۅ;I{LJ9k rѨ2BZ>̶=OW!_ekqK. OZG 3FhX4D]xU+zS RE 5r5ݫ= fKW4a̫ۋl5@1EInM6gRXjf0EjVQEF 51H_F:v;lh/l"5Ns}䄺#˴<3>)&9BRג @ӟeYXPT~g /yS/JUhJK| d22Mqb\ " *O-eV0TuML5OfJp*ZU8uh#`NZKD}CE8Rۦ6ɐMRW/VxCq( SvTt~>*/ye{uJ5OgYfcISJ l9WQd1f<ק%НGځ`s:KC&=F˭|&D{5fYތdTQb*2b ˉW@vQjсQf2)fST7)zF+,E7IR̈4=sУߍ*̋.^@0@_VYk,3(l̡y![Jj*#]mߙ<%Q2Q`֘U|D)-dC Kgi Z ezOCFc5||ɒǼdz|ZAP̯ ɇbUn$u)#!#SCw'*Tb9  '"κꕲ4RjZu/Yn,q ʖ-6l RhRVR0U}5c C 5F - Ӛ_(5 _%̱-&KPOt[wed Όv2mYF{]=]!v/o0 J]) 1؊UJ{2Qx37qC˅Z:XSe Xd]3%M `_h1/ZkDO4}SY]lPCUEp6=c VY;[u)9].qGy fU!,)㘻?<,%9e ٝ74JRro3T+7e5ZP0|cWC"6 {2Ad6Nn:}U1KŢ^S.~bZFeCNg |jh{ok[]y9t~`ʅUȶDRrY%Ӂl4p:*(7Ȓ ]Tj%J;t:={9'1־P ώ ȏxsk1 Dp1)'e~4(܋<_TdذqJ|Aq۬W#csXj}AELk3q1&\%e#95TZ1IHSJаȚPwRpwu AFK A5a`T^ id&**!66Nlf@옽x{":KUF+!3h-1$ ⿌̈3U Qa'?IuZV뢷mUd*e/_~yg1w/"?#W8_NݗOԗ<7GSjOq‹ B4RD+UhP1o lH-kČ{.;@+GPA^-P !wyxC/C6Qar͎e~e,w1-< NGǼ7b/ C-hVW1}tbsP8]:pلLxdj DiW7F#hՅz& ;7NAT@43b{Vv2 8`M ؆j=Z6M i7rk%LLc6}Y ?fIzz@3L)4ލ 4[+m~M&̘*{ vi?58Qo)Ƒgc h|EEF|g螰6iwް]]B0Jӌ!">7+ Ӗ2ǣ n;dJ5R7l½c?IDISF~{1d_S7bpDfƮX$|nBI96v }MBazDG05P#yꭷo___^>/1.h_c1?6AGmO 15{͖j0>}cQi2|B < wDY&&͂J>vMzXHehSm:O+1dZ3] ^jdژqJlY^U?P 7 zӷoZ}U 9˿/ax胿4.K9;i` @IQq*xv[_-FH0Z زdv m.R\yvx^)aޘ"3z&K=Vrlofc;0K:mQHu ]]=!ȤqI/8,3>@+I*< K*S 2c5)0;Tiڏ*uS%JY 4F`;iӟ5Sֹ},9Z-lʇCuY Mbq5o ܠ˰kحvQxڶÚb:ʤ<= IDAT.m*-J7`0޻vxYf-#9d8'[߁܂clc{c׏C71PO4RIF9BxBlhlP7 28duf056_|p_ Ď!n9pb%0v@Pܗv&A ؃CO10F(0('l+%Jʽ":!fz'1u#-2x$:ƺA%j6gZݶ38[FGn@vqC)2!ɃXl G]2U$ Vd#}dl P=;v0eh1I (GNdx5qs`) J^WʩglRX♥j./t0q,"X>ƕW OU a4MY"d{{7og#qs"G8mU$z.V F{hx)X#'?SO؊$)ir{~jS f~*076 Y5Ysu^"sgB(4)=f,۬PdRc~>im?n6qXOxh]LKY rSG' !~>ɰ!"nlV- GXoMB7gd '0 sI9< *_hExmozb`pFLcG:1Ơ߹L@ xCRRgk)),2\ AAw g)?#AT̛b҉3>OmvX'!ym@imN. ȕـR:OJWJR&Fl]i0;d E~+4wɰʉqJc5ot]lE"6_i7.Rm%L`qe$~fJS$ԠaHdp0q~]ZO%L2i1_Sތn.ĉVC%L8u^%/Jn!NQooL'%5:I/4WbB$̕R&!{7R&ioഃ V$vF 4M02'[#3o!p|Dm01FoddA<0? +>TH+Sx ʘ8aQr//JkXR͆w>A#0'W<'nvl^v{+X3 kaHμ<%I!bV.ŹY,U6ؕTJE_d\Avא@H]FHzh:\ x(ȸhp X#t;XoV5%TxUJVj@4J8 S>C;> ԅ,lힸN3:5Rl/n\(S}rld@eao֯z* eiM?BuVw*"jx`ؚD}Y1ҰώlzߦTΔZė)O ZⳐ b:ӀW ;89LH2d5Q0`d l[gkP_+4CG9T q$Q\>@8ϓ'q1x*5ӀO\X&0펲rJb^d[_-g&ܚ{-U ЈнсUu_p2`ABb 6/QJRiP "&~ ݤM@0]NʀR7NDaaĀşXM>teԤdG F~]X)c𦃎Ӑ2cp塡W`6Mi7ųbֺ-tn"LGR7BP q-$)7 \e\ bfLd?;/Hj(7ɫEU ަ}4.iRlky-WcY,"c4i'eM*Iz-*Өp90f]CTlBԠfH:p*2Ƹh JkpwTߨhe}G"#BC7:Ou AR:ZhǥUJL]av~=6KEw% 7'wr c4 fZI^å5м|/O8?~ogވsk z mwM3h)L>lGx_=6M  ^x|O|Kx Q (& RVAX=Å/&{ppA[R],%f'܌71aVf̂ l|8w1u;/gaKKV=i@{`uGxyho%T\e.`XURGM†e6CB4<1'pmE{EqU =Sкa<.,l=/ɮyYbL@[` &ԠAsIaA}D;P ZEPnȴKl?ݨtqk1]JXP /6|ni}N4mRxލ %ׯeozȞ PVb؆y*6Z{[ 3V-h9ZZJkTp7?5bJ2LCL+A`%]c0DDS8DH ڃY?ݍC+UԨn!|ӟ4>G4v cLhVB$aPJτ$U*›'bJl̏ _ 0#Ԯ&Mz;Њ{H2IEXs֠9MX+CD}c(~0 *<+@ޓꗢmLˢ',hjUZhbՓ F Hb <ʁ!e2RV6M>M_o`u;7Uup@ U"bhA@C<%Ifvq4Fe;Mq, ,E_"2FNZ"hT s2NwD&Jp. X/k&SbrRr*Յ!hpTخڒ[up u(@LI1i$I.0$D;K8dR9V*LmlM>x4${z`ɾ9)@p86 _.2VQWdLB(2WrL@N~L GE"T.d8f554R9H)q}4lܚc93 e<,ѻŪx:u%Zg2D:ʹR?m(;#49>Bw!6*?펭 4w5GE0Lla#u*5r#rCRÈHPO@4mp/OTYEG?~M̾c'g3P-U )Q ϐ Y. 1>!eey6D^k+5]mV'h :Gs$ pvĨf1I%Dp˨h5lRg;pT{Ly0h}ۦ VfAxc: nsyD94P^d2׈ҚX5{8P݉Cs<,YvUGAN7tS?ҩ+MF4X;..g{>٤./Q~µcU͔!=p%H$Ω̱b{MvuCl0EZSsӀ8tM }15Ֆ%&Bk,FL&NA9ɸcڣ dENrM:BAdR->`8H&}v;w.j ]Ss70-eލxR* $b6  pI~/#|7嚲@&"oc0TM,ei@Mf.Ղ5lЬ{x=wQ?)]ӏe(g+N#2?@24j(\ ^52)o3:JPA}p5Nd8nq'7 0&@p;&NJm{.l s%/Ѯe|mLq2ŚYY(/:AX f~⇩cE_ ̾ JL kp"`g!qp;YŒwFsD~Tǜf-ߛj *\4j^zvqa_0KC 'ƁLr" Tw*>k!d+jk+vKkvh<6\Me 8Yd4;8}&թ[it^S ʀcauЏtbTĹOxn8d^^/__CM"\8oQdq  ,Iv?͸Z'yI̬PONѰZ}'nWf'iii@y;0l?3|o$?m8eN61TO"Dm~L4ˇά ]v1m}vJS*]t:}P)ͣʃmj Ō Ѥh0AX᫺ }ߦٙꪩtIz7<\ұ V!t@)P6Y-~j {/DB/sG;tߴ1P{S;2 [9^ɞ''72$гFdvHJy͙:ԭKo ߿@Jiͼg+7-1RvqybehKpknZk޹2Bzkz>=X?c@C9"~ dfs8o>@gx4`+\^jbpu A腫࡛.@gvO v<]P@.4/:[a4ʵXB$9׌厭 BGm쫃tCi0w=uKqU "hO w1~two )>HZR&d(чj ^5V_JHC'dU`Lͬ VkNa'Q0')j_i ۘ s_&3N*\֦Ԡ&nM *>Zy0~ĚJ2M};?76TUzĽi|Sk>68 J[.ɮvyQ ; kU#ᥚgT*޾c>z5_o} W|O[5 v܎E-~pyK*;6)tT.\)&Q3߽5^>h(y`y>4_%Ѱzc R<M{pͤG$#ާ0=R09t;;aֻ1yc|O.7AS#&.䭌+B8L89WQcsY;/=m} m@*j.e vbtx5c8Y,GʑZ78P0yZu8%Jr=W3kR7b6lNgW֥O  Ok Alv=⭨cBTzRDD@^7}Z#\Fo g nVb. L+&j yYʂrr\7zTBJԙn&]=5ěbNFvK迉 4l{+.t@ZӸ2ቦhk΍^r#>$(o䮮d<5Z[`sE%SkaLq[~{HgIa@ Ƹ7.DL q -Y^\(u1`NvfZA`tcz0Z'T0%4#)b[-5ԤQy* <`KC[iaV,Db62y*r}:0A}] "з#YM_J5OҐ~X!Iwbȋb2mZ ԽJ18l8X]!XB# BOmH-*?e0jd &T; 5Xbt`5.0 A`ڄWc0Ʀ0qjh7ךO=a>6 ǃԞ{,Z" SN:E "I~Dc 20]m'%z*IS&0k Td8Na2hUW>?637Ҩs\9@܀>tؖh;UI6loKDrhʆhIYێ,Xf.3=ٙn@!T3crh' |lϳO9?P35p<)usgTuڽZMY^DgkWIs|v|{[kDǵHO6A{ ysH|i&2v^T\2̛ܼl!XmXϥ`r)z5Q2=@)"Ośy-Z {O=4[0P" fK*N̫=g2CW~"bߞ:[vWCd7(׫ܘ$p'oI.KK#`>!  8-3+}TкWk2@6И%a 39T wxSsB 4 hn,[MuNFA=MHԛU5'2DϭtкJFm5DR]׀2>\Hmf A{s*] Hгĭ(ɕi 4Xm%dnzpc(z+_+HQafs*'@)[P'1ld$#SYj٥|&+ "0te,pJTeeȂBS:#Ȧ5Pk2qyH:\>AOi+BʋnD0͟ibd3N>0c6㪾l`pxASjRǩ){ë?;b} hg3Q&):F#]U,u5o k\3`濍?ǻヒwy&;۶vw7 ^Oo8-Ѧva]wި@C7-tG୹Zq`[1&, dt)d`wJҏUB;3K'l<*6D7&ӧs㢳5įzŲG/҇QF/7_'a5/"c[73gŀYJ fZU8KCQꀍ ,R0Dy1z)mAv"ʱDDXQXŃVT\LqPcMaoļ-vRf#v {]0XK3ӟG/#aG#P": ZW>X.ϒֈ;oLy{ddXbug9`4Fφ6^](ՁٛVBSTDmg Lt 3MqgQDWeR9*esyzlbV^Z5Bk7\hfęع sU@\ktZ $-nCL$2boKp2& ݽ.sJ% `a Y| |ش[{!n0h Zpu.M4Pz"Rt mu $V:\-kfE$4|\ŖL@wgx/V #Ԁ:ZG/_9E-&bC?)*F72YB置cQW崩!ŗ/ 8epByg:\e383脕}!q*7>5Uk$m)+" h)0+%'DH13x$w:?KP?k]^}[4z\QFxfO~0*$ryLqYX)6 q=J *0KB3NǛK9[\ɻā^I/ڠYbPªQ89~>y4_#E0, h6{vbhΉ /iKmtxSj^OoZ? S0燐?)rh_~yA0"nNuOÜEf\I ^tԚ4i/{cW zk x׏DMUi!iދzAÊ9٫S:0-C.拱O YXg47u V4}B}63:ֺ(˯3kC ,b⮸v!W2'ٳxS@Jk)1x传HF] қ:4-hk!SkWr[P Pl:aJCZύ68ڀIJ\I @k%Ǹ3L׹qhwd6֝ @ Ѝeb PKaAc&b[p ]4G= !`\u.Qy@#ҳ_`Fo>,g뿆g<RͶ_|^VOo~X½j-!Ui,4ֵk!N&FzǦ@J2:XO]UI ap>~iJZLLC|VŰWqDQ7$TcE5S1ߪDP!*DH915T:YL^M'bЬlJ<7IZCX+!-Aҍ̑'55|";;(;8NU)Umӭv”"yxSTigL UTfESvaj´*Hc8vRJLFoL5lvUZcm8R1q\T`0pZ{8`7lsS쉱k^֧,Fau =S,@U#RZRp61] KZJ(5H[d_~d"UKqjk5Z(!QL&[N% (([W^#0O;#OC/N*p-i@{8xZb0.pP@`_馬UsAٓӗW*ΛV^T#5JkW̭&'mhgfbSz"zt<0`>Pv{K^X bqõd@q%BN*%KB;d2&$Mލ J]0S %ypJ=GQ]\LW8{",i. Qk-NUC7:yUztP$f~$њ W/WI3_e͡CX@dz!K@W^4XSVc:AkM^ s~| j:㐤> &tF&Us}4Gjt7F̑~`nDɃҹ޿^TE%}VidV);]mUhKFivA]۠tPߤכ ˿/|Cguh)m TiL۴}ǦManװ6`LHL);oJX&


enX,'NճYM$ל%r$gG ӒfnoUkɵiglb:sS7+0@u3DwR߁%"AF4͡eF݊J,3v;߽Cn754/T˄ *eֺ@ԾYp7PCbEW*ƻ4RnNs}H$a++X~1 -uu]4/[ԗpiV7|zSv\֙`NHOCtEt6:H:H"֔Lm- IDAT6aI)umj =FJ+j˨R+}Ӫ\rA[ZG%>fmӺS0Rf+`ԖC)$_(X޳;MQ&)1cs]y [E~+jGi Ƕi+:WTmkS^iᧄt$!;/ilAKYɌ%[(la1ϥo,힟 Zq0 r2U7Wec)rmӤxDc0L RmcEUiWK~<\h8qj\M}o\Ll)T@һ]>! ox?[OaO=%gg矕L.֔9(&yn2UH,*)fdcT%%j6 }$h^7mUJ&鑉ImFďXC3'D1,3 Vfwmh+QlhAܣRj)ID>Oƈ"kRZv-%%jՒM2py=pMK`^PpbDFu-D'Ozۜ8SWb +jn8s K, L4 W+}XTi؊O*UsaH-tp :gf< A e39صVGeKVJ?"uTPMoz3{/?,rsωa dVH%02$Ϡvg25!T+6!DerrhcϊѺ;:eod9J=S+Q_f ˎ'Z?krYA"X$=l\GR&ຘ@Z=cJf:j XvX֒Iv_?*LGv%-7.Պ&5T\:LSyk ±S'Tz0v$"z2o:_MVy'ͻ)%%} ȡd AdYl&濌ҷ^/i+LJ"*dR)" ޿*TR@мfϓ\V-7K$GB"^*+]dhtIPı+[s+CnFA> 3MI ZDhVHfzd 9-QwTv:cyJ qESòU/Q5riqLqlu+V]h _x f^xV;cS𑻧pߋVNh$G+?ddʘ=bHm/=}la۾'C#ŷOɕ>rwǞܸ\!}ƈD3#'sic5`êR0_i-q"QfI#tMe7V)-?AcEj(kkiRz})g6o) [L|T_3hJYW:GhӦ'>C< mӃvQˆl ysH"w׭iD*MH:1e;rΠ"RF6PgJ2Je+1"[ެ4ZH^gۆu3Dw9,:<;> # =k /rٶ̷ -E;4+f DhK0\(˲#&V %u'!֭9'B!mTBiHqpE5,=[,hs&"$HQhc%| c3y4Nzg:?㵯|9&s+'xx{\kIoqxرH%Q(Cwn:b3|beaeli'M=S2!t,M߳imifG$idx r[_uJVƕD.h k_7O'~W'0qnǙҗ'=?yvCXWB,;!+\̄;t{5G\6rsxl+Uf&Bl[N;*Dljje/E朊f ,ۉ9"su2Ė6 \F8"iX8۶Fq5 XeI߈kEJ,ǰT6(U9|_ǫ^GX'K>]祯{-7ԧ__aOiK8zz_$kꐫgzQǒڿ6+R33Bd,ۣۣQ,n`Dgϔyg284z&9euv2Ȯi$Xi%FfԶKUAbT-@TIFT3F#T"Jꋝ-Q=Q[gQHG+'N)O)uu/Ϧ] +*vo|dYS`K]l%AKyZh .tV@ZI(u]؝\,KJnU_5d?}u ^og^FUv;W=EPX OlE41AKN&f9eC5h=g>-&00i 2p}+h%n%km\r(\BZKXfAc/}ƊzpleS1duiY+kҢ.ƁlUI(CF^~6iP8ǝﭛO<{5#F@zµ$Ꙑe5l[4:^^8neJ_QwޱQ%.Ya[%NzM>ĦkWt0wm " oOn@σ]81 lܦkzY}LRRm3( X|˛T},GdE~ NUْZDHj1rǝ5(ylhЯn!<jΔ9 ʜD[q0gJ=qۨmm4i9/<0Im )3py1$o9g\t\* SQ>zuC6BLFB6I8ZmuNV()%v59qPpqu#07*rrr c `9zneUW2ŮA.^D;ez./-IcZ'[$jI{l@GH^86 q4h+13YˀR>#-2H{v)I –9Z^zv52R.iGfᡳ3>/`+cKiM/PO.[Z[yH웿ޘ T{Ԝr-;%~ƥO+YU\i1Wm&D ^U5?^H~X87 !U5AlMJCeTBEJ1-?(Jª]V`=ƴS_C (^dqˆe!J lnZ42JGT*fai06-tʕU)VM֭dn^CϵV ghìz` KR2uLŚQ!؟%oy˃Op g`9pk^|[{cٷ`)H]kߛP'!~{%Z+IC۶ёdPx}ȥS WYqI+Oԡ#1]{< %S8;3IńT5NC-iI_`2ҫ1ke&M" fh =4{ju=`M8(&5#e\LOCzOVzP/ &ψcj(;Qwm1!Hܪ@j&a[€]-Ք)HDƊ#Qqpq=4R@R!.5R:Ͷ} v:rmaDt:lO qE[:L<(ïh=k&źmH3gֆ%m HI5Z*Zua$Qr'S<2tC\F5{%T$έNZW'V7qu4%X)w5|U5;ݑQoWZDVeEO&WYqB"}@3˸/-ҳZY;WI%1ʄ/0Z}~Os?Sox;W7}N7hw7j2,.b[r2ڭZ8XPd,]Q_ DHFL*!tvSO>xZ'"m2vQyف(&)4ɕ^(]1u늊Ls.X^m"uz;4N/|Kk9lEqWDJo}㻀ρM, g3%OzpP&[iÁ 'z% )AjxcG-hhiFbH8FƣimuIr 7E< #\Cْ^,=dDq:]rSMx)kD#-et$/27]Q~B/(btƔzĔcq=vyX-RM(CEoukvE]iͤa,ی7SVjz:yO*g[؝*~dL̞-*I x?g"+R; O_΄g5f@/"<{UY|SŞZ+"r vad_>]6hnoڶl ʍƆo%/2]20CӘ Dvf:".)G8c3V;ǿeq?W~]/yK~6ҷ՛u#ˊ|V LppUuDHU1ٔ$LK2 X"%cav4FNF7"ѳ7/HT)zQ& t gmMn_2-.)ˊ .G?[/aXcRնPQ]^Aд%):X]/H"2-5pˊI&9!JsKm06L2q&A{B0>UWٖԲ~(CNa4NhŅ#2k8ouE݌Zx.k,E,W ,\*WrdtZ%ħ*diHi[Cjiu#4M.J0 &'yIbΈuDr)}DDtNQ7|q guGρG6ߎp=hp2z!p !:w v4:YyLWOqPGb2UЖ[Z庮)E/@hM IDATm|&@ V5P1P@2*Y+Rѫ[܄5Ik(֓KTU An]QpjHӂ =4Spt!aHȥg£Oq@ȎOPV $H d{Zݲ ZzҜIcЦH[SU@[D6bgY @hҶ%a7Iw_gbx\i BP=nUѳ0`_}V_0qeʇs8L0Yй*C͠ ;M/]Ӊ 6$0Mo LXL%z.(YhO:L˥kd q,=Q6IкF۽H_J*&܎T]Q z5-_1٫0$4.V0W"GҋsUyA[/^нxLQ;ؒQq; ^9IP# EFU7h1MVP+rrh+BgcERt 9SR83ap%օح0 ׆rLJBf>=Ww0ɃX4ywx<]r`2}gVu0NX/~ٗd.MeԫVqRJm9:e7/Ԝ)ZՐ +oCZw>grag.1Y4'O=8ɳ;\izUc4j;ՊZ㴝'gCtG mm-"]]f 49&P裏Gn߾ͫ^*~ϪȒXƫsk`LT<4R;UZ)c"F0cgú a B%uNeīL1P]m`ܫ(R l&%JM,"%([3Ɵ)(~iƘ3  c *04NE/ht]#+N2qE?* Aݰ 9@8V.I9A+c(qTxD&2a+Ȏ"fJyq ;r|eN+ _P>>rꍋ* rTM ֕S[\__ oń 5D<6>;nύ#8UOU,sQ$#hLv! 0 f)znѬٽLDF{*K, jJ~Ƒf&~oM޽۷yGy7g]G~֦&HToK-8N,p<{!YG, aMx-ʡ6]EPN]F&&9cg8Ќνo\6+X7wy@!2xJ-FrE[P.pgFr%=p8bdow؀IޔY8$cp.W> F01-G?Kky Nv+9P{L'|bzrpx7r=)%Cȍ/N,I2ň =4Zq!#zHOVL#ydgXUd_5>[okzibAkqq 9!?߷_5mc yf{n]~H>›}3 OeT"mXkkuW7ҦֆFE YҌt&t/NJ@gPKx7}FD7یN'gWdgNcڂo'K9}dɠT C<+[li,q.qUmdSxy-nc/ Is{qg9ۊLhl=.m ) Ee*#24D;EdIvA᜔¶v5zRϸD.?|4>@wWOqOp_c_y=\k1h\(0_U9 WA'β->#l-bbMJs;rVb!˓dI6Wl |yHiXm ^GT)ɼ L*i)kE^ PBE<XL Ƹ= Kp3Cr HUc8e9f9UQ=b*fz&kfpa-g+/zz+;pk:c~(6KX{ Fܓj.EeELf?07+#+>t!<.'t]$B){n=p2 =Y㕶Kւ(`V;౰ʁUC#^ ?zy(ܣN|5y5o-NNNhq~~<ڇ?W~Wox#~k_gpzv-n?z__;/ſDӳs~g8;%}{-_U_ռ浯f~go7?MMO|,B_e)Wd*!aƥ%eӵ<9D *pX䊙6jfsn9,>k:LJS$긶OsrP,a1Ä%HO)S5b%lФjd>-gt|_}_kscHrW83.<'~{C4&&:#A&RSg2͙+]*i{k}^C+ #?$=>1Se}㌮}XPiWMΝyGDx𒗼}|7|#x; pX|WOo̻nq0Q^QnWȿosܾ}$yOq}I/suA9QQ^#!aj^JRUWsH,qZn;)WX!:gyvJ((XW(y+& xbBż#S9R7E53%;[63(M@ xBʜ ?p}뉪 ߰qT^UlJ[%7LU#`nݭemE8utT1lpրi] 7=c͔p?`Y@(1-7E'-gcҖۂU\m-8RFSg}h5F6I)oޣV5S^qeR&܈#En%j:tzˤ]D%QayRy.蜹,|+_o{}0C[ԫo)}.#CBإlֶDj24rے2[n^a,)ꌭNBgct$/=+_2~/9}C,~`'p,L=2E4UzLCQ'.gp^ͭGp[b?9p#_gO"6@[K*oC ziB3 WOЭִ6eyQ=N<.ESȴFzsW!N,?&t~zf?_:yͫN~{sy[s qHLћ&n}g}ww>>Ps1 kNտUJ0 |؈r !=nX3"#{V =id0-)i3./3z/Ljۘ1&m~lTJIM3eӢ1E]EΔ1:T04ryݶۚVeK Հ#̜)_+ɞk%nDpYsd Xq" 6Or{8`;qZ4=2v )?AzK-CW cŌOv)>DpXe4v 3cDv>4VUD6>I]&RAv^Qi 8 B2)*jYbWa4z%* V˦&/>奯0:O`||~{1gӀP{;qWޔ : Յ1?-=f3yn%{dlE8llGJxg] =cζ‡xū_۾g]^yr'$siuE ZL#e/ Ø6edgEnܪY |7<,Z ?]?K`}< W;ӔʐX1S^ rj͆AQZmI1O0] 5Ji w|۷w_+Ν;3W\i^܂0c3SZYa$3fFbƠBad] EL6&g<#OK.ɤ&jQ]N ja 2?;_kjVm4t&њr"u/19.M# c@λR7ΖvhnwXg(ō@|F [I7ҙsLkZMoz??A0ST ~>\.cZJk-|W~_K,s˾˸yㅳ<ϼmo?SDl6/__~92;G=F`$wY`> فb#q1 q箐#Z*c^"25c1 yC4~M|@;F 8xİ}g1 *F[꠷AvNaz8#2ѵ)X?%sxr̕T?z*47' G ˥h㼠=O0 x PKC\h2dNK #Pj5Xi` Hcb!"P%E$`l-^!;HŤ LW( x-F仉E 2?*2 ̓2-G6gثlxs\{}EmWyg[`VBjm3b?f7g6o:瞛e< >ܖmb>ڔؖu칣Ee@LIRq 60+1)-֫frʟͅu|Q/ ~b>f؜|m[*c3ImKBi[Wrs$TԢN]%fLsC3p+ObnsY>ٞ8xZ0}$61!@614Yw3mD{3eǥ-G'W"'O /n?ŸfҮJh^{|/?]Q~LD= IDATMKx.PqQ=idiTEzĢ!RݚH^b,.T~dhaPfM>wBW7T4XQ0 u)FkѐSRvKx]Uֿa Lv1ӺhQ=9~b=Cuk550~_"C'\+ƥ'QAK c:33,<@aܡ(eª)cb:sXiIb}USÄ-J- l]kNtt8#.|k՝/C ԌV'W‡u0R./rp:9{Ϋ^ ĥ#n>.dA+SLTm4Mkʼ{"m&)-ieh9AFD`rCggFM]p}_:s!eCs6~8fMI jX-`ƐR)bV8zO}sQ,H]-2X$,l˨Ȼkt"9"(x9V /SϳXPQվ`I>y#y \z7sFб! `H *2 { _Hˆ[Z;(ŅDk“ğ\&!#pp7Br-gy%mbmS-y5O_jK.R94zy}^C8'/0V~߃hs>,/ܞ6bVؒ@oh7bhl`[o=<ʫ[[ cl6&B9m<}k˯ޜ'rv}NrQډR즫Kkf3ٌA:B$>w RMVVtiнpHs҄GeJgƁ%LN1NGyAFĩxzI (a]z͔pZI xzW8͆@SHEJ'Z+}r?̌>?_f|+|ANҧ%e"0#>@^:xQ&; &9Ƹ<+.?{qI 4I0ۊAҌ{B)/6 ,Rjx] wC nL',gMvV*ܰDaA@8ڒNa!Ń.ŨzpH~_rv_,,Ƒݭ"?` !CgvSJ@nUV9D L-@efj~To}aI|^l. SI Zs$N^V٭3Knwfd֛n}Z~ҳzzܧm#SuckL/Ǝ%jYrh Lbe #U0̽함Nv)Z E qdPg&J;zMa5gn)1q~FNi_ 5\#6Nw]]P3L0cHFw9]B֫N\q3K>p&Q lŰ1hqw+X3 !Ysv#`%+ø0(୅iaHCjc)su8ś"K.ĝ2aA7C,0@:]GY\] _$Om׬X'<5UO}ցfbuX sZ.4Kڐ-&xj]/4'JLd1f\MjdPiV S *y`ٟk7;A[00`]_aIawZp)C-,rK(cw SW1;rt쁡0I/L_E8]rx\M_~M|<9.]0ahXF?#IOM4VP:憶ETsX5cMlT%Z iӎ o:"i 47t_CAmX,N5()V9"=83WvńJ@l!L͙= 2yg0>j=9a?^mӍcfZxKd!$*LZ:)7 f! g&{WP!}#;kQAqyA(mjqۉk-wmu}pLzo8t6D o[ff| Pƙ%NvZb"wni,σ;g+^nC/$k GcJE_L(t58.[NWs umVcubMI1 ŋ ڃ4m㨜2rxǭ_A,i2OzjUVp֚M`>1 cn.[j;%wWN70*72 Ŗqp#\s`;7ZHkv?_/Or#X>v6֛?gJ3n͑@2G;KN xBFJJsoTZ\]b<:*As(pjA[32ؚT0lCdLJYN} BY0I=`7.(L __ 7z2R=(J^UvAo0 5ub-&$W67djs#Ig,Y8}LJG!-1\KlBP邵P 0w,B^\HUN6%YB- py %4)MJ?l){'D OdRA$3qjv͑m#7 fu*8 OqowaK.NiX6#ie,ȤD9B5ڍ<Vlptdl+6B=bƨH\C~gnlXVyyΕw=Sw+%`7Gv1#mBiڀ҂Zü<0/!vX88ptK)MT쌃F:Y95*)+KL*m0&#ZbR;7cSRVS^sp'm:3!%E8thqѢA  %Q]V<5Ǫ̽2[bU1DmLꉵ\m>A-VvҧV*jɮ1e SB!)efLJ%0p{Nȼ=K۹y:m3]ɶT\b}Rshudbͺjuĸ7r0 CuNo-..ܻ%r?<7/X+^ub?z㻟;|e,BUwN=DSQ$;*\b{g!{+hF-0chs sJr4dFҺ`gnr[|ML1DL˙X CO}"*57HȵkPt@}`e(.rдm\4TH~8r)RP3|1CNkRJg1?51,CL:yuҔB采(LDWjII C㢆, J-3a >!-hm@Uko\1bs] ‚/v9h Qu"0B;8.3RmxΠ  Su$P!h '$}:N$rIv炑]K,7ϡrt.w95z~ºH6Ā'taXcp /]zR\[.]X#$Di?d$CQ&xS\F':* ]̪AGvPjSTQwv#HJU-±dFHDU!R5jW%p#i"]4/HT .O࠘V)Ϯ5FX%&M3˃~ahG>XI|/~3>TH~B[W| l \ܙ8)n -y;0{cn4+} E0#3uZ}FrϋךuHycz7L57Ulx~&7odk3sYq9&:Օm-]%4e^B刵vs7ə7]TNP&agp6Ĩ^L31GqA4yD!>4B4TTI$A8e:0ugfL J#NnS44P H|[jJm3Ndƍ?ZcX$ Kl-3P5ާME^NX f}ܧP;7`(#vcLXdGjuFM;Sko}+{x+_J̟3@)Wul6A/d堪 O߇!r\c5aѰ1%=Mb$X#?:D@sUA |]SjCACj݀ìB!he|J|_ڝRNvo;ƓIx $YF?=g{HW92~N=? Pl&rXR]#E!u(\ܛ?9l|4 l3ϕ0hsL595.=4ހkƝ:Ԏ֝9bk]NأEp]n0xh 6'}XqLܺ]!;'ZCejS{of*5fd=nP0O[4!w`̵qC矻 /܃ˇηsCOERDy mgg(j?-3f"Kh0̜"4jt~q'~ F $WjL 5!9sV!p7> 2(Xw{֨QGQD3Lɕ}`3w(G .c vB_&.XM00/ݳw?Ay&=z׻|ٯy)-HiwtGz٤fV@G o KO>$cf]y衇>y$2Ɉ#,Zd:h ͕b1 !-x M+LTBriO&E&FX+ TSգYorn\,pI!V}Jܙ/NIo`qkTx3m-(lpc$!T%!dL%&:IBw8huŇ_nB_}$;AbM=2UYU &+Vuƛq Fxȥ r\ֿ?}~<?S3!^&+`[`5U"<2)[)SַV~!7kF^7`nN*mD ogNu?X1n ,"ƄLJJ-,iF4D5 qDhe˴^q>]Yp:x脧^r\ac3UwQʶcRnJμ5z8]WNV&ds3N'3[c] @&x~cOs?GGn<7pN\<;k IDAT[K<%CVl2y4IrAڐOPѺDVs+ԝ'K^2Kf! qa~ʥ3"ԚZD mebXbޝak r3)*awGbj wќT._ԋK')#{ܹsLpμcoo@UO?ӈo[[l6<䓼o?2 1yG?0 Zy;Ʌ xY<|73{9^>k-mm|;{vp\_=a>WO4?hCL5Sɢh Q`:[$:c0M")N'Z^`,GR-n_1zޒ"d{3 j4F߳) B4bUCɻz"0n"9&_3r4vsY407kH໽OgYq.ĩ%eHNuOK#g2o9}} +3e`%F-[n-*Lm+m@$5~y݋<3S74yFcÖ>—c#S;FYT(!\+\7+Co$ƶy\6Lӻ\t{=zíxzO<%jm-"0yݚ0"9]NخC3ͅii1sO~HY 0rlO1</][ n'8Ⱥ(9`s=د-r'43FZ4$ RgؐdT4&-VՆn]y$B;),lج# 8@;KBq { V1dOZ3TcNjJo3.X0GpA~3%>CeWd)b⽭D>ѺC'@UP'e6|Eq1q?׮]W<?ao{oo}{_Uo8?0C\v|#Ǽ?~_;N>O |7~??Yyk3\>˖k ڵks뾎ک/R}NA*W-F[0iu YbH ] h Cu|Ti``4X0l$u̮}-Pp5 ^֧'ljb3ڄ'p @(  d$"'*6k3Y:#{cA!Üw7U$yd[2M'1lH=7$H@5,~0N,&*CwQA-s !R12Pu&i!XNƸXC(P*3Lo;oErʂȸ zj1䏮Gi ;f+a +SıVN0H橓%  K\ۚiV3f U&/>fMW;w2'6K(UGJ0yvV5V(#m뿟-`y!F8>OYMq(KNfszgˑ7ѕ2hAK;'$EtB@ڌk\AɻWV; !Mi iәTH:ۮxh:]!P[2؄܉ Ѡ uMĄB(ˈ 1$;%_{CO~^b-1 [2$1ӼYL!0|AC]M"v)l[܍3c.34C7_~cܸq4omo{i__%4w A뿞Ã}_\<9gn޼>r:q̏}ٟa}[P?i&0wqttWU|+p:Y^;xMً4Ljp9f)@T6H~5u V ʡ#XM5b"3M|kRFخהyx0buw{skP*K'9J?iu' "ґu&eEk3R^D)PI7#ɘ@vcIqMjܑDAX`&d8"(锌R]p=]YB軨kXT{L[A:4VJ`l n3i,r=@ _&dPf\ ?r@i瘩Ȕm]sn\pܝ3ʕLyjEr ۖ{>Q[nEbvlO&̤䨌H *RSOs~G~\D^{/?~wS?]k_Zay駸tuxw|~˧jy^$t3Oԟ'~Z]Nۜ;}5ŒGe O F94F?A}bmb([dE8]DHN:myLd23Dz3I[lE#$sZ z~ #G=h-#A.O ",3g m0p+q3O,Q0%hhj^bIѻ?yk/sJ_Xl"_ֿMhZ;^b#w*HZq˜89/D$̝~[=gzv5h^ʇxիWG?⻾yk<ܺuw?>6 ?C{{{='~ra>?ǿG}Rfyw~wW{eoIKOzIF_o^}dFD>/PM.` 6R0-(ȺcV,C"I$Dĝޙf1Rqӆxs8V6\Q$ t :$eνM#hH ~x ܙ/;UKBEP8&v07/$h퇎,ٔP1Rg@b%Iܟ?@8(?JCs qj0lv/)4ĵ}O\g[wT#ǎ7@x\KSp?&6V!gd.j"YDuqIAdJT8q8Ź4oa~[w9?[UcZ{s?T\ܦ]IL!:1iEQ?Ex0oPRP")m{6|˧|C^.M)@|j!FW#Jߢ^{N d}̒+iPkJ"j&wm68o L-9&a,ZB5ri]3=ȑ:* 0/xyQjJ VL+9^Qil[ab/mg &<|c>ۜ?std9+*"1Rx~ p҃3΀m|#O͌#>εk_ k9< ˲?#|?//9Ʋ,++<_U^zk;O_瓟ꫜQJ~xp5>\81ker>~йTt?OsU~GeYs]a#!PHuOWV=#}a6n텉2nwA{&F;֫C̠8X&Dt,FH&ZKޣt-IӉQh1߯Q+W-₥DC5 (KL;Tctzh^liS&-X'nXw@Y~MUZ X{h=7~0fWKC2O;b*`yšMeۀ߲IB_YvUy 3BKje!vE!dolYҾ[~yϼ?>?KoyXO d/r$fHӁ7 '&K=)caZg2CgQLsBnζ̜u==MGJs޺uESh "=Ҭ SCZ(݈a%ƹXgjkHL`y`%M197&4ʐiQPX%羁ql:R= @"+Sț*[w2yvZgDG C* #'-ȐJr,#V.t0!P q ˆD`\WZC6+Xmx{>cgOڽ=Δ58\,9GWOHi 9N={7툥lfFs#`q G^WӨ+f>Rǭm|#Gj#qwxI~'>Osm>?)"؏?weGyᅏ)k?_~|#~t5:Neg~~1W ˵7_8,ԝփרn#^Ih3)Gx]Pkh[\QM{rV %}F"S56yt>4RO5u6,Oj,*iKA*d3d}^"+E!mp<@zJ2җ} ȇ]Cx맯$TCS}7=$w8A7h wRat%7ݜ*L] "NJ(c n_XjŚ:?czxȕOx fA.a/yIS >݆(t|i \>7^}_NXm1Qٖs!ۅL{?Njoj[9/HڅG@#̐&mkЬ#1!F ()!װ*[#1Qܬ2,nO^C^t턥ER_EMB)j<͍*5-~Tj*qilZD0[b ™]"ɓq(!Q]|Mn4f *!~;y_-u`pgn {{wY_;F6x4]𐧟y暻hj {wwV#e-"MRNW,x8~@4BݎX R?1xOuem\?Y%G!"*]ݩIfq" ICHPu y4csτH$蔩ಏB2ͼmd ]vڋ K#RH=SZ/LlHkx!7Q1ĉ.Vr⽘T{*qTiXT@@7mq$O|q _ysA,޺qJZɼnϾEvX _j[n[pǸ Fι~+|;ɻ-bO[|w~'~h'tsD#@+˟"z']X}cDcO ų8O>*qy+c]J_нDZ[ҚQG8^'f2 !ZP=TڅGK #Hu>YpDڞ8;BEe ^y0Ǚ;b*a=k*s.Ya;*$hoe%\.8(['(ȇ[n׿۳h8gR =¢u[r[yb#>Ay-_| r$ ŝ;w֪.~NhHp3{?oUnwv4hf'8"{S<8 ևhR"[#.J:"Aw9DA6/1LJ-ԼmZB|Z=ewFfKj䬔3rd35Rvq¬>*<_e݇#fl%^ B+JPy[S}c0 njYr v˗7DŽ .1͡ANh3 ukc*<36$~q rs}W8w2M [gNk5sZCl9ދyH'g;ЅF" $˻*Dx3<>]/r,iZ}K7-jZnXc1jeR8"EV=D'%ERVttSwY E9!a> ɡs#frjb&YhmOBDj ḩb@23:T!Y#o8>fZBI %h'@hK(4/PoC3s#1D&=ډ@sO ap`D]Cxk_XzƦAû&KgG'vfFtIĜYr@u/"#%\6o֜ѧ r,qUTqH){)stҔ1AȊ7s) V3fUh(Z!]'4 &.;V8ߌ+<{ryͰLP5Qm|cḆ`Ҙ3;,( iqgw~XeVI+||~hR>D S%$4h¹w gtEb2@4$7Z45Lgr*'8? 4J)q|rqֲξymѡw/M+$3[G\ZˢA5Q Aaˀ"A[/֊-f؊&۰>kznWց̵ay A !VAHU6I`$!gRŅ83a?5 E&Ba,S%0"F' 1CO_LӴ1^I!<[{Qd 6x(rr;L@8yEphZ0@-╇2ږI&td"0{hboYre<'TvbG,Z(1lOd+!Dґ2uEDN# e٦ОLj7 Lly$'<fc&D "Zc͗hu@tK҆c.=K#ka3h%@`쥔Ի8pLyE%wbR:dw&ch29-Q2Mf{;4wI/6nK}#m6!3a٨ YGBA% *RZC0Lܰnk{)3)nq^9a#>3ٗD0zH+fYa Jpa`ۑȘ!. R) vljn2\?eٜl3y :o@N[,y_ Al9Ji|[Q9:~{>Kruw7-ju!@|ƀ-l"AYգPfY!vqro\B;!5?dDA*>DFTw8rN[ӀykZ8PZrFܻFX$=/(ڴ|foE-VaMpㄋp/ԉ R8t=.anº)jjH$OlJ荷y؜^4Щk :NC9{M/S=dx3)F[MH7Kƪ;®zz*`6aLӁA(JΦ&<ҀT8x#w8d8tFpx-,^ ǨMs>fF++' i9^{ ͊ZU!&Q#BG"{p'@"n5rܱ:o1桛 h0{j:!yg"u:rO֍DǾ7F&R+L <} ` >{_ॷ^ Vfl6ҨިQkμ ڜ/M|5 6 xN(ZaaUcMRL$~V1nMh3IS`N%][!I56*/|*WiHrݸ5򗷸$FfqB 5r8&j h^<ػ|cqztU|Ӣf@=k(Xwd¥ˁ{p!\)Tq\%Pk\5=S8LVņ$萊rjf7"LGo8R1Zi8KCUj9"VCQteásCcK)64 Hh]Hs0T298-[$n9xZ cwror`(^j[=0p_x9KӺ25 >`0n 7N8kKH"u]8"'H4GQb $ޝpх1].F x vstxZcc4!B M+&Na{z;2{ N9uՕe\!iyR(bP4V&mN_3AeTt{/;< 4Q[[Ն22hHz"Dk1% iƾKɧg K1M/Ke.ɧ<|ĸ?y6)4AikUEQA02T=o&X?{'{i";s/V㚫WoR'un)4'1ñ=ƴ ` l؝J1'AMJh KVP˜B5荷Ǟ1+^eYoiDD\bd9!h)Zzt=1H_;,f.R,\//=ASB{Ac I;!g)"Iyv4͑rDI`+z14Yr'2jgK8$Lkԣz!AiA)t'(n-p|cl2!-cŵwܹ9.{r"n: O_0ܳwH<蠯)of#IYi(eqaA(>A. ޥyfY!Kp SNO;{F3a##\Y$f-pzW6Xk%ꃅeޢ)NbJ4neXg/7wӅcK%}Gף[*jA"Bp0/=)B'%p(vzD$Eݮ:x; Y{̀1x/s?3nso;c[!au)KT΀HX-!Nd.Vm4)^}SL.pG̢NL1 9\+w8YϹQ8=*Vc`g´85\.gH\kpGPcG!,q꙳lkD4ЉxoޭxÛR 0$0.hHKErޓPQ%-lҹ/r1wk<& Vv@JDmǘ77VӚD4Ƅq,j XOFNm:Cg6ܥ49%@jr[$ F2y/) M2ehfH3jHc@“F{2RXިV{|ݽ`Ɔ2J3rxpD)u.xR<)fF Ř9>q֌o?o@3}Y3!' 0覦ߓẀѰZ*y0f(K6ӗ1ӊlR?zv{vzQա|!ӂu@0˽Weab'u՗3bL!{=]RơG4⭡aR; )VbE9|YuؘNZ&H," "cu-A.ٓp~#uw"peD"PPH:5EY:Uin(iJjQk04h_{mFgE6v`Z'IH9r'_qNj>ah4z,H:BҎElQDaғհi9IhfՀQ"L+Rs=48ð!Sщ<ƖCڔ$QUϘuYb1 )j u`dxUl^(2ڒxW_|x`S,F Z 1Glb>TGZX6-|>Q|,mHC8 >Ґ>~X 2S9yM_C5"^v1Q®m9yP[N yY]9 gU6dǤ|C2d7^yb)=nJDqX1 ź03FWQY]oyX飞jE^/=I8l5A"z8{cOIDwt<~$sﴱ}-C+QXPq+=LnЁ{ADtP'ӂU,m?Xͨa= Sn#=%H0vH`HOH] 0yt"{Ź"d˧^*;y\8ͦ8V3it!ıJXSԌ2䘹t'#VHt\1!f;@* Au밲E [GEj 4F)Fxc(,N4!M) ,$5zZcQ%oaD{cBC<̠P aFvw䚯qod[zc-k [:†,kў},sRw{_'&`CFɑMGkd`WgSO<W^˞&F٣cfEՀK廾yƼN)/Ci-ý(ʎk1s s$(Y+*<_:FNw\((RaYm , sW ?u>[R {?:7KzS{l/\;C yؽ= x;G&>rG;N%pp.ڋ8GgʐBn!Io*K?U'I Fu!n$`>n6im{x{9 "4ƈ#/ BZrf!:NŬ Rnv޻ #F0< 1Ʋڵ72 1?od"IpJpxB,#I26{k m${beuBcS%h y2ZػV.νٷ#U%+gQoṒ4n [ }C@ߐi2RkJFM: 5F2bv'T[5 tQl[L& 2,LT 255 V IDATzK('~?yM>5~}k]VxkO]ًyŲ,,wXxj}) ~ǡP(]1B".$ Id쯾v?E0Pssˌy٬Hq6?΅J *O}tx1‡R"XZA`g [cIic2#Q.*[v%b!pUq>˲Pka\AKX]5o:St",-$4N1G31`>aZrwcqlhF*I2 nJj2CrXRBRC(e9_Cu߹9薰VВ:|/yBWxjsZNJ}|fhr$"L9@P U=0-:<=m0XBYG 3b3)=\B8±G`TÞ+ŹqwvmO,\qf%;;mgԼ`Cg,RٌKC|*wq+;K3U(mHM#Y3'@*]kQH!$Ȓ4VF AZ_փ+ n M f&T{H]Y1 Jc8''LNSF%1P3+ 46) iښĄ.@k0ȉp'(Z[ѪZp}, Ҙ} [n19Z|vb[R=Gyl3}vgoٝ?«g^?{%~} o_6nunG- mٱ/8Cm[ZcEjb`0#(Z: %x +#;Cp{h%`$1'o%D&ч[Z)[BL3HB|O: LjI'NF<抜&9WN3ǛXAx DR%5pF1QC MWVȴIڅSGG0D**PZ.8>xQ(lq DRm ;$FW|ݟY.oѓ 2ZG85Z)<1b5ɕ{I= E'~ !p4^A['<}>z.V ok[,fF2FPHJKFqȫ׮0ItJ29U"#hr)h( 7jtVWyC w\y:#lfU}o9ڗsS7Խ L"Qc#/A&^bʨ1FVۤ~Q*Z\SUm;?7/My_j:g1?wׄ&TV^Z[H-ӵ=9Ht96NS46a>퀴^<6DPc{ԑ֦dEnqiSO$/{;.hX״p't{{@)caf2zµg˜:u4\YRk%j .]`@aoo/4vqr!?qgLsYݿt'N-xF?vf~sfgggÕ˗0?bZS\toB%P+ =c<O2b+O4E}*p 1aj_hij$- #\hiS#!c3IFO[Ӓ{t/=p]-po{9𖋲D1 >mA`r5H0%N/cI I|7"K&EL~JNB2'V\w< u)`i<,9PXb5I8u}KEu1;'Gfz_0: M;san6lj[pA"lQ':)IC,w?z~~zQX,xo}[9><$ĉ'җ苹yK^ʷ|˷rM7 )S;^Z_]O|o|qwRJo[nno~3ίo9s9{,MGv=KD`= `9M6p=qs.xZ L|h8 ,L^U,9G 8 sL->IKǃ-ryrYڸ<@ϝ̔1rն3p56S[t][#fSD1j4p93jLkܖǬ*(R,Q Y]IT1dUln`J'ifƶ$f>[ UuwjS;V;koԾesɡ R|2'4˵9iu $%wEdk7h)ܢnHp d:)aWgNqrQv>XFLk)"xlqUe&6FJӜ:C-{9H!*O#yjwul6蝜 FE }S=s'hS`Ym]A)#l1 ѭl^D<>6J)=hGTɠ' _G"_J^ݯ ?5_Cw~k<7 ??yWg=Պ_g\rppp{{{<<~O뾎W7ylj'|GfQDOֳʯ >Ӟɗ\JD]Iքs,QWZrT[[cl umnxAΝ;"|3?>g p75_}|<oiO{__^R^Z ݚƢF^.*IH NMt2t+Ub>IQPJ% )1Hnbl3*?A-P/؊nAkK  H9-eHpZH @82Z 2 B/FfnXHb`: LtqHH lE^urf".,lAp]9pS.XȖUJ(LYNsgC&scԕJw::ND']%a=ŢmCD6Djmd2 R'ɬQњB_""S(]DQݻ׷Ύ`VD\%l '=JoX2z#ZrY[uAWqjTM1ց0h>MpcH(܇p 40BZ\w.O#LjRDB:pb9s-?sC8!OI9{݅nTf#2I`¡n2Zz…d%5l,̌i)8vt$5"GٷiYP\$X)/a"ʹpGF$FjJʲ:,2MY6 Xlcd{fa9s ~^?,ݥ|ooh]Gk# ʫ_| _k_|W|属桇e|uQ/"|7ŠoߌQ\=&tjpvp_MIF°=ܰj6hq AwWSMZu R\q#A,դ)}ągT Z "l[ҕӫt5nIG`覘5:#<$vqXtj*lb2SՑ`<6\/GCT#O+G&G֏y' sDP9IsԕUK d$m\to E:[r5uF4YcrD)s$StTi9qgBmJϴcE9W:%EF:ɐ,&$-! Y\[ aw#=tS@œ)W-jS:>7lidܠ͑5Wrtz諈[m T%d3M=Ly 04)=h<л.$FG0^ ( =ecc02Bѥ e`= it;S(-TD3s2oLhG|̌sw?W+;9C|۷};g>w'?|7[n ŋu]V`X_%O89_ё^{>>9$р9*zԘ^",I.FD!}|z1 XG#8@<;ldl8ns{tӑG05D2jv !r3q ?OtdcMO$fCG44v"cyX{2p! ꐌ̌g0<ёNc4%o}f\v^pkxsKΙr+z+9gy[g|g "Lwu'>OH)wy_/}ɋli5쵔XFp9 DeЂ#T6d4Kt>IuPgm-EDŽ֣k r$zc$:[嶧IEBg vTO`m\[J9q S)sR ^GL%4 %5)ek zsQK;j,(|hHY7 I IDATs9Um48C HE416jN\|:{dZVt)19*:P!c(q}j^>JmyeRCN۠ח jҒqƳ{QkXPh Qcd2|#x`(6GAXqpc̉8*kBjk eY%63\> zW:I +rio dB.1zGa+xoeS;TөְF-F"G2ڌ^᱇?ȕ kмStBMi:#ЖqVx?@o VeRgE^w~ޕ2S. cӓefVؖɽ}i)ZvyYvp6㞜[/윺}/j>Bi>,ȟOn9;s=( M@kStR[ ZER1H )H5KT^Ib4b2zR"}]wý5y{>62($8@%;h#:-.nJ֖mUZd5\S)&@Co =]lcqe/g,,qy"7CؚR)̈/hYS|;I0u7<%֞l: ӂrht ` #0I3h"hAWR]qÐ`∤(TywP#%KHm͘RNUr:=t4P"aO PXϸcN"ԩ͢Umf邴nT$4F6-/͑NJoQ,rt=BEiŐ93`EA,QSt4l]z'e[^)yNHzH=rȁрzK4!%=e " Hl<Ÿ+К:a&4Bqr@h,dy6;ŗrutU}m۷)|9[Cv?'WƥΝM)Q9Y=Eu"-v7n[)ڀzѧQ: -*T6Y&$"˞8ny},̍'Ԋ9d-G\X_ *T VX!k|jHbٍ tFBU=%1sGU#(cD4pC3xЄ52PqE!>¾- ?tШòp_.$x CYb)E@ݲH q #FL!Tz"]4b9@ȅ(%KOOWLgJ.7p=i+VT m_qﱸ3-h Iи,ٖO0[GX'N띎4E^UJ#DniebmLSa#P1fxuKbu[`:Yhr_7R43Vx(,l'YǟkyӟNXzp?/-&#dnֱJ) c~Z\ f,%R$Yhx0Y+0[ oj]<Z=Z.li*a(ٜ 44˱GxGDjT[bjC#xO!x"i iZpO0N3;Gp9) ;w|Kx.yU;8<<}7v;gvOmќh"1c#(Q$Fb{+,dA͂DR0SIHIbD591ǐ$)fψ,͸f4T9Dx2%tFq DVH2 =q;rJS6}RTT-'M(H[LFX>#F:A̡G2+ICrT| =~ADWkD&%="xPJ#{ɮvf{` 9Gom5Xf~$)kG>G"Q5Y*Gӑ r}rH!<0ئ %傷 bL6\^l[hL*$Qβdwra0\3ՉMR<`eZ (+cn=M,\W1Ƶ?X`, `:Y ӁG,0a|DX3]otm)y-'zI |+$_\]>QbӔ{{_`W*Op݆(12' A'ʸɋهЬ4H_:I G%"pb}f\>cǾ͑=]mC#ڱcz3T#mj8CHǒ{(F* TzUCAvׅ$-1 xd`A p)y8R Z7)FP]Dy8 Wz֍un,'W }e_,6CNKV#evW1f6(BE)@Չ9hNήiH6)Yʰ;Z,"t p5CH@RX7Iadc"]ҰPJvB "-sG5b"Vun=xS7\:i@ )]2]_ {7B%d4X%kl2D:bH#H)8w!N0ɱtÌyA-F.3F{\ S537Sۚ]<8 MJVX!`-S-t~QQZ$֐Y 1wh;"縮FqCG;$2#&Ÿ&rRZ ZyRa:hVHLYRN8>k(M69҅ux&MCZ.RJPW۽zW\v4`.5S*ed:sg8 ޅ0}P)1aoJ76ޕ tKdt-͚6--,ߚiݙ fö  ::f)iy^[:D9!VɌ}Pbs¹A ᢌ%+uцmA)Ժe*Kvc},O%"qkvhe5 qID "5f˔i ?*y8t5HsVeRCtk}* cjWX|n lxH6ZIG#e;%$7 * JN#T%&CcSwŶsa ᭻;'cVSx. v1>fC^۹mX˒xQ=^-;'h /YO&mj m}߮h|!!;f2R5T-SvTꔝ)^d #⠑ (95,0).JQ VSd+yX#eFId|nN?JI XP"J!%Sc=V8 1֛5a3"hq>Ns'Sj\˽+& 6Rk,C4ѥD} 'qpN w%F9XXIc@vgb̨)Ɗu@]9ީc $;iW-j8h57 IpQ! ,AdTw4RZcdVp (dlwrW4 b(A_V'I*2gj8qOdec y1`RYR$V{L;æc +!͋"kICCC 7L#"J:Y",µ'eёXW}Q3U -9;mFF-V)};Kl{:WvH''^fD-6Wه6 5 ֽz:rbmQ+t WYl`cc#"+qX:5,@b=f7IRv$!\hwR<.KH |IMwJ^6Ƕy;3Sd"{;EcFg8N"0ULÕЩөo'\cRrhiIDKAבNlZ=%DѸik#;$1G z#TXަytܸϩ+46_y|'sĊ&XGwg͔3sqg ;5m2mw$ ZIpo cWe/3o. "6f=1BS"$mw`›R(H7yCG2Fz)-z0^DA51i\fRN6ݼQk2)GFc)ɍ,ʚp:.xJ%X݆j i[rrZۤ4ugԣ7Mcl:re6E7HOQtu0@H,ƿ-\1d$*{WJp2yP+GNN"WMY BI2.PAװ5!S Qe4%$EKZb&şsc`5t +NȻk(yF<g Oy{l`ʮB/S"ֿw)xCb1M 銳[; D)-X2R)5c,) ypap\R9=ES J| bшOc_Ut<@>rTX,:g9ͥgRRI5D{s#G/\\gEQTwt]jCQ,2+b+L1$pl ҕԜlsq|Ѻ9cS 3fkTaHT93w*3g?I3Yx".^ gjN,0/sgՍBFgFϏ,L-iQ16kNdħeqߏ >F 5D"DA#`M(EC/WFnq+W<XwRPh:y~Y}L,a8GsYtĎZ,| tf1bȓ#"Q 9~ZL7^&C)&4Y5?sdp6f؈ܘk?JbDy8M4f!6UafB[@)t'Hd7 ag;ha~uˮ3sε}>TUI\8CBdi R !RGj nh!QsHD#BI |Gw$\|k9bwqJv9༖UN^k1xߓ1*:6LVtMMA渍t1I D HNd:=r%D7Gpr)+ 7=o7Xʉvn!|xCwhLJ`JϨpѧf!ŷ*bwFsw^˚c"P#GV\ kZSOPT%-QeT2'JpQMdҹ;(b[07Ef> * 喠=I9Ӛnei +F=8°Fqt_r˦g+o'aIBN3~&7kHF ,5cd1á9u"`]r&=2Chٗ$ [DP }̟!ԴAJapCЍ(Ee[|pk-ԥ bꛏc=q|q@Qy3Z= bٍAT IDATi @\iQ0K;`VtV2#hTæ.YH2b;Fn<4fxpNX1/|_ǹ:ߑ'>1>o쉋OS#Z{PL+)ep }iH GD6XJxZ`l;1(JnHV/^"uv,\T4h<]4Df,há~%{~ϲ&g#QPiYLr;E}3I2Q鎴H7R(t R 7+J1Q6F\Dke+x}KRAWeNU3{F>̩۠#wTKکG>KT ʘBhj`\Q,T(h>2"RZ)&sgEvV Ȟh2TC:F)]2Se@1 *f׎Z)>[>m<̳ ZkiKZ5tgSO'wt2O_uQtBVvRɏɿ9t42"!SIl1b)tj559)-Ps}N_n<'jO;iJ7@Lsj'DyVbLVE:l8Q)ƠZ(0T1)$§l҂IGE)%S%1lCR/!bB+3oAF gh;q =4:˭ ڢvG XQ6Ko)S3dYde0"7h),zmDk\V8c$OE 5PVD hɄg3AUgkrlɚN[CyQY0:;ʒ)K|cӘ1#3s-&NaiSeHV*3B-q:B\g8 V.*:Mʈ`ȟ<K]3S%& ND *Mkb0QRblU#LQSKJ3&9<Zgn-Fk"nȀms>rȂS[ᒜ$_Gnd_F0F:@.Mٕ*̤=9w>"rdd@;3V"q%FFUL,|>,fWA:3 g5DGpV@9r_JͿo_'~~Z[w^mi_{E9R; dq4^Lw결X,m.${ZRcH+\q*_*PgA4WGeNF0DW Q@Ĩ 5Zy+cLݡмVfmHC]>lF z6pK@i6zt*Egl%EdMo!G;<_0%x›ڠ[2SadfpӖC}lDى>{K̇e7BuNJ.H(aW(@TYI-1Ϙ P65 M U"n Q woԯHZ㒿W7AO;|nK~';۾<4==|o?~bٓ`E?O"3]{ڰ˜uD72Qzqe>F`}Wxx šfy2s%C!z*hľ ;Eӊ 9s9M]e Ⓕ3fDg|ڴ݂#P]&|0 lg+M_=7t?1K86D$ՂYG]<Ӆ[o\q0GZ}GI)Lβ^=.|{?{47VY8wA|v$0x(.Jx {-޼SԚ %Y2SsJ!ERD0ց֩[گh@khNQOQ@Eܜ>גG:CW>m8,Y{HHd3ʣg֘iW;Zg" |5ozEas™z}_9,)pKMR)e9ړYld$9+=<%mI!ɒB##,`SCf,¢%3%7 &/Uh%׽N|#HW>.+iT\<V9J߼u`2{72>Ѻ~S"u2@!OG2`ݧ^J'e_)gd'O,2sd?;/~Wϳm86zP;v:puy1㗈WGn''_5OwGSSǎ M7v5J0w)6$sv%GM8wkbG|`ۆNY>'3ibaNxKƋC+&P>92:0U%=%mq fٝ :u@@7A(ZF:D4 ɻqXYGPH/KIy&? FkdM6"9C_É킇r~S/f2'Fnf;|ˤG΂SdPD3.HTUB UYER2ZbRWSZBiKc*ɂ>*Jk Kv: Htp*Vty f,M_Bnzћ+)fiL[ ^1o_?@NF&0D^3VS,|eB0SfGFXrQb;|5#ay . sKϔo)c#qŤ"KFz s$`HمQ+_ JWt ԅEi;C)DٍGm7ؤPJ8yH8n{v ggMn((tZSϊ*An'tO97#sL\ RMd)6w+5C[sֹ}ŝqډfHt񈻳m[&?VԘ;Vڲе|1Y7ƘpZSJ`cQE6srXKƑ-7ҰبS]p8౥E<ɧ1Vߧ;oh7m u,~DjX^;36eGR9P:a>y@8R061[3պڑ ^(MvD¹ >qlr(ڏ|$S,hke;x78ې]*Qa3@LzDER|E~njXsTe"LO$D'H,NJ&$DŽP9dX(@w>jVSM^uOx7~G;u,__w~5O^ozΝwS<ɇt *Yظ斧=zQP=ǞUwS)Jᅡ0,](>2kTATT'$4TJΘPˍ-5>2 kH4,\BP  23R)Z Kqd.h3# Z[A"8#ra4W>Cl>N`گ¥̭Rc0"ḽu]3%;V+Wl@_7<6Uf^2t|B/UZ#DQvVY{n&w|JqE\3ciJΪYsRODnŽ#L02"CH &f7K,ML@1K̘L$ [ PrI˸yT{%[Dv"mPtj,q[R>:b2!i6GFeA}O%yH2ϏG#OWH>1+wy:XRYlB-flric-W2RԪy!J22LnJ1Z4L,6s -]edY=-R`2P2ّw|?my?^|,Z,W_}U>}s?yqW)}mEMZO2s"Bt tVddMC`:YXC=@m?{rVdGߡf7L#5 VR lCgOά=O0X }:JiIddJNKr5RtuvQZp@QyFL̠Ò#y:.q F:&DN PQי4 " ˎXiFsK]X9o47Z7zI{441$V:wM(Kv"<hlgkDeȆR؁.CiѨR."WΔ5GXP-ٳ s'Э&WDr*0e qH+33;[YQ1b6tzI1yӗEOGW_A%Fd }&?wk~.Vf$0b䈤ꍙtQvJ]pwN'nVآԒQXqYc%ɍFfac>FLjE zb7<2"{i( 9|7o>{V~/Q 89);5C$Уs{A<ИOW =;&M+z;%Xln䩳u,!Ϥx+K/=M\A{`TNuBFAyi~~}^o_{O'?R΍ʏ>8SB ׁ`J!|U(b 3Kvbw n کd^dT)P):*N33E"[2 ,t҂'{ڦAlGtܒA)ִ'+FKӂlO 橁2]AUSB0mtObӷDlEVQi}VUʞ(N١S~cSY0UD\`yD*iqG -8TY鵲N]x^wq#v[,퀎4)ޑWHZg-ҩT3͝A+3kXb#۰:G4_A;G%yB104o(`C^L|A7ܹCWg5jkT7~ӳj7n*‰Nm^-NTw\aMo0TVҡebb]K܄fmgwˢ+œ@ J lr !v  PnlQ/ 񃍇r[QթSb6&KFDʻnxQGZXmͰHpQ.4`x,ƌOA6FPsJ Ȯ1Fuv@L\Ϯ`C;5 ZmZD3Z!&wI|ߟ>>7R ]}շԏX |B y7gt>}s¢bb}> FPJ!G!,|#2kI y:G.ʵs!,N/BTv$:R 7Q2jq.SZrfwvoDsE#&d Xj57k͍P#Ԑ'yY5X .qG:%NFr sl-E8$ \INHreT7JTu)C]*z_^^VA!2Fh4 m-tn#I }8- {+Fm#Ę-p/36ŭ[۾Ԑ7QlFR06:h KQ΢ IDATy`Y*B7t^pFVnakPQ{@X8;<ka0;tHfw"9hifsXpS93fifyMhܰ@ l6j[&Wy^X9 k/1a`7h&pyo~u.dvIM+rN'jc9]u3_2f$arwt拡I>bl@^ XbLh&H;&FJQf j epC'L3.b%|ӟFD˿LWWW#Yb_n , O$mYuk_no>??K]y]5X|SBDrO~'tʪl[>vO|KקgOO{ۻ>.O4?鹎eyKnwj6mT#Uՙu ;"H9HqXn3%t7kI۩M->GDs3;LKij 3鐉▅$+% hi,)RRe>ȑ f QnV.8C:<8ӹUZ:ةZx7>Dgw87*{'V0>q8!jr$4άzރuZeu[VjºحR=, O$謦w cΪ:;&@(ZaЊhcQHbR a NPRc|ܹw#Ž!hTDV>CԠHp]0ex0IҶ0u:2Z+! ]rˆNcӯq-][>SG&7ĝT4.(pZkYJAt:q)OzֲkVqe߹J{ξ";;VY)#N`w(mRo6NCh}8WT̷솔ՊHUk C[ɑ( /7wd!pl鞝LDVhT %;Ξ$jSD`%^L5nd:R/4zy7G?v:h5mÇd-"}n}u_^2sܼsuYdy}/u,|_yUT +|`}:fƾ< \u{z}̟77ޘ\>תˏ?/} _~z_~ee?ʾ_qrur-TX:]>|+i95b}˂!s:۴6>"!TӳX&OYpiש1CU"-"\WZR'* qjDÝZ!tdz4> 2OzdL2zɘEOpdZ]11Z>^R0\|SJϘ$['0ٶ NȊU ZvdX8Nx;݃a:#t*ಧW*g*xTV,vT}&T4(]tee##(MG,{sdedGdǦ3:$̀ȞPYN+:I'pM~tk}pMs02a[wbUx<\; tW޸kcY3b@K U6>3ӏ}ӏY$6y/=1W_8="x5u<a]kzqcI= FCzinw!Z(3q.)@ iEy"ג,\A04#KI=J"^,>Y6H#d )t.!)> K>uZUnu1mҩ $L)o{x5op%:KM Q >A Ft7QjKaItYEeL=YŽ0ܨB+qqXɷ<Db.˻GW:NcXB;UҮ]fw|??/|/0ĿCog;𐗶A<&=Zb&>dg TIbFa >|$)u z-Cu 45R&6@5HGrdȳk6P=z_(|[M.<}_xu5kx5{g5xNM`^. jn:E{!92ݝOؑ$GRI ܠ-9 HGk:P7,b Pt%㚧s7?cMmTv2S+le"5u44 :f8(z0fƪ3yRX$ufsfH x%u hҒRJp䨓8-yRQ3qVg\CS7=ږ,'*}DbJaY"RI /5I:f+~yɏ߀:#G+]xx<}_GI裺,QAs֫ zQ+ƕ4+)?yGZhn4ix.PfP̢ŧjXE͠4zqҘy5C TäӧK/F/BäNrf} !xy||Z7ZW=y{.DVg_4W%ܝ'U&w#-;:N**=В1Y{fĤ.ޔfƦNBq4 B{Li` jQXQ]c*|vTZ:(h#j:}$WdBL> Q8c0"44ѕ27^ ^uz Dlhr4TQ ŝ2 /Z?(4Z5Fߗ4Mu%hqLA=3T(6)x\#,B[GR˅ѹDqB+/^on*knA%("x [taT&=;ȎXt[uk-&̈́z:q`5f9r@IzوBJvk['6=Jg"2>&< RJ6V4Q ŵ(BefY"z,Ɏ]D15޼w2` :ԉSF,e{P;E4N gnu7rgu(ܿNWo}iȁk m-B)%U'Mq]ftU0'JDp K)fyJ@jAprv1347|9uUZA<Þމfen 3[R.,lHZ]P?Q`h۱+U eΣ{&`Q@zǮ5PFKvc>u֭~\8`[FqHE4FhB ZtBHѥ !1M㋮Vխy쵾o11ױH=JuꜽZ{}s<8f%ԬҶ k]dlQ,TBLu&Gd9 ø|$`Dn)QlSƘ4sa5!916ýMKy*_?er&d,'Ԛ,IWw@D8ʡS:շV&wG?? ۣ[܆s:mx&KDmk]`:9MLay059FSa =7$eJNıEɽ^u]#'9L“0/\okEl|eU|^r>L,NeWd`Q:Wlͨ[mQ;c!SM&Q! sYBm_(\Vp+^K8ď>)J(ս0w"jv^@"mCcGcp=O<ϟ:y۴ů9ѧzO&S ͣ\KVDњvf%VJ&II hM]8HT**ZT1ET͹En-JEҥ^uR6 \VEWWITZs=r,*.eb}EUVQAZD>[ Ś)벭J*LT8W^7Ot]-1IunFYyz໯K|s }wYrɌjߌ4hD\ R쌙`w10AփsFn2J9>ӊ C[ ^+TZ7< %Ypy͹kҤW>y|pʴ%rIyԳA/#T% 9**TW(s[+C[Q!IQrV;2R3I*l:#޴ɣњ tΧ 9lng55Iɜ9J;C8רЂuI=}MW+zcIJC&5܃F\q mDk"'3ʭ``JK`eBUئ%Y~z}s9 wguB蝹ZߙVa%Q!mZ¨S"SXbrIKM;]˲F38QrH+ /)K Mc"e]䈂I8B(g4d@q<38-ZYO<䔆̀1OϠ?s;$#+XosjlƾWW1J+W4gf;<RJ491}0< Oa~G҅cOb:s:ps9T*ew+h;Uqc {X$w't3ȟ{^~ /k޻$Y$aJm6TX*ug"y΁*CJ"6LʟX\WfV jˣw 篠`1ʱ7^xo^y=ϗ \^ O[mWyGwN;=WqXBv~|jz#jH/TC螤fQs#9@EEU'Ѳ/Eh~ֱlPW=j*} ZSGQ$Њ|:O5IpZQږpl9"b#|1e,T6"{Ű(XF RPš`"tB%1Dڛ!RykOf9<Ö,c!PbOա&WRwT;UI+tJy|ץKI IDATaDn55L PxM{Mr}T^9uZKP8auqfv,x\a rCpL̪+ZDJ$K*;EsXe4YN>'ܷ"]E8 k~ޠ5.M8ΊDo@x(rzǬ @8ٟ 91k#k73x)FEkBq$l)ܓ<p#!c19}ce'YƬ(8HIE8tWNT~d?{9clw~[[?Τlk^Ld/^zqe`qo[1X~ ** UxZC8 \xʻ3<{vzOޫ‹L^9-&xSFz_Xԓ|ۙ;;/~W\ZV)Q4A<@>Y[+Dz/C$,6(hT m2)&IrJUKqxr?='5i ܵ; LqmHoF-! C3&h&f$ b¢7 euaEFrh:MEM\`M$,TG[_Qs4dfHݜ4[wL M,^9WVXu,hRam\eMcHE)ɘ)W$]!1.H}Sqh4W$yބbtZwp÷O蹀d!VpCDdgLHlMV'gݝ9VHcikJ1t̉fZ:ʩq=!N}8#ryNmq;q9hcgIL"-Wޢ~V2gOx;Y7ZvLmLLju@Qyb+Rm9%71 ZKkE$EL:b@}_` ߑM8$M uI ;クZk”̬bthjM\2'd՚^*kEVt\IgR?ށZ6tMKX4 Z8z:O| Mд3n0I<7܋SqpYעY0<&; 3-jbP#ID)DC<_V, e#*$-Fju IDzHh0gKP.\K/H_v#&[-͌(7x9g# MJ!\MGo?_o|_m_m8fM{ՊH] =Ћs~vyPFs{ŕ1/__+:ўqɱ("[.tLL9+, ciVL(RV[M9S|gP<m"k3s$3f,V)hfs0pwۏӹ3 s\W!~GؔW4 QNFs5Cj+q]Ue"51%ii s:d'ְda"w*BA*Bsc ck3OA[(VDעT ZX#z#- 2up䅌Qiߕ8c7ښ9ɘWtt'sH4}__Y.i+{{_ @dsZ|*\^s?_0[Nt{|k<;:-p R E%O@J/oV7N8ZS\TS7[-k Pkz)yj۾'4rtM pN8,Rs4>v[|?}k^|5_] dJT)Pf,Oɹ+[6zV "ر Iv]NT.T.1=qZk{ZjִCdEYs eH8;# 5t438FǕ;N 4*Fr J¼*Rk+ >X`D\59Pm+PH]Kf%Ќ͚WͭZ+L'2]g`A>d}F}.B@%Z4֪P˘+up:ȭ"e˾'&:#*x*l(QQg"Q*Q!ժ8(cQ" Tb,NiT9rZ묏׾̷M2crEN'f3L6x< j`F&F%Ӭ&4 UV f\9?'+ppR>^B*]1wcZKDt>{/ ^2:J_i7m01D-b> <<C%=ІеM5A\+%jsԜus V^q\X"w5 bA)M26Z9Lle g\ƚb&^SX18o 瓣@fѣOB߿<[tvOʣr")M[Ἶtr>ımת[ZpZGw**Ҽ$N%WKu_[~{:OE͟)Iz%~֬+F^U F&:'WiP ⮠T1INRQ)F٘rF)ŋFDj”=VrF-?6]rR(Jx;. UWUN0+Fi8J%I)jS,{˲]$7^r. ;GSNRt0YVYhh,QtCeM dcmsI-'~__>9߈@^:gxO&vurR8fVqKE+F£G>f|BkBq`F0f#-q+ߪ{]Wp\a;1C'Ǿ3ÌFx7CNzC3o%)u?bٙ&&vx_zμlb8M:B/7%WG_}#b ?'|, >|[SchQ a`|}[i㠵ҍRj(ֿ+ z6HL ] Qzd5Vsff#\~⬃mcN%{&sx{ ֆaUhr 4 ۂkZ[ i ٩X?$i%qSn"DTeg=S&Žи3*tv9hia!2'}ZWOe2dy:FS vPŠT\5#չ&zC\︔UEWZ2Tr&6" HMw* D͖F3pZW,1%:'MGFRIj&xv&H; _ YA)wL-ׇ(&Fا(~>[GGS߸&'T'.YYy.8/^lI.e%Ey"eetB[J_Zp֍{6vr#if+=IL4}Y!KdեYf)ÍN+:#ES+!"'I91ƞ̩5ħ' '-bEϏ'}% | zOůȳgJ'Ych ”owH?/GD[DZ6T+^KU>BƍXS1QA2̘!0z}"bs=bVnIxb1-]ϭ@ٖ \倓FY6W01z\E%ȝZR",tOľɠY_֕Մbv_('D6&9jg$@>kUoAtY :+%KotT)WO fB\ =-qR\YcRB'3kIcJE=ޤKTE2 5_kJu݈6jz 2bŞYT-pb2bBkVP _=a֝rX]NQzkҋ4 GjY9~Dψ};PiHOq^Ii(6M'gʢYYtaRP*݀B6T!\뉓 W_/v.F]/)}k[`GE!x:ˆ %kA̺"sqZ.hYh'5Oce@yRbO=W/Q\TL8j5b%Jii l*Fy LW{ͯt'E Җɳݷ?]_}1A2yp}B6KhU깡<;ŋO^ J*KULh+ 'HzmĪdv*5qYz:2xPԅ1V h ,vW%,AeWRHn)L*ӯ> tDE#5kIZPfPPMNKD*hFa`X5iEi "QIh"kthtƼ+dWhzi oBV>~?nGE_ſpy|ztwm{؏ħ+jbP̨9CP"LyBBfPJcIKV,ov6iqah]f J;E9Cb1&*=E}¬\AeE"xb!RYA)2kmvTtY,_P?/^ඬʃ~*B4 օ[<]8 8SS1J.(ن'D0ݶ@zT`iRKVEHdMJ >W*l#U-5$M*MǢ~W ]S7ΜABkOk)AWlC&X9,IBG% speߌwhx<郃^9NEFhUլb+TmESzYV3 V`uMxsD#O0w_+|k}:95R5.vG8l&L=]{Wʄ)W*Z.!E;ΨqDDN末P+ǵ(}#p g9+Hl4 Dm5UCӤopM~=p6ძk_{>=ƨ0T)d*ܭX'$1%Vbx((JôA^xa;u|nɚT(EFXJ-1*UV} &Ě` X^L1[5\A5ZE IUԠė[hdԔGsbV(6i.:&k*"F0VMrV d)WJNsT'[+#GLT{ix4qoUsUӶjb6rZ`#i]ktEރpJn 5bnWo%N$-Y" iq)Z /oϥ=I_Vn5w^V*0+n `[nVn7k uc;rCU^PzYN.gX$[@(OhҵI5SroFeGQIrM R<}r|<6? )zf$z:I* g9.pZG7Ù7~/|/}3#;~Q~mό' RD! 3IQ2ʛ/Y6R*k3G]0cLƜ.8SY]tF䫲VkZ4kyX: )KQ~΅ݏ0%%IcXV\9nxb V>3sØ$;+4?՝#GmQA%Y*`2W4jNȚDf$%/X\nC%$t,nzX]铈 9I";У~plQD*ZQFIWkR͎.C@5J5Y9BT!sT+4j))M`, vB,E S+4KfL+`6h@8QZe>O[I% ~*tΧ4-*3P^F/hk+rxG5":X&n}B'#8RnRʕ"fK"bٵ7nP{ INe/ b0Kׄ7gKu EdPT3e J$"`|[E[ VAoV)$lZTúUQ˞/wf3[R8pi D!@ Qy]^kRd00 |RX ;F5H>(rrC蒆=Q @]H@-C}&d& `*)a\)&I# :7d,S("IZCxG[{mtQ"dFCz#"_z:OOj׈T2KDhj߄s.T\PY}r֚ VmMŭ0J`ׄ i)+Uք%jQP ٳ,բ]<{WMBPTjbHAT@9r B%|yX&V8]*hԣu-ZVذ ,WbV鎄_O^W\^rT̥)G63h)$Dr}HS;.EyqqU 55k?٣󝏜gů/*FJCd8+H0D@B>aM+Y]G/Suwt:d sr8EuK ʶn-v$%J5[k{ԚW(su8Lg*bަ@Ud梜yVB'NPL}U)|mUH3T8\',rҘ*OHɇ*)^k!MDKV%Rߌe\yJ- HaF),`'eά0 E~VSM,FEV|: +nn&kV.]++N]k7cTLuu[&SIm$aOBt>uQWZMj)N9ɸh5 ,nr*g"r*ꔚ'XbDҖ`u̲@E0^ki?L!롢B^)4m2O֪g% W\,gsj_Yq?]JvavW%֟_xNܖfab|'#j$$c&b} #s)om >tx܋ўq;x׹|7 U^NpvgGF?O3L剎pǫݹ{_K|_8<`BuNgih70VWc_01 MCTKd145WBB…$r8 $#rԤ$FexJЖ4-c6_$AAȆ-}]GH4 %tێy_$IqRuu땆4jE:L/-XD`QNTH61Zuz@];^BAr TR-HZ Bebq*- *cȈ*9, @ m>K)qIJDwlCv$ TATus5;EŃ JP gǺj&bi S'Ub2W{1p~$0XSjBf[C<)`vB¹eԊ%Y*@SWB<o^;Er./.:gb☌Z[#$H4Og9xBj+עY0[4D]L"rNي~ dVbdY;Too}$wˆZDy;uj|cIbL ьrҡcPV:5aZP^O [TM> eh-#eH gR.ljd && Mm\4uCi(1D%b jS|cb,`fOeZadSk6VsՑ9l]!#5,݂!뽑+[1٧"I|nE@ FX)5`oTK/B=*p" \Qʑ7]"0Ѩ]o*j$8c"W ӝL kZueqsDDYz9rE>t>eQz-Ccu3zJV#P -7#&QyJr,|:*j bܖ-9gh"RMvU{qo{d0Gp{o}q̼g/>ѱ5 /~?#Jn1VbySCZnpk?p{[yޥx;:P9OGM\$,q9*z&1o=!:18\th "D^lo\2 IsZ8X4^<([V`3ئ| V=߈uXw1&+%Pޚ٦-sʷ[e&>юЃ@rA?~p\KQ))^?Ft~4{5F`f׈w;G/›tg[S}CAm4B#^x5b ̞҂U@˨@ *CNQnepSqRˇc}Vh̑ sfd¬q{TsMи b;\ ˕M,6ds Î/2CTQX_e NKvs xEҶeeFg%熱V k5SV[e SG)}rPZrV_ןy~~~2cu tͽL>o*p鉆oWX+qI+Eϋ?5/_QK]y_>}8"<ˤIN-zhNNT å4$hKS]^fJآ6d%tef]'tu0,YäBLUO>ܒ֤O5dnsfYB)1rrE{pJ / [~^F~ISյ0 (i =]ҽ Z.NdlBPk0o},ēTy`gԤNtV/ֽHGӵFp3&Mg}kOSڽ3Px܊jǺ%"fNO2%FxbDAvE@bO"Pz_5!_L5VnwXT4v0󻊓NA KHs[>3}.9%pb\,b&=pVpAJr2}, ˜'ј5jcX8ijq8~Io~n?gSJ `cъ #wcד&lp熭1Jqo~(~Lbo_P!ѣ;G(jɰɗ:vuk5q6|!/cr~|7x+7O9:ÒQbp<])c[oEE4<;|Y׏hیd-~";:hw#+Q}`S=I^絀8 qWȽJa4'Aƥgy-|̳P< Puss?a!,h#&氙)}y 4%w@ѫ9έ7 T'g[ty"ٽ!VXn+P B': L..esI5tfwrMw47q̮8"ǘ%x1\gWc};5X0/9b ++Ü6],?p&M½Zב~2+b#-k8pG{ЭSd?P T8]T(L8Y Wɫq?42ѥ9ݓp_y1x{i@>99*8{p-jAp7Flt}'FUv5,W\ěx!8斖CMq:%)>X8ۀ7ڟ<}[#] .Ov-T :U0Խ6ƴ8=>x5~Ĺq"XRˤ )2%M{q hjA)D>sbѡ xhdԅoS +j<ߔA.|A Xc8`w|SM̃:FN'v5i{2\"fO2 ctRG̀6i,WÓ&!3_}Y{|W?ȇ6^SӓM oؾ$ف$&2Rb:MZQlk~2 znI.Ww/pց^xaX[QbIzaunt[D}qHP|zyK,٧kvz*pw1Y|cf8|BtE\{(cŋꃾi{BN6%_x7̻*rߘd=s>>}K}-/]-t cJa=Ƴ~7+}60kWj>37%˟}^˙yѣ4O{~o~g~.?xKn9s>ϚraT9;U\ (isܶeۨ*Mvu:HgO}n #oF(~<\@~m.b )$~7/:6imk9K'}tUd%=Mfdh+'~ _۽#xv$n[q]$Ir0fFV0?b>ɚ6A1E&i2R=ԹHy򛨍|[nin#Z4v+Giqnde0Q)t +5Z! *(bI P(I܋u`WJkS½t{'MmF;1FO_z݅CT˅͘gw*_ ~1G͸Ȃf3?]:`o5b7'Wo,HZcZy@.s@]С.6nsC,;a#({yUAr/e'Z З: FnbXKPRemūQd7̓`R8nܷ  KkfǀLv;}K]},Bqk|R4X4Ĩ8鐄+ },J3*<@TI[>N4!mv GM;mxAʹKA#f`Cwn]^|NtdN0Z]_Pʐ:5[L7v9&寴D|fׅҸbRTS qѣ)t@εC&>O?J_U kwդ&7Z&87>Ӿz'F?QlR"d; TQsgsğn2tPؘҁ]eL&K NCsHЈ!o 7Jc(=4 SOc8<Ūdۢ1xn*dT%yw+iD*qOѿx򇟓;=~ʷn|1&a' |MʿϿKݬ }'n'k8ub ys/an ay\'SN 6~a4Jj݌pyh7NoڅD{_r׸Q!LjYo6l& YHo $ka t|Ov'_5媖VUEMAG٩' t]|i[,ݷoeP3xvRۡ.AD=ȖCv~K.vl46ݹ×Q I^B8iFGsB-@valyˤ͑e0]>5;3wsg 5M,(jJ$O6&< ^R1ll?&b3Ƈc}:~eCmT_XQ*=O-%+cV<[Nof7΅q*Mm5noĊ8-1_`y^6rP,WFKנHN>:ѣ&m=,ɪP9D}y^50x{ [ݝdݺ h{統~̞óeխaIZOO?&WnӍhȿl#q}]"fq͇4mg :%pjܛrXSy>%=7 n_ Cܠ r^os}:&s; 8Q r c7BK +I8.!rCl%M 2ٮ8V:s$ݭ/cq1vPAqqKH67s\/;2cy[Z#<4.:|TNguгv/{HCs~t2H~'~mŮ//+e&Jf{<bfKϔ9ev%/i% hҳo>FnA a=tLg&k *UD RCg(qLOo88}[zf]6rjé9_6'ۊ;V.{F&~Qܺ8@е1|O ;SAwcCtXlX)QYMꂉʼz!)мLXxi~CS>O+jqZy1ӼĪɷkk'085vFGRMİ!OT^G*b\s32'ŒSfNKF;FdP"qUX6F^+4?*plH,&R2V]T[Ʒz¯M:+oޣ'VQF$&2K?NkX4?cpśq<ާzHcJsΩbn[ (Pw@-YKlVWn,3Ah mO;FΨ됚 QN{'){e rAX]!]^Jn4qs o^N"4C@n<4:iebl#.p/NUz}bl30*ՁV/:?CG ]>#ʷץgpH!]ˁ')]Q–.D' Ks!RC۩bDP+1>M&Y s(e֋i8D=O#8d~aG\~6F!МKLUXZi-ӑRrz^*G PL Mf{r05xrq_:&97P8>O(j} /A-BҦ](=ˈ}Lv@Ό@6u{)DRY5V[iP)ۨ TVnĬ=DG`o*H>E˯jKa.믑xi,7a Plר~- :iu6PoBbxhs}̇.B޲uLg dU*~P\Ǘߒ`O? e]\ iC.vf/ʴ!i[\>8]:ˏqvis8+>+=x;gO9FGKOaR7 ,`l{}]X%tibT:;e75 ?M4T).1΁ !ɕ!pyx#xR=iX.z.r4<:7%oY6ݰE[5]_ zkɔ.dD2|\,Q~mq]Ywc9z&Qo{ል'M$-gy&IȎdcޑ.mpqx6?E2 j,r"Z)X(j}}?wJMuag'u&҈14v#Mgau`1T$L64p&7MeVqyKt#`]B3u x\MmCoҊw\}%"lXi '\'z] {H5ױrBC]NGD3}~aGi^[RroY"V64Pk-WO{1Vw۰m J.8m p䓶k; kVMq}S1RG"T ӶⰇԈ$~cG6Ӳ^Z[[ЭyP20NԂA\LBd_}IՆ=u+rRu9ͬz#!?N,#$x6>ѭh]NH^J:%.o5?B Knvd3C6x2xs}ɞ-s[#9t@Zy08Y^8\!{9+c9иgK(Fb[e<'MaC%spȨMg!itݴ]e9$vG,$=߭^FcC>„y\F3%6,)F9YaNvMiGZȟt==R2$R(MfՍw1d'vEuX|4~:&PYcu8SM]|bl' ؔ E;D,'[<e)"*.L9llS^oc[9t'6T"DꊅLGļAJgSa}sº;q7^SLwoy.A >azc}5^;{Uk<V7BH=`Z-OM:0%iz`! N\K* ߯ļDuc8.9aMfYbbBgs)o.Api,aUHtEhu\ijT#0NuHkw\#fEnēDtXTjV!kl:z8Lw8߅X0T,ML'S.K4Om.H}gMĖ\S[l7ۗNz<"8[:)-C6K:Xbk֤KGF=csۘxȶm*ތ8Rb}]ǃTɪ&E}YXpu(?b݋bN] vx^rK֗: ]5QfxUN-'CܩN~Xd}n,GIv`~+41YxwBKp1>]~b5]7`yVs3LڰK vBc[u3÷Rw1 սn.?v8%|LƮ K23 Ӑ6Z#Jk$ٖ6BD.{!zIȐbPznl֏c}Vd/tO1dM^Hb_ЍZ7.l[ s]J G@&@ y>fcqD)j802])NNCL-ZYp3uZ|6r*j]QDZ2܌-pFm:wo 䄚O10z1|Mh - կ{2",y=y iXшqL0?Zق:~IyN2oŒk 7 %6DL9 ~[6-.-+/``7?LNF(@ϒT6Ub^`A1:8@ R7d&ѠƝfEvRI n;6JIۤl)? KU >/oO㚑v0 ϘK٣soA \5 E1UH܌O:8sP7R-r/)&2'a:ppE@h: | ^0mҫ2!M^ΰ`Y)!}3kpi6}y7k]'Q7 H5R};R\}ǡ'pГ$CW*́P"FLq3Io=3Fиy~]*PK!99>ܕ*4N"P>*vևK2,sWĨm''EO8ۇku40>(XM' v+Ou*96m tP-zh/3D 09UK}1 ,B(`Þ-ai'm*R< 3jؓrMC8.`H\)Pǵ>i(gxv2:y ѲFֻ%ǏNy6cEܩ,LF ʁ]oP,S-tiR~1.VY}6.a+oȁU(ۊ %`Du{kKusWv9un1U.FT{?lCm`om T:9p90,M |㉵ ;BչKl jy.tra|Im .3q5Ìrj+T ݤp3uZ[ߢ!aa<ڐ93o3/Z=MRk9aCy9^†nYb}vAߢщU8?sChXk1|3`>D.DOHu&) 6٩>:]rLa_7|׿uѲ9Yѧ%6woB$U!M?[C:Y/C0J9$4,Y;Kp ^4R)%ӪEڗ[KlM>Oq5s*ܾdߑ-v.>c5cat| "T,zfi~.`g*Š :),KmD;;;/do> /+q^)v2yZ0 fbQؘ-di70D&t- AW'ϠrnJ9mhS^ƪ) 7TL'X0qY;#tJ]>'Ŝ*{0O-<++t$FVYJ6bq:͑Vz9gn=dKY`FyyÔ (&q'rQ }ہIx?{%q% QL]ص~ٱlK-7[#m"NGtHY圲&`qhv^r3O^&,;Ŧӽ彀bo9\E 3 XƌOCV0vsEB!7d0'ӕM.-ǐ0\#@ǧVqfu c| o >O)j jkOD[!u n9b%~F׃jd))*\>hQ]K}gYꋰ ]RXʝ K`=-R[z]R7VN&WK萮[yh1FﴍOuNww4*SH\>W-X&e`1! )9-ubOޏ]S׍gRU;Ѯn,O?Yn6tx\`ZS=6EO_/D]t/ y- 'A|zkC ـ 1]хg@ IDATpb[N f:<A!l ~oKDoWT CΉ^l}&4Sh4[ݬ::m] Id}/*dJ6ØX%LR=CS4ʝ{pWU{3i%,g6`cf0 )Mb$7I$`rCȍ$͐BllC0`I$YuXխ# }#Y}޽vUkx_AQ)=bvRkV6{q8SiWY0"61Ak|Ua&Ku7cב(l@G2jn杖+DFe`|tHh`LK6QgD+6lJS:YF %;֦HTfD V#5uBEX7dQ;J y>1j (Sj%S.Xna1c]i AEִU ZfP;#~dcc5]EJ8jɴZ)Qh&h2ĪKlIK@bXG툘E+v#92Õ(v4BԨQcF\ fa}5]E@( ShD6ℐLldrb@kW^4`ũa()Db$@|SO2"qt6hCjDCj}fBmLLm>hdJeYQmRJ720)cUF$fa<Y Lj#9b#b3dI!X1I.1W/ ms͔ZOr2#Dopfq֥Dq 6P4\(mEpJza dvЂrh!Ӣc%8U9q^BDu8HfTR4%HJtH VDdʂ{ih"_@c0iD,SV!KU:^5DU4"Vk!|%AFl;L ]%3TL #bښ8ur[):pQmy $%9,%h{*%g2S!=T^rJ IchC8K9r-5FQul%TKM)o!cD.Ak*1H#=D%]Ҷ)`::k0% )R'dДX*m[R҈0x(YTbZ+S: r»O5j@31΃% ު0i<^CDZ&Yl  IOA$Ԏ&L Zl,1Cl[~sDgӤ5c]W z@/Q JTJ3&m01 T}J]!b ! m#䢼)%VamI6R)ٝАNk^N];r㔐-)j\k d1DQ*Jx+h[b t. ڪ+NMR6R`3D2$L)䩚2"U:w"=PFGLJl.MybԶp%&n `9-.Xr$yuq6jҠʇRMF .'BȔ(pud2I)PMwXQh}VLEK9%qSѹ1,W'W'xH]]^}q"FC+]+"2"ؔ52c@ %I: Xd֬U1D;( LXSt7u*U #+LߙgF^֨m0.T)9ct%`֚*?WLTX#dY{i; QAL3I)vQS^ވv  TVD5IJRyRJsF3VIBV3N鴍D ,)D)Ĕh&,Ҩz6F񦉈vR YӺ@eډ%W"0kS#'ZO!͕c$\'eFH%#>-5CQH1ҼUH$$>@`(ɤG%5vq b#X\ `jBnq* Ч9&hCDL71'9E-b.TۨHI@Tb1TD]-xrWL? I!Nu|KC/%LC<1PUTAL!SJ$dN9E {qJЗ)]ZL7D:8M`ԡ$YGYFD24}h I#:>Ɣ:숭0&Wbh(h`S;-⅀}T2s%IxrlK:TlrlŹF<` cc  11r4ak)]a7bf *I9zTv$="&C}| &(*oEN|$ ,Eӂ}[%fj1Ȩf*UUJ0֯PŤuF.+`p1"I#BP +M-jaO "dP:$hǛ14pbMm\i[y~Q8Q a(֌SFCpIZ,^l44|nLvkJEi%QHEri/BioO춓CRwVB!F|eHlj݀q)401*gF7Tu k5.Si03MqZBh)kH->tV4!3h V;v@pYL6[=%b -D6%zFsMdR2Y;!trPdMRkiMI;}ݍ ❉Jlj5}GI [XC"h:LSٗ M81j mSEn% acIjA9>Ii[F}4XS`Nz4cU4ST'+F(k4KH4,bF=Kq )Ŵ*,Ȥh ?".e^ǹS+KM3jqr%ɲS&UoUA٦IobG 35eF4;0!h;:h{WDThWVfre6($}"A5!iS -W))`j6NPɰd&GZ,A|AZ Di!֐Ni Bm$xC-fY ĎZ% E*mǐǜtVF'4Z` ښ4nI^Xj>9'Kliݺ1UNrd֒HfU' і3A.JEyI9eDk3<%eC2Q,cbə)dvbEh[FJȉ4(Sݦ(:g>uR lyF:J=p"dK۪K;X=;5Qy lNft*XcJ2B+6&X+2m D8PR#u.aRWb:ΎnbUD#Iic2 Q[^ hELpFEIUAg22xEʊlLE\;8|%z׭6QTS-5Jy*4avqU&IPL-D_k@7dJdRWY:4RԆx#IA[TN*xbVph7B1ctB(0X%D1YALo%KVQ5Qh𾭺YSi` 84Q!g]$kڠvAhՖ$:tL`2sDO<= %EJS^GZyHd jQQ`Lh'zDH2ڦ社`$*KU&g Emf54*3,K]3:m'l$KE-@Eؓ.!V`0Z؞x:QP)󷱉E;ڢv%&Mrr3.TT{elFc /HLF\k5`'LBP[⽳V$\}|IU5p=95!td ʩ$RmCրX}.-h}J |+V)MK6Ø\SO_ q9 ǷOJdmBS%2SD٥$Mry)刱R \ƀPbbE¦ptRjK͒*Q)F%'sA;T>!:>腱Z嶫ĆjUAqFmVȒb:#@<5h4ʊ3C)AAǣ"BتPNSaSB1:Ւ\7RJ TD b0N7"QnFSeN4#+Gi$)P1C!9nR$R!XeU 8P(#^uMҦ-ddbC#q2118t=Kiӊs]~A[E9k*h[cS;*\}2JyL7_G&:PudG|ji'驡chRQwrXHNu*IY; Ih*RY(pG:VHZډ& $Ǭݧ`%$E̬@;1JS 3$=VR; TʚhTfJJ=uRdڙV{UϘ 8鸥H#f[]'6ðrrBȨQ4NMYUQY?Y{ ga69k`%;f@5A&);Y/IG '2$\yq) 4[&Ure;0gz\3|]O9e6?4;禗5#!+~t[\x]F^OnA\5j8`\G5v<ԨQF5jF5jԨQvjjԨQF5jF5jԨQvjjԨQFSSF5jԨQ;55jԨQFSSF5jԨQ;55jԨQFکQF5jԨ5jԨQFکQF5jԨ5jԨQFԨQF5jNM5jԨQFԨQF5jNM5jԨQvjjԨQF5jF5jԨQvjjԨQF5jF5jԨQvjjԨQFSSF5jԨQ;55jԨQFSSF5jԨ19ADѩQF]FON0oh5j81@Ԩ0i~HjԨQGVרуSSF5jԨq[#SSc.&bGmeO={j0輶fR&F @b$F0`=` Fm{ utmԞDBUU;='5j*(d.{C`xx;Q 4X0,[F>-ޑaFFF=>90-[Ol߾~lݲ_7~N=4V\ulDFo:FF4MY{˗/{1#= g{MY{(W`Odxd=6ʱ=En'=E dyd/XɧQK͛6rǰhv{Ogo1BN=twDB/_E\obJ0-[6sGdҞg.1oN;L.N _b/篽ŋO Mt=l.(|>ի1ba\ps}suѠf_7_?Dۼe yN,( k;!;fgWTރB ${Hy+wHܒhZ]'2@%B u"OƜ322N dObhOƠ7#֯gECev?Xz1:F!Agaƍ{}{챳y*Y,yY}l}vV^1Q~~o_=)67WqE5k3 ,X󲗽Ś#gį/~KwyYz.cL.u^996ic,9[>uWxmє=Ĭ|3:>O])^uXl}{?c/_>5)Ivccp0po(iO{Zft=c._?h4tܛQ>[yӟ>gqpEQ1V ςsxyz5Ff*{z#w߳+19gs06瓟׿,_|lKtrW淾M6r'7s/W{(?@1liNАaД54 aDk-yzBy_ɸs)Jd…< \'2y\"/;ȲO]}5vիV3=ɹ|' <|.G`lOL?|φN.KjL 1~V[fufqBzZ˺uW}gS?lǮ(!6TrWh4Nv}/SM3>z~0SNMp;>"5TUEUUe9ݩ)(gw=JN3Ϭ#<044׼_d&{g/u&v*~>gCt~wwqܞe/|s:u-?7Ll8dYOĤN,~Oeg?<ϧh"]#~"_e9 szOQo/x_N;?Uoo4=-j5muL6Vu244t;5x6v.yozB7OoN:{粠.y;~nax&$-N89Xܵ #9Ge&^pm̛?>FI5Ny;N"~:9cE>go~Ӟól7>{kɜOgɒ%4;2}VfvLe!ku{-C66{jL1PkFf|E`({t7D__/}K27emȌ3^s1$$CԞyӟΪUhZ/c]\ϨINew16:}}pwXbZgbrRyw(18~q= 3222gkݎHͮZ_{K_ʂ ޳xbV\w9<_K,K^aeC:ꨞ׭Y1E{p.gԈHN)}cw~xK_gqN<"m]wP |m >N8S2C]۵#6߳MǓ'rHOcc!s^Zm`6n${S~xG!:[wmyի^I~80x?2co `Ξ#:;n'xbמs={cyO8Q;̄w~w9ӹ뮻'>y=5kpG8f# ˧?~<{xK_5\üy#HWUUm͛ǚ5k0ưh"KZnnɏٶu+񦷼]-Xk{vj1l޼׿M|k͓qc!=\OJ;]ohD?̖[馛Yb?Oy+^Nq#;),YQnN=b\ lxQN<N9$x裏rs҉'?O^9G5ACE69W[8SzzxcPݍ2-fv*jۄM9a/%98GFx.Oz_ϥ|-\r%Xcg>իVs-pmӟ>#Ѓۿۼ9w?y{~xō>SMi7g$PٰarVFM=(9ES:5"8!DpqQG /]/_[^Eq{_9֯_93ȕe{+?xvT-[J(8i6~i,Zh9t~l?=v ̬Q"!F|ڸ(=yZK8rwCTA8'ag)`!='YÒ%Kٴye$3Y`fqm2u鑛&{.]=},\f^#"כYT~Gjid:5UEbU-H3NTyϻEAc{5Z+WyfڭND =ܯkwhUZj'{>̟q7{D^DxK_B?k֬aӦMva qWzxò]ux N9d^.\HVg= _l߾<(/},xt~sgկ3?nZ'H^<)OfdddSUr ωS3qΣY_"T .6nޥrSFҌ1Teɩ_+F\AQG۷S7jn`rܶmׯ*ƴveB^(˒"c lڱd TbllT7=g x1={H_"e❡Px޻&Oahh_gqbz_ylRlٲJW!͟8 V]NңSӱ'Xl)Y6o"x_ab;OsdhA='|2ַȲSO=o|Xk9餓:S n|\ sxᅮwq'n"?y#jae۶m}ݼ/;~)7`N=Ts(\{u|k9<%؃bzywyTUʕQuh`r=1PxH-(Zz[5mhuVbub׬2oh91 322sc-۷og֭|@2^~شy.D;(iԜsFc)R6wr6>…+<'xOe RTY|rZ6otPf/yK8syۧ6Աթ(67n"@YU br6#zYv^;U7{J֯_NÞ,&=g{׽ _FkQ)]5=f笜oβi3MXzC X|{FFDѣbnCdY/_#=?sمϠ:}[ojybvj5c]_r(/G3 bs'Jdk_yQc$R:ƚXF *_찛 ۹ Rt*źcj(Itge]422 .dl() x;ǝgNJD8tZc1::C=իxG@qQGry-[+(?)^אev eV֯_Oh: 髻;if3<6[n|( N94:=jxS mlݺu~Lf7m6vм![m=>NQ^-{2=&7nd=EQm6ZiZ{lό{ﻜ7GvKEu6 WfS3{bA}o #fDjҺe(˒`xdD:'u0&[ne5NUV Q FFG`(6֑{mEjdΚh"B q'enڵj8y•W^e]qe￟?O.OO}*CCC ri|g>|c/jÅ^ȫ_j*,۩VwlpG'?)>Hn̴I;"51yx,ՅngW'iZư{1 h&}~ڵ7}F,XR|OG#?K/]-[?-{a.U?4/ey]ɳ~'M?fя~D_ʿyafaժU\W(݉PCzֳzG9}GlpB?ۇi4p1{cO`㦍4 -\DtʞY;)ZP{.^K[ނ~̄NI/?ִ18dy󲗽Oayl4Yd _Op?ԺL3^a̤{Zb.zKv:5.*Я)63uwvx߾};wq;۷o)W 8{B!?})UiZTUŚ5kƿ| vq|W2666e!'ctB]ܭ137sdggϷ 1F^Xf5 IDB`phЎjd…]Gy"I=%|h ޞɝf:SƮ[߼{ZSgeT{rI'cgJI;G >lܯ-\1"YwטkzSϢE=aB~ۯ .sv[t[|W\=e~7ιN=38UUC3 1F/^W\]}*˿˝eY/浯yM֪x;ށ#?}ôyֳ=CqFj$|D!+ wvF:騉uP9^yVX-ߕL3#^|xrpTدS#]F9nY Z.['ɽ]<p=O{uqa͙XX)Gux_2>ަ(h6(<=Rl2=6=GIG-FI(v=hd5=1SNSOhhmC#4s1>uY/}Kq9dw4>Q"z(`3>ޢ(r>תU+}%CyjY0=vl>HŮϴz !`'jbJcTj{qyc!LpcWkc!"<<\uUr! L~bRKlַyH?eN k֨ e5}WݢjqYg2442j1ٷӵm펙01˲ dx+W`Ŋ;{iNJ|鸎Xb9˖/۷6 ҩh4&9I̾g4{n{`+w}gҥ,^xՉCt*W\/,YX#z=ӳl>qjd߅"o}oN? 7ŔFIBv 1fl||= fhh@&"Qfx`g=tRQ,&qlʣ7jzW= C}C"˲sIڎvbuMVc;lF酕xm bSڴOaPku2%{aoh4KKў;ẇ()vה͐> vl^=S;]Ghp95 --}MFGSp޾} FGFxLپm+Y__7=ʲi>Э h4 Foм4c zg߯"1Ğm[7 ˠids}|d۶abb\A֭[?hC:0Wє}EZᅲ|`Bqњ_Upz%K_Ck~*N<.Uy_?f J6=3:;/Y/y>K~AjsItעKy;{mN:njhŌ=8SwҲ {dwg1I͊|~K==O6#ÜpSSWj4{W, Iѽc1>'F>7j rG08o~ש)91NgQuԱp s 1xcl\F͟1Gv@׆hprϽrĒE\o3Y9úc}MԘ|:](ݻH:yUW?fgהw|mt-b~gq։G9[;63<&^q޹ 7A-D?9lLa_z N>Ž1Rcf,;_}.kγSSFBNf?&II#HHl! EyW@L']3Hcl.[B] bמigGIb5Se*sWg;Y 7>3x]ׇ/kI &w3n^=y3zљ99a^z uLmɤQ '\@\brD&,]Uo+O٤sLD}w\]s&4d'v Y6'34f*c>Nn DX{=#5VMÈ*੢3ŔD d;N">FǷ"!#Z(bx▟ EX M8JXf Z4p0X5(dD#7Fa5",1\cWX :a#sQU F,рsAln>bDlDh J80S6HlPymɑ0F)*8C$"X$xLLZ7pb @l080%1Mp9&g@(׾N3$+j츌FE!LV}xA3 9@&9Ɩ@\G4 G3lQ&#7h2Q18k3O0`c*q"TWĘH΄_ IDATV 6FZF012y!@ TE RB r1a(P"d>G"]9l^;1PmvO=8>/(0`C\ƅ' ,ִ d1Gad&`:I1@EF%#@DLFpaAHXC,(!XX##]6Hn ^" MJ*c Ƌ0N4!,32mNp6c\cvAhc#S+ZmPp߽ 6B "\C 168KTe "2g!XȭIŁȭ`3gl$:KӀ5΁,fP,f!GŎ#QcȸxL̉xJ.FFpE[1THegXC %JXmbAZG6Ҙ7'e\sزuE҈ 5.0ChHbu۪z_k}s͆G慤,Ԃ``&BLaD(ZD &U9!%Cx('JRF|0RQʀBCp^Дȉ֜9^Qdyq: 4ւ 4m$BF' ASMMhMԆAF'6uc.lt Dv"JL EtrL"m&c30]s$'f~@L!CA΄OċD^l$?sgq@bl ٞI/2 ,_1~t>FS;b Z(MbEwm.*^G]S͢6P:" (F׷__O+QЂyQ{ ţTG33xd̉9 <+I ǬGA?~|Hu/|fg5 uqC(7fcfâ#:QRޑD8T8֓IFBofd%88e=-A=p muad k2k Dbmp$ SDdT'2)k"㠇C$\VCyK20 B Cs&H NP uICҽdv]ps2DׄN:15 3F*bZC%ky,vf2dCtÛ  ͓Y`E[f꼤!1o6 Qf TOtFJGu@ H:2 @$\8@v$Ar cŬZZs< ĈlhDڄ΄:iE0,0ulnwq !6)0DLZH3Dq 'زtF=o*tBp9-3IiLР(MR(D:ND֠GhQp #< |Z{$ pfN2D91I4YhIS]k#MQOEJ׍3Ʀ4U6lmbk?mQl,!<JE!tVZ(醡7 aDç1p#pWr&cgqgc1 PƄb& l*dZ)[-;Ʀ'65Z@0=q6դ!r·35! $,.VSl*ʦLs {X7`b8cBf'8kZN!̴g,.LU1_[z1}eADlX\Ȣ FX kJDXm9J3aQhT-O$274AcLR⃑΅ICc [Mp~.I Hf7AA)mLi0$7wo&f:z12x5>i39#8I98/5D<"J h톳'!5fL?>CsIX4ZKb٤E ';"Iu)N 6Wn$QEIN&G 7rЁC.rޮiDV)#$+O8'd&&lg4'!ҘGaS<䟰+z??1Dy qS1+Rx Z&b#4|d6(QܠAXQ ?ΰACH^fCp$.!Ф-Лl" 1B2I"dt!# كcgBwTM^1ad4BSO>y`&krl:C\Xgm$82Lk{2ڰiLn>jH:`kg% N"ܛ,쨜] фGw/iZ-vvhD"/Dt WLܰ^LfD'Hυƕ*BmLJ0(Ihqt9pN̈dz8Bρ `WABL$@$8׈6dbk~ &W =슠X ?dyi$P-yUb,1϶m4bg"`@F47ƘΑ iK ʫfٰ\yꐆ9Zkz1@̑4f\Fڷ[=E88Y ԅ_[B:Z^HQPj0%'$ t>PEMoI kagXc` jdR&z~__^\ dJn`3r, <FL.p"*TG:YzgDrRބY(&=C'd#ؑ `HGSh8GN<{7~s.39P, V@5p/*T2fBҀ3H3J-=oFe(F6"$ؐ:81:33MIW}Κ%}'B sQ'F0zIHĜk Z8"W&\X6f㳀JAqꡇiJGiyϟ?s=QQ021`[ZS<jFjZ@le~$A`HԝЬ2 i vf/Lece64_h0vF&1pE*xߑTؚX?g>wZ*040W,2Q3fv$*ɐI <] iݙH\A$'2Q:V\9Q~#Z?n}L 3HM192A eCǁdQXTtf)LK$'2ˉ0w5M/࠳wO~OzU9 vC,60#Ťi!4i7T$]f{& g*S ˝!5${Ծ%'>j9~Y6Rk"ԵLOTnax(kJX3In0HEK 9h>j"VkN.5fL7ĸ!@ә#Șd4dlEAG, e{JiC!" _EC\?'J/3ywx^WZb`\ ywW(gQ i.RP. c7HJ#Wy{^2~'~9dI??x{>\{qfc\׺'R6Yd$3DTX#^N@)[HxKb)Q{fD 'EB@/RR s(dDnoO'N;J55[cadd!$W͔P-bw4I0z_5^󒗼_LNdH[pJ^*}Zdbyw #Xc dq bnm :c22L"X$x^ixR p#ӽYr@/LpZ!޸!ӗIWRedE(Fȶt6gga7 5;Y0uDye[i=McqhMæ mBB0:拌56ZrcZkP Ls?sMo'-"ʯJ.%K@5f10":R|ay$wClYcN@N `%!6̃9X=Aԇp:5idFyc.&Td\@!"AaYY̓0d#4mK#͹n[砝8I܎dmowZHY0Akz#Z^R:v5;jMY6IN5bC{AKMjIQE>G(>H/ỳIV&P QNzQZ:36R/A!KIleQX YY ;DHFcM<(46O1I843XL&!O/f\`We^FcͅM DrEw=M kvɜ_]]񖷼׾ƅkX = h$=(&OēF+"ou4M8SDieط[ux+/ WH:x*Ax2ex-bDV[:VP K82SH/zkD@D9ZVRJ~B,Ï?8|i6 ["Mwb˚cETQ]C0ETb+㊹~GbCW/`aXE},P Ytg¯ /?R$#H\nHB2q/&(haXݰ0Aַۿ/e/{ǖ7TS at7RD Vֺ0B5mc# Nt8wzTut1k'GfQav5,_CXsYh /_N̺‹H:F2n&d8޶IL ]|W}G>Ÿ>r w~'~yK_K_R|I~~-+ TP:Uj@"17dvBkZ.* 4*pHҊ`:# Mb1nd"Q魪JyzR6始XxJ}QCwUkR+5Qf9ي&c BN,s;b5;DjӋѷ}~UzTY&Z, V 8]>zŌ[NcaD`*Liw*ʧVrʃDD9pHǢp-u:hiu+ܔu23ppY_E+ёkN112v4$)Nbb,,V2lb]Ein4RK^i#R)ݥ,VKcf$"`ha|pO];5A~WW~) |o~3Ӊ//{{(t9*n톓L=H q&;]( *hiR}ID{l)$G/sG_ʎ t F 9j763Z(,a0~E(V@pQ=)ˎ-< ،&}Bʳt-XOh}|%O>]b.oOmeP) CI8̬uT Ϲ`JpDY"bp3Ճ$rAu:kBa>c1y^ [g5Vo 2 eVA|壩&>P$" b#hM” ] fS&&ڌjw]*G2"<9˿yv ─԰C IMHvr(ٮQF[~a4-d/Рx*0Wfܯ)P D%d_3J <=*bDHYJ.L5R?τhLUD e[ ^󶷽hMM ;$'$a.4mf`dH%>bbn'8O@K; zʽHg̳|98<+"br}6=2:GE52 cA5[Ҵ⊰ eQF~'^*[\1%Kf]ktH^! TA49˜3ؖKAamRpU7y1aGR^lxXbċh]!q0QSiur :1 WQ]Z<~x_̓O>;GPr3U]:ΐ.VVg7Z]Fx%Ti /;]bTӔbH()n;d0L Qp^3IleW9(y}žAoe12 A?$yܲ5)gtYw?0)7Ze˓xLjTɒ7AiEL",ۢ-wunnΉkˬt|2*6L45N![@5Lgy) ZwGŐj* E~reGiV{Jc7O"3%=V's.R Fn3VEx\.H!ca[x9ڣI^ШUTFS3 Ok2f/g}|c؝htVkg&SʴcP !i5pB2sCuq ,Oh(.ߚhB"lYsA;Q(*:085}Ƚ+dҍˉ/FzMeTIcW4.5MiS#jȓO>sܧ'44m9ޝwmm^Lu)%+ JSQToE,1*Jɔ J!j\f+6QV2zBB C82D i967\E\עw)ۏCU?v}{JMIL/ ZuͧUCHؙq}dV$ۙCs1U~ߔ:tna{c(gT'|7Mg[O~򓟵lLZE<3/wJV‚F|P^|.Uj2-b`$BNu~ܚJDP]Us*:/%Zq9h3 I{Q^Ʌvka]ѕ&< x_돀QjrVj4JN.xx1Zjve5cy/g&NJu*<[$妼}+z4G&3AάP@z}R#JF&>t{OV b`8 I 3H)x;w|w}__~oRJ XA/:XrUK1+D/ |D)+H.0MXX!`yȢ^%uRC{j.lua-b=]W|7ɣ* 21x\^!lO3s鷑sBD|( /~׼5J/;8uD}=Ba^w6A@$Eƪn 'FW28jD,cP)WTEԕ] #hU܉<3C80R”꯱^L(. w-f'x&y?c/jCՈHGMNfY]-n,Yu05Q=*aI((1Lv( NªAsN*o3ٵ$="}I M^v!*Aզ71z*CgvVtgː:HUi؞iyrj%LkW[Ֆ\;8D"UFL*1+Jg>Kco 2fPVNcš~xɘ6|58 zfFKmuV줽!Ϗ ME 7uB;kly{?Z,&__~x~~//KKO$y~s˿g?OM-o㏀B1ZaQeF4kTKdYZ6x1&-u*^v[GU(\4Jz&|QE-9\E`鋞Wfc'؏72ch5z44ykE~~~ %t|6 C N+T)^'bMK8, ZXЮpEesbN[ogW!\~>>Tft<' hړ_-sW?tɔ8 ^uM6ܞYqy1eձˀ/ggٟ#>W=hsx='ӍeN3Gx-- lmdJ`;p {agoQJȳy(κtDn4- +[C&*5,1h~!sb석eq^ך@[ //ZD5zymD5t`ۙq_4EF+,F*̕PtǙ,Pi^YzU|5uN!Li֏ Ydt]1vS֚7)fE>Z]C&z.OOsN -O'9d5[LnOZs2|IoWᡛh2JgSdUd>fVJܷeufeדR:bMV7$3 R;䁭 aDž-̰ȸd`Ŀo͡D<"Ɇ+.B8-͡tr?]ŔtaI{B˪ʹzŲ5b$}`&ah9~_}?'hFkդNTGTI`J?*WYB!CAO~b,9#hg&SY0>bJ B3JuhRkRógr>pKͬ~W{(A%|.׺Ecx۪X4.զ/i_7/Cz1:ϳd0ӟ+.- OD_whcf+Ӣ1ہdjjQ"/zʐt'qOw[zH`sAV6܊$Lx o^SWL='ʡTԄe@W&ڋM 2^smm#h!AM2aGKAv{s0(Ӫ T-ʯ'?oLu񬚁U--i8!+Fg>]度s-i m97uƖr|\8m4ZOy,b?''dc2~%J1ikXWTA`s,:6v2u:d+&¯PvO5DR;ϼI~?OIrbR}ӟ$F$B ~TXX(`ݹr0 A`n˖;Z"f8mW@j5x2M?&KR n8 q'7'SeSZO'˯5꿖";1Pk)Ϟ^}rJHؘkҶJ"TG(xSB#u\NOcVkkYj=bCK+QCYH0V<3 &Pf{u)Ϸé)7M >ޢ`fK8TEM_sJ*^ ܻfdc[\>Q6҂yϿiN7ʼnq$l8ʾ4mg*&[^1%qktHX`feZ3dˍɩXr-.;m'!sL-H'd63lpT"=-yJqe܉o'iMSvwNzE87NEM YA6hʓvʼy W,묄kga58 7t7+T ]P6"ɼV ߍ>&ְĉ`M鴜t2x%E]Ģ-A-يn`5 } Fw`M-5p}1NdԚ"Y0@/P+u;B6Tyk ]IHdTNh*lmD!6J"k>9Ɖci 7g$vMP3HEWu qF֨"(v獷?Iv.`eg dOu%CQR48k#ebEkF'ύLj;oM½ pU:*Za"XGPٶ\xll8yck;m%HM OOgvy=6۔L~6;1@9ϾfkR5֛|dx$=ްcv2vM1l ^æ ^<48>2!+'CVeƴ,w9 \hd"RmνV0ڹ6*_.XJ {qDRBXeNowd-̅yߖzrZiѵn5T_%7|Y W]M%LLMDnj5pZ{-"Q ܊e/qK\jH"krQx%u|UQ4V#ԢfD4Ja1 #L5;^}`%[a?Ėe4S7ZFF69 ?i{ҲuTA/`gQhEv _D>aN*)Z!)-2Bp?&p/FJZK :Xݙj/=Cj ]MX{ʣ"{Oư ] ; ^D pKdAI6|o<>"@SME"1Xs>ry]vTwj̒iW6b8p$ɹLjDGeM|9*ypF.FT.WzW~FnN,mab91Q `[é8s`^sIQAcRܡ׿*r;pdrsMEuOv. s"&gD/g6fhH!hG"$rF+,f*WT@M \>*̈l]lҵM0]øW \>4 IDATDSjr_8 kЙ.(it}}]iqr(1n-ؠ5F/mJ]4Ȯ fgilmVϪyKe6@Y\`J`JJ3uX5(<"&7Ec_T)'^oS. s=gUHR̂`l:o~㫴vӌ,W{A-f82%<֋$䅟Ҋg, d**p:L/:dU:N0j/iZ_X,2;|֙/+Sk"cYcz``ѸJ)%k@tmq{|єt35.-Zzє ݄7ŋ1<,94أrfp(&&sFqҪ (*`//~ dj5&kF 1Aj5tT/# f ˀ%M|Asx(xARxD:3A85EKk bd}j&tc7fJ̫3V?8Y$q*._{+VjQE5NA`4 bGt$Y+ֆpc!LW>dLQidflJ 9B0<4fM9i'1ؗZEdЦ"8@2DIZ2,X f`dSb^ w~3y+ɀ1X.2>UԗQB땮s럳|+&uC47f>K^ E;YDUPRA/̋;=g=a]fa𶙘OU`QuS@\"&K/S/!=7 9+J~܌w;Zx,zk/Z;dm 7TB&Աs7g=%O!A1#bp(L~`nXp4,g4̈ T< ConpѷBM xƲLjk1^>Uçp9OV;ys;xv=;# chQ/.ʶxyi&H&}=! C1Ԕ%+K^ u5.p_!;RZ}{%Hcfә~![0M 3> {`oFZү G[^T|VQH}av RJZiH1Q |aF3Ca:M^|lcJtE!|gf/^҇!Ь*ylS&NLݡwo2ۉVv* XrڳʯLQE37ᅬ,VZŁqiGq)YsHTŷzru.zGY|.kӿ^VcJc.迅 |YA=<8/rdFyKFYi!OVU/2Y83 -J9dI`A .y6 7a]"aΖLy3"Vz&ք0-7i!_eugs%zV#J$] +/~^-LԋLA_Rib.QW:Z*G*,C֕3W%zUF4|smh1\t*}N[p!elOeں&k[%+f(8eRbB~cﱖ`yzuhř7c,__oƾB.zXv6V@$7eӦH>샘umY1mbs289e&L\y[ϴ%WD;g^LzA3jpb s |? XFb+rIHhJØ_ʭ=6)3IhN %hZc-?_J :dh1:Zh V>ӪmdPB9xVi6˪oɫbt'=|4{6jV̥pXo5>ւSEBG8<8WJ链oB dyoArzfXR[ׯb1 Z_["(FۏdTLnru{y|҆i՛uZX3.V4egu&sZJp8јd/H*>IUِeZ;,FΣ*N /ax2ab@AE}=xLEp+89Yy{d_N,/c5T39EM? 魌6S0iRFu7iAC7 fc\+0'~T-~ldMfZ̝dF&^J9 OeV.:URJ#AZc3 GRGNM,*'[R 5^#Od[ ku)?ڌfOq{Me zn,L?6%cТєb{8&K=ЁiICȁIڬlQd{`jYU+˱O,uX. 6E]l ySLH"PZ>%saFrL҆N8&{m點}L|axAg ҫgC! ;-;ڙ랡"LYJ<n_FLMKMxF1kPz?&M<6 .{2E)6|7\m2u5TS\!'ڔc`ZZȏpW$$,~#9D2() 6J:+`/AhfIGdf]"G됵ԋToY56udy+)-+.V+J."]huL51a1 %/dnJ]wغ)sCd0ӫ Uŵe#{yY6YhRC&Qg#?X ;B-H4$Ux$ Od]"_XB3ޢ1.Y>EI -*KM۱8qЖw!V9UG"9Nd'F66o3ҋոBL|sLZR$~ʿIlv ?Svp9 djS{–NV[d3st=_k%f9]>|,bX2ML <W}`iqߜ[o ubg,ҳK2 b#lJz溺P.Q )S=qZ#*EXRKH/UTÈ\,.v ({ e4^@I4#mXPUJeY1T KF-Q??[m/D"o]^$E^_maC5cO‰kɁy̤̔68ޱ+wU3b 6|rz<8m`shdߙ2Fy*NYy\&v\ 7_+DlL*52/Lo@^Kegϋ.3)6X'"[fhߊ8mR3°_A9P{ԋYgaU=)Pf:.K)RIEa[ V( LLȨC` 3 ӑ.+ȵ ״wREV ]Uj[rim 5e[IFyEYIlBӔNIUx찆d2O݁ey g\K-OuʘS`BoF#\2 JhaI_dqc6%ACZA cǣq6߬H llLÀ*ɔ ̂+@fl~rhځŃ9`!RiݰtLc)74 TIRA \%moBR&QF=>T i4O?lIa7XV[J<гlWnˑg[.aq*"8KF^FkOBj [:6 *9G% T(dХg:9yL̜1|OzA\hur"P9GjAzӅJ𨔤E0e2l]5Z]C 陳B:`uC)J h+:N6:lxw+:JCEJkJW%Fg#ʜK[zFBZCVoj\jnF_z?8;e1F4F8'3 Frz+!F!;#ܔ2,.tz'-f`j}ϮEfկԱT=`RŜ΍} ȼp٤+)w]bP93`sfOiDxc#P~QX ׉)_RdW+^U7cayUCdmRZ%Z< t d+Ueϲ0WZ(%W%pAy!k04䳱ٺX#[t^Jbm(5*pN{fFh@ٱ9M ͒dȗY-#ȾI0hT~7W:ev!g`eԓh*a'QXdj#wgM =]%SSk#1EdXMM2-]QDxA]Fn4Z@KUy%_oLb^Ų^вtNh3ڒS|L="c=7ms۫SDk/:+ ?U Wkr9[OnSxpKpM/ST7f<ֵ&g9γ46y"Χo"<>s֍]벾c-jٖ.~km1SHGFV e' g :8#n}}:P=ZT<\T|Fu5;E4}&d,l.R^ n/tXwspjrnYSbNyOEidJB3J ]uA]kO$f4HAĮF rfg4Yҝȃ .ZսӘ,/y||!n^B¤صžoBpaqkؐO#Ӽu׍wl0c= wWjr,Rh)NJuRHQZ}tZ"Llbv|k&N1{pѪ+55dPӽW|[+ u0d߮jvo:Nۋ2դޝJ \L%2ٷfѰR,sQ,KF Y,A]q6Jxe8+J!8J.\s%mRh(ߑUXprVI>TS=h*1z˲R$І|YoKi+X9-WrO93MץJ+A`g/!|ir|KA3t6ҾBBrk*6V_*.|RFgV$bbajoP뱆P5F ZL;`R Ig z<=;o,Ai!8(Н%mqě#= 7݂LG"]T#"+NRK>&,5*fsݒ9t+1rT`v0vz!o3p)`=bEYuc]uaŵшt{Řzod?F]p9vJ`n], :.!ڶEb4ɐ9٢a!.6!dmnjmbWnj@惨Aj)> \I3#bs6r1Ml TV~z2-Xj篔mB|㻘-1%t5ڍE~j7UD꺙fpV|Y$ 2wV;#.X|P/vi-;tA c졋ĈJzd0 φEA;hJ*m3 ;q"$sۃkh:=3ThDUDfYR.1n4V^̘N#Ĝs]bStFr0Fi (0:č%eӰ,O&OSVnN/uu5d+NNVT{ٞy+m%%7i\Ƨb}HɊJ$TLvTZp*Fj0ǦQ S(L!f*2FCVƏȸVX+F-MGPhvsji M+F"-{7ElWs=%i 瀿O));ae<v ZXYQ Ep20Wkg\#+Hܝ)cҡģVfXtNF*%BH;%k#Ld1Og,{yV:P2^3ߺ+ƙww1\ PZ4ӼV`ZUg1mz5_ȥޡe z$4*A4l%yR{0>f"d7J^Z"C+hwmt IDAT\}u^yw<^`sUoz"892ϨFn nˋ^k%Nnoݽ9[ܼ?).1\<7_".d,׭/ Gqd)YΌi^Y>ގqsg i` X\A7&+hwr"vbuwɥUPxE Nľm< #N/<•:41+PtFKpz%wh16,*i9ʃ4lvPNm%ejret,>L$pGb5S1{_!c9 1 W̘\L/ykNaoƟ~S;ߕ "?|.n㛘j'R֨qj {xn|kbA[%C]\^ViÁ֋ĀgY2T_P0ϓ=Ņ+C~F<,K%4\GrFɏ/|{dR'x4 VNjקLަBә-bO ߱?ɛ77{E垥LA95}.ޟW+qϩQqSmcI^0V*d;$P,8TB.uI?oJh/d}9sjVչdgZ n)jJpXSѹhVč̝3;t}| _ȏ?G^W\>PQq-8o K`7ƜL}̥x?BSt_ 7,3嵈 9٣d3ΓK!vjmMaD* tNVߔ {>[N.jgGh/֜u\\K_|;fUbZGޘ>ٴXjPec?jH녟8cV Zka6hXΠ/#t 9YǩGP(ɦyvfns "?eRRd(q<[In'??s?̥UT.h@,zAZHw\Ssv}p_>eG0AEp{ ^D| {gyf/5+#^2dKEbRME]S$Q`| "WD _AQiy ;Ckܴ w8EX?ƏR5P9awӊ >cT230Y;+}SRA!Lp}=EpOzG4,+Ձ-VgtVVVi6Ph|/qcNϦ5h{L%zVj k3~O{QfAP/{Wg%VC=žJL,c!cd%,/qm Xxm/ɢ h(I5"(0f^#™|ՖޅɫW1>OPF!`ʓaF*~,z\{2>zy8I6yxZQS'{u?977N[>p?vNȆM7" %z,/}KXv@l>I:|]O1^3Ѭ+~=U2ySd46 ݟuxں"zc!z/>!8?DhidbFeA6Q~ħwƯ__cK[*\h&;13{|ړ$eùs{n6F7c۶v/y]|Ipmg zG¹[N%v@]AUES k>(+ *9ڈkƐ"k ްb}|U$$!0OdL6{}o_w9>Ý"NE^^\/Bw~vyM'&X\SSt:WZռ;MnJ;Wbȟރ?ߕj.X5춐'lcw!]q`cXsΓ_ooݯ?8e\IN%3\Qq^;Ҏpگ/|h t%&PUDqڶ"g}5̫*u*m0^x#W$L*- [wEQkĭ#K'; ?o7/MR}E:$2W*}"x_qΈ\?#~u| �8'M>W#WiAtf$Tj畼'9vMr,M̯}xem rs.3iR,G㭖en 7}(p_Gǯ LtKٛlvy׽ywf%9}I)-W!eWi1#piM[i"p q Qd%5EIB2,}sν}f6|#Hb@>۹toKI2S& bNpBHwymw.op>G)G")u8?$i,58U(+~G{')(PacD`o Ul@x1/* P@[ip{"r7-FM{;I"ft>ϴ.ICCSבCVH|`mЮ#jgmZN1Uհ\MLuQ!5)VJPw R0s԰f+ĩՃjVǐrDS%؞9Zۙ @QnCHG^w(D4f*BPiS@,:VUbѶWR50ybGN=86Zk")TB [BFjJR/x|'19VF)|I^D0݊C D~tg#R8B48ZN AyxoKBY"9Ch# &g@#.2i)d{cKR?)|$Jip) J& = uq'>y; H2FLaLS60 %z?u !aK7G9Eݢ^aűCAiƹ,VDQpxqu1`UdbDDL$jDѕ3\ A-fKɈM;]jV܂ $ *=8Ʃ$̵#BxiG>6Npt\Mezꥢ<@.|F`3UFF^_'KtAK\Բh-*aCz]t9p2c;$FJpIH){u<)9䣘^y2ZHA2DI)$iQC.5W7 #5٦,"귐|ʀt qo i@3F1\F܁}|z-Y9 Q䉏s+8'Ʌ$*xOT:&$E~kOSdS#ATM#Н LYѩΞpPHiq1M4*T5w4BVCt5Crvb:Ç@)G.DZdqaձfdb6$/?;GP(o+ TcB.ys?0YM'avxC>t+ *:*_G' ӷ$[6"md&wJ(}x)SG*kPoey)ۑ#D|{}~#,8+qi*Exr >xS 7"o! )K"Y9:!Ѻ˿>l"h%1ui~y| 5hO~^8:A~[-l*YD9ílPKVQC60"YG\T;B>MQphNd:O3I03%kUk;`R4E@ GiPHQnђ}oH:+ֆPh^ȶ!cEF .Fx_ԏ/c0Yj>?>C9gɃd"Yޠe!*4 gR ^2 HW'*&i%"Y1A8ah ΐS}\*$ڮT"qwm>g* F>q`jF9!DU#`11O2YVP`rJmJ@*HYJ>~H){W|UF kO?/"P1< 7Y-OA9w|:t$3G,iAK_A+oLtSfF)[rO(Dad{!'41GMenzTبӁ]XaJUmsD Afqb` ֏K7U&f%&F&|A\~嫜k@P_&TB "mc?PDEړ,32 cj7tA +}2!GI#:趪N(C,OY@ml.Ra1#k:g#Y@ BGnHu04<8V?2zo}Zx**"j~cL Y5t8ꋼ6`§BV^򠩃m3VʆcZh!hEKO*(_R9A( I@ JRfID,;ِ])Qj<䂝idk CDg#0ZEZqδ+ K"f&Rq=DfH!sG#/|)sB''ND2 qqo_]U,䳈HY#\D;AcD[anD1oK.a?dM/-7X[qR3-aIZ=Bx9Vh0 z:[a603%ؼB3e/R@EoGZbd.﾿J|s(?_|=T1n嚺E^>sȶ<`fRsKBFm$L i71蜹snz"~>O)!Kc TـК4m-,a u+U ɍ7s I5CDj Z$ E /[i痂e1xwL1a%ǔQ9S!"'ZFZ@4ǏW kYÝs7"Q+7Tބ½ y{!pX5Z ;$JeNw[o<|XNh+m O C.E -ҡ 2_HBpDCg$FFj@$H\֭#Uv$ 3bs?fy F20kJVzڋA{:*giR_n)9Ex&>a*[-ULx_%HI7Q*ckrn)#NZ5¡J!BPݶ2d26{$)p싌:X3fj6%f3tpH%tG>>1vvr׼s~X?Pk` Yvwy\ҿM͐P ( _y!cp_{}P'-zD6-"Qn&t2֗a $E&ǷS@GJDF{Ǒ dk&zD.?dmՃqݧ,s~cdns3o)uR)tA^do|\ W{IFzHޞ M &5UlZ&M"ne"/9ҼtޅW$B*du"oᝥ4x YyO18RpP0i-*1ɋ[l `z?ȸKoE}q$s^y{@2 IDAT>z'^MoC˕ø#4;}慧6kAp` y0,Stwewo"FNߖlCJoW)>Xl.̥XiQd)Ukuu#[> HHϣ˻{}_}wv@C4H݀v1=hN1<1x <M=¹YckgS8ҫX'x ׷w&t=\7 kE81A4 0$,FF5ǻ=c|yD[AMlն\ک#IHrL+]ùsaK5kZ`x9xkQ&gic@ Վ Y| P~l.P˳/悱"3VvGǞ(7/3jvWϬN06Gh}>ulc~_WXkVcT̸BZX`lETb1)ιMNNPmH_ aڼ"AʰTx[G~Ө: Eh:B(RImƨIahr_xF)?Z6ۄX3 AbL4Czx:"ӳ,,Nq;\3+ *>m6']nVu[+Vw,f)4MN\C,8MpXf=fa,)VF4u>*6I\mm`4Q1/:t9,sǎ#ʘP1CrIrCA:u%lփ$R:tDyu<)'sn#2Qg%Z jmShwg. ޿&/Gpϫ]wGx1v|v#u(0E03OX'=q*,%{k%4"@Th%I$,Zda1Eb4yA1(^Өk1bLBd]hqڳ[%k<Ej]4`8;kРȋ@!#mj)SXv=2u}޿xY{Exy&#N@=~E.ɍ}ˡw"y19J2S3r&fHK%, RCrRGWبje1zM[X%׮lJGA[s}#"J (.ԉD0t#c+LJ-TXiR//`hZCC| ޽X_ .L_8̈ʒ*|⬥xfWYX [f>wp}e#%˻<˜C~#]M.I&(:\`;P߹_,PCma!,Kg)8  5CZ X;s!KDR@2-JD%TbZ$K^KPL XE.)dG̬cWxk5xct,;WqŸS jl|@8p!bC#N.A]^giꥫ}~c7`]3~3k&g_cAWZG5Te94Ćq_ް&cjVtEQnﵾ#XLY)d0)j6xb8ZVHHQ2_jThz/;6qP?7+9 gPLEcRѶ=*N3(]+ptoe!O&>"7fɦg씐)b!9|pk͘5W1G \F@%I<+Pt()RE(d/iHd2,)g# |J_YP8ߴTPF`#oBnç?Inj:\箍)ǒaeթSEb[0fϼtCZXW{csy}wZdv~nAIDXe9bWԡ1c޳jvl͡=wP6֡l'NS{ꓟ~G `o}sb1n 4c!TQ12]C?k;;rLJN2H?8qIO(R^FAij:eJ߂Doy} t~C><`!k&fx׌(22Eb8>=35X_k k;X);{57+v,.tѝbdD+Ƶ9%U dal,@ xIVlt): L2O*kS ! AD㙞QE2G׎!&7-R pZ%kD3ҙlm(%vñ3os}c\[gɑљ45&D:Y[dj2#2 no^Bk E!X8dsbs7y饛uO=R"U9.Ff۷жp*c G"V#Y˓KX߸ 2A 23e{hoj?R!BkEt$*RBPDQiwoVMxFNn{`.j~Lh Y.Q*GS<&轧%KG3VZ?=vc8\|ޡa ozk(':{~.RJnҦ! 8 a`,N:(ZBE ,MϽI " AHŤplZp]+9h R ^ ]7orCCي|-}]|9b&t ȅǏDmvׯgph:RU+a*8~zr[G)r|`mʁ5F$/caTbb2É .fܵcn~tQg 9UN?6JLhx6^|?|`=I^(LJfGK]4+ {2,ck~$IC9Y01Kwz)KW8vefw_DzY_sÏav-pn +@E3Lt4NlۧY308Vi :ƙ BTnTwT5^-opdA5P>^ o\b_IUTӒioktlMdBĭ)N|"@ Ӕ!4,H bt0(xM(4)$쟹N!WmׂG6 ?YPgu(sb.ZcǦx4&`@ve378;%&H2%2KtXj^6+ZR|!_=O?_8c [|ȓ0rd+ FzT)`Fp{T .Tu"lȐn r^a_w6|xzl_/Aʤ6ron|}ۛcdܸy,+7lLw}yj+fR3;!TX UdO o3V_?Ga_絭%Q(aa6s=xhpKt)PBo VeB~Rmj Ɏ.Dj1f4'/lQĂdK7򑯛qj)nӋ_ǿy,tȘc'JfgWF'`o8PhGhљy7MaP)f"5 "DI][_~nf?> D-]BT՟:rPX3}s!GS(o<ڻAtC2SmM$~ !I&C!%ʓToP>QFOX_%h,h|H 3xo#sUxyV0l.z_)cXUq!TyKyvaΰ5Եe0TT 2 L JS=֚v|8/,eR#\X3{gc?+9wzS%t$J A%KáDm0-\JTڌeD-q5/CN"4B|@Rʄ򚎓4!:@a 7s Mธ%O̥ospʌ41sWnZ`CCkl-Ĝ߅/݂LIynJGX%VxI57ɃS M%s9\BK'g(|@J};X XxV{S\/ 0#,@(1A+,NC櫝4Q*N݀כ7Q:_^]+d0ү 168a?fܜ`6GhƎ8v̈Æ&D8Ӑ+LCܘjlP8)..D`.rEYr0lv)%Sԭ;(b > @@8]BwR@26%RHfh#qGvLj^cA }ɛ5x՘W²l v&^cImxP-~W_9`k}˗<QWcucƕGԋ!Ht7cwwng-"N`XxÊÑ)z2 ,>r OA)X2qh7T4IE DM\@c}6I.C.rJt%{tmI#@-:t@dZX@dLĮq}،xլ+E#ݺ7 1_cBsw{a7Ϭ0v14س1" 9ĂVrc⭡i,mo9faEڝASL?Ǩ#|2NO$aƸ %޽%$O[>2BYz@ GLV1%tRdaoaz fkvIՁ?:ZI ոi$=+׮[DŽՋ\P[K=VTUءbtKئGJp8$f:ɽ5]vMWd3wmMcS,*N '&O G>p%}ޤQ-,`#lѝ*`רj Zn1Dh)iJ$HB%=5ApxJP8"yt*h <||EYe,ը&q%tQ|K'_%.|w Y %7")bS9s3qd4'zfL&Z ۄT?n288E3Gk 3G9>{inmGx=rZBsA] ATZ*DLn-J"nfXbdpҧPYVj ’,لfMКu$9l<7+(57fعrr2sG,sN b3?e#*NJh{fqnwctU`r|n9PQ U8s'Oc^‘ 8?(ZS7op$'{Vۏ b$E&pt֯MM- v/twoO T֣kF}w4C9۫6Ѩ6̔Olq!E9x|>_O'\#2IPZ9*!b[K+K UZ&m, l4F䵒:AШ 2MmLYS܀Qncv#pD&߽ 7yYZQ?p/א"PO"dnr!%e3 g eAU vD!q蜁uܨDy[qz챣ll4l65aMcmKk=s[U561H>4=D=HHV't"ZBMwIB .;{9gkwx*#ZWj~3? omV; -$!nʉULVg,2̚9ðkq~Cgᙗ9" a>xCWfc| gm R=ep=bs̥%SL%;[L%9UxT\-BFDfc4d~ 1on%ߩ ip׍3h~_ ȭ3~mf{^́9n=z=v/ͤ@RzM\x?| V] IDAT9)뤐dgooƝg=N9Yհb=֙]p&5-̈́%KB->94BUɌdyoL'$ V GnA:bK.ۭOYVk,B ~t=U(eμsh{pr;]`o{n6 Q~;'鴶$P6|˳w"9g.q7O?|@Zc$#)En=O?H&6*M\b'ܧ^cל1a㹪k O6Ik J+%͘͘182+QkcI^d(B}wZT4kyţ\!Fp䕘74ryb s'36vc;q۟/KY==Ь9C7l\u\`:{ѱg5􌫑l-c𐧿IE9iD7^Q#n/t5mUi}Q*MMB) c,dް+*YJ`L gMc͔ղapM%{>ygN8S嵜w >nO wwNR@H@];|cL"&!vS[l\b&ܹ3Ï6aM<-Oroj9L8CHF5t|shM󚴹eo 6EqZk©Px9RJĐP$VcsaLmQ R D$C(wz F3~efW/O_fTCۤq>{&&CYq#|ifq]9QL΅D͔׻,=wGCC;B^Gh)qM</aeo2EUYa [ qYrDai!ie<7FI\&6 16G0Umz3Hb(I2l* NƁ  ȽBLĸF5\Ƹ4I(%ש-lQ9Wo"A15D(6lp͖<@#sk5 $tC܄u]Hæ%bu'Ұ4ĊPOYьF6lW-_cxLDM䱹XŞZ%H5$Womt.SmH}_v\IB(pC7l*r %3vlMaGio,YǸCƹl8 gpRrOE8j'u{.crY.qZ*}{+dr.8qu>HU |峿G>GR},95DqXn#($#Fmŗk8b<#Ͷ0r +FeB 5ËjtFcOo[y6[%:z?&bXL#1r{ȉ a\Nb&X")qc6+٬Ir&[7w@s[&32L˜;:zj\2*/1ҋˌc8q2}7v͌e&;  yD2bLlO9'ڿ)(ch*\"1)=0xvSGXb"%ҰMo6ޘLMdQ2=*\iLbodzRD ,]m~9 So%wbÔ~S%t `dDKV&ztpJUQ`~yРg$$Q}-H"H_c/_W͈M_gV BNg,c$%?w{Y0!`]z54bxC+_yd/AJE "DN+) ` dNC$EEdj&kAKUhҁ) Nٻyye&sgXZUz*5ɐ(ĢRLyl9;1}E#BmYFǨ=?1]~lE?Opbw3Z\x7}~ұGBZ2mKEM@k(L!HqPC)=6Nj#&5VR^`Y%$%∆^Yb?Z 9G>P&3,qG'/sۼ~:Ro|ạUכbHZ u5a;@7=JT7VMVKh.=7Qv/-bh{,=F'P'䥺$IxHp/V冁ԟ,%.:8HO'BW_YBJlnq則c6o0{_#[(I~pш1 d%6=&mIs-]c%Ca'Rł٘ktcٔE6 *jrހ=B"/;!dײ0p:}Ӗ!\:9))n #'ئW4%uf9=cr}Ĥʺ¸; vp+yo0uX w.qէ83,\ZuR pmHL=ɐam&̚ 4Mu,|{qd8a9 Aj0(h+Bt,>MTң(!2fIz$yDb[{.;'KJZT̴%o,31ce[B0-kP'=%r<#AW!VƂ7\'O )[Ml.$]SEs&J]Y/yl$Cb9Ha9V~cv'y]|^lcr8AB}LmgZCIgVJÈߺ^{Z+9ƊGg 7XBŚ+c͹gٞӔYHA}eì~&9Gc uҒҔ2]ݲABo )e:Tk"%;M:#UmImO:|E ϫe+EvdN@h fJ7a$p]cׁeaI/C[NbmNgS$IܾS<;TFvS'I18e`14g“0NR-$H,kLj`8Cv #4d- L)PdA#;z}, VPM5P#8 9 h,%~_9=̙łY "tNn8"!VQku5#gLW M[,hd2[K Sl̦Srj9rЯ- n,^f 1{;HH6# j-ڞtn)MnZ1 {Gf))-G54c5o.z_=Enإp%-!<>[&qf`}c`98ЧDiֳX-hoPHnpjA_]b !v`턝P2{y}NruE⼚MVwRF jA="qKw6ܠB6Z *i^ͤe*Q=:[` _Sdan,]]1)4`V%5Ge̙b Z} g1,X-su/U",;K7m))X6\Hٛ.qbD>wo?cw1Z\_P#Ph,LLh-}J]Bg|^7ȐDn-f܍\==F$䷶"0MWsa<-GYI5CC[u1i jNuSJR*^2A{Lh6NV|~;i AyF@r\[ݤuxT&X_(F$JN=!=s7b%h M[y=Z[SC:0/,!p>PnaP DKVřJ*4T ހ`;)QDڶc#qEVk|m, cZ2-SLQ)`DIiLV)ܹzLXHTeQJ&D3Qפ%#̋-O+kglxݱlG7gjPNPǒ~XX CǑÎM]i$C$vzu ;Grک'bq6MaeC*? I`:?b2 0 ^[ 54lEm~IݽjQT3^GH)cD0&(#qs^yvqwv^o:a&'׶L6IU@jLD!b"/i'SL d-Xb J93e7:v"t~>0-?Og-Z޹ɴli6\6Ncjdh!%g*oUk.fM€ıhZC!Jf-F}S^Rg;i0p7te6o8е [lkLKTwUiSP*%]CiFZ&X/%וo=%53)v)œVF,өO%SG9enhloKؚdT+¨&ܸFrɵ- Fq#q4K 1͋ يƆ|摦müִtS-@׶dL]= x}Z`T*0 RW`.z&[!h`Ni1͔33 I 츆8`Lk vb;G?3I2ٞеhZþV+?jfrS=k^}oRF7*%\'cD,)pm8(cut mw-"-;ҩRU.Q)a.,"srD&/5zj#8Xb/- Q6bh63bic}j?;%󴋴S:_X;ߛ?dbh!0aUb,% k2*B9[uK$rɛ_!PH xUO#b|7( 㔜;*/8Z:*像߹SGnϵ_lcV 3!y`wqo11Alt9Rl+OLNS݅j)s(4h.OLy>r+ ϘӖiL|UPvbH* ޢ?S/bQ1r듨DFT92BzMMKJpR"A-x~/|C|߯w/p n#<⽥݄[SC¦B+j o<xW0 -dYeK:$:'~9=}wJ޽?0^9}ڀ&>@tb ZTUFbb֠;K!2%W_rzcPB@%^*5݄BqGPiiTxtQڏ=Ad~*n8.)'9[|3;K 9dvPCqR@GksC6=iIzV\ĕr*t:o̷gX ɢN<tul*TKxBMsCʡ6L"8Z_8/ҦDRMlB )ie?h3Cm*W/2og 5[SCKD촮03%MV[}R#25z x:!R"R:R%bb5tav' K0 [;b0nI5m\ Da)"O5OSnp),3Lwa{~a&)Xk)jHbi"K8L Q+\shn3^3Ø+uD 1GR"( STq]VQ:+ G}o=|v+ވ kyrtZf3C.5bh Fl|DOԌ ӆE+c`X4.K9\Vv:;nN֑O_{ݔauۋڐK)yKC[r/)6s %V3q3zAH8c㬩2ebkX8S//?I~3ƺWw:yZ?÷C:3o1 ¢2??gy|d8a{үFš9EH^ yx`:썯_WoZZXfSn׊!K)' ҵKYB;&M}R.H`U&X#ְ;oX&NM֜_NDk :x=~ǟcnroQ/bkfbR'ͤnjӂ̍` [rW}~tB6b! UpyO>{'DqM &Eu\Җ{Z/t]1nA ^Z xoIBo }lwp&cئew""H(7'&ÚDl#g'/W:6^X_~)wS\_-(RRKts!9X!(**) u=n"žyvBIX#9S/N<_1++g6RYR(޼IG]4b&xS((D͈nߕ $S.w/::\(h2_ 1e0CBBľ0[랇'&|/Գ=Vm46KXn ;hrx~o`kZRJTѢ҈ *$2řMo\ ×+%+:W J#b*)`3 Al*xM*t\G?,v+qG8̍K۬}0j;dwDX4fh*4SC_OLT W3!m q=_:G\%F7C)x`JE2:+EmMoMN 4֪q ,)и6SfQ$<%و]afoe&'^ :h1r·=wO< sj hdijT ƌ#9Ta>+'L:0L#ͦF E6RF|u&>іJ6Fh-M5]:6͵j RWOa}q7G$T1pC ޖm!4Y,~<~sDC+}9|`_X0{9-{W3F61)FVƳKJ#̷ aU1vʌVis2J|KaF_2=iYoNqi۲pw]!))w7 \Gg{\Ե̆jm!g:BX0.J0aCugi"Bcyb:(*U.Yp~&>&4_UZkq:0,z.l:àMp0ec<}^%L82~u#fxuA C&&a]ƺ ~6PR6맂Ehlm<%̘2Lvq<}[Fq7K@3&) _]_pa:c׋_~F YKgt4Lü$18֛6IU>wlh\4MKHٰ0M}EqQ x=lV8t߯]',:EũR|Bk&P*R/K) U% Kj2SU1Z$Ud̘F uPxw̦5Ļ**pߍ7ZOޝ1 Mc%d8S-.T-4ڶ:qw/_`uXFH:U(SLޢCSR]1LK-Os4ewxt9[&6!))z4X VEzJqUhH&qd>e\}WKRb Im +tNLxPR u5f[-L9\Yڭ a:N:f4u{oh\ReW}o9Zk}ιv^ a# q c@blpLP*슫Rv\q%N$$\| cBd=ZHVwޏ||vQ|랳Zs~tÓ;~i4V66*4Ld 9KtxTz(>[OnROh7bH'}4VZ= m1nߎ6cW؍kІLi9B꺈@8TN}?Q:]%gw8=`’Ԍ]FՒ4t.=!ѧ!k5$L*34B?{çly1Tu ژt| U نwS;MI+LknwHpG ޖh{h+`B+nwyNE7 R#ݛ1)U\~N{>9v,{,< =VKb/8$°Y#񐐄89]c}Id)bAQu}"I2Ca:y;Bf4VjmT HYB@Ys]M-_AL-M(ZR2YIQTod %᭛f'/3~Č3#oZ7ժj #"ID3 "&\~Z$u=q?@z2$>ҧw\]+djvg_TC-=LvѼm Z_s;<ɟ{Q^,!x>H v""¬pq_5-g,a軞. H#hn"ίi@&n!w>ut릿[XJZJ!8K!FÝaoD}Ci_ͤ&<h sS^l6GǀsżU#hIy3R0]Ӫ)3p-GtU H&AdKBш1/s[/'KLhRL `\Y$j椬 fhl3Jx^5 2Qfx/3G=,n(sLmtH)qlyX8X yo$`}1ڎBHΜ$ T>άSډS$ii$L̘746`K"M cF?HvxݕTJ"Leg5M =xpt O*yPi:ܿrg &vM"s1& i4(\U~|&DcgF6fJ-9c&}(lkA[@TȖfmT1BzuZ"J$CA2[rdSY̙tlC-;aLlXyG!$$x}yP <\"O? .PBȵgRjPTγ/@);F\O|yq徻Pn ]iocz: )Z&kH(v+3wO YRlB% TBNkJHJlg Z <;ϱ +氣2~5k|RG@K9#Ǝ_;murIFW\HFem vGҊd>툶"qVwܚ2#Y(!6TFXG&tޛ* H%Ȭ/6Rj,ESD>\Q  ϾJM mObAgaa}u胠1oj1vƕ|94Ц̣HNh 1nW·fm̂Zs'Y.*UsA]FՁd0nG̗~a_Ĩ93/a$Eu }! 9/\pe$ՉTgC@bj&B>{k6i6FZgZmJ⅝\ȎJ.3pm`7U>Qsbn3w72C+~VV"RQ?ӯ$"\6cṾWЇcMc{vudgnRF=1EZh @m5j[jAxk\.1КO"c +13W#e!g:&+u)5S\zn:a6ӆy~>sJKRK#EcjN*^SLdbP=8N73|RТ"DHtzi!+ OhK&'% I'6u4j2k*:2Ded~X15'[XY @5=J7l0Q[%A.Ra}2;@"$\3k=[k]bzwG)5L>=jv~n.bU=ei߼ȹXC_l-3]sI f]L$bA3r *Ul:W(qE9S@JJ&d擧fC-UVuӪRkƬ̌ %8<.N\8xxno +-ͨ*M"Zq)]s/ έV|0LݛR~@HeY>ExX#tԽjbuðSԆЈQi8l &D3mNXTd yPfZ:3qCvyՎg73nKg]k$"h\cքL[5k<5fL1E\V{m%^(%A"4vIf\ M:fk5"IUsbU{^ BmHUglIZɞ]y?E5R2<6\Ɖi*H0.qMo/qd4Μ*noؚ44yNW[ݛ>䫮tsa{$|3(VT#ÕNPDf2B2tJ|\_A#95ʽBPQZp[ INs%1hBJ+ݲOBe)J! !jJ  aljfu)V sQX 2;/t_x;? fsOv7q"plKY Ca8 JGq_^4SL M)֗GJ)Jf_ 3`/R'cEeвo.yc#DhHj1r"WJؠL9"A(y$9+IХ(188텗P6x;̣2FލL3LGW?<䓼rf9;nϕiܑFΤ'.B@_ʶ&43JظeXH Bt"a$]!ZMЮ>rpiȘmF4$z\ (oWFm#ee2Ji=ah6O62#Ƿ2iJW%0cwL50OXrp5(z)cHTY Z]S;ٽV"]fh1 Bҁfj茦!(Ea`AGFExJ{ N_F] ׅҡ1WMJЎ9W;ZNyr+23.)UN sdڮ2Fptp 8{w=3(qW5qw"!)Q;SĀDw>s$5_Fl3"2g4#5hiaojY2 [RM+}СqW05n6堉ŠN +vbj\jc >tbv:b`Fƹi2Ghj[,0m /xA6v93O39,%W0*G?g۠3Om<˴!Sҷ@;t]HkBWљR^8fJ3%Ds.YKip""bJ<YޝXBdat2(Ga( a + Dz=Lȸ=k*/=L`N>u9݀h}X G毹7-3,\ GFV^LC>{DțQ?Y;g_f,7hdE Ј!L\=%EJ-?C,0Qhp`0EJ -`aB`qS7 '@gI-sr(ܒߕUX/֕{Dg IDATO7>}-cD2F FmvVnK>X bT{ f:!8[?ҳg <.,F?9MډaSFB0&Jh3:2ca?骅vxs4L-1FbREZ`8Abb u2Z(zaL+#^؊x#QU5mc~#m׬϶lweOU-c: ^8Ɗ]4G$ܑw;??Oswl=yA64ukyGRj#i۷AGZX {8YC_|-MP)D],kL )54Q5,$z}SQ!Y&V/9 r&0 m1aFx'3>vKR)Q!g(i\*e~ʹ3x>/"rq9Ѵ4G} -lh+Ըewٙ0onZ7v;;h#DJ0Q)bEYoieA<9ݓTXAb 4 GrFTYs-Уg=-9zx[ ,w'Uk:Q͘BȍW ҨT'ihIn Ě%Dm鉒}/mobҧ7,Ǖӹp}]fmR+5dĤ ^8ju6տfybm1Upq`THb>U&' XO]!:3Kh}\mGa}UIUHdF} 7tU<\ZZu'cV #&ezVlƑsNLxiixXm,KxwΔns}XHF)T3|I.o- ?M"Oϼ sxy^SQke#)%b=OS7dw/OЦ2TuOQH2M AW4>HoUEE6]L)s)sr.GdBW]!Gy/|Z:4 4КWk T)\\l?7y&EGv޲i lGmb* "fT7 L{A]}5YfDJB`O7z鱦4x!Ψ% 7/-xK ^lta8DF+G+!Fj<ˬFfa}9qvrz"a|'uu vo}ëESs{RŎnO\7]P';.if:g j.@Hn934Q$|5'Wք"D5dbe<jph !1oKCdk<(A,pHe o;!j4vE [j+~~WirT6 $J3lwۧ:|Ɇ7{p~~?'zt>" $_X8]_|.Iw5֎[~3#/.IJR{ؔFFԙ<1DŞ^)nQ E"YؚECGn<`TCW7|z5q ʦ*f¡A!bߺ3x?ݿb~*c1:I:uI8|g~;sw>?~=aQVijnw֔V8]pf< ceA"]sc~0HbAQ8SȄPB0D$9 ]3V+%}&&\*G[P~8z~=yGMˁM'Ի]11~=o}?Y\' ?_|;>2!AЬ*%.l4HKx@cY9Yk_HO꬞F]4T#Jk9T6l(-E K U7=ao%„1ᮾ3 I^ԈVQԄZGR yYG3لd8c.dN.ּ ~sɿӔn=v_o*M[A‚O>?a]v̋#pɦ)"yϞхDi3H|Ajcve@H8Z)Lu;gPZD4z3ߪj#h j@c=^w25v-dB"STT#9ʀ V j9sN'|Gk݊+-~5"ÀE.).}lͳEC^3|~sgNaIҘ@e3-OJKqwnf.K:B1!݌7C@ڲSu3.ԼT+,uI j D!{2&R?hڱY,/cP)<_ LWXL`<hcf\f"=c^s9wz|ݛ9_!|?׬(˄ ])VgbtlhK6z4R9zxLJQK3+#EJ`,n؅8TdͯiRE¨$V 4*8&4U}Д}R:Ni6s:JkD4 > YLw3#znh+S\-07&iZ*E+Q2uZFёB2GCab3X )כ5^d+wq:|/=2~Gś }u2ܱӚX&8td|7"o|>彏_]ũe2$h35̞iJ G9,oͅӣ)E[%jqTh  1}X/fo_Qg)3$#D$O!Y JEhpC?Ӛ@c>)ߞF Pq^[/KɻƝ '\0ecXE<<=v7)qXy͚[8^O63TU$'l - ڇ.(ѕ6mRiŧˡ9P)< Ϭm )u"-]iňcCeCWPӔ'qD5,>jٓ;j xFZ!V큒4Rr`"w#|j=GBQ55Ȓ# %/|3bК_kMRQ4fhqFZh~"XW+Ac䛯z=1j1z\rmNw=(_ȗAj@Aj´s Ώ/8;ݱҥQՎog\;X d>\,c֑ h`@Zr.(* uGFK!Ȓ6śo/zu@*j RP]#a̍ )rdUߏmA̙<~Z*ݚW\YHa&Ha/\j!ii!X+bkf{ݗװL0ĸuؕ:~ߺz=Z\hTܹs 7a8_~zD's"E >vOILke6t"#<;T/F_0ϑ]l<#&}ְ`^y h>Qu/DND<%D+}\ | 7郐\ %Sj%0υ9gΎ7n8;03U02GX]|*#ű f@1sվV:u JA@3e?r(& B&Ǝ<7^T.}Da=RKBUY.'/i2Ƃ(д2Vm$?Lh_ms0:1[#q'N1L:ZS%MɺJ/둯wN^''<}M·i~C$falTDL˓ N/63,!b_]d Zc4GUK8'x04JR܁( sdFn[b A15rX jv$kok!Tsv( 5P_*FS!E'7k4̄(21 -VgyE'x8#5Ccӄ. G/JEhoR#Zw3'./g6g9\%V/}\yNTԺwL򔉖+5J4~8)|(25\(^Z@YS7LJЪc͚ RFX $}ZՌ%fJU }W^&=l-S < x-7~%Z.Ď8e&Sm9獋ь ":gN(cnjc[ 514KUhɝMmN47 1lggl$Umv^)PB&CyĄ\h9_h"2ZsNd$t5EBI_ 6޺5nВheޏӍy2'g眜m2ÁqesOi8)6%MHA6L@CcEkfn M\fIvϔ 2c!fBAydu]n 7B; Dg{vFSKـ6t >yxݐx]%dBKs'v~~~Q 5[1"SΜ]^Y_l!ppdȯ=}BK=PfO6!FԁjJ%؂v)bYA-BDq Zvvz=y6҇@/q3@ DĜO6$DD1R ͸u󒛯 +<-{q\h-^3sZ;N֜M/w;/D'(U '*F!"z1lbF:47 &?H21ProJ޻F[]}sV?[/BF.xK^gK>myrV'sSg;v0 ج%?-T0kF;oΧxSLC:aF[[:J|\Fqby9 1VX@{d*tN ɼԌ]ޓ0:,$b^hE(H8Ɗ3XPF3>#M+/2oM7Q>w{^˹Lٙzngܸq~c:캒Nq,<|`Ua6c*3ƾ9mR1 ;5}2YDPӈ$a[bNVTiXl4l"V" R¥O! kCcHUt:m7x>N.^RNA^5/σd~ݏEAd}_%_Wgm3kg-2nP'H?*A痚fl$q텢l 08 mՍnn3Lh_}fdWהɝ3#,},#iUIRH5Iw!M0BQjD/}rm:/S^|\#zietD]x˿{7۳1M{j5=ٮwlV+nb,Z#2[eׇި]ZN{F69÷fZ$ OiG IDATCXV$¼N'nC-3h$4C(m4 3Ȋ.UDn3OAWo`ߜ'=_||e^ ;?}/̽~-}M֝kg؝n=M^iGљL6AM{8f&<f{2zZ(4*ˎRZcFp{QeCJHkD L<%sD (%r|1;" ʌd-ٞv ޙ]3zȅ:_//_+]}Ovg7OL2'hT"IޝA2eQ]}1~6ZThӺ;LftУq5RͨzLM@"Մ/qM(ρ(P`gqh1 }I5;"y^ -Nn$_JO9RI:0دKIќA*%H5 ^8]:R-0+CWg>v_#~ާ;^~˟;a2OBbp1Q{OT:VR nF~5-wNFs'ϝZZe,Δsքr-"P5,mȊTa1:baC[i4YF))KH2Wi"FF7r/rε׾C'_ 6/L-ʠn6$A΅z2yH1{`F!=1ZhKA%~%̃CI,-h)tRP,Qr59 f 4nqB(BѵDb-1SƉօ0aQ30D8k׽C3vF)Sq{}k׼zo7>Gv^Ng!ϧaq\I(Ck%u.0u^$ZFt4WfOH(Y8M3++\_GΒי3$:ŘȵRƁc1ij-jx*HR{H!u. ԑQN1سUh.K^*_ {wDamo&iyH!1H*W,yKܣ@KA'4R ?74wK1$$!€1sj66̘ψTse(6^Qنi"6-#3:`TNrF=2yba֥cv.h{eH +]']?%%q4_a?O 6g)7dn]=nt QgiIhVHb1C4o0b:0`tPAjYq sMBVA m%{#`ti-1&L.<7ZbpU"O3$]}7}e$=__ODQ27'Ni-x)L憚SR*U Ge*qȕl%KTR.$ 2B$jdCʐ7ԠwG*el(m *=x}$ d1~7$[Tb:HI"KGRV :ɕf+~WGWrOx͍1cccdB Nۤ-֛tr2 .ޙۈeC̙cj$q_%.A4GJD]RR"+*y ~It뤺% yȬ |&@h%1AW\ѴBM4-9KaXGl[DUx&-;֢Gkՙv0 Lx*__+qm0Q~7^Ӥc:N'ѭ C28:I`AXk^$%prSfYK wcg1ASJCLa'"p8.y$h5c9#BH)FcEK412J-Sb?kkH/]Ǖ /W79=l2UakIHc6aL&|*QI#Sݴ2A#8KDӠ戊z% [( 8Oc[ȻT롦FY/D$:)aϊ) +T[e$U> 3 p1&SaK!Baf@JAțA 1FRb,!iƳou#-18g=b.7'LÿLg/Y[֟eY 2AϘ2 \HtH6%<$M:^d7khvP(t*E1o䶦7DxaLC(c[Mh #gd~A`WٵάF6džYgU2^]딲i<¿Ct5H7f 1]8]aܠʚCHE"@6H@[ 4 Hݓƺ(n/56tz])[V#OL$S6džc3~>;npZq䈩8Г0{V {6QBa`KSP mFEFO TXtŞ 4Sh1'{z YoK˾$Ǒ7HV#}`V{ZSEQBjx_7b2*ntϤ'Jh-i~28EIgE~rqs… unxt3%gΜjI]tlgJ6k-=:=UyM=gBw}62-:}C:w:fr?# kG'+Ɋz6DaQ|B͂?Wd'0GƕϤSxK(bh =LaA~;X}  45R`/9W Gg{R'sKBUH!$貎Ea9ĐtVƑ |b% m0-B%rEH_oY5enQF8:9ta@μϘ4[4[k49U@Y3ơrgzHoc#OVHҩ-2Lx$ָ=y#׼%cڧl3#Kuhݤ3 tqZDT(ChSxqjmF(YiA6S ƵқGWOfnn1r4 Ndr":m$KIǨĘCJ-FI9/{ 9W}^X1sN~T#ھ8-MO+1;B #fDErztmi1wG5R*~F[9k1G֬Jd8Ua},v[F[W(bTS5d!d:F5zPžYʻG:A)) 5FJҚB%is]DžI}[CW:k,f,Ee]nrXSFʼn^ {frgnU.{͍ Y46 ]f!?xa jC*Yɫy"1F%ļp8OfnꄉF `3uqP #9e+Hb b:LkF 6CN!ykCYҀˆRg^P|dT--kD0^;bkS )[h ɲ>A},јkvɺp l7H(ZGJ@gX>Jc^Rʓ4f7V)ck>QjvD 5؈FRu[6H|əLeD]j(*+wHBp'Y@w(4ֲ*91ZFn Hvtu:!^rp,ey Cv@J =+ V #RIaY5ut"!{BS56p~IH-ƛ9Y"f _NΝnh#8k3 VHaҐVҒ q]RO&7L*CeDy\ч]StIYNȗk̴;Mn%q5GGG <0̪q<ᖩHi QzC}t_'";e@^yQe#LT0>;3+|f$ #J[Y8x4P܂#$$rӬ5Fa=|uL01|s.VZ6)$[҆^өUt$r Ðq<ҧ sgB H^ÚZz"$;YƔ؛Y!hPteجҊ[DI;lSѡ˕JnQ ]ѭ+&H1o^Zl-Fb^jFf YxH)53Rl|> eƚ wgԺY8o O5Nj:l7О5@lDm8X`NbRP*Nԙd\ M; 򙪫3e@-Q%\!5j?bLZfR+q&7l1?lnɉȽ`ٖQP% ۴l,|7X7i9Zo8Q% "rx(F5%S Άt&6m=.a7(EEbStK1b3I]3++Mstf T'ġ' BC6{cyܞI̤(a= @| K0$'%=jXW4fG[hV͚2!ª=\wSHJ܃ݹY'`Htww+iDŠ֜]2FⴇI?YDJ"5Hwbi<1WGkXI$lP6O|XѦ/*tNHc)5Ns%C-!Suh:sz" - CnJaD,3S@I6 sٺa>9Y%QH#gDm㤩$(-[eO1*GF᪑ه YI*yV]A0CŃY TVi]!csz[/ruC 3c06,ĊNe2 =Fh4Rxb&>+fd^3k!#ybk" TH͈SX*$B67msѴyC1P-|tBIz'eI6d%:h96*0aNR9)Z3:(zNh6Z^:6'5՚aUdK )ƑآN0ݽ9XYă'#h(^GFN%#I>L*Tb#M U:]2T)dҮ O%i Ŝ|_ ЄpG{K&PiwlRyg zdCjeM: ٌV0'ʅcD")E$o}IJ-CA7hy 2>{|)tDDk! 4q̞WGNHm!Jo0t 䶆aC&wAR'c)> "k8Ҧm1c -:I'gՉfz8pѡdֺpBWDqt6~~MtnaQCJ'9T4 ޘGhBI<98X:sfP!H -V8Äs\:xMp0Y&1́^*ZSXKj)%;:HF(vyHDx'+^;s ;1X Q D2M1mo7+=tE2AD5C$S#EYYEg.&|. s18U>q1IKQ},PQK1n']xL3#%nyC)JklP۳'ڨ){J^1.=|D+M%bn4)ֶ漧Ybs.9[itKH_fI'r ]LC""s'+''P⥳w770M8W\͖HM !۔(rTRE@ IDATю%GYŢNc=%'&e!!qe΂n3=+[wO;JWK[ّO3' 7C9qssNgn Dao#J;hS#N_XLU:!16"CG{HH]t%r}Ni3֜"j\R&mG!A8taifNJ0Zg%Sgx[/9+Au0Ϗ3{a3RՃbD7OBJׂL*OwG慭Vڦل[k$_aMT-R+5 0]ӘNZŖaî#ҌDr1X0 ԩ'%Mw4oCCA2%F˕61RX 3:{'GH$Mؤe')m, CN:рd3JƮhw3QDHl8JpF\+i40ًn6vz[ȿ5cQ7 6AeR:#BP-@&T{WrF#U(yd3%@J#r',+͍ثvm|v>:S`ailvDN3%cQi;nIݙ1 *sg;\B"jbF+ֶ'dh..{+y(:>XaB\M˗Hg!01XV.[*$(flq*CٳNYbߕ .tz$,HtC9OZH0Y~*%(YTY yOqx<"se{^N{6}3O[{Kt$,goo8%"7_'(K2Z9/nO-,rn>97sdO~OzKIr*BO=1l~۾;8 [<2Ӯͫ|k,zi$|}sݫgVfF8>}?:<=LYϺIF~w^gY>cxtw>-~5&'_;Y:wtm?õ}y Z"Pʳgb|R՞̷3>Anqmogzq~GPWE52{o+ǫ0 woS#o .o!Dp#\j~a-{ F"?pp-½%L88S uJ^{|xpq({\Ը;{wpps%ؓ8?*v$ɅfE-s۰H'o aܲ(@UoB=V.}7x!>>;r8>ynl%\}Q^Ϗ-$p;!_?f=u[88%ps_Sp>}?^^Y/G>x~qݢ13~zwxի͆x@ȭ=0?o~3]i٤)286'd6EӁ{vY$a?7jSZ7vS`77E:+Ӏ7i"u2_4N.\:s-%n:~ɫ^*.]UҡSsw r8|A5QC'{ެ+L5o~//w3Ojb?-~rIn|73~-oy az܀#TW~p˜\_%I+8{!0RSJ<#<qץKۛ5u &µ׸O|RrCG6 )rp;ZG~o;^RUZk|_ϋ^{iwQҿxπPp<{ap;E0 >SUeG5e~Ҽ88Sqv۳ی9=q`ppx6r<8Tap88OR>~|.7߳3]}Ju]L@J|C%V>f>7 /x ᎟c{… w<kRl[Tq|sz}!O|aqʕLs˗/??yuŧ;=pݗYV7m&^J)ロR־裏ZN)W9rY^= Wrrr8;Q0r]l6iL+Wn~oܸ)͆K.~~a򱎎gg[.] k׮qvv@)p缿c=qe+Ws/x?==ƍk._g۱l5~[~wEGGGwXVw3_oy[[nw _$ȏs?V^f<#oC?Gvw~?_5]{__QU{2o~zΛyۿۙ{~]k;~!}Q;v7z2aQV0◼?G>c)u_ƻ.aɟ;կxx|w;?mȕW~xPUܟ\vSd^su){/>b??^*{?ŋ>G~7{{zǁ?5] }k9;;՟yV+];{%iPJa{vg|K}Hs[iҥK{o|#5_c>Ɩ"۾7ixpw_|`??S$Ilw[>>;ro}-\}*7𖷼G޿g;5H⻿׽?_ϽM $6GGi1Mgggfnܸl3e;tΙޒI$PWE¥.% hR\]a-+ D]E\]d]pEH2I&L;sc1|JfίԅO˸nZ O=zfOBY;g}t:$1eTRZro.\E9\T**fC3eT% yzZ2:v⮻!??~׮EQKdf"%K†ѭ{۴eMk9rJŇ}te,[~V paAZz֯Eܪ4x0I 4ZhuzFKrr wѣh4td̙3پ};֘X4:=N@II ŝadذߒ(|̚(T*&O̾}@ysNf̘6ߝ8ьHe$b GG Æ GQ"/ 2:ަ-;wjvz2tIYY9~9 n؎ T*vܜѧoEQ8WBEۤ$5 RRRBII ^Al\<0  j~6mtGbXn$︝ҋ.N'}EګdOŒ%Km*8 5 uro3ƍq㈶å>|;oŚ5Oe5ZAx5lݲ2ȲUx(:syұc_+] п?@*d- :uk1ilيGQ-_m(.:ŋt=QFql1׋˖&MGΙU2zhFɹՋ%K6lwyϟ'o/Fkj$j III@EEn Ye6x}>HDl\lmggС>tǟ "un7k֬aʔ)dv‰Ora>Oolj<$4 NzSet: Ņ۪e+j]RÔNjRUUunj57oa3cݺ>}$ôlVX]wEiRh/.? y01$}1F<(3&a&<ˉcy|>z}G"d+ȊLΝ)&V%7wWB o-g5Ŵm{e%w}ƄN0YSC|B, IkV+ӑ,ӺUk.7eeTpdZVGUu51V+]ˢŏ| }9$)Hsvh~@N׮TjBMA۫(>{QSSɓ1rr0>,(`s T)ɓ'y|xᬩ%OAqT*iѢ@ݺϭ5%IYQBrz-6=|x\$.\^fCoKjj(ZQ OoHDZZk F#/^DEDQҥK fe֭T+8YPq㨮fҤIƵ 2iUo1F 8k=qsRx"qAfft/T*9s : EEzj)*"=- s%Z$&TXf$IDDQdzv6=TAP/蚹sHMLzz:Zl (?Q5qqz Q?~DUjuA>eT+ur0|HхC<8"I_# yH7ɧi^9T~dPe>T4WS;Wm۶D7_Rb"TW;x<$&&2NqԹ] :X*v.]d.EQD7pE압8p>BzRYYŋtlFDZQ]UO? h cikc+Bl?n ˗/fSL8Iֺ5.t"2Ç C H 8]vO~С(rcǷB<_Knԩ}ENٺe3.] G^/93gb2پcfJKKWv6dYqbjA^ O9nXv68]wAիGA9w&YQ ; ˩SDV$IBE+O bC` ))?6VGl6V\yEj@aTTqXxzʹ$"vlt5Gݻ@ ȼ<àȌ3۷( ~}{5E~q!dYKPZd"?Cƍ۬H&Kx}^7~}s?c4dA<$99֮f3ֳz*ˣsdt`ʔ ٓq&0ty芆͛09(s%K{j҅bj ew]cP~X|9s̥]۶&z׭\uBݻXl9555 6 F2"QߏQH/`IDAT`%`?a<320?gA>ҫW/RSScfΜAqE)x1}'&ٳQQQ 1vBIw`ܹM*r(b$yM1*|}3y򤫨Z+:Wd_~oȲLyY9ϥwޡ5d'`X ЦMwΜ9s1L8jlڸZƌ7|C֤Ɉ [%{zi:ҭ[G6BQvfÆgZƓSbM7-瞻LbAUyru}/G={⊢0} >/~_gh4N8'~Yn xXl)3sr]vay]{G1c\$Ж#ocA.2qFńÇOѹ=hZ̛GTN[6syf.ZDr16n|JŪիy7 ׿?ç~"+ Uё3#FҢE fҳG+d-_l"()++cSkС*޿@e!՗_1y4C/{{qf̘ԩ|2`^//^ʕÏp8>|V5S~>{]WG>|x8a/U0e4BMM z>DƕEcORQO4 8_rٌ^U :laݎFѐYWT1_(++#111 kkաb,a*e˖ͦ<U$%&Q/_Me.\@ZZPUUEmm- Iٚ(76(DQٳ6墪*Tf Q!):SDnnNG[_F"IHDttt؛nZKAtk4^٦(vP՘Lfb)..%PYYIrrrPEEMפ .^Hrr2 r55õnuMeYGllUujP%]?e_aQkHLS _%"jL&~$ =b^YF!::MUU5V 4nbeҋHRQB[_De~?n;tojSQQѤNwG 5LF#qqצDQImLBBϟRV+)))-QۻX, Aǃl&&Uyy9uuuf ׇhѺukv;Fɞo+j5X֫JTZbcC9oUULµJh2Ys `0fkRQ^ʡILLl2NÁ` >>>|j.W~PLLL\ 1j"ze٦m;.REW ideeEAV+&-CH"62sƌf)D,'Drj"3{%,"QmX#s ǏkJEAFLCބg1ֈ _ вEȾ0jA@CK "  7ވpDAD?%^?6K IENDB`qstopmotion-2.3.2-Source/manual/screenshots/pref_grabber_linux.png000644 000000 000000 00000144372 12536560630 025531 0ustar00rootroot000000 000000 PNG  IHDRCOsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxSwҙPEj =ފ׉ |{L"ρQ_d ]6M~Ď$7I[y=#ɽ~9$7,,,L   3.8AAh[lɝȪTҎEAALb V AAE{EV&v,  `49+  B@LfA()jJCA#AJL\B"}'_AFf&Ύ6Wqܻ0c0Ӿ75\zL:q [3a軴hR8Q讀ޯ>fc>;݊±E@"*P։+ JżHT@{dfei?oVm{;4؎ïi\2x2̨Ϲ19;Р*V,Iwg|Uqr2^`T`rY_mtjBaS%G. ALdA(I%$R%?>:AzZz+z'j_5oDR讀w;}(S`4hLvvv MOW oL&c?ko\+cbrw#GC><Ѹ0Zp{M.z5P"Z`aaQڱP>?~ػ)_W1qګnf歴kD*'Y$(INQ8WrdGs9y/? T~hT68w?_ܺ3zu'ICm, q5vz-g/^Y㆜bCWL}C;;7Q\ vSQ'DFEX7nqvNYx杻HVҬqC-Od7ͫr:7|z:v~|.2~];-/Eru@F5/N]ijPŀ>|饗C +,+*9ҶEqI$$=U@|<=j҈8?9x47oS+8Tɑ._=oHNNa_RڄM5iDG"U}lԀ軱vʒѠKԬ^?rv4kvU= o̥k7zeB1p˄4 ѣǒyߘsi͞(c9tiNhVܺٿ/өUuF*X_^4m܀GڱiȀ֝&;zݸϿٙ]:P.zq=AA}&il*tW^@S:Íszv%O7Wfphμfl7;@W>j3 ͕:5|5'Μv-i@`Z]u@B;qqޣ{8:{ϩZ{}ziGW_!7F.ܿOݚ~btsK~89:Ҥ~]תIVVv& ҼI#j!rw :ww^鯳 moji+2 Jej5zugpdddg" ЮEsSe/Og,JomH8qA0Dԩ 吕d2v[w0q4m@Ɠ+8hBjnAF{oeZZ^ ''Cظu>-h'r"===_|I{zq5^vv6666w_kk|iof(VP9666XXXcQr;88VQ*ۛZT@ff&zӜ/r\۾^AkYAF3q6ZMvvvd)Rh߬BT*j>H~ܔFNNO<t{y'Zȷ]4V[k+mY= mojR{ @!zQ}?L  % Sk;;ҎErKK+Pw#˱.Ag޽Wd }C⑝MNNN|]MU X~KbU'JAKLdAArI.   =b"+  Kb"+  Kb"+  Kb"+  Kb"+  Kb"+  Kb"+  Kb"+  Kb"+  Kb"+  K^qs!44CAYw\xAi  / qk  P.  P.  P.  P.  P.  P.!Oy?һc%jD uߵWÃ-;j$fǦLMeŜ8u{1}I,L&J*ܼu`9U*Wk;;9fzfMB0Rk+|_I ӫs JEBB...XZnlSRpTӱF.wL;AA(Jd"[ܹQq'&o W)$''Uf{fTLƯfa̝5擓b)( `}4L9FVV&ӓ㥴i JSf岥q;*Uèq}#2?ӯO/vmAAUMdNz偯[Wr?ϞϳpT www^ Co]Cݣ;'w0HO‚:jq1FFձ'';zu9hۦ5[^mۺ5?_RFd$._M_.5|*[.@&O?Ӭi A͚'  ϓȶmӞmڛ}1eߍ`^wqv.}R wͤfz^]j2jpZj؂  ϫ2{kqVUZ11T*1ečH>Z S秝  ByV""o<}&'N"N<ʼnS+}o//|'Oϩӧɑ,+ڽ7"K5QXXAAyW3 GJ܍OލѱSEaPj2~ƣVqtt՗ҢyPB`'˘p#Ǝ/zjNNIUy ̘2Е]AA,,,Lm׺,^E25J^YWJJ YY8;9]JÇdee&֑-cFAב /++T4YƦLer\\\>  B\2k>h ٛ?%33Ө K8RA0?}R vR[&5-!6lY4STƌ#hJQSTLMeٴ܅}󧟟qxJHʁfՋ ٺ}+V,bXnGEIVsڵmN//Ojzr-yR >,~I2KZJviOI aO3^r UV{erW]/Rk+g^MrJ NIr2+TR**\\\t_Pzz::Q7U;ܺ}˨͑F{x{PB-P=aT|)H_JԴ4҂*x< T*SSd5uˤ>( CjPոzB}s9mL?Ij24nؐ>zK3qk YYiiizKNNaђtۏvC9v<7s'Fs/[ګj^fiOOOU|v]g~8О]m8z<H?.>!e^v@ӐV$'OBb"c'N&]:vNy&CG$M;:uAH,tjZԙiݱ3}h7; W@Xb} :*Mb-T}Nu+A=ؽWb SPr5}2vdv%go`k֭mܟX8 LHiӱ3o;-皩}f!-SNBqqvNZ4j5hϭ[߳L8 [&Iѽk(zkθ8;KUV5=c>Hol9{pț4n ӓZ5kJW1VQƿuQ:Qnխ_6 J#+倫K/vmZӮs(ًG߇gh_pw'n,rkx8ƌfox?q]^przaZ$<2]:v0 !?ٺ jyT ߿{ejͺenՒqRKEGȽ2 RB-T "U2;;Ez7:0jgRcꊕwb *R}su1tN뒷{<ȫ5wU_u+~ CjuWmZvuPQQڟƔJ%qt~:޵ lo7@elBvv6y-Wr{}6uyX#=-ݨpZ蘘BY^s7zښm*W GK1a4>Pd2LWQQCܺ|[>Ӑ*t'++ Owݓ>i{{{8.8&b-t{>k/YA(ލQ!}/0񝝝ѣ&=N>XMbG?z45i@III8;9#;FVvY}pn޺EڵK5xV1:YXXPLJC={uHKOigP5ۛ}ܙ3ŋA *4.]B͛(SS|zgb}BaR:u ˋ%,gرp9Pb0ޢf͔QIaYA(N>ͩӧxyzҨa͙ V-_7nUP޽2cn4j}].KI[^ʊzP(X2.\ĈêhѼ9=wcyԯW*+̧VkıgƔ+ թzj@Μ;GKQLJf:'я+N0ԿVVV_0rxd2v)/ȽP$Ui$&%2?oVZ >Y3Ox>>aN5z}s/`ب4iH2 {q\.7oQƿYu3>CCC|ysfJJ IpwЇ%tq 8Uo=EZNNX=>==V:1fM?--)))dfe$Tj5..:י4JÇdee>зTʊT&'`aiǙ:s6܁}>00^G0?o<{%bҗP ̂)T:GcR# 嗝BAjհ.P'b+es?Ugw0|+>[ct:;},M(&N>^8 gk@^HӗC*1AA yo-Q]HvUNԉ?y ii&+,LK_;vsǎ}3+W矙T:GSS#  Od}iۺ5vmZ*WQ1 5?ATR'OI_KcS`cL:G$AA`" 0g4{GеKg:'69]aAo(}a}M{?..wQ4i Μ=+W9u1KuuSHs,JjDAAxA&*U⛍6 QRK,3[{AQ /ԕ/DdWơ?`rUҏѱ};cҗR릐J(OAARXX:))ϻtu҃jJLOLLT'$^RSgff7''GNOO/֘ӓ'jej:껱j:7Dsrry\%TcKlRw%~JJzݗW]/Jg)ETO1KݦSgu>?Si~_v(eĩԃߥѯy?qqj-~;$86,SW,}Ν*w⊬Ϝ3&\.7Ң֩(s,Ԉn*׆/nK/6lÇ>yΥ|*.ЮmR<+~;&7kfҾR㼨K_f]I;MLd#9/ iVOH@VL&3flRIjZ6JE\|<IeɓC*+1Y߈qÆS60yڧF{x{h,x\S3&[P>1~"s.ӵ_1oƹ.ƶoY9I%zbX˘s8RDV(1"c0!B2}v+?[@ՙ;k $ ~\||fwKWmZXD*&mQg+S#FꬳL&P<,toy/]͊o7 ׮XDTԯQ#hJҗO ;Yn6CլiSٽ`8. ,\'ΦJ|G' &ׯ83'3C__}?Z8̞~ ~'1&mc }ӐyeJNNC>ZdhÜNFX39s>,ib"+α4Ԩ:ص{7._ɷ&cVxzzp<7l$ߟOӳoX'[}MLyyz`b}6Z{-֖o7mG;L֬\=Ffu\MN_۶im0M<oomFLeIlkFBק \qCgsg`䨴#F@Bb"-o?`0׬iX~=mY53c:U*WfKXtBl ]5~Yl)nnn܎IzuMTi;4KW:8ʨx=uc9z8۷CR˞th[[[TpLs枿ƶsA3>{{Yx3{ OLb'!MԌqUV5=c>~^fw3FHԭS`\S6F sm,T`xضsA_;1qEV0 i1+++ܕ|?$qMf*BʔJ:K!$mk_pw'n}o.͚*l)硡VDS;L&_>|j5>={RM֩]8qIf,˜1+hkCsGtg1b"+e1 2&c\^qqdeeg 3vsTd+,tU||]DTO* s󙚡115<,θqݺ5#8̸Q#d&ǩy8ƹ,sڷϯCc|ҿ([гk=w.MLd ʐq._!M|n=tw2Tg82Dԫd0ٺm;VV2`9_5ԕOsLPo//|G[hu3'L=V-ĬL=cŊtОu_n}(4Ԩ4 f{ȔO8)^:&oi_1`)u,+k|Ţ)mQcMC߹P(\&&PIeHP8ĤDMj5UTa'pqv&5-*eRqHe+,tr՟~5դӸQC%.&>[ ,cE;ȝZ̨Xŝ9k<|جx9@}5|?;v.Iel;@̑oi_իU+26x՞Em_Sڢ8ǚsu)n0uӿ t݃Wjl%'`aiǙ:s6܁퓒Pո\n(--Lu/)L\Ru###ej*N*_RCqww3~B_[蓒BfVNN^ꓒ_R3f?ڞNNڇh\u~۳$Y5sRH]YA(/eHG*kB005vsIY*}^,tfԵH+sbI1x+ۣ\_gί`{d>&PCYA(s{YCA(^/Dk>$&% ԫ['{&^^,_3%>! <=_ݍ k?[&ɒE ԡ}<(Je%AxYȽmyl+K5fM۫Y\ϻ~Ir25 jTV}Q|pe2=u勍zu׸;oQ8 ie% P'jP>wbb|FmT**XTL.ݣǎ᝷$AҞ>1n W?Cvv6=ZTnݾexݻ>o^ VVtj2N0Yyn̞@^f^9997{mfu8ƯrDs￁J(E 5-ݺΝ;?x_~F.^=kDEG3!,p...?'5|8?J?(VTT*'O!.>˖͌>U2k4g+يy gnOKWfMx|ٴ!oEd J/=Z Up.۶凭aXDӢ  <_^&>>U)爾s]:ujȱc4 Յ?pCk_[5Wǟg1m>YGڠW>yRmw _tҙ;u"3L[hZ aɢTIup"._aԩnNM?_:w쀵M⊽!]zsXYY~@nRJwަSTZ6O_.HI.@&O?Ӭi o&:A Fa,_" ytdt܅_Ù0f4;[y;wr `>̘25?о;1wcMíh|>.+ҺeK:ĸѣ8p];w֦>ط+?[C\|>܎dT*scbtؔr7F8lkVpuϞøѣ4p~Y^i:cLčH>Z S秝%UABZ!˙;k&O<b8y;w8q'NOMZ^MqqqQx~FW K`? cK?pc'2cVV2`@m !п ^^,h1'N".>SOk'}|w_eoxa+]Zё6RZ|k&%%Gؾs'YOW.Ь{Y8vv>z:}SO]Kk߈ʊZ/DVceBV$GG4׮(PJKmC(SS:s6m;wGgKI0?PleR'R K3zV?/Dr'lFBppg{U /jѬ W\NN >e.\O?Y` Z9ba! _a,:( V~ Žcѭw_.^}՗R^=>ZLz zt/9BٽΣ[ڽ*+%vĶv2u,2336ygΞ3~"y7SrJ2ZͫoIAٳ/S&,H.a@{1~a#>ѣ:i"5z& 8:Tj5/\&))|Ǘ=vA[>kᅸdߏ{ͷF 6[KFFT*U7A[ y|=qG;gOFzёӧIu7$%%̬,ﹸiZ0exL_u\μٳ3⿨j\]\Űh\ƎVVVtJmOH }SpPÇ -==kkkuW*XY[jWo]Yg$d*\\\ݛ]1rF$6O&[ҤT*IMKңR]2l$'SB|5=H?iii޻vƚ!E9Gr|ug9텘Ț(@ޥPCYK&Z"KPVC_rcgq۟93ӫGw w%?}T}Kb֖}0q Aߗt ´IQ܉k+?U;QreSXv-""HUҠ~}ƎIM?_e%$&p"N$;;*+Q`Y]:u㤥aoo¹shӪֻ/ ۈIqҥ|:o/W * 9xw&OQuMh3OڴjűT*M5"0۶LM͍V,əsQTXZZʀL; Ruwh>[ɚufMJcMFϿ:kku>}s"5-U}o;VEu7:c[a#<ï~atxc&LSJ}/99*:b2\]Çf͚u3220e*mJ\]j'[[[ݴ1rx223Yr 5kױrR5kڔ Ӄ'Xa#ԫW`zKU53c:U*WfKXtBky?C'{;{焆14 1:ۂF7>zw_8OؽW7l(&/01-?&U%GA͚; ;r0_H[lZPfMҬ3|>s.^d͊Oi>FŬ9?Li'B*X9M=5*ɱ,m^㱸[zaZ$<2] ,C)X֓Y$%.>|0u ={2B߁|YOusYjʅȻqAel{, T^6F{h1 O퍎8͚ӯ:G衃F?(e9lL]LYK`ƚ9' 1toEGzX IDAT{cV[C{ﯴo1ɘ']s~5z?{K{qhֺ7%5H5"^R}oo'}l(죾{1e,\]i,~W]FPԡFK0$A(>47r@s$ 7fm)>'n?ϞCR‹MLdAʹK>.q.׫o =j  BRRGx"+ Bc{fHz!N6Wx0JyUA%;ժamm]ڡe 1fݗ2cVi!  =U*T*TzđczrApP3|G̝9///.\70o//&Oؑ#޽ ѢyP{'$''x'xzz* %6 {{{n;l;f bբhi(V-)-EiEmj&7Vf!~>r}yFkݺilq*fMxB!]qÆt"LzP}Fò ;qB0Y7/YVpL&jǚȮ\VP2 f fϙ`!ԪqssVt^;G>ΌYKIdB)6nhj߾}7 G1S\\F 7WW EdTj{cl;|}|iiiz,n_M5iXBAV9?-!φGiIhhk>SN ;wZgr+++[|S(K[B!O$C$޾M8s6/Jzҡ}EmU!($}Daϳ\v 77Wx[O:,!BROGV7ydddhh,; BQ\O:I'B!IdB!D$B!($B!%$B!DDV!BH !BIY!BQ"=/D5f,lZIYh4jTLрNg39p v݋Wv) JWhټ9UE˫AX^Ϗ_,}m u Tq6G'YlRB!rz{Yj 6tϟaᒥlnd,[:uhѼ&V}{;{n3gd#ۍ_:r+׬eл:׮}=Hgix{y1}L>d͛6ŋ<уDLL,.\`ʄqL:L#G-7X.|7v۴b|..Ev'eˈq+w00a42|D1vL4N Y #"HMMepE}|+Ys2a<5.1QbB36iܐjpuqZ@5kPvN9c^[HNNFTlJ_CN9U+~7i]7~csuEjj*jٻ/sǎw/mѼ͞lѬ ?_NCTP(y&ԯBXvvvd2 :NG㟓'YʕYFXtG-[4Z5e8<|Ҳy3s 1J#i߮-\z www^%&&b:7IIIx{{Ӫy3ǥW4m:+3xYz ;F>݋jUrh4{yph;爱?11ܾsY3>NZ\t/>/.BD6a3v$2tVQxxd%gΙ{o6Q\b 5h@ p"3>dݯ/W^t:nEGӮMb"kFn#ŋT`Nb|c^Ɔ5vppY&h42L&Ά#jVVV:}u6bmmMp 2 <<>>L1)͉'ۆԭ7ϰAMT P(hܰc/?ϜTZVC@ʜ<}M.OԭC >S Fkݺ围lq*fMGV@כƙ{C*Wb&o6'>><=wosX}O[mBsV^/$4joƐi`بپ'7ט򒔜sf{sEϜ8y Y=5n ޽[11ܼun/w5?7&v"<"Mc˜( W_Z'󐛾{Y111?#)yvv{j/iBH" ҩËL5k@hXx!c'NbQ(z2mmlX0糬L&yE_~`!q~J% fϙ`!Ԫqss5}9qf ?__ꇄ{KP(\t+[N[GJj*CGz`ykT` "r7WW<w|c6#{BsoNNGBB5jd,Lexx֗@vAwx" { ɉvmZP~ߵ*Kͳ CBg3ΚgKsn߷>O;Rd }o F 7Wl}Y QUݷ'bcKYt iiiz =\?v?v0m smttt[nvuueղ%9ھx1y l}Ĩ4u-[q_nقLbb"c'Nu 36jjќ͛g[͕? [qwºɓt%ǿ7"OKKͽYu 3-_l1<2rs[_ʎC)WY YL$EnoTn;wZgr+++X|Q*4TIع\t!#F䄫 11O1 >ΟQvlEP}|n>ެJݝDJeNU5 66֜8yGQxRoӪ%_?<ĀC(ǵV)w7]R~9 }_:Zg{L=Z_3 pL2ujR fϢ\ٲ4lPC7 |lс)Ά[o&&Pʔq`x{7HLLˤР^=>qw!uvt*KRR)YwKKO ٦ظq} 44=z<ƐJֳ\v 77W^Ёܙ􊏏/233IHLh4\޾s ʔq(xӑ3OxݼLYS=dqT^L&6_s.cڅ ꭞoV7@„X`GѶCL*A IDAT .=s.0g\ QQ%ԪEzF/]#eL&``ڤxyzp=<={|+V~LaP(h׺57~ŅK}p"Q7nkېuRj=d:?o'^ƠwWhi+y-5"yy&YN^]Xf-qqqt|빻Y a7(/{իu:iצCŞ+WJعs />o޺.BuYlZ+5*[}.TiQ ]}7[s>:&97S{ԡCIXIDd$s>&y4n*ТYluGDpB^GX`0HNNU^OJJ*Y_F#1YΫm݊bמ?%FyӦٱs޾}TL1}תEsǎ[ٖ4Zm炜ׄ]#`@蘣({f7ёe+VR|9Y\A|tF+G\R>|0v<7QQ7@qԭC >S Fkݺ_DDdyckTÃYs˦똳`g~B`T(_޼nddwHJJbgiOf.lq*fMA)i4-VVZ.Ǥh^^!Lv6{;3sհ|7i2[ g''\\\)4:jQbƽ[kW,GУgotľOH`2ٜ ;Ru }oyLc9qFZMxѣgo7lG0LT Vp l݆>%7WWfLB YqFݸk[1R߼o>>Vc=Vo &?I0rPoۆȨ(f͝ǩgӽsrU;d0ko/yVVVtzv'uUk$z};~_EJJs̼E8r_o&G o!Id5 /<ߎ/~VVV,Mg!ԮY[ckcÂ9e%d2vq(JΝş3wBRSSU3+{/ס#G8tHe~a֭<8v =z惱Xryݕkֲ|jTfϰ3[y83f}/CB$-4-Zɩ)(2Sw%Wcjș[$ع_p3r*Vj^ALlU*3aL1 F ^҅!Yn=7o!puq&)9bme#GˋK?y*6}M޽ߝ;uݝź lʊrmLDFz:3OΖQcdzr:OHff&c'Nγo]6_a ƙ0bbbi;;!FɄ``Ҵj4,;gg'~c֮7&ȸ[2dHV.[bkl6_J˗<R(^#C2?W.L2!&ʵ !L" |8bx摭T"W$/T{ \Yt iiiz%ƎL;q<_xg{{{;w0ahBAVQx{\]]Yu(4j-VVV4ꀝ"w;; ,(i)q#ǐt.))nnٶ{NZ#kTg;pԏgΔ RٟqqqNҝlKd۶je7CZZC9p9x@Jɺ |9bDe󝙚5v<'Nʷ㳤e,^?!(ރc2cSgp5jUƸC_L'Nٳ̜6zwQ='~A^=sӒS*( cbHMKvԩ] jI~H~Rڟթg8w5_z r !.T"[X&ʪɛB|Eڻcj_hEIi߲ [O3˟Ԫ|ٲ9{M0xzPh餤Wմh֌͚q9F+=sF# >=' }nZMLl,wtmM`2 VA888Шavwaϟ{iղűQxzZ/˗wܾnnm #*/SYv B{4(t[y]#E_>噣νH"+D)feeɔu5;w(ٸx6OJpEw22ұ 'M5miҨ5 U1逬˙?o5˗Yv%>tKNjV 6ٻo?ڵ6nX_L^@Vvo{^OLl,-5+t9!uR\eϙ;u J¥K;~/'&&#GXAAT*9y.A溼s~~* [lfp0^Lx˓7oBAuOHɑwpa C*Q6lU*[\vZxyzpR{?..U S`U `[[[l݆FK~/18wW]?ZJ ;w&Wjw=F/'''lml8pCBy> 's,d@~/_j .s/(Ȗpqكqt@V]N%f:keʰpl6o`}XYYQR%FA&t eػBƍsϙ%N:şM5-iccGS&1obLdL֡^ݺkӚO>˺%\5 >* ZM-زm;m[!SL9s5vՃR)SXz5V$--@Ι9$Yb%III2l{NKDNRRHAk{==F8~L<3zD|h$ʖ+s/(7ڷo_ BCCѣc I+>>IB@բRrML&g{(Fw*2VZz:)z=9)>!фs[Tm=.:<ȓ)F#oc0pws{XIMM%6.OB'qp=/X\إ"Qed"--퉵T*/(*VZm ϽG[Kn =Sn)"9EqX[[?Ԙּ8B{/;ŽBЀGV!(BCCNR@XQZ=B!^Ld%M< !ůT&T&_BW*YI*Dq/OB!D+l~IJSEG< !ůTҬ6%7pm#N*L@ Kb $?}neVc ..mɷBҭT&&Z%^-'<JAe+Wc7e2NE#+BQJe"`lf:k]8a7S]Nf|S+[+IN5b0fBj@\ߋ_9d%&22JHBQJe"{kgM`-}}+DlfئkkN _[ 0Mx"cjFǧ3כʽ5lMUokF%ѤfsR{Kȝ !ůT&VpBRdK.9IgsѲPF Nʠ~;Е)3wx4J4ucK XFt Vɤξ k񈧓 !ůT&j&f\/rS-'zr?s٦Yg߆Tt2' ܸX׷M*۳\Rng#YIn .ŤѰ]DxIzdBW*{dǧcÁK,͒]LxkM@٫II7Ycf-O6`4ɷ^ ßʶNp' !ůT&޺tKɜJ)p=V|7+a?g2J9Q&Ypy.k^IzdBW*g-e}'#S4aM|zO>26*VGfFI&Ӎy!) d07rNe4`2qQrHBQJe" ɁKɸ<ǮFϺV*7تYFy@Tb:Fp&ɠ֞Lꋂζ(l $=B!DSlܸԾ}oʗ!1Gg^VB :Zk^y+תjgZ_ ? >^!B %JLbsIbR3y6tDIbKY!BR9{d:F6%-SaǸu)RE9 ad_LblOꔳ/hB)$=cdϞ?hn`#T*u233uaᇫW`Hjh,O;OH kk!c2HNN4ST&#+#w!TZIt'%ɡ:;*=%\JJ*6m"ם$$&P(MVtڅ2e`E8y BA5:h ~EO ě}T(Yl dW2}Dۼ7¿R:| Sd_?mZ;G67Fx,큃puqfi9 z}>NNc>BVsh"FJ4b؋+boծaFboqqoN޹֗oӦU\Xg''\\\)4:jQb +jѳ7]:ub߁'$x\llΆCTҺe 7d, ߗ:kѣgoZ6oGHMM֖1FҸa ,^;EK2y86i``$&&dZruus/0|`ԥBhFSN -gVrD+NLMzR_'tVEWAepY6i >$'') 2325,Nt%>tKNjV 6ٻo?7RQQ7pws+tL^@Vto{^OLl,-5˱g?yjR/.3Mͱ]Q7VjZj뤥~F\\\pE-L1!uj <=^ӂǃ\LjHdRםId(\ݹj^0e~P(\ TaC`88-[P3* .qq:ОXEP`5jRI_}eoT*6o͚xyz2//On޼ !>!''Gn߹C1 }쿘)g_ъխh찷{ҡ:FkׯSB'EJY!#;{FPT$2CօѢvJV΢^jCa4GPeOLiܧGx2iO:RǟCYz ׭I#DDVȢn\57WwJ#d09TG`GRЀBh$..gglGDpG0 {v|نЪE b͍;[ܾ(9Z6oƆM_!Z4k QRH"+xd++-cv4a/V_Njտ]WjEǙ׿9jxZ_RR79z,'Nh4Vܱظ8zM 8x&AA ЧʌiSDݸfs6J-[0X[[ovԉ}ysYb]->%t\CG"%%jUN>T(_G8x2fH7l[, +j,k[0ǬJelu?qL*Jv[mgђL?Mc01z,,Y0T58|/RSSU3a=}$OaCSc {N}}s-)J?H"+J IdLѢZ"3}Wxq9NvI>{1 ;;[F5>y"8o//V,Y^gl5}{2w="_qss͵M?>FML\|<ꅝ!GrzL!YӸauy3I9wqq.P[ycH|}-߾'Ύ.:ω̚;ʕ*p"^OԍT(_!%m6}9j5шd2Us _Sx{yqj 8I"+xd+++UuNazZxB8cH:}wofdd=^fP۰W !reOP`5j֨N8yHx?RρC%m[}`"[}:qϞe洩 @o㫬?Ƚ7 ٹd $lA,-uۭ*ںjEۂu/Pe%3L&7Gȕf~x՛g9y8r*~1_xGbY#{H^xU\.X # :Ȟ\u6TVumbVT\l&9Hu9VkմʍLKC٣{ǜ='ܦ썮w~A)n{} uʁn1"Yi6ۉ9V7ne3eʄ|Ej~ᅣA=XzWѽ;&0~ܸzbW<zeϾssxtƶH^U֭kg8uq\IhJY5obf;NFFFrWG+zk711-Rj6z)b$ "lv@F'ow ?~}$;RXĻ3/# vG /Ï>f|<ҋ.fq?h5$&T=~Ny]Ɣ5$/'gb"PP~AAd5_e՟fttV]|H qݼ>>ؙ 2i„:?@jJJ 5ޡjv ֧gIu9)ȊH9;HjRgV+#$L=o2=cx<$>.Djw1O9kp DXX{%7EQq11-)ax<&]CfFIIp۶md5߯/D=w xnS< }izK΁}s/g1-RP5ު-Xw9NVUtf743#G ٖ90d~4"#tjDCDθx::>j쬇g3Hك?͚ADD@;TMj ֧QQQk|1ůQϟRkdeeqWbD&L&6 R~KEE);O||\|2I~?VkZsƶYm''7^z3u^ۦN5Ąjn5ʫ;, 7| )WeeeiDVDv۬=f^Ƿ$&ڟ5j;wD^y y:Am,}sXQ^]}jvÌ{nѲEښ9? m]vfeь=E DAVDD?B583ι"F +""31>^i Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$k[W@DZOM[װ|>o}f ]So(\CSiǶl߀chQX,x^efltKKl^ZZJQq1DG/9v8QQ0LWP_ +Ҏw N3|>6V|޲r|->#G0L$%udK"g~{i6ldbpf&~{;uj;ʫ)(, |w4~x٥ 2ϯ̫/F\y $&$0ϏxfR_6sq[kcg6&֬/1Kͷb=$''3~X~yAK1 ߭ZZDڎH;fX wD`/_.iwK.fȠATTV3;e+V̇$'ud_~}^}Mlu|>|{9ZRK\y&#;>zݱs'ss?F:{i \Nf2n!:*;wq&&\W_C.8K.y_P|n\ee:~>zHw>~s=,ztqck+g~ۘKrt*tԿ\.ee$$Ua3gbb EΝ8w]v)zWp#9p cqԫXt)E{1"##xsزufI3s16lڄjrɅ+^#bي~tC\ee$&$0Y^Uσu_P~{5~&kE_ٗ_r_1?~믾 ɄE=j$"#64^_PG|&VXT6ˎ$$Tm۾s'~!7\{ ^Bkw^|\EYY]Cn/(W]M{N ,hOr<RSy߽޽>CAV a!ݻPYYI}?O~AAsTT{q]wGߒ>p?RƜKg^~u>n- q;~}s˟;去!%9⾙[osUW0dP&\t!NVZko'3#}z`ۙc=zAeE< xxht^/LYoY뗘JwBLt4{sr8odxz[nc@~|u+{Ӥyǟ'Y` 5bx`ېA,\5MD])9vEpXU|>iz/߿-d25>{Ϥ뮾ȈH;xgy6OHYxyhtػ/Ν:܇"b| "XՆndv0kAUVP{.  _,^|Ϧɬw42GɱF 8:Ȟ;q"S;ֳ~qpX,zt@0UI39]wabc镖ƀUʙٺ};6njk,RԀ 2r"Ǘ_-"&:Æ6_xe|BN'ם7}3fqonl6S*RSSܑSsԹEm Mؼe <O\WS𣏹 B*6ߴ[m qn݀idE1ۉuXP-,,,9ݺt-[;lnFnF?eeV+Ǎcqlٶγ/Gf7:蜹5~~D_,_z"«z>e5GaaGйsgj{ȳoװo8a||ԥO^Ջ L!>>?O'>.yO<-[8|8Ą<'Kk1_?=²+؛cي?Y}}}`Uv5dd$@{7־#Ilk>3H;f;} ;Q#y5BK}锚#PXm~ U_y9?__w-^t!6/AukLYy㭷8wϿ7y,^IQq1MjڴRS5湚L& }y|<gfE֧)++g-7ofh#>PS디d*|: ?n\`rwyזp8@Lttmه"rfQi$5s#|ܼ9C:M+IƓlaGv6k֭O!?iw>`7}~woJINKgcXyֈeffdk!99CC(*. 66%%,[O/)ե`n.Y1-_򕫸z>(^{s>]:wO^5s8/mwPZС,f1fcF_zد1lٺEDEE宨۶Ubfw/M(o[|?׃22׷?5kJDD}!aV+^tDtrF ơCYv]m;(#${)n:uJN~efhșMAVsuh!۲7xd&Q8:h;w?ϾE,nӫgOvƎ>]ҹ3,YE_c2ҹ33qcu%a&7RSRp5ǟgⲋ/f! :&OѿV=Jۧ7))Mhj5kYTTz駬`Z4~<}s'M<6n#_Pk|Qu/jk,0}փ^Cp@f)#X-L&S&;`_f5_~^x̀yj㫖曘ēLz#p8xh <w?zO3gХKC9ϟ2eJdeeqWbDPCu#~^/uݦ|CT!.wEe.111\SQq1~:c_NGKJHNH=Nm۱Z-tJDxx-E}]^^NAa!I;6jR*++ 2h}("҈H{qmVl~KluV֙(::yi[GFnmFCi_e9C)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!)Ȋ!Yۺ"zelں}yc6[ڝ~C v8/H:DFuU}ѽ{[WEH;e|>CbW|-704cd8^Zf#,,=~?ǏCL)--gb"k:=nwE2J IDATJxW+DBAAV+%0g|>lvee[d}G`2HJ eUn?{?^t!&o55ך?vV***?1?ɏ 9SOa&L&33ۛܩ~dŒe˹;WWRPXx~﹛sƎ9rλ1QyozUΛ4ߜς??a[WOH;fX wD`/_.iwK.fȠATTV3;e+Vs|~6-cRƛw٨*++%>.7+Ņ~?3zÃ3ԑ}9Ybbc\?ަɸ1?2xLRc}PrڛIرMlSj|w}\rRH;f ns`?Ͼ"`߯_Gd/~:{NQ6sgᄑ.oY#yֈcFfz^8h->rgУ{wƏ貛PZZJLL)\.aaa &Œe˘טf)5i:7D>xAIH"LL |>Eb~`} LE9&37z%˖{DH;fnV?@>aB|O?'q$3#+WQ^^Π noaÏ>W_`Z}ڭ7yR_~+WQVVF}uн[7Fr .SjJ(9VB݃n%>>O2hPWn~Am;w2/Xgοeee\1*."/]JQq18iV^Sj 3ﻗݻs07G:-[a64aNyyy}\_˟|͜}3gqm2xWLGŲ+ 0AHLH`/WRބsƱlJˉ?#Ϫ{ذi>%^on>huºdENYv,,̆fopDfdwCeeeG99/(|"66t֍[o Gw穹svڕ;nFjj ?='7&Md3),*⺫$2"^|~-:|[|LL<qEfwɃᆛKKsw/5Tn>~?p^g'۷?9xfL'11rܩ^{$%9⾙[osUW2wǟO###y_osE~Fٓ|Ž;yDDDPr6[XHuV+)"x "XՆnQ(T0kAUVP{.=2xs(ƞ֓[~w;7n`PF& `ȑ,_¢"yy @S𣏹ʩQrÆ^aCǝ쫯_y,^|Ϧɬw46lTo_xAm pĉL9\6mmw0zTy?p_\3n7^ii,] [T\l&9cמ#kVsʍLKCN6{HuH;{@=nF)̭*[Hͭ~9n5_9gXpZ7Ʊe6o:Ͼsg_NIl>sy}/SF;9\wU<8zJ'g]N4 Ǐg_禴YZmR ^& |]fEu)Ȋcv~~uQ=j$ѣF>p@u9@jJJ$Uaz:"U#^,[=̰!߅l})5ǏTn!-ĶW.::U|H)n^?xv担 4aBՁ1ulIm<ҋ.fq5WAaQ!Dg " +Ҏ9;HjR:x<r?6?s/.&MOfF:٬Y cC8v8Kygt2rA}xy\sT"""x Z)|x s, #qK-ぇ!`҄ ,[Vc5jL ߏX,߸;v[~R}cccg6Cf ${)n:uJN~efArR<<$: &Ç z_:m^#e7kۿ__{ܼxNE.&ulImbbcc8ZR²+x<8N߸p1M޳/"-GAVsuh!۲72jTd2!" g\G<V橹sx/Ybv;z;ngsO[f ""G&f3Ϛ/s/f<5wUo_vlش'Ԕgf!2>OcǏ3/ [zJ]JK|d) }dK̸nƍr}o&<$S0FK[C3g0'@HfΠKi zwO'::.ֵK:xٲVڡz=wѳx`}tt:}Z|Yf=Fױ9./=5|PΛYYY\qX%***j*`2lX,:~^/uƪ^ۦN5ĄF??|>!`.Աc/-- =\4ؾ''7^z3uiL7-5+*.W~BbcX,p-;xr_9,DD vq\rp-bOf2HMIL4tQׄ&XeܩS)222h)!﹓&;ۨJ7-5ʋ#!!sL&XVVY={v;iZ "?fqOBEEE[W]Y;f4cGnxgi ""C~x%m]vkpf&3O]ZNDZ8gb"}Ű"r&Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$Y1$k[W@D]Ʀmk9tBN=֩;w$6&}`20V~?Ǐ'**"Ң4p+AqWYi56nQQYA>1d=~1gxMͱuV^/Ço몴;g?^(HYDp!Οx1:B,J|I\xzdggGii)D dgk*//端b$%%%;v< W_}Eyy)F١x<ٳ$CjTٿ?ݻwoꉴYi6łf{1QDFFWz<,_2z&5%s|r|>]v%::Dyy9gT 麦;wRZZFRԩSbbbNwՀ MxxxbSNٳ]b6idElaa;kX,={4Q|>V^Iɱ,VѭGo|5zTVV4 z<^/v=yy9fs7T~S)rn7vF?~oƶYcիW눈 %%%Pp82eJ[jJz%''k.HNNzEBAVD-,@^/֬f1߸¢":rԕ*++ϧW^ +WR\\d2ѵkWxt:)((K||>UiDDD0:td2QTT +톂4[uo>lݾR/}EEE΄DgbE رc!xv ??l- FիW6lVUVcg͚53f<k׮e׮];P^ii)iiiX,Gמ5~V^O>XV3fL`?ǠAg|?c8p vSoC*6ji'OG!'''j2ydvJQQ6m"::JJJ5jVǃCߟ vͪU5jf۫ۧ2DDDD^idE¬NEbBlLL Çl6ط.Տ]_ OZZP5i2#6hbccѣ@ը`ii)={a6"//FHII1okP#G0l0\p!999t;t:}v<qqqZ}<'׿(6tHu9'?OOOgɒ%\2O%cǎ~fٲea6]`/>"""p\A4[jC2h׸ʈdK7 >e픗ʨ+,^v/mܸ>6[;Cq}Պ3X,zؒemVb1Y9V>}~z HcknkקMiP1?TE/iOdEv^ꯔ0ƍˡ$'%a;1`h6J׮]tֹRII 6lo߾7?&^CգڱcǞ.)?kkW?x<7j^c`ԲjsS,nwЩT/cf)))!77êGTUKS~}LcXdEc $l6vѴ률XgHӧ%%%[D0?~ŰaSl64!5ӧᔕa2HHHzLc嚪7n޼޽{cZٷo&.]P8x &)𸺶ʪ+..jFn?4͂~!rqp8غu+nѣGuV6oLtteʨeN30USڂi}_*..ǏJ"43#EG [g2LDFDklOfX8묳ؿ?fx^x^HMM < 26baС|^YڵkarMVaÆ}voߎ%66QFaۃլk׮A|||L&SeAՒM7ύm`:tj'TRXXXcS\\2d#0_vݺu5*] :40USڂi}_XX)}UB]؈i`k%+++$b\E'_c2lX,:ױx^***BUl |^/^79-]f߿os9ُJOO'..\9[jN%K`X9rd-Җ4"+"W{[iiXU{ j`mV[jj*;wdϞ=u 7ލwUUAAǎc-ZH[S6g6ѣG8Kf3IIIud(bT ""rF֭[[W݊s)ȊHp8h̻"b\ZYDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD IAVDDDD LBQQQkEDDDD$dCRCRCRCRCRCj["""rf?L\\eDGB3 T>wR|sj~XVbգfsWdEDDڙ),*$3=uV;&׻;`j&(,*d˶-ܽ>i}}H;{(LbchNLt cæ # 2\mD11۟UkW5xYvU">.U1$G|\|H2<ںۺ2dEDDڙy~kbl ͏=yu(ȊC~_vjiN)Ȋ3&L W1ˆںBm`dEDDSU8|m]r[ +""h4"{hDVDDDNpu.--ѡC& ՞+jEDDw/ 柧y_٢gߜOc^|5\˹2|gL{z[YvtDIDATr!=wuXres7jWe4?o_lb*A^z:|Gd[;+ϯYg xi)/+WUVF}ޭޜϡÇ\)xݵѹu6f3ǟ-u0#+""|r/]9cΰ!CrѢ@z*=g*+kp{G;w2EE]>Oz6۸wg!յ^/|Up_߆?I~~vsc٣u߽$&$x<;k`II||>;+8wVPʷZ,TTTԿoڰqnos#ǍeС;||ǀ D^^ed\cƍ8pRVVd&gXmC9o˯^ͭNyߕ{ңv LAhhpͿv`Ǝjٖ֭ؔkWL&׬er=k΁m$&${]t?ЭkW/8kprs0'k{Fum """Lk,)9k8F G,Yʍ]{J 9)I'Oo7K…y΄9 |˰Csn$UFAa!N s&{o=ϟ3/= q<=nFAVDDi7^?1))i2蜹\޽8t0ǎU3Ͽ31aC*sջa&v;'1!>q?n`gΪWڽ+ÆaPFaaaݷC3{lwտ__żgί~~,V+Ow`z ,,ݻm,+бSIR$d21dРVƐ:Yv56jӛ1||"zo;ލExRWiƍ˯nsIyc1(#Ճ왰ng3Xn3S^^NSk=woҫvׯ/y!bcٻw/ǎtDEu`=wgCVP:SLi*H[Yn5vۤB&n͍j%!>>BOCۡ*Z5vٯ\̕E^ng <ںk|>xHLHUEEeeeDGGֵeeeiDVDD=judS]dws9^-oܼ|FVm}UDlLLscN2ּƴum """L H QrP^~蔚ؗڪ%"""1w_5 mȑ#Zki.^gʈQA(Ȋ3+j;?nh{0vήZ[ҙ ȊH -\r_mD>4GVDDDq XM`2pop_ݮn궶M:^AVDDIMI;ں:S.#tJI:|8u)>RLrRrWigb|mMnB\l^}:&y9tPʩ, $uL+Ȋ3^gfs[Wp|>'`UYYIN]H֪_^~***(//o """PeeeF˛Ĥyk ++!""""(ش n_+IENDB`qstopmotion-2.3.2-Source/manual/screenshots/camera_running.png000644 000000 000000 00001023506 12536560630 024656 0ustar00rootroot000000 000000 PNG  IHDR5-x)sRGBbKGD pHYs  tIME.qQk IDATxwU3sιmwY:,D@%* KĮlbDXQ1[,`ƟKQ)J_ڲsfǹ+Du˽̙{gp%T3WH)q8X߄aH_/-!ZK>};O>-袋%\R=tЗBjw8ñyyl2x0_[d`ixcǎ3| p8!QaX,dtf5[tٗo֊[c4p8Qak Dn VxRJ®3p8 X;D ^'jp|cb+^.9Ap8?&loKX+q8MVgcӲC5kc"/EcՖ7p87@`͚hðCR2shPb0ZތYzzr8߂ƥnniP(##ɐH$:H)Y|9X:vE).--ҩcG||K)YR_O*YoRʊim"EywΠhl HuUH:}D8=0䉧O=EkkHnmҡܣ2jiYd1 1!.g;r ׳СFҥ<_щ' pؑGs~cgݏp|KRr`o[Q#P⥗^b뭷fKI@Ν9s&oSCnplAR*N r9fϙ˽#7p=%"1TUUb_o~r90D)E!0 ֒L$*Vc-a mC:}xazk}~̛GMM D2}"ZӃq3)SOP[[[9}<ϫ,쥵FA:BkTL;=Qc? ZгW/ޞ6 c C Zˌ3xw٫3]a eQp86L,\s=vߓ=t:Eݹ{x!?r-ZīS执&Hp1DZ~s5Қ͑L&y9yɧbpϯn wu4S^| ]V:3?xr/e9J.|eL&S9>SUE]]gS~a-jر1+~CrUWӵKgN?u<]:wY9cI%l0ZYxi~9 6:W_{q%3lP/^/ǎe1cx/ϰxbv=)/1_^y9j:p=0tȦxc)zW7܈+ "C7tҫcm-?>|2oS^c݇2u*oQB6faCN;[o7M?ȑtЁ{xvٙz(Qya>gq8 VX1tJ)B]]3˗3p@4WVԸыñaf3V\Yy`a@lܷ/Gv(sϣSNy|jބV-ZLXHXx3N21 O>Ȍ3uѻO>=ol6.oƌt&X_H2o>h6l(MMMkU*;o'v+n=H|bɠXkxWl6n l>s1l1|8̜9S: `x:Ɉ8=Sp|ԹӧKiii/_{`{+VL&+ P>geCZ2 Zk^Mz'3dM+ZS(λXkqv:K.Fy Oܩo6]v?W]RJ%K@&nn>}hl͟%KBP[[Nc*.D?+j⽟.jZZZijj7I=x7*nqc,Bصޜq8+'dOr=F8}) <Ü>lƎٗ}=@.RR8:k RJ-^̑ǝ@kk+'{;,\`d)iimAkSNw}<MMM ---Yr}rk|fر#B"LAPyڤ_!666:k_!Xaeˏ[|{UUU%Lds_H:oQZ &27pl9wzK0zz "O9*kOZIR+SYԔ,5K|c|?\ZRf?9M޵'cm!cɒ%ZXrUt0ƔDgp8Ջ6h `i%Q#\M;>R ?v>pp8^XSp8[Ka,Up8 %,5p8Xp8oiK7֮qyaQyQ}rzzt#F|iΜp6ZW]u6F&^k}cM7N;Tñ^~obĉmMBMM 5x#0{lȀXb9MMM_9:԰Q[ڵ+ov"Ct壏>䓏?fСEƏ??v<$?b>1?ݻw#N馛~ZZ^cO6ڨ7RJ9 <ЃBcc#zEMٲV[sMaԨQDQĪU7H|<ϣ޽{ر#d?C*ZKUUo>Gy}aMB![m ~0|>Fp|- G6>DT,Zk4r)dҥ455Nٳ:uƢafѳG1h+.˗j*2L*Y1,Z/ٳBУG/teAt?'=πڴ 뉢nݺQU]ŪJ]]aXw|4k_xYfU6J$H)={TVR$=zgVXAcc#Zjkkܹ3aԚرZ/R)?p.{o(:lO 8W^}GyxsGq1G -NN;Ȕ݆n!J)RT{./LDy'?Ȁ[o'pQG~ :}q#PJ裎"HHy8g?;+7ߜw}a|)%vl 38C=dp8ְԴʳݔ H`Kn[:ƘX@Xf?Ro1gg:  =J'k-,[#GbxZ6]H_Rݻs sp!`BV{y?6vsqڥc*֫mWτ c ={t'|%K0d1$TӟۮSu>gr '!Xl+V`}:|>I'ɓ_`;pՕWp='׿N[nAkuZΐ!Ld2Rq|Mkk+--}̱ҥK}z%fС\p8׶}S):˗SUUE]]}4ǟp-]Fkk:OוJVv.$Æ _&L` T 5s~LϞ=> 2}! JR]]vmĉɠ,_B>seĈ 4\+W%`Sw?GIY7Y?Ĕ)S83SuEy:U Btؑ^zq 7{fiii!3z(~R}e6k#ǑH$fu__R$={cǧzr,X/_NNRD$[qMv8:#vJm;\.WB_Z[[Ig2rlͶK?0id wʫ&Lڮ#`W՛;!NNrqӥkWtڊ ?nj~{?^OJo1;տ:={йsg;X~#ջ||r{b j;t`2h!w}7r9V,_/jdcϽyw?;뮻sg1EW[Wp8_v:%TLn}\B@>_*WlVƬeT9(>ei5,mm)_\p8/'־^ Mig)뛴a^.KOj^.Rp82Іӻ,;p|[({a(xp8B!ql()IH%cW(}6_p%nt׮jh`Oڵ绊rlP3u0xAִwc.-ߖ,N8&R)Rя>;H-W\K@ܚ2Ӈ>{`+"8 / 3j\cC9LRӡJcͺY Y̋ v-݉p8^ ?N8\8džEy?Dq7UR3U475{p|8Kpl`A]vENر#]tav>/N:׿Eǎpp8ICCAp'{ތI'WkBB)U:c)e延?+jEJyWs)a!޷.dӕRhOñ2p~y51q": c RJ>}1 QJc=Ƈ͢k.rl,]~ ӎ;0vX<esyՋ?q^u.X, 55(?>?]:wYѽ'tD<>o9{{9mq@y{4vi'é!y|,g_,^ʕ ^455'ș⃙3y7H&44y_ǝwI:/pǝwdZ[[ҥ 7t3'pK.e%ȒefEkÐKres%ꫯrqN5k+^͟-ʳ=Rp8I0dٲe̛7]vمn _J&SǓfymݘ4ix&3m4̙3>mG㪫Yg=zOE\q\8x7{;'=I #L2#yP?+(rx~*ucp@f9xי9s&BXlyoSb-啈D%ytPCPTX[ .A!>inn& $ŒkuQ'jDn5uuusZ;{C %˲6У{wJu IDATǶmgLgOP`޽п?; s,w;.0zkj99s8묳K*A`k̘c)lv?"'j;o>cPJqw3{~i'}a-^̅]K;xGmh|L,YB^x>|8ӧu^駝F.g [9"n?8&Ms6t(RJmf?%Sߗ]XF'k>(eOu@qv?X#0uD*%T}.S_yRV<#ɐf Ð 2Uk-J)$RJ1rXyd!a/ZRTeTRJ&Q)9{t|'J1<ݘO?~kwKۨ%K~)C}x!(p8pZZZJ1-qGrHE(”,ei dKDžf!mm:B@kK 1s{d2Wr{tOy)Y;5]<%Ow} VG!0lfYN8wðM#.G}}=S_yj:uDp8Dg g[8ǎ㛼J/Knر--t pp8Ҕl\OoX|LzC2RJ)`uGq8nwӮq8)d):5p86p8Xk+ Bv+[kZyZ/!e}I)T5:R,\￟sH$r-9c+9sH$_*7x|>;Ny&N{V[m駟[#҂Q9=w73ڿ5yq'sR]]MΝZ3n8}rgL&bSh, 0gϞt!B T\>|xU!^xXk۷/L(6m555,]7ޘŋ#`ҥݛN:`}ys<,]v% CVZE޽AJI}}=$  Pq;[K,aٲeH)4hͣ*y̘1rٓݻԩSY`f444P[[K:̙3|Y`˖-.]?&ҭ[7z #kWo\;c1w\1~l 2+ۉSd BP`f樣o߾a΋/o5jbyOK.ar9}QVZMMM{P&klR̝;I&qsEѵ[7|Cawꫯf̝;vۍ_lV?3gdvzL̙392dgf̘1viKRӧs[ӥKǪF.2,s+`c`ٲeL>(?Iss3O=z*{.r F&ˆ#rNIR7v,Fge;|- 8[/l s}ZLQճl(5֠V mO(+c7v=ETZ}^gkQE,rZb -b/jeԑ’ma?PώFeߺ,* ͊ c dZO݋ygӅ3 M^1nWˮRjڛgoj Jr-7p~+x TX ,s= Èه֖f>#d…Qb!;ӧL$ )w 475V5s8}!ΰr W~u>dcۏN;Rv^{-3rˊUcc"Dg{ɓ'3vԩ?>dnzA>,=fϚ~v.RJ|M1#,*NƎaQ`ꫯ/Dmm_?~<~hRHtԱcLcs=f&8+T / DC Rdtb"ĊHPPIrR~LCDZa@x?遅hs̚OKhm^BI | D#$]@k>F"aFa"B`JEBȊ&Hk J"OjTV l@h#@j 룽<i`"TFFD"%Rc!)0ʢX "B!ڢ9Xd k|\Na"dXZ"RB| ARcm=Fi$k$a< &i9@hbڋJ`ND(0! *+56ܳХ[k/" tkkx`, 4 V`F""-`uSq7( ZVD H 6X!"Bj"QDj0#X4[I$AX@ `)bƠ1FX+XI(UBQXA6Il?"!<(#Ai0DG3)hh AHȐ#DH\EP"m@ɈKS E` :h!g#r6ETLҤ X|B `B(IM&%oB+Q&4EAH)R$)СY 5RIB`Ȍ*@QH$҈PƯx%T-Je@Lm_3Z.HB__AȘ11n8m{Z6T*+VҳgO$ZkgX%Kx<@LkJFc%esRE_|1/"MMMTUUQ,K=$Lb"xy!Vҵ(bʕ m-gh".B{owqw0ֲMy/!"q>F7V #* /f޼y.kPR_[?LDmO>S2n{5j4{Z=54IX/4Bd^P/Ƞk  U<' t&EBH@ Hx;BFTS ] ZY `R*!( jPR$X1Rd )%HXEdXBPaH4 '|0`Uiw EIȠߒ(X0"@[f (Xdܡ0ĭDTqKUS@6F%QFG–FX0]' 4XK,lE`ѥe\aK/KuT,Jy$aEa*k%A*e *JɔJ B@X!bH<+֠$"":UX҃`%SX5*Iȸ@ % %-FX:`Dm%H%b1kA ' V*0Xl6$xii@>"!F`lI5Ea FHg=QD2O HBA҄`QTXe%l|y> U~߫/'ulhl P -1>i$A>JO{zνdR]]ͤI~aXcKt֕g}c{nZՈYb%ձ{pѧO/^L2hiKxVz/#?3grQGk+R裏N*b477U<p٥q5k׮r9y$/w̚54=p~םw~cc@*ży "2 o?ӧW]rc:wL~;=z4MMM o̯us J֒NxywڰlRw"$lYlJ4>xDl4Z^/1'PP l% G`.tɨIH2Ng 镬'_kҡ!>IZeB/ͳ !BčLF!"!S/^l .JDCVa=*@ I%ᓑH#QF K"Οm< "@!@3~,ؤ D`) VzQ6D@h`D5U 2H"Hla=MtlB!D>S% ߦm,1"BE (!Q"Γ@"XFHhX RŝNRKI$PƮNP%J9AQr,rDJ,ea@%EQcbXTX[NR^#+ՅMl)Vl@J#C|-c %>ZXSY$L,L`D$zjh@k,rWPʧM<A1IP-Yd6!l/<|XXJR)1U (9iA K`| § ]D#=P)0"mSl@<)V2E xB$0)Z_xPA H(0iO )6ABYAMUD"3,jFXHIP(:~!m[n%m½K.]"ݮ#,c+0 gժD~8餓IRmq饗!Ç`illd=^cذ͘:U2 VjG >-֚Ç3u? }438G}=k+y, D\X,r=w󳟝Gmm-G_n'%-RHaZ+<,X0 Jf2۫k*ihh P,ەK)E:F)֚|>߮o6.Orř ZC!xѣ;hcU\ :,3}x&PH7VMV>2SO30Z^ aaO&ʧh5I P>07,Z4D!wc(AT"JƾfcBb7BұHCNX)+c&]"*AhdQH@M ?{kۖw}sϽĎ+q847 !XC$H+H!Hp3Dl * T{{^k1hUr]&}{һ{SS2,T@TJ/ p )ƨ`eiRJKjzӋVS%s1"zE)-D$I檥D.d6%'C q`XLSkBќG?'lÙ-vܐ8{]TXj`Z5[]ӚLvA D=lr~BzHThx_[B YWKsz@RSf"zLidz94NQL̩k(L2Z<+dhlJ S `GZÓ&KizD 0U=.e}]Yt-MDpR|oUМ5 'ih:{ѝHShNk) ԽZ i#" 2 EYM Y:#QIFB8G!sŇ욈G5=yQ&yLzI8o|«%k2\QrG5ue+1jsbL,`ecAī:'`qKP;|7?N~?==/w28nq|F7s;޽{{o_5} >p߭Q~h9iů Onsbr8 IdgIpq ,wWJs 1 L;.:T\2D9P bf*,] <{ВLME"[ˀP+!0z{䊰e=C4b\dbi/=p3 ,AMdDOf5Bekzȸ^$Mm$H#kP]C"}^h4$E-Ӗb\L 2iE\QFO`dJK5-2k- WR]S̹J&AЉ=nFjd AZۀrikĒhsXBQh]G,yw-j!T K~|Bn0OXCXHVIiɾ^vŴ@PyO#]RC{q-.IĿOd(VAdQk:!lN GȆz\0)!thHrp4:TJ 24>Aj`f6yQ+zEraT{I1|8OAgi”%L-+>:ςZ|+;O2x0oHn7g3FFz]vºrEH992İQe8&3^,v`2#z36]o@xAؕp Sb0(im@;PI]2 IDAT0=@%1bepBB̔ZO* R1~ j (8jI9jɊSR40)wg@F [k3d*7/pRbNMABK鲑SkZ_#vw^j5AeZFGγ{I dA "2w]xyP-*: Ѧ@r!*E(Q[d+#tyݜU_"YT@r*h#E7I-4"Rjz@ E)@g@Nj IzH>"YkirAI- #8QAJ.5zNJyx zmO$E/ ] 42&qXˍɊA*'ʔFrgf ]D!,dfd, TPix!Y2P |8X%vSe.AtX?ƮE[ WG~kXnΌ !8E[(Qn b r~/k##r:OWG=aO5@7O 5AybOg yiwƆ~D۹#9|{ WZ=@,q.b1H[H~YшC+X.${5A WC 7]Nx%DU"l'$AvZv$PtBhe#A"^j(CY.GvB>2 Grإu."rtUtF%[8ZMIs4Tm' }4D-=7aeK* 'qYE[ bp jd$i ^%҃iw)F JYZ?OctGK+#ވ5 4^3ho:]|H )JxK@+Kt TMR2it+[M EM`wH|GY*R6/Flʪ>Ģ.2޶"\Suf)Jsb;sdGĸCj!!` !]6nǪōE-QZ4X5Lv]*/:y0F_mghʹ7D>dpqDo %q8䁝 r_ ?foEQ:ާ^o}m|ϟ䓻?觌 moH!,6 Yq\n,yˮߐmpwe׋Bu)hh[.ΆPžM1=Fr=ʭM/DmrKiSƕ/t OF1J ҚmqG_-V˚D$(hWY^F.\  [ez(^;rO6+kǵ ~myC}D-ho}OTD00cGÄE3g#/WCJHx5"'B%vx##d*kTJ*jI*߅}n^\6Ln: JzxֶX; %T+בJpg/!6ʽ1˩QIihh?3Y`hZ`;i&:Z_|`:kl:0$,n?$H$;҃DHΠB =k^$K|&%Z"FQe!3Rq׎+ յlazEyiNq(l+T[%55;; Rwa5MW4u;sZ8Elt@Q?ve]qCTP?=qN)>fq{6eQg#bTp=+uzuP^߶[ӟInY{˺'"Jgs2Jh \6vIV.<l\q?Swt(!-w0R:U\J%d<مWY.ԁ|p0--u/dU^{'0~#u./voFm%q#r1vm2H:Os+o$6e GjdcG_!\QYI+ݸXMwO<(AGM#dK "HICkJ[*fO٤>[-Z6pi$*7' J0 kkbsvـڅzg{VA vOP+S*H'ì"ɲM{([ҪY>Å#XL\ I\"tɻ`PaJx'uq=ɩJqTdӁ*dߜMd;KL6T")h XOz~:' K#QJRYт5fIfhf5Dꁇu6@^lzDȊZ%+4%٨H8 e#epvy~JcqVUR^+G0Vըg##V q6Fn\;Z8 <;Ēa .ULe1b)q$2*O&+ R["X3켖k%9g7w|C*z^G5pR"ȢDl/Ku!hԠ,kP,Z;NW[L:_F;pS2;/)+PuRB^ґ:>;Is{ ̉W^iLc?)0s[(R@$s#} z}lܨ @E>D.šY~$ %_{WnU޻oLaUE23)/r|{C \s2:۬=&D&0\_3\ȅp;2/ærYͬ&&Wֿۄ,͠@pqUAW<3c[ I`p*<ş<M",٫iBCeو oP4Z+g˪GvQ(H`M?ﲥw&D9|\@+c,B*Z{H^ ( _ H. ZCU=_s;x\A8yQfʉf-]q^gڃ5,: t`oOxh1t(w]D ;񸝄$Mó^SH+ZS yl.dqvgV(p`46@rZ)wJf-M UFD5ijps/*rIQZ ga h8f<08& 4QCA"hNY00Q cyE i;@xӮM(qyS`2 r}ﳬh,后Alyr'BJ3]%FVG0zDx1p n왤m|h!]%Z I*|<+a*tEh rcpB&/Mz";)м"{2pvrsq<}q=ЋqdU!w3&ƦGOlet#/CY2It2*,I$7nR#Ҕ@c9 ̕QaW&؈ܐ!0#MtE/!eJe)Ί e4 *B!v0cEVoC3- U_*ٝ0ǻm׽CѨLrVrm{}D v^ڹ-Q+=e7 "VS:c.ȬxHz]?SDoőF4JCYY=Au`օ\Z[uYa2J!8-n**~^nlW*_峵;[x(z?Tz?ꁱ*--2gWAx9Tq-WP:JT,EDZZ4sVct{ *A+qGS|@AAg.j/+SiVYZk>1`>8Jr*\La2P))P48CZ3,z9.'"6xuy.A`vgC,.7,.<)Rnc"&O n*O4/Ov[laU+t;őrym2`e[@Z##]f,0]" jhE+픸|J O#yv=wrk`ȫh#3tlq}UvB> 3rJmt`^\pY)Jb m1*+:ƈЅhYmm|qy5k[(n?ȧZmDDUpgBH0\ ŭ+&Je{9^o~+s{]^^T3,!Z`QARBIk,/)*a72S’`!;GٶXl95,bj+zxQIiɤ"v0(c3*U-צ̻brH;7Kf YI2ʉ竺NyqV-A4v[K4N5M)<ζpPe<\M9}!WQnFJTBDW|(FRn g!)厩sW,X|q^k mPJR붎q`HBC 1,(_!Q7ZCWK${.v)fb\Ę$;. "t0$֜Q& g=8|pӅV"T2ōGnZ Ut]"0crABc~.|wN6OsT682xTpyq(mu*s/66q^4i2u1WQ ƹ4FVĸJFdtB-zO7/)8'‘q!T-@U,8E(#UIY1XJZlf߸- IDAT -d&GYp[\Q rIe@ N)::x'g%+4dlLzjApA,pFz"$Z' e瞘һکWIC ;5BgAR_{D][%hα3}F6R&GIՏM$aJz{rO[szKUeQby΁Ou =­{*ɕ\lg@}ىDǙGҨZ%8#`#SSq ijEVM G"􅊾+#t0i'W 3r4=*HT%kP5{68VIL&7tLaVs̔}LǴ$puCS=h[pL\g~~@`Wd&V`Gpu3{3.#u "wR.x9MIY%L.̹Xs6 [ ^9d^uXEC]:^1z<м02gZSU>,lr݋ _= 1b+G6`l(qWVp7}>~Ue e;d7l S CأrۋbU嚫]#QÚmȗ8"T.S"ʁJú XY[ۉ3K xC^ςDsfkX]"TYYEQ@"gVz'>#aYC\g99~j]yV&z@WRe BkYu W-AJ GaarTуX6H+Lszt=X qy.FLNQ,Nj䃾+=D~ۓ0sw!yjQ?p b"LԲ Ka&BεC'+KJx,V WIoU`hҒH "r,𜍌cI#hJ)J wB +C:ҌciaܺSxvDƾ5#"_4V3 -P]nynlwEbX:~ooo;;sO?ßr񠟒x.BmtY K.$qyW`vG.7̞OH9i²ꊜ(o= '^ɘ .zhhLyp.zO[SXd(_F->)\*\yٴTLҾfYtF{U,WVT UЂ_aWo糕Ƨ4[)002;kH+@EQ*.EZ`@1ZLc2SދEB>ޭ94 Vm4Kw1Uq[;&Q=j-ω(j'[YV{>rHYd?;9:3itLHv4&ـ Rix-qQotA5MD:Z#TSUӮX%D.d9ʁE>Bī,Z/žuQUC 0Tč]eX,s0XnD kS[&=tSaވ[_ ʯ*kPrqj zXT+C>`u10|Blx^*=/qv*,([kOdD_ņpJ$e 1ոĥ"khP,wӫI#Q9Ԫ!GҼ9gF9 \$}C+#7rj2F[E;U ՈXV+qVPtFϊ3Ueɍ̻(ëMk'e(Uf8WeFd8QJےEUTJaȥ-hD_'=viﬗ^pn?F&z *:&"\<jhg)RmMh Zum$d_9. vŠkHZy#YoԶD qX9kY3^iVB_ogSч)%6]>3 qzB"P,J3:MV5Q.쐼Y'NTVRu$][?gRs[(F0 +PJݟ0WC%o&ԣiX#ѣ,l؄˹Vyv|9v;nCXLP)GX>wKNtk8xҁt e o7=7o/|wbf|ӟ4޽ _"cOO7o[]/1/?϶m|_ r~Gҗě7oH>=//ǿzpk\^!q,{=hS 7$0l5ՙ>vcSNG槃jw̜7V/E9Jfv+= mC'^{&'NU{MPJc ^ Xֱm2H!%&kQk!rwϏZT;5I.NM=;ȁaj7UVXrȘ+P 6]=Mr:Ĺ1bī]hţ$Y] ΞVd +AX_T0g'VZ첐 U-ݒR!Fɽy蚂gPY٥(RˊOD ENK{J@Z iZ]W2;h3 ܝpQȬ"~I"wmَvR[ͣZ5N4*u[ZUd =lhd3G${ze'.h{yWyh{trVGq-:Zk#J5UQ]) iΘSUdJvWf(>CwW8r !QTj;sYX bCRD.F%?ßy״ _31?Sg裏/۷o_5??E_Wow?7o+O_yY}_HCGx9@ 7x}ydHQ=J۞`; ^?`ԃ6H[;=[ҐXօr07Gx\H]v1n[?oߺngα*`qG~Y qJ^%2ʜ]s̹$YgO؉[KւHa?%F:&v]Gw1N'bi{gjJNYK -J Lj8.g<0aPL'|~,. ltE1 WCgX8Jk,tL4fj+ͬjFc,20}AؤJ+zI*,j XkXƱ7F k mv,laG 䞁^^|D451'HUL&;q. ; $||>o~;?3?~ =9k-oosuu38n޼Ӟt^z}Ys5倷ȡ K#> 6LGafrR&3zIuK P#rm~86ve,>Xt(ŝ{k-@6;;w4vh<1^r+_˿W_EG?=y_{\nt^)ܼ~wxֳC=ċ^ox|xӛ~׼U<++}y{q{j1hPu}[K9H³vXc2u+R[ &=|06:`7zǏ[\J`r`h%TXIڰ-q$SXk}E#ѽD[id$k 7:ά}x[jhKLh;]]t&CaQE-HlX4@x7l;151g8HsdwX\n( VRA;]s\.$N5-Uh9)O7Rw0ke(,-NP5-dfd?RZ=HR8&sueFUȼ&+90\qӧ:'N-`형˄Pڌ4J=r}1^yC8uV_}qz.ѕi-mme6M=~ ԅT>^ёߥ:&7xOe8*ɑ\p,A)j(g@ӖX(J$,`c {뒦ѥuBz\ɸ"r&X2My:LgƠϡHm*mfmCd6 EURNkAL <hRyD )J2Ӛu IDATH{h[~qK !쪤r;+vb)<țH%hzԮjd,B҇˃iW89]8l ;D767B,]9c\Oeh2ax*Ƣ{Ѕ-V6u9o3: %?c7,eO4{|Ƿ;[Fq8&^mt[WTQ>>7z>~_Z?y9yfw^מ.RW߻LJx P%T;-lwR `2Xc_;.D|]H}1#'ۼoyۻ釕 ݍd\ລ7$1W+05W""ϣhE s$Ms6LrƢL52%jZ'0/zVTv,=pn`$M4I:ZLtMUʉYLeD2EBđ,kS\q\e2[nF*'L5W%OqZVSvqS2fUt}26jE> z.˩/Iwt@IxI$80FwսAU*8K8&Os=uJfwXCsS*ER ̓L!֍ -׊DA'K {_31=s@iūa=.|]:Pٰ$aZd$**q})l#=X 1=K-T)* -s4W4*" knU- 6N&V'%LaGü3EiJb\s3;ڲE4.j?`:|*+;=Ɓ#=eɎE?Хxwij,Bp,-%ekЅ>h6GMdOڊGBD!ƣ==bX5xFF7«L0;⺱]>'44S7a'[Bg\XgJJ#2,lf.; =B!Ìj>EiK۹f[]t#鼦flWT܌jf j {R-iw4&@B)hOu?+lJE E@P%x*`aF#K N`*/I +vQ͖R"'ra8HRrVƝJKIYIVV5Hyj"zR‰wvp='&MEz*Ɍh=RH(r*3HJPLżP!z+ XE#EVz)Q$eNA;1%˅US}@Q_%@^fpH!c>k#@g+M[5AVE3p8BHKX%VZuNDme%g3IAU is kDw3,.@ Jª ӍGu_&`4.;V*7x"NwHぷ/>xw-ty|3|ΟiO{hy⚄ {$.P_IsUoDmsbluI0rÌM'4i0lsp-%K 3[23`58 # *&V)&2Ѱ.Uz 017,^4PBGށ.t6VbLLiEz0X0jJEב2LH˕$ h~YhʓEHˏZޡ"Z;Ze+!ӆE!it=Eŋ+<#*i1Rk9 9*--VEtXAWp&f&"f aJl) Dh y B/6`9`щcBCZ6ď+V8C-{gaInGfw5۞#’yY3"Tq`Hd#[ll6Mg~8҄i.YdGTߊP ֘y\qlk-:H"ƬՄHA2eR3V0\hK*>>;*f`[KMGªI:49)k9O/ѹzn#'V%Ag-c析?J\\TcI)R޶4͙WWTzkrUL[]B.:8*' ;B,H_LuX10#MpyPV4=DjLe-RW i+jF٘$8dG008&iIH%C1BDYLh-7b,MKui/xghf fGJh2T/Z،ƂbmMNs⚸LH/gphw :cRwQ1+!få_E^9D܍Z=莓_C=>>w?<#<) #:Wz\I]VGqՎcƋ{~ƹ8%xe+`|^vn,qGfe/k%.\h Xl${ g 6e*䅍Aѭeg=DunXL.alB%dqFp$J^䘴ip(Y6ehU-&iu=˂ʎ/[HZN'F$Sm,U&ssӠ+e.ο->D6ix\Eu[%Zrɵ VjP>%k0NeVjgNq*-LJlNeX]SI9EN-QU 'ci% n;sz#|"+G@\q0Kq,L[z&[&4k.ZOt*2]\QtpbfBuKϊNjLbT5%,ᚮkrʧ3 >11Tjh OY哦,6lYEZ4c3\ҤcX Anrd&M6.w7C/n[|XT#ݏ{F,uu\p$"<6큺{z;x>~!޳L^$#;w$&xzGKc㈩qFjD13| mya BN`ACX`әk4`/ F0lJQ<#R\0lC֬pHR {LQiP3]5p9՝Bcl떙g"#jAʵv".v}6,Lc%c8`pӃko`#1Xq&]>kg|\GqG>PT֋!4!Z*_뮰ѬM%un0"}=O_y>/╤ԫ/lfCJ+2#9LߥZd!.yҼV*ZZD]iR мi{v0٩P&jqNLL$Y1JV58Oz,1kdhT$W3_BI8ݒu_ Ӫ;{HLjMcYXjGȹ2U<2F5;-F=%UZe1fVB,uMDf$'//DUWCQμ&/g;!asF`NkTLTޥV1kYA3f+3 ,U+.4ũn[~O/)p?=<*Y0CS&5 ⍩_fzڠ,190`̫uIR'#J0{6WgLFH8y@izɪ[ 8>&@J*iYB7ea}ֱ+CQn=DGmBz>܀5qb3cHʐŃM&`=߇ OŦ$F18]}rѥ6iXḣBOoKEy"/\~cCuFSal{F9L_R؟ֳ&a+bbC >kFLS, ,iN )70]Xq]$.]q4U76X29HŖÈ tU="ܓ`5V[dN@1OoyOKUXkrnә-.ng5'dxΈ~%LJl ϵHnF jVTA^I|l#b+y.X*+C(1:֨Y«@]80$˪KvL19GbGH 0н; R'bZZP 笪9IdʻBqPoTFrp\03Ҡ8t،4Agkw"058v{ 8Di 4Y "$PVV4ys s+?T1k'`bA|z9ML;=&[*$Sn`C0E葵˖72c[Rη nzVͅ$j'm$9Ƃ,K̜{q2~]rSۊB4̑ V ƒQm -_&4V2r}o`n?Jq|85-0`~bЦ8;=5SAˁGCW|vy㆙җh8W |A ĭG 6amTlW`) ĭ:K 8P Ք`GƳC$|s,UZ,`D+nEd^K t䐡-1'[PR6Z0C8VQDk-RFz&C ?vvHI## @rJNp" z~KEOǂIA1 A# (QwԩhP69NzRRq~H)dN6(P%Q@ʊZ.4j=ә+ r(7%~;+ $|lM=}bR "?Y{ =;;aYa,g >R l2SHbNqjlEcKK~&\諐44l"!DhPɡ”q9l.U0LN4M+VCN Qí%oIXXvIjGDU!Ѡ&...x3GG33/x{=}xk:0{Yh-g/\a-jN < kEJcA# 7Y|fƞ,<¥ q \GoE[fclŠu7IN;}>$i3rqhœIB1a9+.R u&mROsf^ ,>0V|6f[pD2m.ұ4 ֲ )9]LlJ5Y@ Z=Lz54I\ dr MN5$xwj-Mّ¹j/bKslٕեsL60i]y~dPv8 Ĺl ٧7,#W#SJE+zvQRU] *+ky|͌s?scu_u/e! 5?? ^[ u{x13~~W/!"g??K^D7/CxƑ9Gvc$Ia8nLkho&oEl k4ۡ̔E#Wўk&`ã"-ڠw6OcĚiB^|0n_#}Md-M3m,z@[ז5Rm}Wo6.//qw}M끱cώlʥ7`s(,ܤn:iK@^W l:ϣ+6cD;8m"Ow__ȃ>7?|'|__KDWE,²,/o~3"²,<裼e/3?3/nݺWOO?ZJk 3KK?1O?'7g<~6^:=)'m +.\[SK* lL6w|Mnr[M薑߃:{~p Zþܸ_z[Gl`!˩m ] JלHд3Bkť#Kfp86.ؠDG"ѫΉ$:rɂxsW0s9]S1/]-at%&DG%Q<Q%Urq * 8a+L]q& gƪ_K}fYJ@)zTޖsd^tr%/@ c˓x{i)@&xv݁$hsOx^uJ7$vaqʨBQZĂʈ+Z@HI|oNۃ[6kF=џaֹ7I~wLkRo {%qL(oG1ޜٚyX`k쪪q5}=3W;.`nEvmruf EPY&ϛ}WpcЧAr| 1nqALAz#,MLL좱yWm*d47u@}H,Ci:pKZ%knhKMcf0aVt>9Θ,s6C x>S>_~/7ǿ|;Z㶱vnܸvzxyz=?gȏ;C?ICM,KD|aׯ.*Z-Wō>bp\تtﬦÌ)m&KCuaָX9"phЪIyLe1ЙQ1_!uaƑ`FpFpL;Z?2h쀞E?EM@K2b"IYӻ^,4Q'Ȋ9)4d h(&ќ :Ri~.-kbh%j"E\v$.Ҩj@4uZ Y )B]4DRaHL+` lQ"nJH=Y~%].?}.Xp6,k@K*0 QZF`ϷdL@X mVfR2iTQO_01 ϩV}ahxk*2&|zdLHYұSKktɚZGILa 55wv t2倠KFsCR-E] op`?k&GDaMvi#ObqoZ2Qe N[BnB_ 3lE16 ';Dkwwy7Ogty9hheFba4(Y4:s+dX]lOP󩤟暷-Oz?_QMc%_%ȏ?c?}qcu}?|ٗ}˒tا<)Ud#ׇ.Zk|w7=;|wkNi[۾|ѳ7Ԭ@KچAv0g^\<>3 ;> Go#{Dn`\#{]:>;ܾ:0i~ʑ.RF0$?d)ihhZ511'kB&]&JutA".^"-$drɛJ:{{1"A/X-=j_$fUG;Mg;yXh5ZR'hdx1F!63]QaAUTj0viHE{#h[{@"9ɕAEA+td,c&N~\(e$3]W:ՀŝԚ-he"\Ϟ4C-yjjs1cfzY8Wep֊VP;tR ph58ҵpNz嘠yE%LPX.)Q 6w6z*HZwK\vRݤ+V?CWo։u-|^Foaq\^//|?{o/i?0=??qR_ɯ?C/UſOOq_|J裏_zOo߾"f&??//?|_|JSjqMmO o`>=Y,`x%I>0g[#M<3?dZl>3wӇ}ey`X(x읙IwHA٤@4D~fOaX9ם#a=ilS4]V{Gf4ѳY:6c)Cɥ1z4;7KWtLh$NrL)ʞ6i,)OO"+|'ޗbʀjTIDŸk%)+mU5Qcbjh:o|4dgAj QQ~A_RPZpMpo!$drzkJy:$Js:cc ޼yzw_ ?C?įs;c ~._d]Va_?})/@SxO5 w}'rj2Jr5#=A҈q#^TONSdёb |Dnm`~0{OYQobnQo>,N=i[ 'AՌa/X,"M?V=LW2]sWz(%iYvh7EU.^f2IH^b^塻 !a)LLjPڨ5>՞MiJ SUJ<5gtWșSAs'^ 6k0:o`\*b7qY\Pjr,x?[}DQ]@_mEXЀ2~*7=*)0U)ruX|ShPkNg?=øn1Ú isu~y=_˜,cU}BT2I h- gRTlZweB*Z`h2lpۥ]h6ZD6<dbjӮ6XvF6WeC:VTK2Ȇ'f*mY\,n`v2R7'~hc/1&,%%=Y;%sSj,?X?~QwmCh bW_ҰXpuO? J'aR Dd(ZUrTdJwYTUjn3IYz'U1ɄZ?&T +N,*֭zOrۮg nоbc,l~ҧRJ̙JZͥMjUïqmM1Oߍ1 Z sƆidcb&P 堹aqrw紤EcyƀXK=HkVrojgo4GE[/,.ӕnsS%Iln m5Lcw>oЯ˂c^m|JeUN -tgxk_MD=PRiGjgj#!߆AsAÆ9"x^J7Ȝ]hìq'I繡 ZX^9s^ōSa\P[0*cCK6ݔR;{ke,V"FQO VT[ obl;inq!`h5ozrjӵ^[5Llv,kSx{)t8R32.&H-" U''6gXذy@V%YY뵀2&B6ppqIխ$lq?|4XqCf( S*VGDmZyVd m2y 1Q(eʍ<b\` V̇DUj?5יEV.k|T:pŤ3UU ZjZMJH̥W(.kUH/fY5qe#bR #^W)aA4= .aM1K:(b5 ,;%;Nb޸qTi mi1KGM. \GYpqїi q|h`TiXplaҍ{#_[{ԗaq3{jZk/+ןҿ>jO1TJPI^/nUTxB3sOB;׬kcuwz^&{-6`'ٱC7tCavrOz2{P~2X\=CCspkV&'vE\ʲ]"':,PyqW5ʤ87)!aJR 49M¸𦡱:.2POU1}#*K*ig[~u+6J~E^R6㬵gƊWRȡJ OzwtkuflN‚pN)~/ȏ?o?_Wczy\fwx7&-?dIdH t烞ϯ5dam&2ZG)y'C`GQ2z|~]ne9;-6ݻ8-kt3V*+J:x5:Yv$&bhTV<ц^ -. "9jiCC>X/Eֱ%e[+vNկ,I/qfi@xdhhƱ&cV1ODJD4|e҃gZ=U`3,XGlz-/ F oBNN++ћ^`rdtj$ JY:̢Z\ZS9Vr{CIe/dKJi=j}wE3^C*sbYuCmyU2 9xtg_0TykPU 87 IDATΰ'v.˧>F4ZLz6rFO=HDڰmBvz;vt:Cu!G/ukh{6x8zkhL0䞌xl2y-&Vk nnFkfR*f6d4 NsUٜ毱-hнj􄕌0[wjZ~;??o?ǎ>Rc7C8VX*d`1a;;}Ӱ+ynd`G߸qyjwp+ܛ)^x9tZ&پvcӓWn6 2L*kؔg:|&v# vs.y&s9-mUGh/`jVLITtkԍmEn/{$آ^{iӤMHf]āyY N֐fI>֌hz+{6MAMz\#SmZѝ'6w;9 ;G\YA,_BO3{O0u%}"aw0F9k_\y㛫AgEI 8=x_x=+ـce%<ȼ0O<$+1.9qA09^:[.i3gHy"_ѻ?<:_0wk׷*ϼ~2^.l,qNc׊_՘dOzOddcv}6lA&Muly'؜q./!J[`NveRv%*I8 yPyӰr'R,[rX4&S&pSZSQ?-{INO/۵a./˃L|s ?hqd%} #Nx&e#rsK+7͔y(kvi:ZzdS]:&# $,K0 މ nVb[w&:H V:@dCm6+*liyZJF0U]#+F$+:o5?1QWRW ~‹SԪ,WEve^ZB[J\ Eփ;_8*\*,"ajJ+@PR~B0$V,^nm3bVbPFF(ó*s w')*)iZ+:O~`8ׂn* +!V<*wpAdƙ$fɘO؍E[.=XYϠ|rm>0t${=S\|{pF4jMgDmÑAEZ֡vmwF׍u傪&>p?^pl7wFP]^|j8Fuc6!8~TmB-VbEM=X4 )^I,z>8'+lT9au5x\d[s 0HcRqN5{@a'|m!?0n`]gh29''_o;}}Cfz2T/ |k$ɹet!(~#PB؍ dɴ< ؉GN^}kd~]錍[|dvgm%U̬zÏ^Z2 vE( )*Ԝ OaeTEaJ&vE:;QԳM0.˄,B3/'Q7LXfǪR/[) 8;Sz@߲Ԝ17L^qڋ"$] !KePuG%k@=(w~Xz8^/7{e]dV|`z'`<5VnT*I˙-cܬ6Tڨz;iR̭IJZ2W*3;*f,  6-/Zs@`Жe@RjͲkTWCű+t$3Owl/R>i=chblHE]9\&d4Ux``yZE|N'{Tw^<:0B*$Az@9qkyϫNʩvzcoqjJdo)Nm-R?l_?/_ߖq#G)7t} iƊS m^YF˫wm`͓!dGKN#aDt 29Qň&C#9-MQk)qZl%I;TWC(ẀX8 ]d2/EQ4۬$f&3f5V9L0<<|S׎j'NZ)i05vS|>}A/\בb(dUMܕ R,=cHt܉RpV.n K!ag)уݵjxV=]jMi3j=C+D)(SȢJ%^4n諞CIJKS2k\ZD  KHAd:J"!Ulحi;@Uo`䞂1m7uGU@x6 8faΰ{U*N]Yђ gs k2tG|51L^-oIl"E0Z5+gF":/ N˓TJB1>S3 a43<^ ;U/a;9i6XjL)OZD.nt-խ:,+|[\i.=])mni]!˟ztZ>*Ԝ K/Yu0cT5ːz2 3u_,UL]iױJᒛY, r/;f"|Bqm~!SIClӅ9ةU0Vn [am2aZ]srw#BXw,bqXj`&!4l{aU C?Rpec͠ lJt}YO -_~"MH뻾/|;y =YӾo V FXGW[8î ?n.ݾLh(e%j7;١^sqyőOXk;W㭕r!,[W>%dpMM^$66Ut?_}*nx#k\u *HGC )!j! kɮZX783 '{u6l ko8% `Y5Q V#Vdc̺:M-aReFRۣsډȔGn ![UzZ}AJj6 MIa^4_v!W@0WѵδA𤠤4P4w؛-r8]$M=k2XwuhejƴsʳےǚDĖ|Ys@pYmufJUL [%Gd|U~}p^IAyty'nI$ UZqL6͊i,JW~LűY:lJd:-Otfr~|sx@Sd6i0t84D٫e[ʃۡ2Dolgj D؍F,ޞ0<'VP<ؓf0tMD[k72zbĖ'5g5b4d$٬\.y_Z)"Wü=gy(/#3jdXʠ-un@Mcؽ<22iEy GڤWJQNZitQfQÒ*6.@V&Ri5$ dSYgmJj|:A{' SDԪ9EN'atUYXLmQ QIWbX1(m[?+=SO Q0Z]hu[biͻVOyzkbF{T(Mh4EުX)`.7K[Oʝ!ZvUml|"nw n|5 ^4?rvXG4!G'>{+>{Pl4 o~qt'x>3}sq/$vNu  {U Iw xkCŗۍ<y?ݹ9uI3 =Xp|ifS%R+\v4F nSnf$ix/ɜՖgqYȽ*tNzךB=u] 뉴:+tbiפ1z_D5nw1s=A0M4_VPΩC04i_8馆sLI{|nl\9sZ`cmCC|ݍs5|9G{q،(}^>{Ʊǻ_|`ΊV׃ho<n 7i1?j no`b;+ݸi"t%)+bz-0'hY1dT$wc~Iam3ͷ}wbGmE_UImhܘ]i$ub +wA3UŨ* 6ܥ3^iZ)LgC IDAT5KK% I &z:X; E1EA:j02zőj8lezCQQaո,"㨄`0S ʤj/e-gk'1C)Y1/վoDB/KYEa**t2%k>/$BIdSIJJդm]ãW(Ԫ7K u77+e*t {ӧ{Up^T`~Æ츓\;R rS ](Чbg&7'>#l7fnpcD&i cwqnش1$jv79Â\R VwwOomvioXJbX#pZ{ҍ7 o[?tWW0lЌZt;v%;ZjMV‚eOWOo|ny}l98YPjlsjUBG'3<ɸlE}SРQM!?Q5YɅL8LewTOf)?9*]-Skj؄$)yNů WcuglvJ"Pݔz/RScaC$c*6ZReQPBU#xHi{xgc yɯY؄.n)IQ*QfUL%r)y&ʐb w+}t1H,+)VqdUL %#tYJ! AJd%VovY\S?jΊ[i!-M 5,F2-l&SVwTq$XsjAXyϤm +.V9XUje4.K \~z*=7Z'HVZՅ$iN?;͎I=nB[t{W1 ,:Ɍ9PƭKʲ)nd3V ]޽sZ~u(־ df޿9g3?P0,qYdS);3,d\X;)u݈]'8A$axkK5' W̌!l2Lb\]UC X !Zvo5,@#d(5Q'*ʭc;v"K+dR*㑢ʦr+# 0Løф2]EUq^nSƽ,O}blfL}0V4l5v<$]zcƹ<_^:,jX)/w}_ ,]QxjM7&Kƒ]Z< `s߰pR`sϯivYkwsnN'؎tdB2"'BL 3xI_ EHFd aP#⎱vU}랳2Xk&XVvus{w=yp^}|9Rqd<Ylvbz<9TѴRM4'<fM~+?^<==KK _Wg?_k.ǿx 7"KTY;jdgyL2ʵ "FS+20Df5G CMN|8WpɃjUy+0j&XNEmYHryЭVr}$&#(CWBn* mdrbѵ 0[YIV<ٵq<̈́vwNd|.hDp\JrwхmqkWɌ(ƨ!Zn; ~wP[n;MF i=V=t t 1E]Ѓ.,"=57P1oDXqYujkTV;niVaYޚ }ܟs,??]LCU? Xu`nv+%AZ+:y$v*))^[L˔*BrR4.zf3*`'\qQ^G`/]DvVMv]}IBu.nq\ޛ4Ï˨:)\9F Q%-kɔl,m1'b.?'J\0Q=qݾmMͷm76D99|s?oos?s翻P|g#v`^re0ck8k߉ 'nUO̬kĖB .3{ky coŐAATbo^ڴTuAjLq,j9P E9 VPDN< l N."Msa!^ְ5hI%ZE]ܨo<ٹ"bOEWH96 &׆`}*f/_Ti$kx-RUK'D`Z*: sf[2oݱEi*-uݩfpEC;5I (e'yfvT[K_7FS{oE)KF`"Jjȉ%% &j *|W+@R!Uy£E*%X@Vj{jVU D [p]^{zhIGfCFaTʋ$u0e Γ_2Ȝđe2r݉8(H]~RsDV4[DDm}yl6XAT}C^-6Aa%{yHjPa"SJ>»F{NNHAƖ s/b*˝.php vġ;`=v\5o׏2c|%Sg~g?r/2_ʚ~?>3&`͡8yrҍ! y` ;ǸɈ ۞I{DKYv"&6vQWC~zl#DX 5xFE[=SQw^IYDrY1"ԊvH fs.BFD5}%lom}H5bHd'@Ry5 7RXypڬmX+.i,!VXZL6*2e(6 K XQ7넒ν)_C%&C7"v%X8axL,"ۍHڍ͵1:Dk0}4X{8.ez[Zmd*Z6C5ޤr^yU}W c@V̗V),td 3-cAaemkHbw)GQRˣ)#?+ 0>+(P,GŻ#8 (W쑜ᘃtgΤ^',w,QXG$Kv{4/=7t b8G}y& [ nXU+J$W]Mk2mhJ-S32&^C)ʕI7:#lITW"K*{u?r[ȺFagXry^/]b'$6@+vkedAjQ=^׷IXZ?/7j?{8ʋ@;RE Vћ"wI&(VL=>(%P'NˣSEܷ t-An q+xhK&a߲})H{;}mHr\M{+x]пftBmĸ$)H3I2GɼR) AֹOKtM~bjBN_J6j/Tae콒?UGuViOJEɒtZHoHn!7{q2+ܡ_pxJhLWBmtFu<#r|" p4vTlsO&Va$ƕ~6|8J@#y̗kgfKNXz`˵#̘o hLU,s.@I_&o_#?q5~Ndhufo\v}$C"EπXQH ׵;='v`D>>PwxK_UW>‹/֪3|m5sґеy4VI,^$B]&;gtB^҄Mmj.r~@➟8#\by d HixDj:ה6p y(*Ui1:"*Qv@]KgHo~cRq:S;PBx5{& xf YhB ̬b|M-3f%),`ڌ XmZ| D[BaX%;["҃6#͎p77ohpjsXeMH5!5N2Jjrz;d{bqc '*Mm$o^L 2jp~^V{P\#f3Q>a( 3aH7au=BI ֮yTak~_iVf*BmdDJ7QD&[TAVUZ>_G^$yR8:{ùgL-гDEٸQ0ɬ>Z0OMoUw* y9eGu5jlDP2:L2lŅiM>` Y<E5+BNhI]vSdZd^Y˯-C֠`ko?$$LuRttSݹԺ/ M:7c>L9ZwiD;v`OJ9 .wFK%ѭq+!~4QYV=ME?U/be,%*o<,/GƁj!1%s6ٹdwY&߬TY Z(3uՅO}Jy4x X&ϭ$pf~`+eO#?#>ᅴ,w)[ Ҭ2 m*Hݺ]ﴎH70k]訴W\ ԻWNbQ"ƝtVDQn%WDg/N6~}% o(\4=xi# +paɣnFJզ]PDwh{vka&1}3CvFUD$Jrw Ys>ke5Q=TAq,GjO{Mh{?$W(i %#hXfUI4h`_V5_уh7V"yy&drteaS1 .LmnѽY_v@{OhSV~__!}>|~zz 0=5AVW֑1y(Z8nUGqR ׾uY}xVɔxixT:` rR/yNB3#Tx^ήGE2͌-궻]P]bH> BULVxZ5ՊՖAs1bJ̤HȽnT+II`EUv[NBcMa IDAT^LMZ^,uF(CY2 06ޛA{o!Q S[XlI<C08[B歌gezAYNm\O3! dh]|ȍtOߢҼi9u@K,ylK$=MI{n*FE=,(m4HwC{˓+Bu[Emص ّ6F 5` 5__~FUb{(ɵ|!],`L?)9<Y ZNZFJm*7f%1Bcϙ#}ivc֋G-?P6,+~d f afkcʅb0ٺ%Y fu#+gOVg=0SBʂ&'R6d gຎ4e2̲Xm!3q3y8iO㓺>7?\.]sz+=}|;7 <SpQ+ dj¾;D.^7aF@b6܋":hit]mn/<|$,B #Y7%%j#h19&{X`Wđ9a:4dIAESP9/lэۚl螠0v8I0zUAI!&T'y4<- ?F2|A)Y>5!ufMKpB8I4vg\9R{*kGZӔK퓑3p ^m+$cVZ!5DT9@:\ڴ]w.[cs~6GF:nkf&.6^m@DLJJWe -^J-tLVI(B- zH{̚, 3Ϩ-!,o ]WAF.1'$Om*U)A"Yd;Lrb2Cn\YR=W 2߁šRhm:Ȩߛ]Q`z%WU h,pկlVĸ$8:wwyrmϛ&BYy!6FTb\pF NtOSqOo,w6ԤY({~k %՜=%qz!_HH>a X9Xr4$q A|'Q7&@6JS:O%dUxS(C("ѥy`e&̬&cq4G@Mi!V߳hE9ɢ"Ż2_wd:j'>Dب 7ڱ#& QLSQ '|HXMٍ:8+X{u䵣pVO)>dEaf 6k WaDvܣ)Ev72G㣥j~@8Hg$J^Mo*ߟ7MapQH)D2LV\^~BH)%yk@CkumdT1AL #9ǩRgaɩzqdG!!;A6%M3CȽ@YE0tq2mrx}v!y戍~81'>a˝}beg|+}~GjLl6CQ LnoM_ V9_+*޹͏p% ^Wku2Fn䬯Qx|ôanr46=8usV-"jTM ` usT_gzo"q9ͣZ`B_Zk ,X:DT+4PaU--40U uUa[UQH}?U'pT1V>'P듻oKRzZy_gh@CF*{O:FFvN;TGKk @̄ܬ7Nss" ΍2K:P 2&&(y^]]U+:FWbKm|/LU+琎ji\S ~/rjTjUI*e ]z31z~"1wݞۨFܙ) ۉ$Σ=4 eohȅH\ |-lxbXK]•U̪z/B &G-"[ } TU;R.Чd7ezɆ{ rg%uӂwo'?}}Kio~ׯx||dO԰FU$U(uD 6D! +ŇU<1'e] 9RAJZOۇ/wr{ #CpyBT*"J$5xV(}.;GS': f?NNmt\(pxb(j;hL[+COS`ib*JRTÔ߹UR<:|,3.VjbpA;eT҂b>{ӽ<+lA>oM{"Zb$'3)J3x- e7joQ'LK-q%* Cd#Ż, QT>hR^z{^!*l/4`' G*ErT&fdTȬjYnS#;#4 TǎYů$^H*:#(mR^!ރczm#xW;80jH8H"QX'W/J$SFn<3A[Qߔ$uY ùXA.b\U::0!ك8`P㣣٢AH`˪},qᕖ&`5qa|8k=ve7َ`VDh MY5>aTV;l9v,m##jѦFTc/߲3ܖs?cO3&ɺu-giDZ Dר9cUR >v܀aB1dLRsaA3Q:7M 3O`Qۧ3şk:߼/'XU {!!;Cƈm‘;&0Tda\ȃ-vlRNjU> !;IoHgY},ғ { fµ-`e7^H)Iƀ.٫&UFүGd2<5xDF[C1-ڡ%)a+j Fvihh -iOWzmZ>*iղ[K du+wɝB ._zJ{;x%)|n5hK} AHp*;xhni]^v\3$ilg,X;CեU4zD8*a2GYCw1jǝ2*d 5lv^13|Oݯzg>h[_l.c}4ᒋRc\!VoުcM,>Mt>0tqdUz`u.RUz&M.pz]'ǹcCfΑp"/ I˾[pf2`' ۄߘ?柘~ k|5W'Ortn޴Xԃ N^+fd=2߁d/kGх}^<|/_~ *QGc(̴f'@[lDMфM]953sKo\<`ז*RXxm.FyjƔ  6~k5)7DeU;w}c"ո\D#)Y1sJQ͓ (ML1 j$ׯU̗UA. GAXtVa5gϑSinCt[)vڨђ S[bee.&߫ڧ{߉1ۄvfBuDHE :X5>j_ymeD% vP!x?k&?V"Ϩ1E Hfgէx^ l}e^HV1_UP#cv{Wf_k&xb~cɏ@Ȼz=g>~Vo6k_wLYYME6Vua5ӕWy^E@jGKk@Ƃ8ֵ%Sa89cu2+I0mO>:$cgCK NXߒvB^B:Rv`*+B䐅ɹ k'] ͞WΥnQfۙY)Gn'IKV3hQBWgZx%kͥa3SѴ{&S koR@&ô,?Gl o/oDTHD %r+gT/M"Uw'ndMI5YT 'Q#! lI6Y (ct(Ei=ҟv]'!rc5f\k$[ewh@w9 ٛ{(݆ <)e{VdȽVYZ*5-Lê G!L c1l?xc伾/X7?3# f*-ˢTrh^%Vo&Nz w׼vX7vT?@z\NnooPWω+(!uGP\ YI2xQ"/}?ɱC`GWos+~^?|umr"y!g1XBî' s!SiJ,bchHٙq/i\qHu4^"{0Lpf u#G`׷ە+?%]na'tI9/5|yd^12\)?ˉAgJD:,{\8C£#3\9SR; <"ԝH3X#4?()&o|@")/V%C 5ƻn<m(jIŲͮ#]f! WQ=%wK9 ]Ap7qY39814 * uE>ܢ]tڈnAY_MxkʔBT)(o{2d)e[cY|UyN ej9nba2DbYH#||wʏo]fo?¯g_dܥ|BX޵'Z-asU{k-ʠzRC2ٿב`)W69qd1ԙYq\ PZ;y[ 3[ư#CNYw+u@[|&Oipp}>sp$CX3Q6WC^WC\/yzBC̝7zld/d+(BjʲE]X'>˷~/@bfX1XqE@F"d uæGԇAvgc)bx,\>L6dRteV1]VE WA{C%(ayjG=> <#*Cd}_*G%W]b&%D,3if'W8s Dmr܏чdur3Fg#;ƢJofN`e^{"Sॉ* åӛWIj͗r<@~ު֕uVގ Uc{SQRܶ-3!Q|[=tzK[~M|=w]%v,M$OyG*)(bsen{hZr/;yϵW1O}mI5 tLBFyN-{A؎ROj]kƲcMY(xO"Oa+ł[\"wBv$YhBu1"7B0NE)1p2Z#."(̈ɵN[IZq zhbađI&hD(r}WE?TȻoqheО,r1qcG%ɛQe?#)?(e\an%?F Y1T_'$82ӃeiK?̀|Zt#ذ4I;k|a -OTGї=ĝgoD^nƚ4|Wat="6V\; C#DFf < dfv7,%Vu:+[+aFvV*wS% -Y#2qF;'@k]8B.Ή],޳ciV}f+\%9-+ '\E:тB=WEb3>ΙE]K X蠄OjC8[Wvt|f'$QӔQkvX7\1%CȖ^!!~ZOkb4͐"2QЕ< [Bܝ |Iܻ*3,:&b>5,)b$Aأғf e+eeBYZO5d \*꜖y32DZ= '1ӈ2#$Oϖ&pS2դRr#'dFg7e=hxhxQnR:V;K4f; 9%B/F2}۔niy!1tn++.U=ͧꖏ )BKJ3i=V ^njY %Y*dkgCëTlx&D@9D^gNȂ{Cib|Cͨ ) R# %щx sނN:3 hDL5uT!8ˑCE<="!U&ɋXaB#ʌdbɒr|!`3$Ë^6~&Abc,:U6&2 G? X**`f倯=6L͈S6rvQ[<ޏWvBY %' 8:ɳڡL1XQњk.^(~ʴ&Q{1uYRH?e `L6ckãѪMhڌ]V_hDt14Bn8RJsL R cF| 3` lR][ۯQ ʦ1-XKG-6 NB?wJ3Ħ p5ŮK;$_*ꁸc.`;9b"Zwt=>q(2mr4dΞmX1Vڑ0.F} z3J4@Ws G%X+Eff55 WdY葛kZYClX)&'1UdΊ%ݝC2]dU4d5gAM9B讚qwL DzvKxI6B4J-]\Q,,1"FzȡѶ'0I:yaʅ,Ґ qDm8x#lv\>dH8y-}x9K;+FK5EKlЖI7MHËؗiTBRaVPʈȁ2eq fcI2UY!Qe"  6 EqBZbӻѽ>MfH5}*;sφlEDٽ~֮-Ʈ6{vgϊیa(b}Ő*j؀L(tq<9]36E%YK1E&ok1MV5cƂ8 j`ndhe-3.V E{z\$)U:'UHg 9ؽOi8#kwi2g pdi vK~T-)˲Qj2#25a*BpvpL e^X9Q`?@ )o& 7\*DPr)+VzI.$pan&\jSK`j<0i /\'ܹ&jN`ZI(/A \(4XP\E)]B #9&#46eNX,*Y -湢;g)WSLkhM~hmP% ZYecLy4 R3%^CQݢj> jJF}q>S^/]r1tYt9WRȾ ~v1ZKL| f4UՈEd/@S!14B;:cgx8<+,6 NZ z=s2psKY"qqY]De{Y[_Ɇ;Tn8N.YfԸ0icJ&rD ҅Zr]Y5 a͸9RNMx^&MV´tYq84˒%kTI ՙZe2\PG=ݬL[rr5GQXY {y=gy'<҈Z!hLRbuzs)b>G'-Δ }OJcBdꚌ#V@#A9B)ܙ/it]調?>FF fKY7ZqݍfE@ѳE&E$.жaFuCSz%dM%jE]pzJLٕ9M !JKՒ|ʇhPT,LxJS܏24(aٿ[,)A.6LN(=ͫ'*껤R(ɘX?;T C#ECq͘|s!|NRި@BLp\MDҰ0q%WAXo{@.Mʻ~([LS})1gBbhG@&rPPã4D#2Kh& z'-SN&y5Tߣֲ7 +cHN )::KAY!Jvl,`ȋLwMkuKW|YS:'۟q!3U{4kBF1c#kQ).$ʁ IP)!˄`0Y@bLGיz@ˡv ݋{]w[&bʬ2ierWb`:e 1?9G^Ç7%ow\:qYiv[[Nέg<A'hhl'j-{f_ j 5=*!ZڜFc92Oɧk׮OpƍϨE!4\U ^ǿYCt)3ڨ=LMlV'+p]v0phpa{Br>ԐTwVf6Vg8;e:9kw/xy9CB~)`،S]'>[<});ʡ{f{An;&kWCfl6%U u'2#V:qry}a`QKFڳ1tE;k)Nh1tDk7D><,V(sT AKah5JXH2Rr\D01DHd Li!IXg 9ԉ!ޒ$ ,T멼xK%-h(S=\J6rHM?$sLa1m+LZLzZ-{)5Ƕ1$gT<4>:G@hA%J/cǮ(4yeoF )6hL>z>XpX%Vu3,e#9!~{ϝ˸h|nM5&&"imTPBGbҸQᆵE*o^pY0)%ʧY|(^|cvL=hIMuunwdA2uGiѸ삟y7G8=_v =?#>r0/tUz8[ꖞɕgn)1 E;>j 1PیxZL$DK“y[o?|wSkeYiN)RqqlC?/-oT{?ϱH>3=װԠ@^ZL4q6D۠{'+e@%bi2J o@ڙ&c;qrb-y9SHe(: {Qz!AX{]Heaj4qʎKJI0 "&J gB,uS)+%'JTuyb3ӎE"-}NBF%˿AY84yu֖Z ~gIb/]n9߁)hOBb؁C/lh0} Y|FX2;̃=q$q 7cBxR>+\sxŀOrȄy(!kr/k"qbLCJd$c9{ Plp[TXMc"[H=n+7׉N^4v[ixBɪ 4r fH55Kpس+˲cwlˣr<,۝KymxRź`:S7jkɚ7!qڔ>eGc#k~<M3Kr}XFUaO?Ot*7-V^]JϨxxrr ~ #pd9Ȧgo96[Ix0 :*l4.KHG.4Z3S5 4=c:``\qQ>ߎe{SR*w)HDT|@ܲȷD^B&UtYP-3;^nƅ{@$WxLeTеqn=6ʳ(Qn q!{aʣ,:L_EG#V  L'HJhUekz^Q?+j Fd{I2IHi(V5z MōST`ADs ,8c56V9@ #Hld,P5, Mn[a%h/\y6T:Ld<^]eabJpDv- I017k`!oOVg‰*¾7q3|xSo2Q"tӌ;H ry1ߋppOiItahsM\1~MC ^y[v*pbH r~};S'Os#O!6|etmưkYn2٫ =4ٰ&=ҭu9]@X:)Dςj  IDAT6`3N! Z2]Sљ.;Qgg~~?7?+^Up~~OOs].ϏN>_ ozWr![uyI^x_3o~U$PKC񪙄1q *J%p& 넮sR[]QuK* Y(ҍqRQKxp% |5j ~G7um묧8#\XQ 6ɕ,v)A[*QI{.oXǚoE}MNhe0a/Lu NGVw# zқ L rɩ:>uA6j<\q=2XuBXg(/I8ɻw^C7JL|&=>z&45߱8w9j!7++eXciža/{Wxd'H86)=yX](5 AaP]4XuJŽɆ3S7ߜsXV_m?z7'yu4?-cxM]$q>3gr׉~r~ju%^OrYal*=}`l c|-?ʹ8ìeSuBXۿ3\~g}'x9oy[~g!w^x?av=x;گ}wW}gw_eȄ=<-|_KXשּׂqڵiǿ3h uȲgʀvi4$hVj^FWPh"L@llDž(Tl =VD$E*mߙ#Azh4f9e6$#T^%9%E\죥98Q w5eO:x4|ta]WмPXa.8ErPTGXTIMV*N[Ce)Iƀԣ[g4Gޕ9bh9ݳ x>GyAM2v^!B[Q'lF|K3p2sZMOI( g(|Sb&tr 3me9XKoe]p,۸P@( 7DS r#K$_81ΓȎ#h4Q;yuX]e6*7jDxH`*=*zI> ̙(Sx1fqe%h~(le`"UӼk ॏ'S;/+?}U&>)1<2J}*Aq'CZk<<8ݜ"&ĴV8ӎ:3 .P E6ff?Z?%bFmcq/T>>k5~Mùq??p᫿!+gWp;+(e˾ |..:~~oݿkMW*?JcqN> R/_P y a5I^*Z^kz]Yb(oPƨ$wNiE^J. n|.^WQF:Cbϕ[Пs]p4DƝ"<34k,[JV8f$LLr͟ 0?Ǿ W2^eV콑z(Thz`?gxYl !PN :I Hq9SD-ZC)YO+.T9oר4$%_rp,v?fk_Z~o }sE."/e)"__UEU13^_yWZS|x饉j|~)7{ң+_5_/W^"~>UeN- e/XڴGK&(PmU9jYWD 8Sd]^ 2TiXQGɽȆ2OduƩORa?0%8xxfhvE~j4`fL4נʁɷXkLXHW 7J4LwgJA54Po?%>E.FUMu+f}ޙSL 6Kk򅒁1H{ S҉'3_Qgx ެibiz}"cՀd%tn^Bs_~=1U_k~@O}&,.VZWa{wht5P6aa1]hu[xss,ŸO=A1:{ sOA{a>[LvK$^2ψXygPN C((Ά`V A4aZqNG_Oӄ¹t. ɖB60JPN\yO#/{=}kq)CIl7۰=`۱HN D $=qk:$-[%q TzP=gh=w_ cEt<]6W%>tn@,2tEk(5 9-i_F*zhͥ$\+=; LIC19 zfwF :γtZUySa ; C%/ xj&a}w9NYV5UWS',FLgmKj eұ 5UhArw=Fc2Ys;yQ\a}W"F1KP^D;:>+/X͵M( IߐT \8O}jqťE9b*ɣ1ygmF[l]ۀL2ɹp8:&}q/>?H(_B1W\`9ƥj mЀӓ-x섈XGdvÍkCIJ*A,vN؁+(s=íg?{W~677}o'~3Ė>>nN"55*=L z}amF_u鰻폾o? NEsD<<x{(Т!L!"aHꅀ+[kRP"+٢QHt]X- KgݩTLeÊc9hE^>8Xz6}kL-Mc$\1R8-n2_}0πHLd$V֒ )knLIK_(e[tBam 3~L?@xo|Ow{k7S?y =0/իP "=I[bԵ4L!tONqHŹ jGZY.ҨI9-)SoXtT:V'6g|'j8lt`% wTt TĚuݲƄE2_J2j鹰1Hp1WD+eѬ /**Τ9X#q`"lA& :=hT)cUCɍ*J3RPdu*JxʜC. u̴q>B1aTĢv:[U諁] ,:-S*P(t}"6yܲ G_d'k&=շ1@  t6>XsR{7i \_?g˵rH_pq~^8Թye\P|= Y/^ݰ7S߀/@\>=)7.^ӼleL8ŲŎ/{×.C8O_=g`Eo#=;>SGd]5߳{{.}陑4YlA*8!`reNI"pR @ cpD,\D"q$gzzzN{{'-TF +[5%jZGswFIs]}q:r̤14P J uN 1"ĒHCu_͙xj9~,N𲗾rz+"ߏ#x.K/ugG{,W*Քgwp bdF4Pz4:@OUDG ~BXG"K "3вJD%TZ8wy쉧Xמн3ӋaRX6% Z瘍2Rh@TgaM20m2MD@; w}o&/r}ic1W7opk6SrjƚHB(Tj]s4ju 5@UEcdHmj`LC:JĚ fD#jV.->G:kY/W j0^MBK0PKEߜ蓣U4MͤbÄ&hlK qԸOWY ۵PSB g(.TкǨ󠵄L41L?,&MHM QlZD#U(VgT3:?L{0ȢN\82S0(g`!~u6G-q0pEX^h.Eb3fk,}5JM`ڪl(A]F M(T?+T TP>f?BN_$F7ʋrlzB!;%-9uOj&kq #`,GH\G.al-"vB$3*S:xV'֪gv)sk^ vOhp9.].>ճ2KJ|_֌#sF1o| _e_AuzY%z|cR+\?0Pӓ|:fmO"$}OVB$5f"/ӬȄJ0f V*"7HAI+sO2k3nuSj*)49ҖD Ǒ>c~9v!D^E9@sU#hӺ}RKoh32@WTIXHbLLa5U;lRнJ2jb{ggʐݽ^q׵W8u4M~ڇy?K)25F[Bn&4AcA#ZP,mUx)dgԢ%DZ9VO3Nny|kSOsnqpȡAAr&1 Z=c2L 3+ip*(X+BlIe SfCuj:oF4"fԣ hg5q(թH6w@(VS$*d f'hD2D g n 4 )n+,w>=Ǥ/9GxYxŐ ˏ@=)sW6+DB++ Įaxoaad?lcVBizVDZ6TiWK>_"r[x{(:VmA JEUIqQT&M-0M9![%vG\浟 3} -W]ѧc[H'꜈byX3&J64E=/4TԤHB R)AѡzBgB`r6|Kr.c 5/XlQHG,Ї% N፲_#"TUL2""Jh3Ubrgd(&iEVHLFJ2R=|UAjIu2K9ILgrN#Q3eHm&&TL.oTd9;99vᑟy/ݿeH-v9d/@ z 8Gpׯ#e؜vIaA#54rv`ޖ{vѓ[\ey2 3}gt O:Uf H'32Q ): N %0i?:y mE~_S*!`*S97:!fT q3 2M+G4O [Gm_h+'_w~K}hާ2p>+|rf "wX\=պ1sprٌ4H2 IDATXKʰb1?I3?d>k?c8}G<ʌ8s_q/{'u$$7?y'Pw)efS9ljr*h6[vZu]XGi magQ*1m|Pޔf׊ǹvmȔ[̥*M,s e0.;Ͼ+ $YS#nQ}=SZ=͏2\>Wf4:G7'!`XX,i҆:Tmɐ|M!m"Kbt [K9(ĘFj#@4.?iܽ^!k"ScnH=b5O I6dӂԀf_Kh&ň2RD!.PsS :N k1AtZ;% A.y֪GҜ,D3ԊHh2!RŊ҄JPˌQT5C*%$TLF -CiAM)ԪŜu34AlLJ I>0U?xt5` !8L/1Q,x-ȹM˭'JY{M'a܇8j kkNCfkhHX@@;EFhOmqk;m}OY!WE5Xleޓ# =WA%&lVʹ{n*CⷿS6m^/ʷ@!{MPԓBęζghvFmy۔yZ[,=p>#[#u-vv #"R{KG~}ֹΝ쐬&jdjS1DZT"զĜI@"TQ'.GZp/ `:~5HL-hncK ae̎COm IMs撞51z J jPcR(Z+,$ 5 fh9#N 4̵o&O"+KhB;Qnij/QA+gpXŰ`ɫ:Y)ҊPd$N(4V)_x'Xۆ5S8o?Ek6#Ijx6k8>CNB{usd3=7g'q|\l8ڝ!5e,:5A30VL˧DHw5oMڇ@޶ 2) TJ^;V̴^r;&q{ ~֣gpK8R̰~0dlr[@BE'R HYd8^ mkge $S6d̠^"cM2Ux蝥 {:t$U:Q)Uk#AْyZ*O {9VM~eU05U(QfP,)@rWHPٰhnsmj=?6uL!%>ݩΧZBHDL EJS &`:C0$*DHb 4f RKu0^S IЄ},bU44i3xA3mPkd!%ʌ&+MN5U֙EU 5dF FB?F\'[VJ8&ʆ̔ :u#J2XF:I%m7WOȈ( oc T0qp"'H&tiHA; "}f67aCX`FVk8J߱YaXZԠhCa3 8LUj% 3taUUS|DI`0snd S)gLW'펼✱8Gjyq&Xt 'b;:ũ v,^0ڢuĮ&btB+JݤZM]ngCɌ>`#ƑUjWcʑ)+81L@%ЛOn[K5FVn-p͌nPXI-K\&GfG[\z?KZQݸ&Nh cX=ъU@3Flgٙ8Â>w?-D|d_;"R Mz{}FW{׼5|1W\χ䫎bOFz:sA,x6OX0ݙb [5|0BPrdk`: f|ww۾q@X= {5Lp3"#깘)(R Ui(D3 $MG$Pmj$kSpQPNQ'#ORH>J7'| @D$evN 3FC̭Q4jT^}?kw9ml_5{F8CG 'K!NGk7C%5&U4[o>!9}&s?C99l#'nme3㬡ȼ5 i\b#R%xKvEۼ2,6RiWKWh ◦0fh&9l&"7ѼK>/yY|b:YBߏN^x"qvd6-1+K>~-sȸf#y1|Kr9KO_d{`&½<_W>LoQ;H;k-=S~\?.m6FV3%,zdIka\@&3sHhuQJs)Q*RNp^S/-oAUo~'xO~ HHzS0i C wp2w?eZ*4)by 1zmASM`0F51bn͐1c]LZhT -3GGlVT!6d1bh)*1lfԠV0Y`ZM$U0kˈL(^I6 Bi5&.C hp:#j? ;D*I|Sz2a#Z'Ladxُ5񶏤H[471ZI ǠW'ZY4eΐ]Ɔ=:Wf//+r8>p6N)2cQ$= IB$49cN?@=ƴf6%k%@ŧ@&qyG'_Lh1 !+%Ps~թ͖ a NYoV,滌y*]U>~qfH2VbE88lY5abp%;?:Gf͒^l>l2'ix[y/an3[ǟ~tp93m@*4uZIcKS-C8A] w-:H]sB@IA7e5$5M(f*t {bdip*zpd˅$ij\AvYj@cHc$J"iYA7(GL+A ozӛx;7m/̙3w0_e_Ưʯ?\rm23* i!xv={yuHЎ0 P7 cBb{=6[fX r-^+x-~!\♣n4zaXm;lѱ-kMX*TOaW&>˲A EMɗ2 9{n`{'L3fe8rt@mECr<^yK_ç9o&;>W/qxUX6Zוy=B \rUl].ց>`i\8ŋ=éSs{?oYHPʪ\_7{\8䡓IV{~|'YEH8$FuBhZ! ڳ,ȈԖqPa`蘜$՛fktc%M\J)P}^1Qm 25z#MeE3L"kF|*@}g%8%-̀Y/;Ax%vx@VV4dKD3*y" xq}J{*ݟxXoV+~׽u|}?#?Oߧ rT,㑈"9HQu@ e)B N:F zIt5A3c1O), iEe^R_-JiVǚL L"KK9Ǫm)/Iby;Ќ"yS|w|ykx7&Qke$ivwwx C wB0ܙrxxC=c=ƙg=ISۿ38DȣjMv<1C(^n*5nEIB^ed44lhPdj3INVrdƦ]`usbQ┣4PZ*6fC*4p4@RdFPJKhhtY+jF]BY I"ܛAFJ PK$sZ#) bC   F6@'F4PUɺ!97&Ov0A 2vMVH-wH}EtJ6[ 1ºBɠp>JZf =^y. I/ΙqTav֖}\ЁfY;F.{x22?Z3!P+ y*[&!bI&-T1JAE($0K#h[fL*pЂIXRm3DG7ج}Pzrp={ɔDP%<^WvF2:*\zp@+4Xr8ʉ~Mn48<сƔT4TQ^`kB:}s_r㲍 8b 9gn{*XɰE6F<}iZ3hPUm@܌.Qիܙbڔ8E.(mhWPj.] 6ZVDV6f,RM$$6cTa!g? _/;?oֶN0DZzBFE F# llm6@vLݙZ>Ø3.\@?AEͦϘOd#򗿌o~<8Q1}q|w~˿Doo'~%~I/YK-#R04%r\6bH*NK3n[$flFBjRnM,nF(KrA;z5N/6Nc#v>ǬxfdFkQYBPEh"9)/uTjPd$[PM(4AqzcJΓ%j-%DQZK݊m:B@i(et )!6 qDA<^R Tjř3lN`3FuBmC8XYmf<{*q~{?xMx9uvg:DKfN+JF]SpH98(<"bGBPWJprQjฯĸiH8NDfmbE8%ȪuΟ:Ń3!%0U5^ԐX(AT%B,|0?ńMeakk@gLД 9$@r7rbb'2Ne%UU/J'%fK_}%&<[>F3yWJBJёZZ;&HlLVLhZ)%cf4M"HtZ@RhK&%R IDATOJT%HL~ EQDTY3mߐHDpvM?Lc&niتHFŸ/1EjPu~suܓ׈2 *ey0ˤW!5 bpSX >DFlTy4%Lqr9C-H03k_ @eGxRy Nx)#E:8rn 2 J2-jfS,lRB4v9^Y|&'NGާȒe R"10Qz_6WWbEBߚ '/c1qn͞EˣaKiatڦ><Ǚ)>svkCnv̴A00LavL(R!JbZBF}׀ajXmK#KM!]lqC"p*hH-[޴(ȜiI !3é]^U_|?f, ՔdB#z ʆKpszӘLذDo}N=~ٔ̕i@³i BjA1t^6XG[P> R?7'ޞ_qi)^==m;Ѷ-l6?8r^?.j>RxHJoxz2$e@Hň5!LjEu0tOx6!&&Qj Vg H*5HBReW(`4sR7g c̤cA1=.VHRb$ j~1WRH԰`^?5ܢ͈E|+kHҊBցՕaH75:T F dߙXMA" ф*nq?u~؉ѳ%R{KvE.]C *?ocXuM)番AicZe%)>nY.xĜUF*kKlƑ-1lu;}OU'<}cɩmcdC?[ sc BTT'p޿C,,ـȀiO7)&яWq מ8`(=?zE{ I!PMȚjF\QcoTy9^{{q]uPڶ"Jnhhv`zh]$ͅn۠hl6̚ Sp+3aChRL߻ļ}-վ؈ڊ.1bTnG7ɞ3q8buUkB3ibb.ˮZ{sX]CWWdwSEؒlF8 A CSH  3N1!Öc")J6řMfU{9{NF""k ~us^{-D:Z9HT[hp4r?TG 6to=ԇ>/g^Nq(X9˖ͥ.L#C=aq9D"TTbYquLfxmh^asZ3L>ij \|D}Ϗ?7S>SoB?ژ~;r]{8Ktɉ__Wl^;?xz)ݤT畯| ʮ6u#KB'$,4N%F81<&uP!4+t GcƷ+\c l(nDn)a%#Jhѥ;9ܐL2d~_ /u)Łݫ_;_|ut65b T/ ^d$TbAXo@i2<XGì^q62jvuj"o}-~ߍSs UFD s5`*aU,EJV[[C>{Оx2c(U1?@dF랎 :0օB^(ӞuZ!i仈&,R%hKH؈h4 iG'1OIU(yߘ frZj#pz23X"Ytl0fnU) $H3̠x%ZAIXA5 d\'?e^0 ) 3fKϰEQ$C g-{ Xؠ8.3rv&ŢZ}hP9gx~Ga~'o"[Mr{|"w.szt5ҕ11xyvJx/$)RD2s8O}o=쬢ꨜ-oo2|3Vi6Ffl%AךRk3j1k07gߜlUN6='Lv mK j]6a\;Ȝahlw&dtQOh$3Wz*=#f,If4iub[}+fѬa n?{ &UuN K!ӎ.siݖkfkd5!7zKpdɁJM!x#$辣|=o㱏g}Й(L]ě?C"@F^-~~4bTloBtG0`@QxT[dmɐKPk0yfT{ħߵxy~4"֘?(~GB1 [_fTchh?j !AmC#2\b/ʄfr튖(6(BjyG߯)Sew66=c%@kHLMBM.Hk4U%Sõ+܄f#뾏9BIZEXPzf%Y~%LFM2I"@R 4N_V ]B]WjK@A"F k&1D0 ^Y }Fƥ$ݼŊ/N(Stil.{}UpO4+ }t ORKW#8sMF mˀ#;8ɄXZyg=6]yqO jf8G;Q[ꮆp_t2#EOƍpl-שۼ-EUzkv8XhbF#1x.5AuSٚ$;^ĿE͙;euxu;QY5$Ҫsj&##%8Z+Wmxs+<)FZh`͓Owor~~ o5{B)MQ+ TQjfëkFa$K=tqGhtxY/ee֫U^nʹY3F"}p'KMBǷJs#{M iE#7=N~>C|+_D[#aO>;Czy!'r̻Nx=t@pwAؑ3!k$[-9 i: En>X;O.B2гa.Pՙx+Ir&k{!!kuZJQ<ो1NRLC:EE֐Fl)8R;$uX:/{]]HKYJ,*pJD"HSz\zC҆M3Y+ S 1b(.쀆*t̔`=5ŕ-hq\SݑSSNW~1",_44iv/~ }E<+K'f4l1e@h18=o"ҼřYy|Ïk}VតП<˯<qV?wȿ68ؐ=V44W3l5EKB|V(-pôk ev,?/Th%}.8~nE~'θ *b;|n,,q;!gEʎԊ:s0s)GG'^)+U(3&VSؤ-~ yb:i$|9m898;lNe`wRRV?>wx#ElqܱȼT&VSrZ3A,7f Jt.\%s]úqK7.qzvVyxG5o Bػ](fQ]ʷ(>NW0W% <1o=߽Ż>a^={q籷YXYuY_c#5x w9C7f=~QUU=:#Uf7J鴣M"Duitd l^!KA2QV{+n'v鈣oxoaQAdQDkEW@-V*m/_CН`94Ed[d[Q!1 t~F<$3gleCpM:s|킾?ˍuyυ Z!DsljԱRb3NVƌ/I@'}!+qU.=yc<=x'o\`6n7X>ʣ80afX(q.qLY (Rц>sa}'~#Htޡ)9~? p* $N퐻2یY#7뾧LUchy%3Zw8䄜+4Qɫwɨ*Ї׿m xGt*;vjOht N6-B\7h$9-D(i^΂h-a]'h3o>;j/%+)VIC.{ -.NPb ڱb.l̈sge XX=i7^o Fx|7xZiQiiƽG L B ?Dub|LC^1"WrK ъ1ZaQ{M4tDekh[#Au)$"RH:|֌,Fx M crKm`Zp+Ud;č#mo8H14NՖ,*_R Nu]S1TDY<6'L*!M:)WQ`hɑ +2ꙙ.~7G-Y]Ss%cؒ"x ֵ4t\ IG ad>ŷ8Vְək@KAA։FL59c8=P^tͅ*A*s5%_uKQ7d,%GcI>U9Yo+|8V _؄=qyiᣌ*qq Ec|#uʄ1ۄgVg#sa <69Uبe9MHM:ڊYd.}}wdH%móG_c!ɹšSܶ[ Vc({*=_X Sb{H)3Uza=tb5߻pr^{"r%D.д=ݕ *Kсf]eę-.pVH!oPo¸mkjܝgXݻw4! %p(JPnEɵact):i5r)&W IFpyVHcJG}|*ȼ.'ƳtɉV M5dPd̕",JO^F1C^,EpK A&u17;DK9:(nb!"9x( :h:PjLrE"uj4z1Xoε>KW ܍!>@ w 3{7eD%s"0؞ b4 GC.n=|ʅݣ6fbm 7ɚ!RYnt]PWYTMJ҄d9aiG`#X`yJh>~(ѿ8Mo;\%VGC^<Ø[!YFΫf *ut>)M*];>*Fg)lY!% ]n3%آQ {=vʫ_4Jaw|ax}i{3CpEu_&{z cUh$w69/V1$%%-3+@7kN:T AjcRX -~]DVQ"vl.7Yc蕺 |g|Y_YLy[\:_Kbrk.=jLZ 7_xVK B-s|F?V~>̣ DW*3',\{*؇;ȁ(*gk<"TZ voѿzzN4UrU[X1S:'3+q(#R^?ʍ:PeG I:S8#q#َR^zaM[gl%Bc s40փ]ijiŴ,,<_Ӧ5fڨZ Kſ=-V5d)r"Ȱ6I=B24e<85x:BѯW|~IRiKFX'7jbks@+XsM:rH80p3H8|a8zfLoe8Hh9<9>۞;o7θZɝJq*օt\I(]s`mG5g7'7FwQ5%yq ߠD!{ɜ-LArp u55#Q=ߟ>Xփ^kCi4\&n>-aZ" ΄K½Wr:p2!,%AZoA'J kh(|ӝ^_73:~$R ]Q&@ѺFUH#9Ux#)kt)8ZҤy`&rS1[%VHi4aAs%-K24 Af䯢"sKCHͩ"y/4:I g8Y.tzxk82N2beK{\i2Ant@' WȐ1SJe'S< UOY# z&D-6]H.2i'ku6'Gcʕ<|1dIJ */zm/𷅗dK nQ@ hr![BZ;MƚB1+J2$Y@{L)\㚭GVx> KǝRߺ_gaX]K껟hϟ^/W2։ G,^(jb E?%(sakjQMǯ=Co~/s%Ah$s̸V:OT7)A_jQ+(6_y= Am8o[kkH{W4Y(V"е%QX"kh`=Xu !E"c3 *qpxKA5Dz tB4 Zh op(2pDXfIg J" ן"k -KMav*Z@ٰ8&͈z`I1qp͘b$(E@]-4&i(PZC$ZY2)IDS+!ogO&*=s/o[|;,Ƨ7028gf\8%+bKzmܻzȴyn3 Jt˱YQV$Ɋ ev1BIqzDw8o*$7LeEQݢYh֫&Ĝޡh(Gbe}k-޼ "dSśr4wPf PK7I>Վ\Ȋ9"-T9..9YH9c)2=c5vuVv-5`&=}q7+^y7>2"𶷽}N4Vfy7jƀ*LJ+4e=ogjګ/;9H`v;a%)\xZ>iO'55--el19{m"2Jl_S~wN/g>85̗/B֎ BJyuȦCBt)!f3M?y~@f%\ itIRK&͋vc˷.DX"KY/RzwE,΍qnɰb\!qjlғ=ؐ 9uhDꐸ!*USt; MG"~j0smLbuq ׌nd{ I.K7,HŜY %Y)\4ِq8[ܾ& Ν]"TJ_H~'ےD[Qbtb >uj OfM'tpƕ0 HZҊ. ͠SE41KC7;ϽɴWx6W ?M_Yk0[}[߇Dc\_Q&'k}0V(eWK rf|q;[~%NE^H)z_,\iqj it1ݘ/m]:@u D߷/8z%_3gNMPH)033$#:6LFj7"IeE7 s?oh?}΃`_[_)똜QSf)dhJ1(FD!N كΎiFWdrK`=38=Rw[yu & "]g> j̴&ah+XJؓÉpلRgVbR8H.8ItLjT2SP=3'i<[E:i.G1B5 ú4&pcm6!ts-bt$0s5qܾ D*0KwlA=x͸kcsfW^wX|ˌpt8Msx2;iwXo/B$Z̓ӊҷk -ԔT:'&Gix)sH⤯fL")%JKTɅ;ҙ :S RZjKKє'(Lmlkuِ$Ji |Oo#iÕ<|鈃dRJ$KaQs$W)Qd ur3*F%Sl^Pлn!9ibN}PWVڱGtfsp(@6BjD,7ů*ӗ.wo3^߼M;7{z*7{6N23יbsie=“G8hsnSvqyuc9ZY#cm9`)xl$sѸ ͅC}C#5b5Ԣ QFu&Hͣ1%i&-&iP vjt2! LĶن~0l6}sH;#>51EB*AnIi T#S`B[`EI쯩ڂ:%6 CjŠu=X.06saϽz'?xc9<}}y!w{./H1L;{iaZ3昄Jk.S\9v6l Ͱ9z\3CvSŒ-;ƛ+O\6,W_?᚛a4fzv.+c@Y+ \ Jhd6suYGmn.@ΰuC;L$q])u1JlEu ؆-):iPqSw8{xы_|@~ڋ뮻H)~7:[[[|۷};xG 6 ڇ~~K~bbGJ'#iBiV .JV.v$Agm90eȻuP'jk1HQ28{ivٱDl[@q:$o30TNzBI 0%4G%[FSXN$ߐE!( `2hG`.nB6soФGgZp-HT&ԄlsB)x-ZvS} 9?N1׾qiűė82‡;#&]1:@OOU:rr=~ZU@LdO)=]u&Q4)uKѬ`*`8DJ1!3ҵx}=Q'$'A5&U:sOL !i5ac|{"I ր uzml-z'p$s!Hr0k*`5tYs ƹ>ǯ-/ D[Q`.Ln?\b8fI>68vrG+[ et-:@v;_>owNp3y Nd*w<#ѺWFrb!$]N` Fh\r|>/'݀|5;'H."Hzjsa\e=M 7Zys!^熈I< F5jP45PJs&R[}9q8?c?_rvwv.4;;;kj 1.?N5eǓ2^rKOI)1MN,[l+J)X.Ӹp‡tDD*?]C:uN~s;/e |7kq9:w'l apgZQkeq/bL7ߩ($*&h{z@\+Ei["!m cQ0.jL= tC4TC ,ʆSdTFAt([nX'9)OmkL4D/+T)#7d5N`T+z&W6!S"ךh[=H&¾5VT(S QiiZ`#- EN6HRXrȶOd7 *cSaEcy!u zÉ Q'zkģ`sRٟLYŒDY$tŚ@&T [aJ uHEbfͶ骒}`1iT;XDhBQ").щ 1 '5'Xlzeʑ;Jl8.]X]iDfUʙ:g&F8Y.GІrRi& i2dʴC;\ehC{4V+cy^y{⦅?ݏ<{~3.<9<cgp4n&c]*3̥"Zav$ w'̦.T~Ə7>sy/ν>j;J!b6O6ljOR2"K6,:eAd857Ӟ8vxl_}#ed=h9['3E. QAK"q.U#^rq!W`NW{ p:0ZS(1}fR]*[k|W5?ïg^ 0 ?3Պ{{{|+^K^9\q|K_7|7r5_5oyx᧽[n}2oxpwRJu]W\o6?SN>btǑO} 9vy\ ) IDATGJC|SxK^4M;5{/7t)%n)E/ɓ_ǫ_e\y?,K~gob~ߧ֊w>Ξ=7n.7gp|rmO,ɓ'鉂o^(i;z-P Sh8vz8 ؁;x4S0rE5!ރ$DfQZH瘬iͩC=/spaF3n樁 'BUE w=ٝT"υJ&r&,PEH9BeLF9%X U*$,}P8MGF CQtp!=hyUXU 0.wT \->(b`{~LF'!M"l&V) م2D3"$) j+6 a0ictHuâ&RbLrs̺EӨbۄmk=4ʈYEPOfCVX&A/J]5ZiVk1ih¸Z1'mf\q:rYqXe5NLeu% I:75}GU7bu57hw" b#1 MxuvV͉ VR<.)423s$DA4sh ZqҀ b|+H pzM<|B ia:GSBSO)qRIBZ5#K\QseHlZp9RRǥ=%W\{𲢵B09)+">yYx{  3>/$=Ə`ەIG]lnI46z*TQM -̍j:KYn^O˿+}ȏ[{/W|g~7x#Kȋ?+?|7:>^'~'?/x߈y͗swje\;[, />/竿x+~{cCQUw!Dg~_%_~ܳW>X.x+^u}~-O ^}0??0 |闾RGAɚ"jUqT$[&SIJPXCQ& ].Q7>Ҕ% *}aIe1I:D_uN(ٕ" H(HNT kGF A Fy;{H#LKì8;y{*RJkc fLZŎ^(0'U[ @HPTӌ {O?Aj$ K-9Rh,]RaIGe3gN#*Slԍn} RelXiT;`.'e 'q]3 /ݬcTk4m8iq:(#x^6!E̼#az Bh}{-(sPWH8.9^ng3!ahtRv> rZq{Q}-ޓt+Xɘ(SZp1ƣ*Әc1(j9ŜpXPܦF;[-4FD-$일HTQx 3}rc?&OhS>=nf^qM7[?&eG.\ɓ'ӧ{x]w/}5͌mxo?j:88~x/o&n{S.>ܹs*(~Ϲ8n{ ^D>}k]?x;8}4qX>>8K{y;w|󟦉g<|g~/xK_JO=ѭlZ|cζ/=yZ砇H[@du1+%\JVђ֌͸I ҦHgSTdt>r@2c;)dxwEN0&kcEa~ J`tÀt=iT*. j0" 45zrf*hhZI:Ƣd-jhQkߓlT0߰YTYSdyAu-sU]rX~ᣤKFrѾc=|.1B@5`Suv:!K`%=9"8~HT`|9T!z2 u԰[!-x0T7y$D1Ա"c")eZI6T]Z KjuDy2"PK@pde/Fz!o ê(U챵Gin" x(8?hyUJH ;{X.[}*.'NXP˘:]r\ߺ;o7Ox>}߅n.h6x%zSkk:lljK/sx+G^yGYhT?乶麎|+{yh]G —׽[/zG9}Q/򗽌ofGEx\62q }4-$BlN6&":"n$ I$tWi=sD%9aG!^a. ev¤a{#eCU.ӬΗaKL:au ,9eTD2չqGrsuf"J`.~e\(߽łtɑ\ bȤ$GvXnXvE [\T3&MaD$dPmΜYmHENBʙ.:晑dLHrpkzH)@fF)0D:.X/ܱ4\{sVA O)7'Ij­(s|gX.z^/mGB9qdxт?l4} cI 8,lh ~h9uK[5뽽=^/>3V^{{ϘY\e+>rO}*|?.I{_ęgmƗ5|+_-M?fvwqsXN;ח^z o^ʫ^%r͜~?&N߻r뭼ۿ;k9zի8<-r09ȏ'#E/۟y㻜xϼIF'LrdHõC; #5dO!.Ǎ$,As *=,E.=rvJ| 09dz}+'DDCtiLNsXIϱOa0kUJv4-MBkRG-k>LL>`H`$WC~]lgc?{r߽[n<܌۟tn6TX[hv;nkq>>~ 曹k麎n J)8q _E[[[)%r\wu\r-7se}9>c?&s Γ|ۇV|3xwpM7Qk۞pw=ֳ0wN:yS‰'O$mn^җr%?39%zzrLSlj>#?>0p-<1z+87{;?~601_l,=)'JE:QE~i $$ͽu8k I[y[bzb#U@L7t*,{|pxQ{pjȀ8} z`x&5ۜ-t9M5 9]H0_P ]@g6{q F> u{;P?~/fC]nX J4<ܚS6DxJhzq7J{qx#_yn!ta[ (O]c+OwDY:޾WtJ!:Y\]#CH6F))}VݱZ pP΍(:2 숓 1V8FZT9C)$֐K=;X&rք%lvt)D)Ee0:T Hj+&$k"zcHiFdKns?@ %+tEU K#uE\h Z^"oKҩ4Fm݊GmiS@9ΝvNvƣyV&ĢG@d|y{;5mNGZKbCDb'?,Ki}UsTg=Z+w6n~-wu6OpJ[F}A5t -6g:xCЖ$a<.=:\ -W'6vH+nd$x*jNHJ:w4U x{]FZ~h%v ֭Xm6xS6V1͹퍔:Zq4nHolG,+f}Hi>3u:$v=ՂNLu2E:QW t #k\tȦ[ U^nn$X>[rg5;g^\{O :t*_#_6'a-BqC8 QvN,*w R)<lC%KdQRk$" G3nbg4; }xjҧ>Ke3)"=mw.t ޗ`L,fFbF\!KCyBjGʍZ݉8G`EgU=^LpR'،ka=N$[nBw<Ͷ'˿BjkkW⫾+y3&,?qRԘX ub G749 9>U*iH-{LVh KWCZ6_+TP)Ͱ^oύ~?qW@u¼꒩Y, b$wCXh,, Y@8DRP!8b3oII ;65%axKTA^B$-YN sy0X:Uz5=^[+︊?j!7^ 7#/|/?>z~O7vBl1ʩ8< lm]8pL:Fts+{@,EjF>t(IۉVaX*}u NW4 ٗМg_"딩Ol""-㮭^C]XࢬjGa)l7Vͨ`oU>K'-+  'wXgGԑv~L$3Hu"1p ]tc-ש[" 6࿈_1C)7 1@ 3FV4vs0\]W WL"{Ã[ʓjLPTihՕN2R_a9|bSînӒA;ZUbʦ K6a'5CWK/e4H$IA. ҡ4̦y6һ;,:k+6Wn5 HU)յc+~ =vbZ'J*iJ~~c'J[еJ6 NS&7pI4!!ݣ IDAT)+0QH*C`͂!mFx(b&A3,GN ,rzFRrU_9ǨTu!dxQT+37͋/8*ݜ<Ʊ]tl$4E1e\[\ SGWT(l61ι#8VGTRXNY[l5qP}ɥ1 MLnv,p@@QDD$hMva4\ n ߬?aF"CwN_sNM BZKfGu@,)6B$l"d9&"UkU~Ek {(")Ė4ЅqBhWrkcŨG!/%CR]C5pǘDHN.͎;A f pRసUN)P][ a|.BJGq .l z96%;zTԈMK\I+؄ DbHf6sX넪LDbPSEXj 4| hc% xiLk KJz1 #S@]`f,)i$SzJXEbGn%.. b.xn&%Q47T8T 愶UR2X`Mi%{(wǗ A` hC4-V<6-N].fkx%nM/p$ 9(=vEP` %b/ gw _ &ANyr蒰Ulwttue3.i +b&";w e+_,;1\kvNݫ/nwݎn[p( ! /("R@"8 ! qؕv_ܗ꺜:֚s1V)plHQo֘yߣrfڝ3Δ&w.3W<9<)A#/u ThJB|HUn!{ XJDnԥ5^j H؎ {C<<<~M0D PS܎;!HtMm e:L :z%zLc5d NkDQ1llw,[iI$R?>dF)Ѧ.ϱqJ5`NmKkk# |} Oݥ=NU6p@4GT3z% tRC@mjU}5w{悗ځ]7ǟCUAOO̎;;^c0әQ7pc\죷 W.JAlG qg5)L]tߙuGN$L{Ldd,V*L)9sA(%##9Eg2Q-a4SRHcVz<+Ӑ /LH.Khr1e.)͸Yh:vJf >.}HQK| ںⷕ2MilEJS B:Z#)`Q E]nKOsBZC#SfʖMlb-ާrT3Vjܰd+J54QxruoA[@=Eمl8L pέ_g^ o/_}gy%LyCesHG o| WN >7ԠH!:&2 4k!)JhXg;q0fhlꐨTif=" 9V7,~"k7X XpN~ع3Kb4['Q<{{ژh$H2#i/ȩ DI4+{gcL-tLFeG,b;E \]T1LQYM̆97ke!exs8㺐Dg&Sص O)32y'`Sٯ?Ƿ/>r~膷;ۑ݁%DH~i>t$AMI#*#)cy iLpkR1MaF ?yak/]= n|~;R,zr}7֙ -J#=#wxH"?1rt y3^Xg>sJzH=_ f쳣0IUh|ARdci|\\ee_:ޅj#;-lt[]u Žsr>_ CǍ܂r-+"L;%R,a>-L-3S0W$:#5JKJxv\;=@5UzJf9HRmܓ^(3/ uWi.-;NBYS[N*h;bFm&xH=ӫ EM%csiZ6MhbeY+'GG$"Q*S(Y\ؔ3ROlj.Rzܫu1 ԗDM6Ԁz E!NP:q*xqjW_@oTLy59y\_ֆֈx[2ܝv{Gc]bmCpIz1 5?EєRL aN ϓՐzPG]ifJNG!ǯQJߤ}u'OonyRf+mHFjвHE(~]xq 6jT: g%=na7C^ (œ@Z=$4.>qF[MhMpEufxlv!y1_#.-pÓ4Ԣ'`i0=%*TTrb>Eg Se1''QÕ>2ӽQ6*9+?*\23 >eu~˿wLfNt6>?ٍ*G9JĽGVy2rTd pI\L>E2eBwҞ'lY3O-!v 1]̙~TZheɸ'6ّ=h)圮мcgDm(%}/mB[0z¨s Iܠ#84!CM {x$o΃'JJ D,q5R܈EYޒޑޘRcΙ$eB5T z5 umlF3=Z<1&eYHGjq8 ⃗_   r9Ð꜕Ώ߃tvg;5X\5L#M*Kؠ: ,Ҍ%iMecQM]!ezH=:ťDŽ$qךD20u #*lj~=Uӟ/+0ϻW\Ԉ|O|lk~3 5 {ϸ897L3Jwr2oxN&20RRt0JHݐ@[E0Zޱ\[BXc}4 z,qaRQ呦m!%ZZC!/ t׀lEk o _Yq[_* QrP'C8{Iٙ &3(%#ZP;/}\-m8 ܸ3;:2/y8c<)=/r#2NXg J%M•E}4'o[|P.`Zc%c? 傳<3 )t.ЍVѲgm.tO4mGL5P<<3[P'{Lh19tvΜ u;ҩ-NSqlnt#:q(IjP$!\ʼnh—uRnZ'KhMVԅZnn*s*tS[Ӟ݅ l׍ތ$!.:LIP 0*GJ0uz0j:`-ѦeBy~!O-PΠOr=d-Leң=|0y'RWV ZC؂UA-ZF 'Y4 /D⿉@?X'8S5 RF 'C @25)2C),"|4#A_WQz2Z+e*!=cv[o /u COd(޿2=+]"0Ոg^AzBD!)I9ik"eA`};wÁ,qz#)ƺUJ&D}\ (7ŚYǮ E+hyAR1LBBQ`THBOpm1u Iqtuwk<'rC_g كwC:n#h(@Pˈklo$|;pO)q{ Fs9'r:twv-΄n$΅iWN29q^bw>$%3X.X]a;LicyGf"Ow$uRq.h03fG*b#zFRGH{ yjĻ HVy<=_DXr4h$P0xLp`B@pwsӉ33[02)2)\v YDi JJ퍤1faVJ6 dJQ[hюwTI$u,s?_GZ<ć/O_LuXP BTWjVhS0$,HVVi3"Dn4w[\K075f4%#8~"2Jƭ "9xMiku tu0 i  8GDumT d02iqer6hK}DS j'97z@Rɤ.ZQwn{׎<{t1XXlc[\Zg N$s:6NI·Oa`AG'F[4 *9;rr up\yd  G j 4X56Mބ4XAfҬ̻zC~GijbiHp:Q|V5~>:H7[8[{_Qihixŧ[o# sxRpvyYx6믿>^'>/aԯS9e <?䅧Pj{}?)O'(U3[hnqǓ[z vt2YTFN' 35j$Ys @# B9[Ck U>zSAr O̺៺CS- YX#"oɩG̃S# ^KJ7Z_Ip KT@0M6OR$!XT59Sl6N%!DHĖS#%'PI.MU)[ɸxQiޠ)!a앐D6 &:Cf'*NEd,"gQ4s!<-p:8LLM6vs]إð^U}KdC%'*u363Ӕإ; M.*]JzDrf% ~pjCqH wl@+NBJl3g>ORGX0GF<>l0g? o`&a4Rz#+6XBӨy#$ tzCUZ/}f/!sz2)3e@[Bj3a1m0΁NUndM)^_o<] H̜ٛlhI4:>.5WZc"gnDs)vfNĵh2!'Zr^xJhƿCeȗZ7^=-r9bs&w*()j#MFBGLoCւjlMS3.颃cP0ɍ?|Z7-RDOԧb(_׽2MozO7uu5372 # JfF\* ֐]%QN&6.ZoXX֍V98Xìm/̳Q]Nۦ$ĉetJyP` a@XK麁ldqBr25''RuHo$'Rv:})Ң FV^Bl$IN\t#z+ H'JxDM!0$`i;=[E%$ |.aD=x/ O=6{rƲP~ w[(䜕ڌ5(Wx )Yq j+ x?t^wF1J3Zh;[{d}y>e :w"T'g2jPZx[Zdf˸(ftW~eN1wm|<θ=4$[dH>=(el#(rs[#QS;Fc8¼HFq;%q~'=eqRRˆKhNm @chfoMtq$'$ET]S9Nrt4<ϫ0͎N-ZC+Ir!Lճ:sG<#0d:eVldؐʨ axFpFΙLaCgnZ8MmHbN5s 79/~kb}CʎݱJڏ$rC(6YU|:n$`F{ .$P)z7־ gp3?~ (<Hw,ǦksG,W%:FU=ݸRxIw$(plO=YH4VNNa~'i赱?/N;v ./iPKICk6>F$n+A,P67H8Cw?3pYw 쐶aBZw؞w ~[hBRzS.x7XXE{]=n}g*yRrü /LISБE9Ktbx)s1klP/6"3e4!_9ta<;9gZk!_GbA01QH)1ZKLk#;zqvaґj|QshauK0XqH͘QRVvlNl$$U%mbP@!R[*!!THVH+*RP+ )I4qs%q\;^B>{{}9u - ahy;#eCX :w[͗j]]]k~K^ R?G?[eY?o?:TiW0T=ʼnWt2hBz5W3a} rJqkۉ(9 %)*q4l)Bc.4&E*L:RT auAI-_z:>Ȱw%e|0*Ea`aa,!D'atvf;ݒa2kl+Yauq|݅q7s G?D_;wayۋ;Uqp$t6#~1Pq+HbSIlхٜ<23.jxP4raO/gdcu2̜&j7g&wiֱͻ(XHGTHOx81Ͼ7J>9NʺMǎ}tmhkQ}g\"j(Hɨ9Z i84B%8-\_;f,=>N76B׻LZ2}d0-JF[ʾ>>K{t{e GR0{j4-mH% UNf1ޱzPB;‡KНңQB`9SHÈ ұ1*I/v__r7ujJQK/__|TK47_O?ͺEMn6$POt9⩂0[Hn2Ua4_ҏ }YHjpcNo4=8d=nf1q'T5 Gh[mlȰ#qrRAKni>BBʁC/ c>5vRΌLNCP]V 2E7IakMMzn̜)2Nuh&TՑmpGZ eL>!t‰E蒹:ϊ1o\ΚDrYE$Q$ـTz֕*n"<\A\NBPaP8\5),׫Gxh֡"-xJu-+Oذ3r=FBژċ^8( "c|`E6+UZb&xW|~S~V|o u Bβz/܍CuաhWZh6%Hb9(C2R&5c YbJ IDATZ$ kkKN7&)Fdu[wj0C6 )N SAr&SʊS&g3f R *}\3{q @wX< e Ӡ'Ga(߀lʇ0B0.][wWą|W0[9PԺgйv-PQd +&4u -:"+q#31;&Gin+*t3X?л9v[3j&n;ب0'aQ6:찘a#\BO%sjXO(u"+a.":D :PڸGNFCD#$eC'FPg#9qVb*" {|{F5Q}bꅗ_zwƟ_rgz.΅LwHq姩2)&x׹w6ӈ1KԯsNNz3$b( ݒ 5m;UJ/,&$. &xGjtO(9eɍ):zBS ȦK; 0O"_.O?3<%wujz|~ۢ-{.{[45VZZ۾Ww,j'2i'YbhM^O,9l̪ՊD/;8p>n쎖DjqRJ,L"=M)DBq3u8IIU=CI9'u1c83'ܢUa.!Mh ^*\68զ,91L>Xa=:USmF| ;ŲIS>S?pcV6ɒ)}IG!c!>)g(Hx Q& v !lTNo\Py>Mho%d/?7x/=L&dڣkr~u | M=jQ&O8fdtzLT#FQ^upm/z۩i1TcQ=h̞.J+j!6)qV;;e~_|9 e߮%ŷK,vؿUqtkG4{A;+8TH^XXͩ7׬=um(!m(e^l`Gr'5j)#?i 5 4"u!<.sI4zTتy :X-DNKIQ\-bApM9EI+VG$p0N˱!sAZAֶY(Y{OI@uhgC_z,BEBӈfac 2aT" @C2qV 441>_{_iI3ܿ?1K6L^Rа3(|28I%y 7=6)YXכ&߰zvݿjFJr+NGӖ63f]"tu|ДKs/?=i:YF>P|Ncۋ4+L18.m,GvTy 1.ȑ,PddzieKiQr TmER ٓJNʼm9apW7W}!Rr Z-Z!W{cX)v:L6j8 رw.zAp4ǰi6fO$QmG-1:bS$X4IJIdq[袸'rJL:[9#Mzp8؉8E,Jzn)t"H/hSRA"~'-5"ja38{jt4dF o)N#ըBYnI!^L7M\[abT>!RBI#ۡ쌑VtKUb:3M>!P2ЂZUrI9tCܜ6؅vt!ILf$ԵSR jD.y[ #L!#]57f̊󜍸y*Z2L2ED T!J!fDc_0*௮YJ[+1Q޸ ~犡wwx9w扭&D: l\R@C")opo`8<,ZFvcAYGxRzCrǴ '팥`ئ ˺4kT_h+tG^xWW=%R4xۭddž :Vc #씑0 A ]X5.~h_[lN'{D0>OET6!zg3"[M:"+ńl few]ܯ|w{ +3HZ_G;E#mW|)gwNj=,\#4v|߉{Ʈ;&^pu;#¢w"m^&n-rPGa2jAG-O{q@9DՂCDZ<k0*/xd{R8jZBe HKj#,+,#8T/Vl|9yA9o`gRc*pK$]RVlk 9)pCۓ)|A,N7鄫{t!ؕ@2:GvW8\U24Yb+&̚QmͱBf$i)1˄e,Z8*|իG7dZXt(66v^&trPYը.$:c1۩ЙegiF4s|yl?tƗ2߽Y.f8 OOefshפr:68%o؏2o^5 n;F:ڙDsVzщQȚ8\3+"͉Z)<8yUxNS m379KligXUA3*n^o$޹ŗS#Ʌ hHzVh Ξ#jB[@?V֛K>ysʑ?Pˋnu]LjɆ)Ni"[gr$P9EC&O !xՑO'GR MR% a|Ӿ;%A"4 4QfLӄARX~+A67`Wn;v<{ʯ}O=DR16LB u[w?la?yٿzM;n2lԅIێ OI1"ھQZ{dm 6E19g!% qݐ=҆M=y\W'ɴE1:ht0W';ؓd5M +"$/QhJ?uYmKVGpK`G[31QH!S K\ tJXн]#i@BNN5qRl /CtdKțϸȷwFg(%a@=DYs[ [x"%AAHM&3o7Dѳ,HSΞ⳱W7T'JO0Sx:)ܸXH$ڰ^ I6F蠧pC!N!w(&g%DՃ:K֙X| =g=0[ϊ38Olhd(!ڞ0{guCdqh}mrgLd,^qsJ:c<Tp?Myxʹzxj\^-jв*SrpQb{-0UnlѩI9$yN4'$w(YQBukt|22)-&q-:IAUn#0(j؅y;ama |š:y ܋L/\?׏ȋG~'n?́UeUn<(|GF56/4^1816rO+mO%D>8GI-Q@Z q$&10qzH060dH hJd[++#IJdFR)sY܀-M"O!keM 9vkAxܗxX84o@QI0bR-tBa:dG@qڕ24EK=et"HH9ALB)6rd %L98; b&^brz_dLZI:yHǎ V,8gg3.ZK; [\n Mܰ6锈fDBv0Ҍp@Z"48Wƿz(d 'Zh< O}ճg<LIcJh[H)3Y%&mfq ܡ,t)Jغ}C I*c2Y7_;XJbFٲۯ\?Vkqu}BUW+u1W7oVֵV$:[W ͏щq-5U_q>p;pS))Ar^(SLY)SbӖEͤ]*LuNnU͓rHqd2g2#]`T>FSA~i}#xn_~r..2:~Gx1ݙ;`XwС_ybn'6 St.1 7 HXHS0}ѩx0'uydnj#R\ñ*VO6'zH 'k .Kq1DPDmLVc A\h auh}Rz-(q"M49wC2ݫH{ddJ$Y谠 \Msl*罃T@hlwrI8 T^Yx󗮹΀Q8dM68Kݙ(D4 4]wB L+sv:} .9gvkÙjps}rp^y}~ [quW9.X{G,0-ѡI!h&~ :Y㿏|wS}xqIG2MT2O?KN#._,^|}v/MbF'm7+|B 2QVd5J2nn|Z!OrBpѣv$GxUȲ68NA&XJ9DA*>"R uDek|WMC!^-9z'-5iXHF݁7iEfz%\MݡWs5l&ѹqƦgHL8XBWT5V:p'c(i8,BHXȳp ("> XzR+ 1&a*Z[ p1m4%l%2k$#țpn"m<YTݖs&T %P:Y`Rsќ\S7#*nJD'OaG&]b!/qf($Sd>qt&\G<ㅯpxG&3ItYRu3%ͣu5QIGs&{^Ii Y352؎9.h}L]ϸ_`#jwǏnԣ\4B_Q-H]]LѻiԛS[ɜw>)W`y {oo͟o/r'sV$QHYєDޜU'KA Z8'jׁ.Asߟi V\Is(sį}r9;iJ3e3Cp(RѽVz0.&=jf6cTm؎5 XBH4awqY;Y*5/fP\7Rܱ߭/+]ȁaKuըKŭG&:4O? 9v?Th#P Q"X2^`Cz7:5 '_{s*##vG̅sbUXQ̤)kh Y"`uZ h2:d9c[i cBXP``E%źQT2yӘeEGD[B89i| _8lȇ?_\7x >8' }M"?+ r'Cd+5r̞|Qs587ctCoo4ɅSűI[CoHY&b <~&x7gnI#pV2bE 9B#@ Ɋ#B(|'5W[*8c'/4pdQfҩ ѯB,CTH)!>lq!nIa!^N)^"M"xzJo(mRxΤl [9jN4΅N.KF)Sl'9ASky3! e~ם{(Kb#gƙ9uFKD3y82&T }H)P>fn>4sp;2Ssu0\)poJr=Ɯ zB:sv֦f1.U]e~A'zg8kor}Rugxe ^F-|m͵&? o9ށvx~}'>LlZ&9U.K yl\r)s5+l##*LQ.JΡq^2:6rSw#O KHud*%C7G鵢RbNvZuf9;M$L&!bE: jm1=3+|o&9!̎7}%r%3!\'w$1b\nAl#MWWXORaxhSDڞtoi}h&d=i;g<ߞ'E Ϡf>b' X9` CC8\L_EBm(j5 :(zy}0J"LeX"S;5: \4~~2i;%E)=uRJ:4M#!:~y?F| R6n_`##= |ts"PR(*H6֑$4Wzhg 3<^ Qq00 )F`@![ꄯk5t )]ha/ǙCWVVZ;PL^29Sq8K 7wШF[;].N{؋q+IS|T5>I*\:O?~?Ӹ#R<8[DJ1IL"i6o-/μe᝿Sroy9Y8VͷAnB L[WJzEk#h^T&`5($;|%[ G#\Ò,6AYJ_Z$cS\(St{e"Qr!kp')q!vXD8=#6LWZtn,NØ)! bd=YoMSx|kW"8<.BN\=uC5YHz4H?5T$ڽ8$9Nq{,#$N)heSsTz̴IyIQ;Iy{0wGHw|_ܿlY\ "jNVlu_iIxy_15j-*%p 5x!J5ut`J Uh7VAM{c x89_Z&JF b`<]늸J{jv۩ykovEG?#ۖ4d=Y_+/ګ5_RҏnC\+)p"$$g : kjՔ k@-&fR&ɻ͂rjYw&zSmx22~oc JBzjrh,;j$)XbT|sSW2v@#=L)1B ,fhU RJ% 4|"&?n|?<>N( z&Aċ+p 1M 6a">Ʌ$%vS~ ^Ӡ ;FR{_۷-Z7Ɯk9uNCUYZe](.bTD*}D4R >CH0F$& $R%PR{˜s֚߯udde57zoF93₥ccc^ɳ+]n?ٔ]uZ]U Lm%A`^48.o^>9>ALQgAj, 5uhMі&/*G!? l9_|qޔ0NF*9R睯;6c PFuD !w7X4.9 B,ƜQfNF>CAȷA XRaTh%YjJ*%&x:0ж Ahj5)ZA)zLfuL)bamRE=ަh(^i'fQUYm[x թcXfW^"NEe+2:.*vBj O'zZS#?|ȔmAig4K.D/$ ˥ 4s׍YL+4N6y Rk(۩FXT,Ō W;euP|(URwAl =(NV:{,WWO)V΅C4k]JԨim 5cꂫbGu䶀iSBI apz7ށp{?xHa|H:|Z%0dVťDT2:KإF?")-,&ƍg$i?!k;?ŸG<2W۽%/~wnN3]&cֈg':q=y+ 䖻;l71ƧoΌz(ɐ w tB4}ɼ =~cr0/;"cGHBh5ź6a:ngkɿ?>o_Hy8@r4.=&[o1-=!_hVQ QSSïykU̱1L+_̕YN3=ANYPm0s r8E&1o@HUDX(T ^][qfdŜc ֫18*b߫8D0%D/=.*elP/P_@4!D$iYfiS f* 5] OLm$d4DˀQfBN_V3-nN>NQ# r~Nj#׭,3Q+dĔ^. S+\HLB[^7P/zqAfYݔTdXvYy+jÒk1klЌѨͯuZ9kM%$sOY-ϐ/jߛH`Tl//{_]wRAB-*m,M"A$(iR"N8p^1d~ә?O<~7~kg^S\^γw8u[&ƛ z[tc 7B6r?7SP:nxޝ &N*ot͕7Mop0r2dg?Ry=ȢGAm ,=9N?+ \3x}ny7/ > bg.6:fݸiW'lbhG C`cݶJΞnpŇ\`Fh^HCEtե݈i*D[5p0]՜I DUW:/~DlUOq_ٺ0"H/{. ŢtSӃ)QܬU3ĽH]FDjŨ5^7J@ް1ۃ"|DָחYKDr1%fL*jX62 VĩyZOckjFCISסP6d CH1V$hJ$ se45k劐J{4 mb6g`bzR+Ut e;y 6T+R:mSՊºnљu뜝y4Rҟ7rz=Nf Wekn^,;{r>MO7[ڹ{#z#^~ _Do~;[sj1pf'Ѹ{;s^=C==!I{XehWҵIgʻ$eWx^hLQJ;2)Uu!f֏GY#KqIn@~u, kT!{WJ3# 4ULZniQ/(ҰL9C]%s~эG$,ȑ`At z_ѕwo Po]^޷ѷpum{;S5؉ա1\Ńuh g'<6^˟Mʷћ6~C߹7V6ĆOP ̈xxsŧ3]\;aI0gKil 5n`gSYڏLUl BMBl}rAkyDyNsQf &$8&J6إE# Q -Kscx*'#ImD&#0Vv F2fӎ,ע +Fl“4kuy^YS$*<ш&8YH Fe$I*B )-d}$^$ڏ$3 Ɏ@Z(ŋ4#^ܪId.n@|nVxHu]Z"IŒO>VQ$/qZ^* .:1 MDW^MKܖ8/j,a [$HF*[çb@`4/{s턺;M^tkYXSDnl 3ءeQ'm)l=.Q FACB+6Im{aOk[ܿwyuEA7D5Q|)/g5eKG9v{PRKI~Cw#nl; _F/X _+?i91y޸wRw^As+R&you `2L M7L-A+w{W'brBʙe^5PH7%TIɩZٱ `=][ζϊZY]L\;3RĚׁ;qԳM4rp.R⤜kt4*$ f@{C;2.DVRkcvT{I/2ӫR^B"+ڳڊK&susd0ȃ1sEuxZmQ!! S:Va%~:<#,;!mVgZF46 l=&t/B.x^U*V.rBB` ćTIAlOOOi} Eť4p+XXUBZrgfm*=aj:$%4mENڄU+ %6[vT} T {٣ IDATw8_1Sw6r;C G^ # T+ ,<ݵ=>(cgL.^o~/!D85$rh*29(nj6ŚRjД zQg kEM3hS9iEЍhL$+bO|1jz-42n@s_|g^gXGtD!YfD]3h4b=BnTx̤Ģƴ\ȳ3d 3i7gbBR8H_RA6NŨz#GTBtuz^`*Ȭ^B pZ^6 r&FDp&6d4ʡBեvl ?̕tu"БEIO-[Q۬BN{EOi=JQ6nyt4 <&ik;9 0(4{ٳ5{eK Zb l"!"0N-!bX+a.I=P6^MnDD[-VDFS;&z|pwZz11f8 H$iyC=;‡߽{޼a+}[V @7.A6{i|Մw|/D{qۙ_oo`{; ˂v|JLcw&'p0[bq!'Bnlzp+vcȑy= Cp}̇r23+9RDYiભRU ;!RyG%⫬LM%rFc8LB9g o*5KP:Z!  n̅vʑbXVY71>/ E$b<&XYJB]l0quP#,>\AYh" -u郠D2mފCG ʔ2,1[d@u`0c7.TI}X#r~g(0}#0.sMA:'sGw5_SqV{npwr9Ã9j αqf݁Au zN*{!oy!M*Hl Vi[,:͍5+pH!rYa$hDTGRQBr-jrfS  B;3@g<+*:sGk|Ǩ!CL= :dbHΪ\ɂs< hKE`t[KZңˎz?4)Gb0ҳhj*SPݭ FBtŁt)^bhtžx)nSTb-% .HU@lL*S URV*@eGDe[=>^&f߶ڼB%9sO[9r2вvj]u}⽬tPlWDɳIGָ!"#墒| >kZ[ 7_ŪYpbD6bVq0˅I9ȨOInuʩq`ԍUgٔ6;VXxNP҅|sK EoSY>) &Vg 'n8ɎZo'rR!wC.׍6Hp}*=?2{} gyX D]/^ģ8sB=[e|': 2;t TN*DBwe߯\ﯥ(liW¥ x,[֤eQyH˾lfV *4)+/֫bxFLUdzrh;kIJvj50U\hzguE$&'L;l$MKDNd:R<nCJk?$YzZO5~CԁfK6!D6YY_ kHk%:AҐ[N2}B6eTrn DNH) Y/XV]!R{a2dighIMq*`f~ĝnq!CHK5qr(Q2'rZ\\d߹pkdG^+SzYu聱"6QdvjaJo'Dn~$Ɨ1~SW??~kh4c~5;󿃜>]`8>r[!.3Ѹ}?׃w?ys_|Ήn;k<%_B~1zB~ _"{ +Wfavf sQ.3\F~ⓝ3mz1v.1wl+LfHu7Q%YzR*@U[xE! fiU̫ >SBLB 9|ї9JىSA|z}̩)r=`v (ZGuM(,< I+$U*ƺe:^߹\}- ץX41ͪk/EHhRݕ jUS^fB(z$ي=+ pYNul({zk 0&-֟Ux+sχ Ⱦc2jp,Zm_aߗMPuGFċ+V/~߱_ nDn 3J@x y셠Лo~em./=v_oyFpz~/~oq;ڙK^Ilj]}#/r13spzpL r's,d ,$sCt)4g"l k:FaVJ:GA 3prF_vNGJ#a̬gsdW4D7+;s ;ɱ dE4ḔȥU֤Q!!VY7(`y5ָòXQQ)EE|+jy./ ܕ+NpPeD9mrMG|W#PJ< 3j,N\9Pz´WɹXZĊT$UMQ{vWL6"F EPtb SJאR ~:b[4k$gz>`Oi}ܢFԢA\/cy\٩&b*{%YvX{5YS8ϊa^! Χ6UpL<'N c(kS,jz[cq!B˖}eAfXն7U&'t<#x$n[?߮;H &Q<FWe.rVPi !P4)2dfR v(Q2&g?Tַ+\O(N^y߅x[Ǚߴ|‡|> 삷 ;z58i^̔&|sތxhl Ǡ)OBYr80`酤d٣%De[V"VNJ+.LMJu0adt1Di U%)QA'L f9T[Q꣦lNbr-]8MgdP,n`` R"U`I^;G*Ʃ>D9RM[}OUƒ[a;$]ebѭpSJ'#ec{ŜY]iuቬBz|B|= HPA9b<-193"MhQki#!l*XK\ե +Nb,\@H"ƑAb$f`v*rVzZOc5+UJu6CFf$ HQ bV)y4ƭn[L46:#tOL! }V&!4Z7b,wED@vp7Rx#5tl5cH+*j%h`ώgsU]V4p4a]Is6ĵ_Ĕ3' ,,㒂0[2Rc6_䏷OTmۈ8~0އ`~Tslc;'5y'Qxyt]wqp0Eysw0)V,ZXHZ.5E)Hԅ%6!l}kƷ b=m Wh\+6,,t*.T\4%|S:1GKΤtp¶һ 6R:f22g(rDxi=[$DL(V ʁc^~(l'ܽfGC"9_'LV:7pOiHЙ%΁az"g:6;c%Վ_sLU! Hʎ}/+`doh1FWg?CH-?]EGN 'F\B[o(LҜo>-~)֏}`osw|y~ͯ\?plAu&\3 քq(&F:T v>8oSԓw"ud\ +8> m ɫk %d0qq_樂CWGy@1QҍG¡ILP"hs”7,~ #J_cR??duβf ,7+\ j@'0-]ߔcLb*\lZ"/Q2lenX.ƴDYkmEBc`,?J"҄~QN!(L0i%/,^;/:?Eg2x<}BAuq0q}mf0,R/B\:MI/3ģݾ*bd.#E9Ae1wKv^yTb rup ˢքNc I:\f$f5

U AEN s=Kg!5FQXB3ߎy2 \BuH0%H~@^֬y8k GqIܐ313*S b4*:< Ó IsnṁdApb,\VYicD"'JӗA3Y19yd (CQZ@@nh,%tYҽF vJ 3* )jp[dFmCq=#4q)!М+.m-u;%eN(ai. V7NɲM^td+6bhڵŔ5ؼtkF?MG,hGMDw&GRŷ$ƬH-;~׵sf̱x`cP෠R8$ y44O->4Q EҨibB@^PJHH-KCPqƖ*cs^ky93s<Fs}׺u_܀mQkx&˲RfSiFY>82~F6s6͡l0fPU\~GqUVu,%YgV+\LvW@p\dV]R&ZX2C$ܾGpN,*$)w`KaIglpٕla=pcXmCᴉo6C#8 3tJz.MrnԱ@|q5:B#N,rxBi_\4j8w,4*<L\m^[~Wcvj(${cdRXaCx*I~j%ncfX_b"C{q72Y J+aʴ)^lZ FY8tюEPVhuȁ ,UusLjE9*.LD"bQqD1r$lq>5S9ICV$ k!ku z/2Kd-!"1d7FM6h9$GP1 bK+L:wCR>LOoycJUkJ]%WglK[R|&k&E_WY%MxCӑI7/鰌7YOApӗ[FnIOy:|Yy%%#w C.gN/}GF(}0=)NUFiAė"I7:H\8KT0ت3y+ S>쁖;v ̪LR#p٠4z |$F,X@MmI0Lu#湮v9Dz贌c[2LQ5qRX9#J0JCmt "r NF|(ZcL+4VH_h[Ee)-eg'kU| #`q؂ޡn 0D c:[RtX$/J )۶`j^6lk0`MjTцxHVei[:_cVlԢ"E*t cr qT4%KpR pI#ԥn"8&w`te`'$Ƌpkv&fFXuf MsH凑g*9r3uOzv\3GB: S>F?,Jkn6瘘WuSӦӹlTjL7 ZJsbN&!1lFINUFd*s*:8 Qr+AoE^6u~ ctFbanNomvqwEMBXa/}/Ote4F r(DBrlx1OdE|#Ɛ!R!w Y$VEX̘ @90X'l^?w),MZqK\v"cŽ!S=RH杚7e72Rđ;R+[l Z-|3:4ZvR(LDň3=CX=DnĽNJ*˨Z#-;˅QWqe8d1ڭC9("xgr$q6,!1W8QsX:DZ 8> t2q PJ2 Z L G#i$e*hI%nYglɵEJ.?il)jpq2UDjh- lIJOJƨh9H^ kFgFL#]"f2pX3c( ͙^ٶNR40=A1ئ{6Tg5/@#P'OiSSdڼt#+BFĊIeaLYWIss)o "V#)S'"J2reoPBL| 4))X H1 ^ t"񢃚,VyYa s`i體e%B4ӧx)ؐRܙ72|zZ9;dU%[B\(%=^W|!['\JSqifbrT_(K7rXCPκŰa* rxL[ ցgᰮx&[ӑ,Ek]*,tTV!$m*"6eqQ%n-59c{;nˁ'Ǯ\0I`t7'3d,a.8|pb1(ƴ/#1;3x4Rّ9g˔OUBє9E1*WէIu60ƨ'C+2S);3{LWL/Ls'91"5 "⌑R`ye Mq Iï%:%iHe% >f1b38Օ',3D*E;>Ǔ% ͩOmئ0p**82Va>ǵA5#,LAD+F-00Ҟ72<)g'G]ːŴYRwAYaP2WyD6ZFu nF)>%M:|b4$Z4Yoኗ܇I>T4odccdIn-g3<.dc2^ w5u2YɎ ǐb6VLOF\֩]!;IFc6ERi! J"ΤXgBY [}p +,1[h(+ul 3ͷ9:KT +gS)"w!):d1-nTiTQ{ai)71@ݷN6BxYdFg蝈Tbt #&AݘYd6%1TŨP\TJ1jkU*C=W$>L {B y2OD۸(VNDsՍۗ2v>:nSQrm $,3>ȄslP27,If#EFݶYčļc@M#Mlz>ȱPR)AeE`lee\ҫUD8/Sӯ ǩ}sIW@QBM!2FCSAYK8G\ˢzzf> <;Af#?M ݬ+yjs%gJڞa,p)Ol18賂9#*°jǭ}*+h~$hg*Yu=C.Aly K!b)134TEOX&sH%v T\}PO8aMvQ,߱cdz5Td$旰lt|XH`SeY!E~b*hMj=fYS0RB?GGװ19Pb(AsM ĩQ}!jjaT.kedUad;i3Mϸ]-0. JwFIh#Grz茙ܬ(m^tMY3jq:ua@)O\D4$k."SgErn/x)D;Ǩ[qz$.{T`-I;uFˆw#vT|DLNYs]mhSF[d9=$3eqXwhlCET_,L<z"Ɏާ~ bT"IpF(>y;2 f, k2c-ș4 ԃA!' I@0y*2k(R">XH< 3i2޻Fȋ ::25!+:-'c8Ǖ$D`R4oQBυ u*F~bqT+ uvq7'H{Ȧ4l UZ+9鸸 LʼnM‡y K`3e7R*nѡꕘiiq1+qV'Y~UzQ).%#isQik$7%^e+vTB9Ax5Y06tPآ9{4>diefxMA=eU. փ}@-++aPPȭsy{ 8\\+Rhn"* NlʼncpMjQ'dؠRɯPQGFcd<نas˒`TŝF?IZ _shsmcP#eBN; Mϱ`>"E +ELHu'%tsFX5v&|k"CHI~\q!_[LqwuFM*ƢTi<Y1}N@)ۮi1-CٰN, l9W%u%.F:uF>izEcEM_ g1NB"k\fӬRW+xYt9*1=B]n* du"%h3le^eG$MU>_hI >EpMB&thL932ͮeY"4vO>1mM[6;2!xUWSS=H$ZǎpsS¸̤ӭ ٬ٺ5$uc{'FIVy6K#e94]Mcx0 i\dd3SHu}ʨnLڢRקO3az#ؚ_a{E&Y/䩴f[*Il1_HTca3":S֡֕ Fz/ q=Yc\yxR+}&:<)V:٪<$q tu* c>ez+ޝ>f*wJD+kR>u+b0̮3f^D">W^NRZ47\\N!AM*L]geMIyR_P#5,|9  L!6Wr$ufsI_& ݄wS9-bAx!•Vi3isS3a =HVX-98 z734vJ/H]6f3q:oIXtm,F c Y5bntc[ IDAT^.FYQ襈iIeGfY䗖.RtVF9sqŕI%TȘ|j0&ce.DU9/sZuMbɾ(,:;eq6g "t_,P-:hng28|q N6c׊--8uJEx5TT*-q;hlcv*Y5rC \, F?aq(˱rrIn*L |&tߣЍaHA)B.T2=o28%uU%T`zy1 0F tL!>3O*)=5$=pu#2|8. a3TLYqx `{tViz.Ub7fc q@5Ҧ;c ATJ,`ӳ2,=0 $[^Plp1"1?PR~ ,{9<̟'btFgnv2l0 u&u`9*c qə! ݔ^ݔ豈㦬X,܍(:<ǁ[M3L5mbjEN3v@ A93iE! =IȚ=p X\1 |̎&p8c՝R Ŝӏn,,DvJ%;n>z "hITpaN6NL9R  I 3hPVuJRIw#Xz.FeF [cD`!ϙ㶐=(c-UZ-6<`&'Avbk'0(xrtE7\-Pmo%^*Β T+{|Wx"tZ :JE.n[&y۠$֎IcLz?b93gkRvquFPFk6stOhdvª:N}̰HlLb3FgRGTSAdx;߫E !IczV`2$r/{UŃ\_ Y"L|vN6T߹B!(=Αgn۠#OWJVdA.x7F#rd6;|6uյC%WYPJ4 EKagX<%Pw7ۋBzPlЫݤNޱ95GBvpg! oZ(E1TQD,+4QH͞A4j̴qYYN;lc47m!-VawGll #Vܻ87B0_HEE .-6!o/wtuSqXxɿ'n+B'zDFJzQ6p9*4( Mڰ,B?6<:[5&xG=Yu*A@.X?[|l)Cb:كAqG2C"S*IN9#QC^Kk1:]ffuLrEFM<6Lt}+2Y{RaB+#~Y>po;X`CFg, ujAvdNy{*y[J?) gR^qL\z BˆWѓ |i9M,Q%8K=ϪDR$PRJ؜A; YRdbꂪD4,^zap9y=Q2rv|޳#dA+Zq}-AZSpuZ #:z?ː/lF8qTW%M\XP:vJ %YZ$)@ϬP Fc-:d6;mI]VF>~)μQ™ 3m-BVIbSqd Wif6;̓88ԍ(K͸ wPSʹ.s# -э&à]ަAb!!v$S7gҕJ>n2z./O)9D1>D1>cmA]ӐVAb4.BQ:3,B,V+^Jbq12y+3d&]\UMBt)ٴ.8szq̒CqSaCSA1Is"We!b>Noqtb:i!3Q\?f#d`9D,S^/To']1k1)nTVJ a~C&{Y#z kzO*N#aAd+iG-1A\`#Yc67FKӎw9~"Nx"m"1f#k`;QeCVelU<#x M:ا4a.~AB+aцhcVK+eHqŐ\%i.Ŧ(v*тm)5EG!ZX#rH>4%1,z}CWLMӝ>0SWB3ωqA|T E9'=N~l "뢑K̓49@X6^!.%6* .jp;c*e{jR,Y ֱ#;u]SMN 㰈:zq)LG&fkDh4hҋ6-BcK;šm:Rd6'I}Pb&#w&)%%wG"A*!ٖXu*)ϱ234N9ƴa %vʚS fFJe2u!ߤt(^{fM63 3(&_ov츫ed-e/ 6ֹ2@ak'# ʰuh)iq"*2h mH7ͬ#Cx!"NtI*}7cPMʧI$b oAF’S;`fĕeDŻJ>GGOZs,1YTM yo8qXŃm,<*]2U+j֧aRWqtzsWN4:59UZy| 4>GʅxB2t%6hIFILq= dag}nh-g6cEmXј.zfD1 eJv[pq1S6qslM n?d̀ȘEwnBϦf5 3ANH=4rQh)X2Ke3Yz}T|fc%)serv-"uSmNLR#L`ܠ&b3dO4g=do MIա)΢p$GPȻ=L;SaF5S ,NۄI6[L+KFlG|uA#ɘWgΧknJ*8js-tӈѠ7^LdixQ)d! TWMn2}3ɻGS#B:KMJ=#b:,s´9qDZi?jrx d^(k)UejͯS2bjIOsoʼnL_ţ>1ag?*Ez9` ܍n RLhΣ9JCݥsA7_p9dE\P23Drfv'"KկAJhHTt%]j١c( LTu3JV 0MuZF|;v>/Ο>׍Vڞ#<Qfl[oĎ>~mHdǎ;vw7bǎ'-رcǎ;vE͎;vرc^رcǎ;vE͎;vرc^رcǎ;fǎ;vرc/jvرcǎ;fǎ;vرc/jvرcǎ{Qcǎ;vر5;vرcǎ{Qcǎ;vر5;vرcǎٱcǎ;v؋;vرcǎٱcǎ;v؋;vرc^رcǎ;vE͎;vرc^رcǎ;vE͎;vرc^رcǎ;fǎ;vرc/jvرcǎ;fǎ;vرQ2s;;vžFqWEMfcǎ/&3oĎO9~_;vxc_w츋fǎ;vر㥆+jLE͎{ DcOٟ8׳s#wFv{ʦh>HAD‹N07%{=aS3 ͛|֭/9\\׽Gy;fF[|W~7_9\}UO歛|qs_yIs? ܋f^O\޹/|ɛ5ϵI^}`nߺſ_KVz+_G?ʿٟ^Ʋ,1}__e_={ܸqk׮&}_~Ceo|J ?pm/ NE!൯}s?bf<ÔR'.: =}rqcd=|?E|+^tzk]|y/de/K-|ozcG?o7Y=v:=?z^(nxGy=ʻ?>2w7)c >G>==]߽}|[ުc|k_+y]ϓdS~7x {{y ݾ{ӭ٫.s>y3>Gjዾ^̤ .jq6}Qws}ѶO ˺r}se7A^Woγ,Goo׸.` __׼5Df^2~=s| & ޹vռG{xeYhs?v}?@kclhC&F |z\ƋNC|xUD>8\\s/1bpubޟ1X{z=nP?\=Xs׮]iM|A"گ|G x:vˏ^D~F#aw`dUQ|#W>7>; 9,?o~ꇞӟ5y f۷ğ'~'9^^| d_;M~?|o*^ܸq9~k6V>s^s/oǯ;?Iw~?{?ϷoY=[о]7xų^71wG|~!~䑇?w|w#E8<*3:ßN;{>#gn߹_?__e|}wh|!o>9ߋ[oC9w޳6g]3I3Go (E+J_M5X]4Ow=wf#zxn=x~>_wmxG5ǥu6z׻я~wwG꽋^>}}g:^c{ZԀZ~r*8R LܝeY{Gx_/??I^__S3Y:wܡ]N'^WBerO_Y\o}oOBw c >]pg>S$ϧ{0w< =MzZ ?:5ghm.gNfrgH{e]7} o;ׯ?-/nZU\\\ַO3<_*ϞzN~~'Czn?3py<_+g~8ֻz'x?Okk8|~Oe&__i۞YS=H!˿y{_~W?|>ҖqjҧZn?kW|=9NǻXׯ5ѩ3/?GMo~ݛx/ ƷOO}|9Pr:yӛF~~]// "^3=qzC鋿oo~c|=Iܶa/bO>>Ν0wƟ_?S_O{1H?S?ŭ۷ofe\օoo+ӯxɧyפ|j?S[[ʯCd~b0Cڲ,;ЇضW<xxD)1=Lo)[`=05p7eܹ|'׸kW%vfm'Kwyu7j]S>R %<ﻛ?΃7np}8%G'㉓[6~7 VLX6ww+gwN_΃7n-RxC=3<՟g/LNk_Z[>xw^ϳmVfm~UY;ςg?]}?p5ZrCu}!,oz7ܝ)¿e|'wկxN AjZ{f71Ǹ2,7=kTFv{8t}Cv|cʕ*Oyʓfp]n<99Y~M,^Cdjvsl/^LJe˖j*&&&[ !PUwm ^JNTUV8})^Kt022]oAwOLԼ:r.njp/wxk_sy.yܝonU}^K$z:~:, b IDAT9vݬ,~ K)yZOs̼FDJCyydf@w]c9xbF~>o7brr_~ycM7>.艬]N:5ùQ}'|SO=A7GGǹ Y-<0 .>6YFC`bH ('&'v4M[BזO Z "LNL{~*a']z,N)b b (}ooWܷu+_Xr%ys/q]w"E>:Inf>,̌|lN?4: Rʤg?=__o?OHguּRwn3i`@дs6vB 1<켖%kqmTg.?1֬]4(G}.O)Iz{>w#ƀy֬agӦMPUGP! 0߻0=bvr˥4TUr;oVy馛7񊑱1VYC۶lڸ*Fu?gFo~ bd|<645pWنn͌|_e˖-|_`jj~s@ɏ5::ʒ%Kᴖ}rǭ _;w:,BP3o;;&&x[zkzP\~wƢW L>W╼/?腼$o@nlYj_~$"joʙQ=xBrG>Rwl߾qbܳi787|ΒʙNU< 011u0&|H@\?Dul+݀ɉ ^+o`kbrr$rγUk[~9Ë%MgrL_}ke44 +V۶mJƍ麎2Ų@ж-PغuF7ѥɢt<<nF~ _2c$=%~ŋsgB̹cN;XUð:yEqхuV̹\px_BΉN: Or=aLΦpw.]J]׳zjټUejD?5֭[gCLLNpBBccLLL"l߾n!rea˽[ChJi2~}$15K׹e=,YlI*rJT1;ARm1Ǭ-[١9,?|.}3:5Ѷ6oBΙa v(߷삞}O7Wg)O۶رm(oy\SO/"~o|cl,Kb >]ydoAw1rR>/9|^6l@@JbrRJLLh {4}̟s'1VCy+V ق )?-PLqmַ{;뾓znf.r|˖-#Sď/FF17mߎΞ3#{I!v0lBU)nMC]HJ>4<BDif"fcߘa!-裗n]駉 Yd -bӦ{P}xsϙgWαqarjIN֬Y]w ,YN<._xs֭jJ /z 12 Xx1mƍjp>O?{ηtyqg?/lݺu欳É'Oo}ċ>_JnzXw al۾vв`m[LOcV`0z=6ogm۷џ#O߿01ַ0}"1FZr><5X\4 _rNf/w}LMMѶ-cccu͎LAD;c֭Lڎabr;v m;? =`ҥY`gy&6l ư߽{Xe/{9^{-W_}5r W_&n6N=Tnܝ3,Xq Oyʓy{[DtUODK/\wuwUg5pp}t |~O&dj掍`B~8 YgwSj*!.׈ccc~ݺu?K -o~/fƍ@R|Woz3wW]j/?O|z^}kyヒ+x>MSseq=?xϵ<zG)32rʿUU Áָ;W˟{/`H+Ч>[k_X#}s{d+_2wizXγdt'yfa钥UW$A![]x!__v2'Fm˖7%D <ٜ~$5_y׽K],]n _c۶msFX~?O3TuŲ=nklݺSycٛ7:2Or SSS]U֮]w]*w~=5+ϵ׾8xG>aoux͇>aO˯O?x;oorEaϟu/{Kz\Gױj**zMK.ΟeX~%GuOpuk_J˔ &+Hey.vE}hӰ0޷oM.۷o߅{3=4)%Y}"s1OUg}cڵ|o?`0`zz~w{}-SSS d}~) oxü\Sbd|y$53㹗_ڵkٟy&gI‰:7E;11Ag||KIz `Isg҃g :+tO2_^5^K ΅VYMSz4uS˥<[ƼZ;L8,K.>MSbg?0s|)]yqBΉ>u]4ի0찞~27{,O4~s} , ȑ6?8`0(cL̶m䒋CdS}VZʕ+vEitXuzϊ+Xb` 3MKysGb},;j5C2^]z@kn>lYa!ϼ6P㇏ z̗lj,X{Hw+`{Mß|#A,hG}4;XK٣ 9T^D~)u[ s`'Gv=b2wl 6u͙q? >@MJg>Y8^Gveco:,pxRkxJnښǕW^ɕW^9`>d1%SpP06q/~S?tu9,M4h!{[7091؏D۶26>>ːy=,_AvD;61j&Y`ھm+ OLOOa[]x͕na1FȳcV.:m.n6=2fmv`Hlݺч; =ڡbS|%Cp7<RbRqg{u nVp;A:N? ׫W:?Ɗ<>#ϣOzs:oXf3ly)fՕ}Ҿ23ǻH{o>{//pe/uڔb@&sp);o.s楻0_cߒu%#_u131wI&U^֦4(:}ky}Pv9W}-p3,ϰKf>B<(͝u:u>jL g\:ӥŨqdƬƽCarz+#PI.Wk+5vBV# RCDRz*K&zhK-52"#ѺŰ$cQ)T#x!$: th!a:4 KJ65/1Xfd6)9&B1' 7+Bk Qݸ]#0S6;jO<񿢩GT Dv~x TDpHBZjjpTQ) :"%b!SD- BђAYbPUȪ:&(,٨DHnd-$A'ӘԸAsm#ɀ.l>hjSy`d*AT*iC-`YiןM[6e΄ ^OSwN- REΐq2MT1(BB%@TH(c4T'* B/ ʚБsE)vlQdždL{BH3 3NS4)1p$:BFI: X@G~f .A;!Z@C B e6ft[+'{FPSapM d7:R!!6H ќ w%'GmbdӉ(!Rѡ8j! 12 GZ,)BSedfMl/c,5E$BąLFE=a<ҋ\фr > ˼bĂ:&d+iEȱrIRX*L,BҚhH.q砑I"XB 4MP^!V6#fH0q蔜;\k b8V#)eB/m=M0:^('$GIGR?eL̄Oma0 j R^Ąm0zIC@i$V>@ -GРdQjd4eZVu3%x1F+B IY12Yk$@BDHrҠHLcY (3M=-7Z1C,{!vTd7&!(uXjŐx/ь虱0F.baǬ". eO5*LYXAE`B`DBա#QF} b%!%@+P逖LJ2d, w &6$ "$5}֑φx DuZ)zr,s[!2 T@hp9x&zgU3 0 :UN ıP7e`tfCwB"a!TtB$IGm֝$YJB[_g1@oxUPsjiMBBO 2* ׄw؄^P~2thh5G5tR!ޒ]dZOd3F L>kʄdљ30C i!B;d'v!fkjm^p>Wt +̍Ԙ(Q#fX逆dX,#j=+lLV,ʚeL> pOT(#ijKUspRcV l+V,HMkL I(i|r*@ŀF< =􀠸&*+>]H`!׾Ug{_`2ӤR2hΝsj3 E#c]FՀ`XnSbTɒHGis4gLX.$ @ǀ%.LH k M0JH.aiU;4Xኒ$Ui:'W5maa'c-BFȐ[$!G$i,)1]Lz68Ꜭ b@Q*r%9. ,9VAZwL1!uB,5ڵ s7~Ԍ3 )Rp]=<\H!{Ś[Z*jV>s8?Eϕ.:taЀO DɈiaP"\Vt1A H0r#c$ I14]IIޢraE2Y2U `N:,g@Ė1 H;TT2iix^cb'&y ъH4SKaJ쒢 uZaGc!s@2ِB>P P3uIa #0sÀs3%Ӂy@Kq8-PJ{&م"5YAF{ > f:0bM`r[I'/PyFjP/ ~9p뭷~zn6o̺uvªqDE,rGdN7H_NIH"\r֓KOnw זJ,hܦQυ)B;Ud< 2n@} kJ,Iv,' _%/ώbaQI'NQϞ6DDZw z??O}j)NH:PCbb<1k\躎=W\rF25!DBVC erzvl½P>sC?rKkYq?fp3[BWN+'$k<<c;hU*(VJ8@7|;k3XHtRpVG(sHQ$:ٔˆ\ + Hx $rCC_J_HK]1DHPzY%Y)#4MC=:-TVX̊[@ D!x^\ynywb"XD%bT>*U &n >9.]EU %VH@RFg1_xk(ZKØKH &n.FbxkP1HV:%P9g eҀ;<ɼE# -#yx(rcr(,x?iF#t(A2ܔ|x,'> 9w!9 | ..o}ڮ(<p$ie߲6^\D$V D7\Ք@3۰if v=:qu?J1iǘjK1AMAe ( hk2m)uН#CwZL+D?H4m(eG&MVp])1U;`el_S̀jg)UHU4<9a@29cpdqʥ{*՝N̙p4 jDQ'=rAř!-P%~89-N ˇsy]1>C[G- RGM):bryR6u6c&7UHdx5&oYc)'4gIqה%KNdS]:Kz47aVTY4NPOƩg X>Rs7cXꁹM.1>~W*?C?}oKhYAeӪk9d.$-Bϔ%;INNI#WH[9j9fVDJ8d=(,aZ033<؋jV=% I:ZbOb5S FHzd֕dR@̂3lc+7Sxv?3?oo^{*ŽO?ȏ?g>'TzKmjZ 3 s4/ˊ}FYc:' M O }%VcZJp'ɠd$t'k:f0的^H%>*)k{d I/OSyi3KpIsZ\jz9q6h^[[ӮLNf%`ε Nv^6dA]; issd[UtQ:{[RhO3e\0o~bC/J *p`Ijs0'9|v`Z.Fa|ho0/fC۪[[=~=y/T))ɃCiSE5M)l,ي .֟tnӂfVJbHiyR.Iis] 3'"#INʚL&iQFITcgC;iq/ju:o<^9حVX<Ɲz'뙝s2.{oj\y7K's4:iŖhM,ZݓHziB:'FCv IjgLkҒp:1x vK#fS.3UWVāeTHو ya9{,`-ï ?G~WO}ST/l@I+u޹, nՅ 0/E=c!V=s2(5EN pCE-A5?(Q`9\űD~G8kFT-:IS1qoM"4I͜ʝF٣8x+4F0//x;W_}ui#u6g [&rMB˒-:'Iunvi gI K;ctzw61uSC֌:uƱE.XSDk)dI}27gFN=Srb//?|=__k?^.©`I]j$&BLO Y4JS;9puZ_%\i+mEzkFro kdKOfe{ 5y,U k"0TJ %ɿh298QiDĨ'~R9KֱwGۿGN4:A4n̊2 `bx@ƁAىeg+h6 gٙbB/eVl8ew`4 .$`c]ࡗ9:&Fuig ^.8 =AFcI ܧQqU |ۿ۹\.;N7&N٭Om &4Q𼣛xIן']2:~8jPK4:'=)€UdjX5ZiLĈ8D&8Ы3*4&&*+9o^{ XKۣ+Yjo5BA IDATP 8-Yd,YS6'S%gJK[% ]qOS8$FrNH7o䄼)M\5Lqd.)e r =c)hvsv0;k4%F)˝2m1"!vUkQn/{[[꫾M'@FbFKwfOovOqPéދ+h9ٳSlqjBJT`*JxU=od KiŶQH?Kr.,7N;&QkU>3D D`~پJ*x}w{{o*`Y2+ V10wmD+i-49>gn:(;OK`cU/Mt̝ܙ:( 4sF;rF,~^*j/6mL*|^<ilD6z ӸlL;){ 2`/wzޓM%- &%-:|cYp-}KgZioof66ׅ6z _P" At×8od_*7t ,I#˥o MB܍д!'"\:. M$fb\AZ8TW6|rb>cqB#=3 _k/ydIHjMvwkyYF+wո[efy^`1[|:|[Uy^ ZgbYL3fQ`h=\W*M!)"ߕi$}L8*ٺ5@ 푪;l5+ŧM3ԀEsKc?cO$+O~-ݲ96csrb;b,i%O]Dz1^}iݲ/bGBs.}Y_+JنHiTOcM c&sw&.JR/~+0?Z]qzӝv&CƯ1뛶m{Sd=A0ǒ`g#!2 `ke8d:xR M黊F&cQ'}ia16ψ2 3L`5bΡ\o&mi/zi ˃ sK {oRx򕞢.h `C[Wg|Qb듟$ꓸl,jgyiKP iE"?rE&Dz j}PF鄉ZtK}A*7њdlPÛ+l5MJ|kT#kJ>'\O-MS;#uOϝ#o{۞w^Qt});}]^Rz0ֵFT4.kd\QMV,-mP'̮i31c$]L`BLl㎴!i:F! l턉~JSb]ns$'7}7ozc+gSg ؛*THX+2vjkEn2VY`.  {VgǣՕs ;:c.x>GX;:ʁ'wvYԂ&G3Hήfdxȴ㖆RTN8HOirB\R[:/O [t,2IbO:ׄyMJSYC^%ddb ͦM3mMz=[K{(eM,b3ڌ֘M__'>|׼韉+(iDy9}(Wli["٪⾕\_jr) iiUf~|57IY>2,&Y |-% ʦ~)Z{wʻ_PFKB2 Vm9JRu{k M'woo嫿>J{-23n?d& C.{ku0~adhbE8S#a# ڑI@}!N r\S `FZ$UصQ!Va]8 HU0ؾF=~'~w]|O?OOҘIA9Zk,+J.r<9e!Xݏ^YYn2ZЌlشqy.^&c Af#BږsW1%lq6j)iXZAsYy:rG׏؏_r3EA؆դx(iF0mhҥeXFS$`U,OőnClrFVkfhYr U(3x7#9MOfiNOg,Ys'\bJCH?q4`IowlkkRx; j]omOi>Ocdrp7Ҿ՝ci/*.CӺW'e-Wbֽ j\C INcN9tSfwk|QCN"b`L7&;Sȏ9^}U?(Oɧake! AIK$5(, ٟPڬ`49sI ´b Ґ <9 " 좦FD]&ّT:_P:8V`ft{AvsoNQN֌XJ,pgH<ſK/q'Ї>FJ/pOgBI;;2M 1Ȣv߽-gذh7MbAMrKy8QFHuuL`d|˜&~M+4w- n]S&;W^//~ٳgoBLu(]TTSh`z8*NQEgDv8 .* O*4qG#vҙ ]:,hFNF"]G<.>xLgK>eIjr%w}w?o~֡Pq}e$Ü`4ƱxŒut^d3صmSQjuϐsY2su(;8AA<8Tpjwl˖96Z?ha[a%6HhHk,}I2odWoտ?֠ƺ\+k:8sYOwJM MU~.uVaZZs ;j@a"<(?б pFȅa e3vf^BʘkrLӻ36 4e0q[;n4+h>[Tt|M_+o?oc8<%4?MLM5" {bfh~]alMZžC0p;tVLVըӈ<7shfM9_ ^Ww>?|?>1雾w]y;Y3PLJIW1͹0xVx5[%Cam](oԛVعm9 tiʕ ^V^]?W]45ʼHp,VcG|T o;&[*4omz16f'D f:8nMl6(*dHqU|BA&V3+7hײ0vYjR+jW|?o~^g:RVd4A ^/"칑CC* +4Ȅq͠"/O]//NT94'Ӎ0x-'- lmd`;p᤽ưgodQr`gB#'Otdm4-\ VC&*5[Q9h~jb줝eq_NE_ku]Tu7IqD01F_M6 QkoM]n.vf8fQi4,9ԇˡ3@u/Qyvє=d;͆3eZ?reF3N',9L0r Q5(L[11oS̞E>ZU^ ||#ȹ`vՅV'ŎSn_[p ɕEdN["}r[;DP$N; kRu ښHl{%Ҳh^ZQMTStdLsM#3R;ԁŅVWif*pjߜll0-:W̡F"oj©RNq`she$]a\rW0e9dXr}ZЬzpVS|sli'L&\Wab֘~6=eW"J9sS+,MϻV N zr 4>d \|a3/[g<>==DL 9_U Yx$== Ƭ4NlVhJ%Aҕ½h 3Ց&V悌 l<< 'GNKA5|UbF߱Gh9NBJNf& ]^Rj)esķ|AB6q}_{~o '{%F(ݍsYs a[T`}4{QFʶȽ "X9/^#G;mjԛC38iv9.bith`|gMQrgO( lzNTf5(( ^?]TwˉJKy"r;WON5MG>Mels,/Bxo6F%;4QU\@2+hsunUGKqHznjL|c0VF?MI6`,h/[JQ~i#v5"^+f sDp4:l:媘]2Ju(WL_#ϡ%vO%[E+zw~Xmk&m1o'oBUHәXÎ%|NQ5&7΅VV7s305[fK\j$xzˍ&= Rkm/üidP c=}?)"dFwT) jj5kQLM wkͣɳ<99Zn̘ma%$oF*FlTm R7rݚ*r)q0/)jVړ eV ,Fwt@U tJeME>H&+?_f!ib`ז fũ,nzϩQq0p̾45A^򶷱4.˼_ɉ9V<2 ǒ/6Uյ Xl0ﴐtIIF 3oY*,´R3dɩ sgu+mH'!q,lv= n \VgUQu/wys'XzwTe7x|xvҗs㔵䠪L-&͉:iěgpgN60z66VnoWX6tiR6ȺrꑈZ}5Ma= &HtZM1"IXRvRx&$ٰ7 .i _1 szWqbc=bbҚsYkF.{vl>cC;/(chޱHBge)BWA,Y qS8+\my  \+̙4N5ޜ;Iֱ,ۍ6E@ZFڜ4~F"Ε>U˿ B `띰/w.V YWFalx"hҚ9[_itڨ~j͔-̮֤)Jfmd$3Av~-8b(ڶ8W;^j+53OްebF3Rdӄ'ا34㔬L d?H7 W;[Ӵ.[#xw3Kx%=ް1;Ӧ6g%/&#žx6ӬY&r`\q'flLEnvFɅF d)ݹF;lVS.A}Pv]\+Y&)BSs2[g1j6޴ ;_4uI9hkJWq)۔$RETk7X$bKpdKz[ MsUQrUaUhZL̦)b\eP@qf-"0 S|Ul9pyi{:[476I.P'K -c9t;A[Ȣ-kgxu2lh 4ipVG}1",*FkeIgy1;3T(mRvF)Z?Î%Pr\MeJ@۝^rH2&4(I%4+tQ}}9\qW6IR:siTeJv1Z:jJDGU)M|r+\kqENɐ&V`lXAk8d齫'cqd~}o|>Z`8xt M YuOv.B'lV"&gf_Ϧkۘ#MBʆڗud3~zd=A0k{2ȹqk5W3ZՆ,tEK9Lwi\ aw⧤+=p'נ3]"P/bwr!V¡Ɯ|[":Akҍ^Evۀ{(]2>Yf[ ֳj5e6rDk7s)m)Ɛ.]PXBC+, `R\|>c EHdvDmJeuI"$L%I,بt/|v&\+ jIH_[BiK<^ /T4V<3Z_ SQk4EXL}* {q4/,CLjbugӊfԚu`֘X,`6.{wJneA3|Ih#x 4nzjڢU/ diM$ /&aW EĪnj$~\\˘`O_J Vq0,7ިJaVCM7ʅY`*!.v__ MxDo;uqY.{w(!bQЧfL7, ]w<N"^sVϕ+E(av פH0;mUM7k!{'݈:ěYU[2& Xnby1T9JϑM1lvoєT0XDmT rN,"0oI:&:@O o5Ic.2>WQBHvYM IDATjuC27fݴKv >Ailr=1/X6[o,VIP6}Hɼvsצ"'JZzkOv$JonH*)c׶lnLrBKM]W5CVgsRe9(0#k0P( TVo ]I»I/U_:3Mۈ`}W!.yǃ7=#I413zuFRE͢([th&(ےkMzpMLc`\SVD:Vҽ6j8i]ZZ Baۗv,}Lz91T>$x[LS]tAT{%M6`+R8C$ jJJ;uO輝h.9z}) ?[\A37E$P+Ֆ%Oh~&\Z,U'WwHڅ\;lbnUY]ӿ@p l+jt *<<4pO('xIWA~8ghgV=ڡ6WNf ktZNsV*QM"cRlKW= 2`2mak)e0 ZilGh+lwي}viBì}9 8-cr06f)0*d\꘠ɩ$#J΂YWLW;Eݓ՜Vz.Ql~g?MQE5y><$9S4՘Qh}TH7[ȋXv˲]Y: -zaΠ<8I6n O˜Wj(;˒.= s"ƨ[̺yuꙈ =06i)]%+[! Ŗ}IoրV/upRiz#e[G fZ˭\}9d'8+㠯Ȉ~ohhC+̱Exƕ+\L.q=kqMֶ5-I\6C)3*'K/DW%wGg= S< ?cd3MqjJL*ę O#Ԧ/i!WfΝRLfܯB3=ƙJ¢*4(hBӘKT[9Ud]r 9R6A?;^Z_CyƜcIGJ~6 L98Wҹ`&՜ ;Fr:lM5iU\LY׀ܘdO^M}_-j\%DžvgFe*H T2L},@-=Zވ@ΝB1_|یmQ}AԨprMB4%*[%O7gTLnaMuhJUo:Bҟ ;a,s\Z-?/NT&ٓd$WȤ0)9DzsE6Tr5u.F-N Oaz1a`@⠆xULزq-J[PD)Su 09#{tA"EJEF39 \Vܢs ߑt5sΘrWqX'6AYqs Xq+\ FlkµHG6 /&}v wb*< 5KTZ7*sWJ&cѫ.]6<4$Qt%F̤jcM$d>)s:駬"-!h̯w.DXkM.GP'$`6:%Lsieց^IwTb$&i3Mbn$saYF u )=~V&m̤lÑrMGMM '[@jZ|OsE@ۉT ]ŵidp]ȒRlF{fA8y&6;2&aZ6*\Ls_:u´!CFHl]ՙGL#V+W|SͱO,uX a;CB&uEȭw;<Մt., gR6dUvy<ĩ\%M|׳̪[/ /\LI/͝Z8ɋ<.üIm XmҔpQsUh WAZ M?[!lRي ckoܮvX%%0rMZ 8W0m{"i4:Kw qri6^V*[+# 7׸̰ZTSKX D[s,p5E55,2krc4 +NeeOC9وK%kM_f"^Xk_J{EOٛږ]ys>ܾXE*EDQ$'- F`V"p4lrX-YD(bbͽUoNZs109% 6 ģv.ƙJ8[ jܡkɵlDHCdCF~ψ"?(7Ўۻ Vc2G<_i|qs\ԀPϿE4告'jYBWKK'm$~ !zDFjM3CcbH[cfseR&* Rv\ xU`4bp\5<ޢS;˺)&sxXZHMbH V @ cq9l-hj$*ECuJ}ƉX[4.u[ktQc!h UXz$NM?_ۀ9n0X?+Uaybwt!ce͡m7$`C HK?цXDIc}*`ICF#o]E##»ܫCyXpr×[XjHUZ05gBLɬ &T)J@hF|"$nijL Q+Y-Pr2^6t'} MC a`HSHpAQT C2,@$$3Y03rUF{J$m Ġ.qK/MY|EgԆ$zSЖ=5B hrd3&_G(Vc-T Zj4va+F2x;7f$ 29PjrDuCmD-m#uBn`cJ< '0icU=mFE=.&# cȁ;0;b߰B5dNHeUt/$kHsGҧ@KL4gr-hh`ZOp&c(cpZ zr-XE sp_e{79-3Gkcth"U !%8 vd8z f2h*rE|̜POUr){ ޟcpJ9Z-ZEӅtF{K2D{ZOI',vCRע'*JEC"cfkba/]hwf/7=luG]}iCov,٫0j*4_ץ͗9ʌ`#&e{SzAxq6ɨQhqPEiӕ&n8xFmKlSýQ{PR͘V'rsgE6f$SDe6pfurB!$Hy0{Sfi;AQ} waqUޯz@BS~nlbg~,4pH%V(xwi^}L4Μ)K+]Q<?hB;m5|wc>6v:jO"y_ ^7#&PG*o&%Z?{l Xwi ړ[݃㹛[{:+yǾ0[W7^>g#głx1|*LObD2!,G+ Z3R 5Epg0ɩ񬚚`9ȾQs6Dur8QJ_H.k}M#MʱBqLd!I]9Q 2QtFDhBBsg))*4D(-P8jDvlQj[v1P#ȼ4a]92&${p7Rn-nuEzu,-%`k4Lx3c2B6 Lo=3S"hXAڭ|=Pd:C\H Q9q OS_%OtĜhH& c]$VR-Тw1{8'Rsdp޼KRo\u.۔Q07o?(Uz&aS RǩC(R`}DbdoƵ^駸|6 ^dn|xGF+xd1Є}և.hnZ8NS-RΨi8cvv#VRWKƣO7TiHiZsKn FƳ2GZ5Ś3c= ҆ e@ &JJ[*C%h-"jG1P;2IcØ4E1V"ef5GJnop#QL"zh:c(3 f׸ͨ2 Ź{xwrɐ٬b X1w6\Y{Yt,L|~|zrch7ܽ}8Ѐ)l!)ԌYbUQk=CM3몽xS,,A<م:Ҝ&Sx<&wTI:&j-q6k+vY ywpσSLv 8[oZk0WjܟXө5*YsnrӞb f8$n*rH|_QTp,nsI4CKҍЊibo|Q{;Z$&EW;Gk*`JjSFe~;x#-Vŕ)"zqjX[!ՙmCxyb3?!?CK~%\~+ J%fv<)3PȔ y ڗBBʒ1NZN:%ZV݃$) 2ar"Pi[.Ssml&NK*K{;yTԔI8w>ȣU`@)f= EJFn0ϵ3QдqD?l~ !sc]"!Vzcxi0j1tRPq*or u0xVHq0q IDAT+`rV_jz_Ы)_g7F3 j  өi% ͆SW9F7Ys~\8^s޺:D,9|3Pkx]T7>Woa㱶6;WІUvض/CϦCJn^ɵ+o!7"Z]%}j}mFGMЖ׮2q^b]ym{~WN4{3gRn!5Gm r T*\53GO`ez|zW`S{Bp [߂lFZyĴb=@xbB f0CQ#zWtlo:rցU4!7Xxy,QZ lՈmύyý0ۜ&(AC!fL6|WNHF`u<1wZYpD[ɨn(H.CjX]HtOGQ?NEډZ 'HW[Plk!VuCmfS(vf|@S<) 5J$vkiC">G8<;枸\A_NEAtCX㻬tjc4ViaKh9K$ LbeU3XU"i6%ΜǞz7O=a= XN5=̈́kZ5 1A-톏;u1jI#q6V}zCe)00WC|׎+<2qdQ !5@f@ #}= 4Sjކ⩿ ՜.:{rtwe4#pjq.jSG)o]ôF6OgêtU"g_»ΞvoHb\"RIB&vf4Xf}9> q oX3, 3PEMTah #MyW5nsPp؆ s􎘲2͑YP ,ZSn0\?8_ʋI<Qh3k&3͂" > ̸ÿz9G$S8ʡ$23Ni\ kJ"=0+5QTY.v/cs#> 3Uv=̲lԣ{LflIJh%j5*ȌEuD{sĐ/GHr.HoM8dG.Vjz'vȯ2woO]19V%L][(kY鉐!+cY/̥ƭ)!r*d,0"ֶ=":[BwQ6TGO`5 Xa)71ZdwEAiQq2_m$}=ษޚG_sn{*5F9s|졋nѦHq{,VyLLV)se>y֖2Qh뙯m)6ÉN4/Dq`}kbc-// DK%iDXʢZCJ(yl,ڄѷħ.1 ,8'/$9w_jN{e RS |Bx%gǕ+J(5yM6R\R}̄y*lR t|{I޼̧CV{5ҰMk5aMW;: y"`Hyk =5$^%50315r:r۱"-ų/^`Hw`q 2vhvuQl[>cl_m>w."^Ξ, 3ZsZ56uڴOgviY'XLuI`*7+=o1 S߰##Tw[q@w8UdmǞ p tt=E"q!ϯ+L I*ҖH QSRZĬ-dd_3GW"̉GΫo]'&TܡB--hl(4Ox#|k>ԋ1[#5a37,6;V`,1>:ϼ\]Db>S59S-R[I;n,TpF23֓# Xa*!G[5))e2LҠgނIfƻ-,|/Rbu4̘|kCNm?&Zowɣvg(#Zpz15vR7:!P9pKuQ $ gܓ$bHPt53zĿ]:G8:MYf' ֢IaBD p]BGX>++~G>׿ VT ,AZFڋZ4~x4ܘwvoN}UG}5 fT9dFʼnKNowm95D۳ASdI6h:w65f7aξHAMSx$&:clLÛ QmHu*|!mgGxgx`#f@шMWߪ2뢷Ч(f%/S B0{W7qg eBJ߹;J|Hȇdc8ijDM Hvh7f`ܸWh _3:4v&X恃rۈ 3c 峉Ge͉Z3.cqL@(' )9gaXR^*r~/wh68} )kyܸ9sm:]1S^ifl6yְ"8y13s+oeşz|Ad5*SƇ>w+{g{~ N>rsҞSEZ57v?GH]BSalTq ?@ǀI0$x+"{{٘#e**aȈ$Tlj2:ۄ">fl2ÖE332E՘)PÈ6Hkq7>SfEbBkpb,_{)Ɖl8Kpұ8XggrEɋtf"x9w{woz_/'s-A*nMٮsi g5] ?ʯ/nrk~G~sIB GT.y\'=FȺ-r'cD1-e: I,QJvrP04\'J=Xayd % K*cY.~!6mn3ǯe8(e(kښ;~?Q:wݫ\S%o>[_/V~O܏!jlF^#)z`} LXJp['SB;\? 214J}mܧe8&a9v]R0RZ䈆q5n {CIl)퐭"1SuՊަ!LiZ'O;^guƚhM~%TaQ>3|=r'E0l5-όX'&aIaBV'B-Y#f4D c%XSx! lVZAևջ:ɰdICRC=yΰť> OPiP&QR6#wkOr2WE>sam18CpM~{\_9?A΍ZW7l/;"#3V-Hc~qԎ"⟎ljdZ`Iz=+")k$:דt&LBL*W `̵'(vH X|m"zop~[J֫J 6ej-?'?W]>w2';^'!o%]} O}8/k3xO$? Z_&|1(U"dj p[dH{_7oRppxrT4r=eh2{)׿u<[7uo}^Yl$~1>o~YޘopˌEN1¸ӑm? zԢ.`P&K e2?hkdZ>`&$X0uD6SM ӻu4ƻ$ Y7>]55vd&e`x!5pޟxK^y%RrKnٻ|+7w4vo 2W8PpaΩb;g!7ViD}2>ˏ?m/h -0ת2HkID'qRkٓX o;*V 94RX,!24[T*e u-[QC'M|8͊&t`]*f'|>n|W_#oƍ^W޼ ?c[\k7aޟhpm>Gޕy1~*+.O5;iũrW1s!_6Gw\LI(",$N¸, 5MCBiQV\KƠMT<C%B'ޢ\"4'Kk4r./8 HMlhPfDQ[79u_ti?,UR*{ԢG$Z[$Sޗܔ{s"ʼA ӆjjDgF# jtsa<9C^<ܣ *nvY.G<53U1ovYټ`\ U8 _xy"{^-8c\Z 䏠Ԭ}L ^٬9\􅗸@W)*-Kb()@bڳ*>;4Hj$ 0d_O>S͸8TT5$]T[WRXKy8φ%}WٽNOƑ[LfR3[Ӽq9^}MN2\+o~0l}~mg粠\=6Zc2my;/psۗʷ_{Fp6O?_݉W3p&t g z{ʏ|.qw{_^3ѧ|0_Gi//ثENI\rzkŹť÷C3EX%v\{#>mw?@Y-:T7dZD> &EM7Kǐg[4?;1x6C!g%s@?SX ZQ|hɣ:+_3|[/#od[]fbW3.D@3eZ U͗|-6{voK{ϒ7޸ߛnE9 Ξa!BYዼ6\6gޚr.}FAm0f%`]f7E|Iiu#rac}bQ*ކP,K>T==Ef meS!ꂰedA@ A M&Sf8Ӝ==sw媓vXkW.$(}] S< Yׯ蓧^Me]RMkl|@8p!bCsήC]~.^㕷# ̧%+˒3?>|\\deuA%cQTvc0cS1ۡ864#{g5SǤ,bu{mbdHQ%|0xf)M'f'FetUI!)1!HNFA,Vo\Oxٵ=bP?}^*? gZϩLEcRѶ=*.2(]ϳzr>/]>׬F6'lޮ9>G|h4歗_}ez/S/ugܱ%;SD3L`bkW_9Lhu 2- PJm@Iƒ, AH3&$.'Okd'o1KM+JTVs"F5|os ;F?sk{3m[|Uagc7&]L eyzo aƼ[%. 8ص\QrZݽc'7~Yn./-,4@dȐMɦ 9hq%QӆsW!>D:g6C{ٺ'L% }$,ߴ@7-q:ck/[=۟"75ݷ{ď]/锒Yeש5=/Ԫ4Gr5 ]6ol;tB ֝cbcK|rſ77ZcieȰWPd00?㶜+И{];>8$uecjv4N,x@}S'xОycqBL:8&0MSg!c1b &"es{C6)e6~Zq恳DnQHӆtګ˔$ HA}%|| fG (WݙytDoxfsTFUD>phڼ79*6ܼ]?eD/]8zԣLv&8Qd*L0 rfO'ϑeo\B!6DA4>E^$ptXbr"E'UZd2C56|O^'מ_<"Ps^>`6"7ܰ%ҀC#&¹٦i&|/oad Yvޔٌ!/tcϫ&':OTW74.MdJIu=K$4%?)ޜWHv10ZX|@NPQPj#(; k+ܽp`)~EjI( L"Qd<~g|c]}+yccix蠊STf#'𼗌F%>5b>3Fw(ݝSD Jpqi0>px0+['. wxQ~2cckݭ1s&2É .f_Z:(믿tȅ{Gs*QaD@࣏<|Ǟ ~O"&y0)-Q|k2Dɰ(:.iPCl&*rV `(b 9 BSp^W8uz'O0q>}M_"2`f/7O b*"a՜:[NPZ5*Juۄ܌QoT5^-opdA5]P|/<ܯMI?xI'UQMK+ѱI27d -w:ALS(0>jO =Jg/] .ftcFw< F!]A!lG~`OBtrb.Zc'MJ'67&hʤv[QVP 4o8%&H2%2KtXjNT6UG[L2OI?y?b(|'$ #J!m0H"Uy {>{#U³˄v1UH$ -2b/Al諜V٘Td5f͘?SFSO>^hO_x"Y^ZDʤ6r![f;ܾnNI<982t [vt޼t3IG3!!TX Ur89"TsyzI eL{x* PC,pѢOEaSf$^Kn{2QMhPBbHYډ$ Q ޷x_S/y)çdßQng1K:Gd4Cgm> @y>v_<7^bWwKM9 <2bZfHoQtȺ&T䢋K/#NYc0EN؆2Vig/S䆗|WGwFZ3/͑Y 8YC s0=֭1iZ 8:MhT,ym sKuTHRcyrFL+\Ql"+Y+{Xl7ya&zI9Jt\jZ"#t ԆЮ[û@٢)ߺGs,C Ѻnٷw)52XM?">ES>߹ƃK",Sg:Tu7apBiᜣ2Ph{Wh/f i T|B c1Ql/(EOV<$Ge_-f.Jt QUaO5 g`-rD8acÛne;#31D b!o2 ym2p#+PyutrB-VW-Z: !ȌN%)]W/ö1K~-W?}MAe"1P}>>.%^?`3j| umq@l*dA'c{oݿCx㊕N,tFTj +rr&$o*QS:@B{Am0-\JTڌeD-q;/Cn"4B|@R: Q5]'iBB"dM}-1lL5.6bJ09qz/KC`)y3TXlmFomCUN0Mr ~WP׷.6R9.*fHmLf3bG[Xq %hDE +yߦ޴9Y)fyŚl|JliBP8@)E&_xF &w@悕D;7*xhTpרj Zn1Dh)iJ$HBj@pcA%`R H-F*9> !c$)_z ٳ QNyMfg`pռ&yťutA  gʦ&d)܈MMV,/ -$Z`ꆲ6!O )Nw1baq$̧G+lHm9|2M*XeW`N/s1߼ʉyC5qC?_طCr[Ho'}F Y3ws䤃 5SYxtHYP5Ӫw;Sw Ċ^%y݄/x u~>?YAU9X1L!MN01CxG#%ʶ]4RVxq"I!]TV0y$Y G@ϾJ#bš)i $'([eʄc-WPE"%W mH,V (K u< >UX k_#g1_qPTŶ zac~.~]>~ޞP "Z]7TrQV"D#-;C:rtJ HX{e /o:gj7yl_\!{$ ;M#'8.ϺlR@ɏO1PdQ۶:4! 30sdKRNKAzr2z~0ԞՇg}.\- dXmP8"!K@T68DY0caK]҉R+XD4q!Dֺ)i"Yw)J|p+]N]a1Du8yi؝LYW:o[  l]ڔt/bQN(zh`RHRH#Gđ>`CjH2i/=DP(Zn!iVK/oZ^8q:]N?|k GK qmjyC&u`y<"~k tz|:K: #ټvywG Mżh ֗ gbyuLc`; Z5&k*A1?jbtHpieW$:aaZgDVȶ&c$#epr:DH?6 IDAT$o)@t Y ,N"ELM)'QU$Q S?HItI;;P hANlx ! 0u7 BT:-ΧMUp]EZyU;ENi3>iDgs2rAX%!b#HhB,Q˸, 6ɀsԤg * VF ;X _ᑞÚW{i7NQsU~icPt$ASVG%"]$C Ը:u5 :"Agȳ䜀sIm]xC o;Ġx(itM]iӠEMYdR l4xՅ`tn`,7#AJO2걼J#g_XNi;#3`]S׋ DBl>UGc+H6zK{!!D!m!AO I8ytI4@P(IA2Cb9E}yY;llyCU#ME%Rf,BQY2ҠYZwUFAS . JBXX2>UCCe,,^(rO?_2Ⱥti5hB7") -|/FX]d݂>O_@[of?y?ewc > Kȿ,h[$(I4 &akx2@4' Vd!&;"MT;Y5N 7'W]}@>Nx2%ZV!(:K:f2_njf'PjVZ3+{;=991Dy\A.r| n~2{옛\C Y]In Խߝ-,AF(:!SGL e9F!b@hd*Ʒ I !&j %3w'v'ݩ!@ C<2J0DxR?\> T BKOUz aYT4ggޜ]8;;|i:G}h E7S\y챋W/c^+8U$h#@DĜ@0d36g.4$(,R)1AQ s건sn" S6 麌s /5R*DM7&tOF!+L;oK#2r^ϴĘԊ3bk4Mw4gSՔe?o-$NBN>tQu;,?xŴI?#1! L2BɘBҢ#$VXdPKS%;r<%^dXDFe=Ņ29ݰxw0 .DnÍi#!3x?*kBxehb ,ՠ;MS !&>7#CX13p' 8>}c8w FJ={˷cn Y%^pgۇ[йE>|ܝAGX_wQZZ˒a۹@gV'$%!\tZ!M(7w!Ƽc`#ߣzdJ b!{B.P yL?Dx4WSe Ui=C{(mVx7Xvc1ZrQ:C I$o/Qy }P"e>` FRqTQKWBjȤ`q"&8I[!BXY;E7ZL[iTFيd*,]́<)Xf;O4k(:=zζ[A}T+93M(H\<5ZF43>$Qf^αcY:Z +a[o24]1>Os/ b* AcI6$~cMʻ.ѝ>Kc152=1EERA I&b8!K(XZ]SLJ+BA kTDpB8*E{,ψE-E)cY*#DMb[H0%NDqEt0k&JQ9v!p=eNʱA* J(cE+|w6JnNj'^rl"|z' n;H7~:>>:E"1ՊB/"%eh UbHDEFk%&Mldt"ZS%Y '._CIs̩kJt bE jT$Ca:+C5jvщgjlz!U /4#ع3# *(ަԊQw'" "!sh/wo|_E=ޡkA!UA. *01]5 y:\ (i^%H+'} 5y rMy/(β(WKNN qFqUiYOefDk>}%ڼ+ӊ fd12"]2Oc,_;0*Fy8~W35a< f<_o>z| kdnA%)0k Y!1]^&HS ED5*]c%!Y Z$}Ͻ*:B`@2BбYVB3mck| U;5 coaU#sC5TDn':SDY; 77M٘HJK7xzxW~q)*ypD)_&O5nR"! hHR{R'%B4c+jD#P,hr1?'?0{Uh+Yeqbщ{hR(TV8[K_&r2 jE',Yn#F ES%M:Z=+gObdRszp;]T3Ω&xvs< Uu{rJbH&]j{2D ғ!E%rT4jށI#Jq&XK{ /pP 4f6= Hm51-{Øz@wgUzJ݂Vil-F۴N3An$鉈' fLJ=2]jY&%gi}8X.r0٣CQ`*-a bG$m X ]3 !DoQQ^4(!j 5i':z`s`e;`1M{6q"E{tSJiflaS}P Q* eh@BDn4)ina@"Av""ֱQRD-=zPDrHSPYAe,>vx!`5Y/;)$Cid r'Y[vc9o>sn\U`@`H@"xJD(QAH(<)H! l:q [\u7j\Rɼ9k}͘b)ͶR]^;p;B%JeiVZU6A51D49o[wXqUNxgw!c= ţq,  OyHc""c*.!%F)˞]ò, 9Q1HSrpVg7YK޸xƒmxz(=бB#PrzzvF 9gj]M:^&e❼\L·wZfWŀx:Ҥ#VZ05k:84jKq<:r@&ڰTin8ŇQAh\56)Npd#P/xɭ+..v5IuE=x2p/$YQVb)0p؊k_QQ$9!WJ x:;鱹lm '{bwߥyT;`@[zL KXjp[;~ϸsW/(/ܧ73Z82$Ɓ!)ciѴlya @gA +sQ[#hoMHQ;qT+B5idad_3'g;j ؿ?bɸ_0-m0~P䒁52^Fi+SM:~Jv8+ PmO9ZWVr>,}ý- +#f0N݈W#hMQ4vrF-t}ZqssV1 +ݐ⚩\>gY04W۩}q)^M ڔs 0v=xAo ZGM2Qd^OQ?<xW*-qF8"1DƱSƣ/j 3/X#8:ϩsqgǟ*@.] m?|heGg'V/=$?KbuάbGP #JGtvv t}1䀶PKOrs iR3W;ЯOז\Fទ@7jiज़o6oڈfA#2D#Mcw;>wV5дK!^Z SQ&F'y?gu3g7y1ơ'=e^z!" Y81=ŋKTz`̼s{ipSD,+U"&iN@p|C|ԄWSl͍t+!b Mb L w( ‘&n7^%vbAz"͎LK-""qsm6\+>a>G> ~|ݿ|+;({Ud4Ft C,t8PX'1RғsZݗ/yKO3Bi+eD)2u )';nu>g}_Os2l{N BS3b.,iWEg|ȏnn֩}-2FLe?6Π/^!"}֑U0Fo{~='5`)#fFLt IDATj@c{:d(fV)gwp,FWnYhEp}~WNyyOmS\n]i|Oꖕh~<;AC v __a|lk]_;l ̤o 3ÛRWbru 8'j;[e K_BRDm3]_TPm& [}?g]YmʙE~':ԄF ]IN/Jg9[E* :Q˂1pr %coHo!?pù}2{oR__5{B+&kpp&JB|Wq, *YӾ5+aZ5\#AQ[_)~/|> 'vn#o'"CAEIaCo.?`NR gB8yKy٩qحɩ=jd!Pb#gZ]|M|xrs~g~e;m0{Dz[I'C krm^yؚjP2]RH=zGxLJTPIxȨgLVVC`c?CƓw%V@iQ hT e!S=!м!z`ukܸ)U4#5BЁgP%Z$.W8p!o_7x+~%n{Z7"1J,w39Ov, Wwt9\XLT(X젗tz)eQ3;/<_o~cҟ>͚w\05O1#$1c)V 9ꈯ&. S%Ķ@ B)CBv,"~:x~oe˻k< W[EȂ~|8@PZiËv {5;VL' /*"Sq}sg>sdHJ8 丮x0Nni{{R44mz40lFRaޝ\*hz e),| w>6<{ŗ-^j\Wf^4oc"n;;m\.W|o|3E}tX0҄BŃsBn0H9|9Rj#8w]5#U"(B[`0uRt̷+ |kiMyw{Ϝ#eň tYm"Z3i&M0nl6ucx_ BKv ʼTjڐAÁO<8yWÚz:Po?һiJgťh`_6/XѾ "l!UQc_?lO鑙(RbW!30;jo+~՟yӏ=4H|狏>J )$!@ UR:CY.{ ~G.X ,l :Z%I:H˘˱sAy\TPxdF|һbaD#Q>!-uҕiQ|"_ޥeypH^@(UlAlD!*F\5>sg-<{ 6\ ,*|k6qNV#͐1;!ph>#FnS ^]_8gԑCc#۲"LJb+H:k>q83gvz}/ QycA*%h]!F],slh5sjadYHhGI2)6B6'i!tĥlE}C#yr#,4_zOH_m f61]xf7h!YQZJRP'L99m3N1E 7O oQZFg#mqr`KA}DS-pKdY=|jh|7P"?;Z7`6(?9ҷ^i^UeB[6a:;u&ơ'JԀaU*{J<ް^&7ܛ _y6If`4!M$D7(m­;H5RqbIbҌ?wL~b&g &V},.Ɍ Nrn43Bkx,HKVZ7A.rΈ˴e_I}*z0AIߌv5 QAۂyڬD"? Z |轉H=߰1K2EUW16 5؇n`$L Zb!PwUƢSaܹ2GN6k%j*Ce.qA^6Yc?c>LIfP*ؘFRU@wCvr4RVfBUZ^_=. &"v4sjzUu = "QxT.-k)!'+n4p aHU5!) Sbt7Zɵ2Xqp!M $/]R XLj1Dsz}!qi R2'$aqO@3y~O=tE0`H[-=mD15ad }Ci3(} #NW z5#)*)$RIo~hTmT/d z%y$KT%(*SBZCӯ〵.waԀIoTiXV!v<ގTN[8L[ІBiiE*KkΦ:XbCõ+~ O>bš؜_͚8&NO b"6cĥb`X^yo]sFF[zhtX?|TUK kBH|^!`1K.\1,I[uE3`iv,;) PBIkpR0}qG;9R48˘h*71,Ќ3?W5}19]) j͚*A#6,)I8Ţ0\ݿ{djs?脾]HXKBP>/כ!F7wDˌi|91$ R3*M 6C="ZMYu]]_Aj9wZ 1nQ4dx$%S{ʸ;{o0 "OKͼo1}Ȃj36V'&qcburƘa<Ihq`[_WagDh-@8n!L#JZK1ϟoYv.K_Z~gV  UB~m_۩<\fAT}?*a֣&FHO]aQzͿ6z}d6jǑ! (Ĕ1aH)&k򵯼YI!~u3оu>j=rƛ܍J!.K!ÝHD GiM xhKSޚ^ NHtKÏywRp]aӪ+=NyE2=CX!UH@##)/q&_ϼ3o2Ѥ2bsn"Մ%*E SLgU /7+gvz )P id(2M,4` '1WlZ;ThE41@יz60Vq`nD5rɼLyGi#&qqf/hd]9cNQ١ȍ_xcՉKMF}izLw;zPLIf<+73D3N#y%Y`)La?o\zy=9rspԙPb84 fJ-9g!a#YqU2|k6[ k+ V,{e+w…$V8}q2nlnl<~X/%/]N`/4nPCM:01 Hu 5(䕫3~ ^h<̝~R;K?I $ uB-w7xB x^V.?x: bDJCH)Y'D\M*CTĭZ97^W9؆2"Tơ1lc9#*0 5|R'@kݻ 8.v9D'x?D 2vRqT2?O*rQܙ~5rk#<1LDi#)کR1Έ*F#zR)(sG[HdQH Qw~  ǻ!\ad0A3:+_}U83'9DfhaXt}}c*;5K&?~9qb"5mbQ!ëRHcԩ:暎C*.1Qsf^uYOsI[x\A&tCT{4_qcߘaf3P]z-3GCBBW#ftϑkZƯ}.s)V=Vu5f遝\Ku\vWa|@͙Ixw~#ǺZ郶yAHQDc𺱟 ݴ᥻[,6c^iz5O>$ԓ>J'mp"vP]S QtfQ^=c\! !OOjI YXTFVe8JVϊ-DkO%I5,,6N3+ZD3D+)Rj?.v짌+t o;J&/M7D ZQ 7FR@8A]A[eu}mr.̗[ f(z[ JBU$,4(ixor]`}Jo&x)DQciL ь\T*!jfmʶj+ ۥUX[^{=rvy9+:YGC7Lʔ01aZ8bs6nO(y99'>`J]*t ưq `;޸R04SӞe& t&pnTI2ДH@~}\;>1ec2Zd<yq 3L0og\ Ff4;bYs5"SNN#?#+b\[=wIӀJ-LjS;}ټC+>E34P 8 Bԑj;FSz0`E`@ScH^ǵ7сBo_FX6RA8Kp]dژ ͈CBWi]HUvfmxjz/͕dmY]>YWڷA3rb}aR Q(:9Q3[1yc6*&0{J+}#=MݯBc'8߾ҽWU21<7BX0dҍ^;y߬|V$w4)HN 1H+N:i`eJƊ+qf'jld1Voy_ssz (krL,h%UrywQUvuf_-RW orAծ')f5 $(y7NWb*Ƴ}f w;Ufԁ?GܘݩGh0Ům݇F7&:6~+Ė@9BnUXKSo{[OBdH3X6Sl{pǺϿ7YmX+BP^}XF \=;w?ϟW٬+_V[N˩v\z|Pf,(4U-H>(ʂqU ד2V1-Uc1Cž^"l3HF+$ unԷm8 {Bs f´o,OŞ[b}iL̗{xxF:8"@>8=M[qۉ벣i0+6#};b:lMJ(V20"Y0J!\#2I ДjdU-2}2l< {1 qaA>_[/<9;_r,R{E.'U 7xiڈjGegفijس_Ok\- ;$zwI-'wF̑#0S(ЇEMhl2Azxr!amC,Wqo8ځgGS!MlrTCz `v YwfZwo؞+1C4;4z) KF4G[wge豴p".&bj ƀ[żw|i3}E_gO[9HJkKUk%ɿPc%G?dto}:^&'A-/,8 \ôEQl(mf3c7HY&F@C_~w$iմn.ָY;C^}zY繛u{ti%ͼ5{0ٸJjx!ɊecaLiUTuE1aj4ۑjgY.H~BK3>$ cj#dhX0#+*"P]0s6"#$gn[!y2 Zgʑk#&ΠQբHsXgzS-n*&0ڳDJRLjt FNm'ׄ_Zs0| 19x2`6&-nܻw;^Ф{?s>Gzƃ|/V4 nAᮽ~GSW{U3𹯘ٞRvhpz1<5giy&Ijgo>!e5!%ޟ{2XW z'dD40_KCf*aqHpl%At8Gc,K3)oJR؉ЭōgN'77Nq }9/޿r-5í'_w_3{{e<abu+{1螹C79~qϋۙn&~3H# S᫱mP`J˞>oiIfa*xKO4sH(>60)ۮ 7=Θ&αOk9Yzfuen]{ųg{ָ~M^{o'?'6}"#Oszz(4LF'^nhOy >KJə#ʌUл~D0ervRQ:Ě3=kf4#hAHp$1`֙06*k4ZO|;4O$iL0x/an>! A݌y(\_ᒻηp>&?f}c|۾wCEFgLk\brFUK3kOӚt#7yܝ׍xJhY&vV/2X0wFy 8hxR$ra$r9tX$ !9/ y 1XT9ز k'#rkؕ=}HxMlmFR[L {[\꭯竾_p|0#|?p4 IЪ0tZB0ΏYGGd}.:}<4MF.;D[ UX_Ӵa\]řH+tXUpu-eٻHxZX<Ut`.F٧<'< z^^. ƞV-/޻Ն׿jw_w6'n[&o*_M!i<}>}Ʀ)StM>s_0faJHzE ucLmO4T*xidKvϤ/k!aF3ߪ45)Rw;27̍GKhNcUU9cWvӛ+\XX[kr~g;].,|  /~zy4q{<+xVFV+$)*vqpH 3{R|ba[駱Y"%t9_LKS?۹1w_߻8C ݌!L*1 F=@@2k хWXO%PW̐oQNg@ vff$s4W"+ޱs^x䈲ԞRjE=SZ!31 w]r~wŽe ^{ ox-;s/_usr4c{anʎڀw_+ڲ~S4=3ppc ̭-4W2U27(!Uto T4`!C9LÜ?3 I .d+tFJN#HgK4#+\fFXx^xzm뉹XR:KIiź{;qu#/cW|_ߢ$Nn:V;&Q 66wxŚy|'q4t8x5Ч,֔flΡ {l#W YubB=rƚ ;j5UP[#0 a\;akPWuvT[E322G?xj̳!^ n1/!l7WgίxK|kzbmO| x~~78=}Y٢5З*w!#{<7^wA K%g5 >1O{JIq`CSc-ʤG,FhTǁڝFЧc)'*ra͸R$9]k8rq- tB LDŽZ)y|ֱrU6 }gN_&̕_lٖyq^WYsoS^/gs~=<RgE(5ÜF˜VhoL'lˆoH^8J-jbR|-= I@|BF\f1ћ1H5Z|II 9`Gڠ24[8flŹ9T V2sí\;q|p*xE]jʊڶM4pgK\_n_7<_?co{.Ad+R"c M;弭/~*9!1fa<sҰI&DWq}Xh_Ѣ)w$ $#d$yL!YM JEQx ~_LkF>)5чW2Ec̥oh_^{ٖ˳K]Tgu9}`d8iS'><<N^G-,&8| ;*JNqVn4\jƌr(mlQRSѣ?'e C!1#"aH&u(ɳ%[Hji eQ͘G{=P-'j>HB}Mh߈5rY)@lA3&)s#Nj>FNs7|g n5ԥiCkpyنyoG+ΆG~y֚Ԅ {逭w=XQ_H,]H@ H0c>"GXhu ٲ9cGVRq&M Btv X癗p=Չ9`̯9{M$LQW_?}S\4ܗpB)0::`_ŏnM:Y:\]֚ ?ދTth~/p<ҿGՏπyw )J)qzR$pRqaIOLY(92 Ek[ʼGSa@T5gJWHMX`*." 3c1GdZ"{Z3gUYnoiռoY4JI%a߹욋=R99X:> ʝ+nZћ_?wIhx.uC@ꡑp1{'S5Z;eJ RR֨oJbcJN)!4 q=\ALVSqr6o}5}a'YyFo{%o9~ڌmm*քnw< Z8}pͧ?'), )CSX/ttViS,AWcfxPKp\dqYwYMkJyL@w#y@>Cl`9#oQ(IfѫCLh)~PykG_$ԥRTZdJiZ|-\8>8)Ώ1wgnpυgH { Pauh5_] I!ț0W3o2@r{6凾 9o Mnڅ{gϮ8ޱt9:8^ <9^ݘ=P`F5΅. 3x)w􆉒Q,j"PQf:vk P<5Qz $oa R;ePSaAn Y2f'V6ϐkNU}OCIdlMxQ۾qg, ͘IgsY9?r}]^,@Đ৞#*@ t~p,b%ZJނb_JĐb(Cg1B(^:Ph20޻[$ P\2NiYT+ڏСpJĝ-O9G'/V|R! +< o~re8_l{.'/ŕeWKjcvufu2p4f~/QOhj욣:9! 6%z]i3N:'`#˜i2NLg_j+'y@\)T C=RM2dH9h2aO? xx~\mN8gc##:gwhVt rvqŞ~[Y87'Nć#xauRh>s,GT[6li=3@1ΈR OPJ'G`R**kdX}$x5Q"8ͅydu]Ơk=B4BGI`GvFĘ$l@azK#y~[)U8{K'ՏC=BiVp2K\\_\)qrz0PGΰ@gsTf'&FWX1^uǖyC=Cd :I: ZR:SjLL >CԳTC$#|CnHʈb5PGyk^9v;[qxՍoGy?aV᠙9o5]g/6{6=%@__+&u &4uFF=:qq%3VtOc I4s%ң +mN?'Q!ĭ&J|< kF0ǘ6@o:K TMإ=I2 Ї#L> -  bH=Ň1e\i޸a/3Rxq^5yu_~$_O /p\mfg镺;-Ŗ(sH?D既 6ILb ַ8l^g*'/T5lהu'Ĉ_B|Lp-䫢QSDkFdYר KJD/F.^SwtM_5g[[G$|J/;j0{Ji,w/ mט7{<)G&Z_# TJ Qi;vmxS6RPz!Yz{ %[e KPud:7u dD1=i L4i䤤p+̾0@ oښOgW#j|ooͫ>o5?{<<x-B 9 v[v;<3;;QL&&@t xk,>SXlO EM"; Ɏ\::Vq \h/ )QTIx;8>9e?3PK0s"h:9.u{hvDeZfIlw;)Z狾A-[߻ o_=efe?C _SxsI1aGeuIo{܌*ŨPL:lF Zz'zEOс$"Ý?TĻҡ@4W0Aa *q'@C&5nn/p/4Mє!DO lj4Y,yE.#-[˃O'|{+xKy4cKg^<?eZH4PےA(+N FWȯh`՝4J2b@>)EH IDATi"(i j F,Z1eX4*YRw~{%9*szثԡ# F+ח|>|كg}O|Jyo[,!vV')MgG|-_9b\ 6/lL^X Zo a12àdq51OmKfEg ($^0FшbDJ Qk*xfJk8zIg+dɱW@|{y8IamHX;6K؇c>p7LG|٧o,/ |a[XYv_z =a-(7G%MBւ$ImAƨѫF`xXəG,-t`dp`u_MɩP N+(ǴXOH2ZX'Sw8S1pEcV!5ܓ]Qv|bSqݻ#-o>gx~W=iytЍB"X+8=:aBE5!}.i39 |O׺0Y*P;@9W-94&%rD@GRHR0 ,oX#?' K:{HVސ)h{|# pok1{ILzpcz &<r2=IעatS.c෵îZ2}PjjU36MPt~S=rZŚ)7gHh(Թuק.yj|n ,7v%(V}Q{pJ\`)jVwg 7THDASFJ3,`ȄHHFjIR¡n6FwZJgl#:V\bؒ3 M* c}YA['OJj?3}ϿxH';g WcbbcI=. %2msyFR[EI፥X2D5gv;d$ߋ1+%HEA, 2Qg}YC5iHLD^A 5+. }"B׉n"-n$Xμa(y+~=/w߸櫭k%Q}G2sgF5un,#C%qz*}`@VX+ajVm 9AR)ÒaԬOqЫsgAbLf'3DA8iDQ@{P%;T^LOng_4>p|iif8?lRPKZ)P{?zdP3VBtUcA O%t7twsyrR^y˄HdHڲ IvZJ3- ;J&u` Α:>`moVPިL4 Y1 3t yajVfr! 1ӬRgc ##,\k? n%@P-$~A`Wҕ#cì1儗ή6r> CH=NIFHBdv4Y "+R[bRG~hHFN@dHX#@4H٣iĴa56+#Uj Α+suyNJci~w8&NOf`¾{:SLf`'»#!cdj@IT©x(EXVQ%-("?P#I9sp\YL?=&,bA~X} @Rwj74<2ąa{?3 sjJĖd CS" ʐvaT!GǑ> Q*=?>R@OPHZl7Z;Ky[78Ndh,Ieb Xk(ҝdi(53 M1Nhd-&)FQi$%2 e0ZkYi̫^CfFP]Y8qfj T-2%*v=*M\M6RB╾8i抛7V8 Nqsc=qs3fWᚎ1:c"w% I(ۨ?As̠2ٙžhH׀iǫ bd\@&xB<,}$K_2ֆíÔ'ۡ~Xi!a k[aNՁFŊ2ϕZ,xRgZO89VG̖p\jg=f)=Fy2jLV֣ph\$!b r{xh $a9LJ'XO4/z5dzX-%69];fJ:t'L>x@Cz.~fٵhFrXFo^Ii` JmNlS{__'*Q 脣ŋ-tSg<ṨtZ,-nH`>Ɗ)KUgY<˗x9U]u;БkpuZ:5.BX?Lh#Ј)Z%>P hJ︧aأzz:) ߓǾ_RF|p #wh#jƞ(:°ecjH^S% LyMoMa`6_Nyvk$M,ESyYpqձ0'zXm%,my(Sz>{8 90u.C@1T=D'6FNtE=¹C82me,R3|l:czO˚aތ$'=zIY8J*S 5#ҥS,{XvDƊ5Ĵy頙tҴp(#^BV]q+2# 9ʁ;t%+9"ea1 3 .#*ctVx*T 3)q^_}d읒v,h[aDjvTeSUtV $aSD`@DqF} ʦ .(u\@PF H$@ IwzK~ۗtI:38c=@n:} Skqа A,pUƂ !MeJUbD{G (5R@6HPu 6EYU"#MZR.&T$<ۀe aжEp PnW@r IOPIk| J3e!+@ HPP {c( T#\ɤQtSI|+Cur/m=J$.`q01jL‰J$2! 0!@Gl-ZZ w*J1J5"rT3OjD1**V6!"P:Q#SY9b"S%qBK I2ZI4HE'(IT*x2@%XSF{w@6B1QIIX 5l$'",#HiGQU(,}DM^ F54 iDB)X7u]Pҡd SfJL+R"尙" Ĉ-!\L4ALCA"%)")Qa(&|7JR=1im$S)i#P(ԩaah' :( )N|jHlFK(iPVTX/i$㈨YD цEaj* 9.V8PzVV}!BHW@&x1\˂0P'#dD+&<3*&̐ ɲf]# !ʣlL"%UgP@` k1ʨX 5IM 2*!@ G-SC2b)Y7[)y2쵏:wjG*HJBXo!mFHMU D)N T+#dYrxɔ(@AᥦH嚥CV X abhs\sԼG@BHWfCSC@Ƶ (B?g)J.dF("r,1:/KMfH&RB)"CBq)ԆK42 LID\=T$D0le%ޏ:ax/"ZZ d%Q1 sE62F4iJ8PF9F"q2"ŖkR FoJRPzǦ{]kQ*C[6%Uo"d| C4% 9dI5Q5 4-9`i1)x,^Jr׋% oJ nXt-E M@T*ED̚+C#CzW!w.5#ZUe" hY^(K"(JוpŒjԓR"ATm-C昷X ixeP2~]5Q> -"@ކ\ B}Vh5#e1( +3"KD(Ci"8Q D "(ATxc({1B$Iq mާUN6$XuP;: -T1> 6z~pƊ3j#! @s l IIE'XI(Q)"é^@"LQ X|RcwtBp;NhIFz!`%v8eB 4 oʸ jLjK b$) `lH*dB!2U68׷ G!;6 %Qd.a~ Ddhb 'Ȉzj E𠩰AHLmQȆӈ( Dhʵj Ԕ (#'O,F,( {RTX("bQ CVux%C8[\=;oݪ"'GF)Of"H##L6ȇEuQ.A[YE dRc%^F!U^&BT.& ^GMKNpL9k<.ȨOD Ghp}*- R s̑e%Qk3*V$D)BAճ9("Bפ&)!MȠ'xCyq^2fʄMYzP)@J5*aEȂ'D]' !![EP>d6 =( G9^ճի(#t-6  BOAW5KZ`mRH1n E), A ZF!(<6uHP1}t CR? ؐY2lH5kRʇ£!bRPPy+0JM T琾J`T:W Τ-#U*5Hqp(C-D,J׫w#dV!2,uG`h瑱;e#Jʅ YuyTBX6o $DP]`X0d\!+ b5! E,bcU2ԭJRjx2য`H@8#] $jC7 Z#Q*ś1.@&[E,Hm!iO#!063QF$T|8m.ݼ`CF!uJo#Ojx9Q> ֮6 B IDATA&oFB8$`\.IpȺ+X&Jb'A&퐄cT?cU6c)ݣd ei-RI2UH ˜"FؕBHm>(Γ&D!,Z8,qNe[Cҥ8oѶBuXSRaBIapM҆o3d B',dV`k] ds )G2"<^Kll.gȬE^D&TBjR"Ua6C&8e֪7[CV T*AS@q 'ׄ)1adx׮B*Nk2VQ-S8Vd" YZE)bTeJٸL$MWti"i*U\LR" zҺz{"R_We}M'eej!! %7jE"`̸()hX&T)OIns!{$2We{6J*11R+n$8J^JAԳS>52.~Xf&1zQs¿bӣy5槵~[mH-$D={ʯ΢E-]w80?TQyhǮPb#2Ru5Q01Dκy"OҘ~5$Ӛy_ScYn~5ҍ6=I[YfV7zy>~^ֿ8ob;'%㾇u=`_9PH ~ۺ}<2cnp,6-xgﺑfq›߯1;7cbkW FzvP?e!qmpܮg\k&o1Nmh莳ZXj_s論Ǵ6 @s6N !AJVdZ!D}l V9Xve59rȑ#G (lʑ#G9rцH 5SLaśo6$ȑ#G9r5!#L~{OהntO{,G9rW ? x𓵖jm[ FB9֚O^dȑ#ߠ®F>>Jqh a̜:o)O{#G'WJR!9rȱ.FFOvîîK>}뮨5x5kyj-zv{_(bwlиɑ#ڨDYM;#G9ցb7^{N MS~X%zFUe"h+BjZ#ePh9!:GsfUnEX+#k?B۱T)%[c+O5~ԌJ*[cV\̟?9C:G99&kмګ̜9jJettvx"[o|X'G% %KV,_F_onCN b|MqC1Q%fN=4J"{7YB#FWo)X ^Y3fxxNB6r+gcл`8=U<ܳlkݸgq ZiZ%{{;7"ƤQȑc'd +sYӨ8Ti6JPI5֘rk6V 5`R{O)NFKkk(󑥌7;kk>||mݖ`%垚9& 말x1X1a ?>$xhîpckp{__; 흝ԪշjF59r;ZƂ 81ƠrNM<~'`~6Z|m:hi֚n G{C`r.gJfڄITƵ΍oe(108@gG iݒʍ9&((ZzzzZ7~'"ZePJGak >ZZZH=˗!q0iRRi{}㤖Z5n{T*>|Bl2jvZ32R}c hiim!Zz{{qAXl-MSVC)cxx!"c ~* R =Sn=n == ~ }X,rͷBPgF7 pc8x׿B)?}K/㝣ݗ3 Zs}?S,/ Ib\6r׾u&/.\ݎ)]\py/̟ SL٨$1gy_t!+###lwqU c W]y%mF=|(<2œ9R /pͷ̪Uq|AkE{{;8C(KXe9唓W%,Z[oesqBss3nz!j {Z.[*_WhnnRpι"\)3}tnFR\wݧhnna;!X`{inn⍥Ks=759&!/{ȣ%GE1Zk*RJMM(ZS߸!J%89K\i,oQ.IO;8jڸXKK[\pׇZST{}jVδ6a]'!r2J)^x_z)_?Q0TÝR6Nb$IϿկM8#OdhII4<Z k-;dYR4MRJ1STwrG2480ƣ̩η~j pt^YRAT""1TUsL4 c4Q7h>ޚ׏.Z[[BJN=:gg_ޱ;x{zߩ_~Gy;|k_g<_JWr7\p!Y>ryy̟ rSO='xw}wqeD-'tb $IhwXxKAT"21qLXh&T[_nj<|-vE(Z&.b|s.2*z</7t3G}E+CT*7t'OnlZkZ[[9GSS4 k Qciu:S*ZcLX288HT iFQJeY(YRgGvg>iSљf``Cse- E)%<˗/ ). p'/c\wݵdYƩC p?Χ>u=rt K,K{T?!7pn O=7x So8injas8s)J,~>̙Gs ###tMBN<3g.o,%"*ǟps6߂= . -ZDۤvo'pww7vwL( :atWWQF< N9Tf̜{vډ%KrXscRJPSN9D|6kw|p{x vygf̜e_0~c{zm,\"O>$J)~RZ=+O/HcB㏳{9sMiP䨣al\z)8'5ֺ8묳{i$.Z},YwsFC~=?O8sRSNf $z}y ؃?>F cB/W]u g̢ O(9CSO_sm͜ͷ 'lb]vٙ+Ve}I.GRo}sٍC^{3<~9AKd,YBVc``],\"MMMxA|_kJ7;86}p j(a`9#I< ޽\~pq_(j$"]S9s8s6}w(Xp!oMiC89s&|0կhmms2Ym>=+N<8FII'sP(?~w<(?RJf͚ETc ZkJzŅ ̭ܨ7p_ /OdYV[mwzq!DQg>i6|sɏDkkF{1lݶ,]VeCCC?W{gAKk_~.N8$Z9398cgeKxy饗x6_isDqD$!ԧw7W\{-_WX zy߲N;ae}EkV_>oN>;"Yʫ/s) yy䑼+}{pŕWI'ĢE/qq͵6:#8^}=؃/bvo믿R^MMM|V1aN6 !===GFݍsϙC-MY1ɝ #wY048Qc(2>`1'>I5RJ*2_=r ;=?8?~a~CSОyqꩧnpBkɓtMf(5B΅@{{;}}}㋺Ewq'7Yn&?3m4zAN;t޵û8p&ŋ/o>?! a~YワxIMO^{s#]x!iR,$qޱ;?qqǒ$ s.]{-/yR|lZEZ{.QAL9ٛ/,tα٦Q)bJR tEL<~:i0OpUW}c,y)$|#.;TDWpYf'roo*p|~đ8iZㅅ y?km  /7 4V !148Q'эK)+̙3Zۮ5TkÎ;@t onѮhK.!J"zݖY{Ϣ?{1ٳ7IJeːR"d'9DA9y(̛7F? cZ)/spysy;gM7%IbfQZ?.]t1Yv5ۡ}{P)O^.,cm(Oh[/^̦l֚]wuBt<śo3ŸgvwWhnnkJ7Qګ1c &DYJIs챼d E~\}ه,xmk|'׍'MS jnnu0FǼl2k{ΎNN%MSinj"MS6mڸ֚oaLR_=CFefgg'ir޹/~U=p!{,tI|n˯ _qcΜan |i<(04}:saM7CPɝE-ZDE<3L2ѓ$g?w V0<4&~_!Xm h(db1ưtRnf8pBfb ?>vePX5&b ̞ʹil꫷oԩ,Z*SN;wv[^Y2=+G8줧˗K)%7wqUjzkjZe˖7Q--q̳>C?i@mh_75^4=G~sFo&_iN8x1z{foo:CCC8ȡцߏ[' {c߾mTU~'vm&RJz{{{}w|7VqYg½--s,]ޞG6i#0s2I`Vw<=ニa#w!{O>$Z^{5'%[ݻe޿SxxV1H)o~iӘ5VIg}NӦM߿Z>B"νYsnyioogʔ),Z==+Gd5ŋֽx5x?=Zkws7G? qGs'2<03>c=se˗l்KShnnı3!Rv7ZZص7Lgc,>^ĶneXkS[nIKK &n&Z>ye̛;SN9Rvߝc=>}k+F=ԍ;0:\/$DQ{vډG} .9ʕ7]j߷=*?b [)Kt Tյ_s{on!W^yz!$qH?3g}RW]MKK3XVXs碔b=W9Ao '| q,s'?gũF̚5ۏZ'.5\ˏc8ChooO?C>DRaCmkhu][kK=FFƚ'I=+Vhd4tvvсחFKK FIX\.1ӧOo{zz)tuuXbSN 0VkuĴ2i$sP&l2ᐇ֚~MF曍gso0{l1<<B1ׯnPH)yW5k֘g/UtwPȂfˋ9眳*i5o$COO&M82R.3mԵޥA5=yO=T*(ɓ;yWmZj*OtzzVyܰe˘>}:BFFFwwꜣ4M\KfŊxq;8:5\׆15 Oss3Y>}}}}UI&Q.ZC$ BsKaF*E$tֵOsdYF\pQ]1;dph&&O? 'dɒ%c”)Sxccҥ3c ZZXЃttvJg]Hʕ+VUפZr%J!ݍ\Z-Dlf4f̏ j)I޾D֚a:;筯ɤֆŵM65>6EZ"iʕC3u1?44Rw02:::|f IDATxwU3sέaA& v,Qn^"vM`CMkhј؍-0DO%QЈXK[v8^v)Iyzs̙{<33K.3fo/Rp8ñ }k^YB>}v>}ZpE5K.zС/>|[!pp8c}3d`1vѢEbywƎg-g 4p8;B0ZKTZovkԹ/ze'hp|/ݺu _I)R @p8+lra֧x7q8񍉙8eW1f].sp8LYߞ)Wv9ap8㛢0C5kae1 W`JOp8F fueba!)9(Oayoi==ji}ǷǷǶ[Z(Hf$5,RJ,]5kQJE AsK -t?mRJדNqf[~ZSH!Bݻ3h>xztY ܾvyjAቧ5y3~vYl6PS^{Q5}Y2 w,\_^u[e3wlеQx1O=~t !fvX.8 Ƿd %('5)^z%zktܙ3g[oQ>j/VKv#c&HS|YpM7\O} k UUU()۸/| PJH! Ð ֒J&+^c-AD mC&}xazk}~ΝKMM d2}JZӃq3)JSOP[[[9}<ϫ,쥵FA&FkTL;=QcW ZгW/ޞ6 c C Zˌ3xw٫z-]a eQp86L,X?9<?}Ow RJ24=w箻G>'H ]g}ƫS执&Lp1DZ~s5Қ˓Jy9yɧ"p:dS"/*9yϜӟ+c1?cs5{ggTWW3z}8S(Kax'w,T7Fk.O=>GSc#7fCk3_?b … ر?f O.\nG1ŗ0+/CMٔ~oO>E]Ϟ|EX┓~w|\zt'Ogʋc̾P[ہWNe71j]Fl6l(i'~smƛ'gӡl?r$;t?Ǩ]vJj^28yk˖5N)!CctRH&aek !X\_~7zq86LQތqx+31 ߟeyԩGOuu5oBkk+}R?ߌsˍ7MοT*E>}Z3lPV{VʫmԮlV<#qѻ&bW^!H\p8 faée̙L睊0` [oOFD幜;@Ν>]:uHKKk%$t2{S,]T*Uy 74`%͢7ߤg|:wC6ݴr5b+iWCbJ$sD<#:w[oM׮]ÏUWkm4i",dڕ۷O>xscE!m'1YͿ?+j,jZZZijj7I=x7*aqc,B5ޜq8+'T"O1kTWUqA2R,uy9}ٌ/}z\xɥSQ>u&|p!Gwמcrs55ZN9Gy=T f2,Xݻ!xZw" NVW\~T"Ԛݺ<5e˖ѬYZRior4plؤ2ʄ=kLœQUeOt\;R,+$HT>om//xixRU0닲-p|=v%Jfs_t8.a<5*L@en1|sha/K?d( yp8H:BٞZϢ&ԔW,džUzק*$;X(~2s}<*7nMp !uuu,Z+P/W)cL,j\;; W^lFmH$>}Z,jtѡkip8B2RX*.p8ۋrjp|k4Ep8ñ!p8Ƿ6t8m3mwՖ0.:" C<# ï`\.oskW+P(L&yMW-&k7Rj}tkOGky6H+) p8 5vK76L&w{MdY>=&Mfl |zJBoz<{&ol2nv00d޽Yx1<,[nTd8sYhRXkI&\uU lLfa77N;6Ru8z';6 555TtgH :,fbࠁ 0˖+ѡC ٘o]b~6n':t@MZ>C>JTbSnG#J/9ӽ{72 nZ7ײr{FR̙gNࡇի7.jʞ-ښo F" CVXqGy OǎI|lҩ4Z|g?)'Gq Ð OHg꫘={6O̻q`Xkݽמ{R*GavcAyz ŗ^no6#]wW\A.'ͲɠAxy7VX,Ȉ-={{!ӧO'c= `s5Dk͡'gS,eQv꩜y۹w(y睇t1w\)%ӦM㢋~0cLN9dƎNrapJ%^u8 Ǝ6Yu8:xyQGH(fJ%)%?s̛o\A@_X 9ڵ aF>g9~}=#G$Jѭ{jRx\y4g(;XL\x o3gr7 .`g[2rH~x 2!'t>k&NJ* /N:ǟ`_pQGqYgb<ȣNj/c>c9|@_q2ЧOviGol6̛;wۍ PJNIsxa$wΓO>}F ȿzO>:Eaﻏ#Rj%Gud Dʳ>DH{W^yo9.O==~al&x}8@=u?pikʳݔD"G6>ƘH@Xf?@xcYENoB8d%K0rHQXk|/zM{p{1|ȡ̟\Om?9Z1YEF+gB% 1ѝP -ZĐ!C0ƐL$l=???9?)n:%_ N8x&O~.'pB;%Kl2gߊ:#) tҏ<W]yws|)n_ئ )Tl6K:״[/]tʕMkͰCY|y%W-5p8ZŨZt)UUUqGs aa%t]dejwJ1l0կ8kϟ_@;D5s|BϞ=> 2}! NQ]]vmĉɠ,] B>saĈE2 |e˗1%k1KҩS'465H$[qMv8:#)W?c dY9`f[^z%4i2 b;rWJV+wMBVЫFqu'SNeM9ҵ+: immZK"`3r9 (J_x>)%o6{,;#Wj:,zAΝ9cW>t!y_ne˨ЁˠMOcP,TĆ10P,Кk穧baIIΜp=zqgrUW˵~u.HйSgm2n챲P(Oqu{>^<H)I$dYvyg"ÇG3$˭cɵFu(x1hlv\xEt؉>m_LCZg_k8ܟs]'N|Pk-555477WB eQPUUEcc#tD"A.CkM:̀ Ð|>lk-Օ0eQPd28,"R]]]d$IR$RNSS)xFWWRJJ-w"J!FuRFT*Q*"PT*U/z篮c BRWWkk+TDJYXP(ڮ|m+VƼT9ϨP(|>ҶUUUyR*0 pp8_Oyrfڔ⋮A⫞훾2j]q8WhC~Zuep8o (!̙^WBP,6# %%tdQjx3tp8w嫇kW440ot ]C96(MXmw>u Qlp8-֖T_*d*[ո{džޜJЁ%ľk%ذFncC"z]`wp8ǷC#HN8\8džEy?Dq6URdU475{p|8Opl`$Ivu:ucǎt҅v۝>?\ǿ/:uD>_;v\mdÉp|2{'xtre!J)RSN0RV>k~ZxW c- Ѿu \֪VW.WJ_ ?95pĉL8,1H)x(wF)Ess3=~1]vᐃf7f<_;cǎZ#>ʿ/JA|.G^7^gXta=@)żyxGҹ3}<ݻqI'L&}9|ƒzirAxG}ˢX=܋&[Z89sY|0s&oTx9 x;d20N-ZDkk+]tᦛnN`,\{f| `\v\|ɥ\pE\pd2>cvuW~w̝7[ng{w+$;p8A%K;w 7t׿l6é'K/rn1i$ޟFkMP`ڴi={}6ڈ#UW ZzO>EZsŕWrݯN7d [$͟7T*Ÿ#^@y>K.TI=uyjcem?_g̙!hhh`%gSNa- _(H&)Dl%ѡC bRr]l%T*H$B 盙fD2ZZI>R8pp8@j_SWW95;\9f3tP۔(5 IDATl =w~lvq=|"̀y]8cqѫSk!g:K.6xcƌKTbmcp8Qp8A6޸/}R{YfN;#…\xEc}Fo/ȇdѢEՋ|Ç3}\w5~i zɀar뭷pq1idf͚ͰCRj3)^п?F6z4O>D_G,+~r;j-.p8#R)ɤSB0k1(Mnmm<2,\ H$$TV(HRH)1Ɛ#ayS)A@XkIӕYSe!$JS%s6KKssv O*fܹ1~7n,YY} : y\plxUhiisZ"CrHJ%0^2\n2Er@jvqU(E|-U){3gG6q wL)𔇐u8Qp85|r-ͼ,X>r84 la6O>/rp8Zޞ6ZtL}ejjԹ5XcNpv5 8{,ݺucN4йK/,Éb)ƅ߰Ù݇T*+ױ:Qp8]s82N[p88wkm%WAn`k-Zkw73ډcAܹs9}9sh7n})O3fu|+7L&! o~8#l r[m)%'NkAA:NXݾD;:Qp8>SgM*Z1cLr9)A@Ϟ=ܹ3B"ϯl0|vCyҷo_l;Q0m4jjjXx1o1 .Dŋݻ7:ub444>f444P[[K&̙3|͙?>K,.]O>!ѭ[7z #kWn\;c1g1~l 2+_5ld BXdf樣o߾A΋/o5jRsOK.aҥy}QVXMMMs9P6klR̙3I&qsEѵ[7|Cawꫯfҥ̙3vۍ_lV7o.3gdvzL̙392dfb̘1viORӧs[ӥKNJF.2rs+`c`ɒ%L>0 ?Iss3O=z*sr Fˆ#rdH7v,Fge;|- 8[/l s}'k]ZEMݼ5RkekhBcW%|}帶b^~ѥ~mrU+u r}+k+R*o*ڽa~bK>XKvlӊ~+b ﭵAX/RD/.QYR@&[nf}=l1b nV:@AHP*{p!{-|477qïGJɂ JE @!bwO#LrER*8hnjxkJE8yǙp$ Rߏwc uib˭8((TUӧOҙ,˗/駟Ψ]wO2v8*׮ke-x:v;&L&yhJhU"@ +0&D`(!2#_L@`KVjMB0 HϣHC$! V#UԮր RzX!4-$֒5!!L"!i iRE5H!PB)tg5xFD"As2f~7kAo0%<Z.[NϞ=IRhQJGXEx<@Lkrh1j2U c20/_*JRۖ$SHL$x~ yKK MMM?X0d m-63ϸ ysqǡ,`e_Bhzj?7V6 #Ws.dܹ.kPR_[?,zEϖM_O:u*QFӻw]俖@G# O '/DdrEdڌBJ+ &Q8gBuӱ@B!lt-"|fBg1(2KKcJD@B#C,RyD0 []NvA&RX c7i #J`$"'i=jQN^hvmfҤlH onݺ3v~tލ+>˖-:cn6… IVhk)%y̜9:zFPJQW׋>/9tTy 8.k%]v%3ϐLxsソ?No,ts?EJAdY^y~$ӧOUYܹ3;`455Q,535QNJ֒ɤyywڰdbw".\紤 L+2R ʣ$wO@)O"%+=G "PR "m%"$H IR_B$ǒP"*P@J‹~)Ye=Be)a@EIb!AH C⡄ė !VxxBkPB!PDƗ)%*$J$X] II %| )"i(,HQBD-#HHII$ 2AMFVBXK$Ha5B$*'|BFCIQ'I Oe@ JKJϞu\s͵:EPW_*瞻9󨭭eѼ/_v-:u;&o2m4n6jkkX:{;J<?IA$f$ID46,(QFI-acbT\ږ=067̊kPHZKh <(%P&KO{!dD|HP&2RIkQ=#IJ /@4Kդ2>BE&,$bHXw$#D]9-ecm4"RV` C=A(@Hhbe<ذ Tߑ!ň-j` )6B((a:zXXU 5A07l U8 v wQ܃:?s"IH<@OzƈD4& wr A:[!BCR|RNXnᴨMFP)$>rAڥv7MF=鋢8TB#p<£@Oe8Y\ՍZ=PBRP.s;KF-V6sI}DzR5@S_!AEѸ 7ň+*($Jg*)x":\Ѩ4!kKdL[b-d,"=E ]JK0ICl^#B΅vD| xASҝvSchfE#'=O^ktZk{ $p]DKlzZ v$ZQσ ~1IE5DQf"n$Pk|h*.4w\ =4FXC) !2R} IDAT184/f4%Oy AJhBW81xY]vf8-W.7: c)Ǽ'lт<ΕzcD`oȂÒ8x[[Or-#rH/?K/[=FOcem|?4k. A$%}2i좜%mƑЮ ClG'Z C%1jGF8.)MYMĔT,)c/jc_"=לAF^0P&F D03J4t{ ʦeN:$b)S1]:")XD5Z= yb[-jtsKp>-qhOb_+wP6smNegkHIq(PPI[Lא֟.So3ǟkkYR5LR \ip^nI7d"q\i^.,]w8rN-LG<ɬXrjeOfĢ,_ޤ4&{6,o$/}~9 '2:1ܴ ["@ΧGV%w1 2qnLZHo{5 nl褨6I bc0H☜h4I!#"1J {hy8?Q?{-N׆&iZplq; x?L>nףv~+ה_{'嗗c{O%ڄs t45yӛ#w!pc8#v<"s ă=6/[L| /9) >8֢&Fd" /-fފI Cӵ%BRN="so M'6X(=Q<~V O~|\h,Z^z5,D$^Y@<26.`Q\/N+Ŧ9שQ!. ZJ7smAkWPi %y kz•MP\9S5z&2¸XKf"e~!1颢MRU_4(XKQIhFZCn["2Kۈ9HwXN ͋yiҍ$C<^ {Q̄SY_|xp>1vbl4?-:Xh;Cnq0ǵ_E!{n0 yɧ^0?aXͨ'2p?t&hᤁSbkiy|2R3Cny~ApΚK3Ѱ06Z  X:n@XT &phZ"8 OHX6Ϭwv D;EB&rf'xqi`EGsJw[Ji TRPW0FI<,{gJGtjlT 9!$Q:#h.4:ny)JLZQJȁH% LOeK g0Ë.GdWʰ4?;BK9E1'\`zE*.0~F?IJ&Jn)`YEcX'}T^ݵQ8ՑQAUH3֤Ҥ3FV9%IgR9THN#Z:^I}5|gcgx3lȡٳ(h#hѸ#/r?FU_^;qhSԐhc/;QfDx:5Eܛ4Rp9@LgCQp6nn=7wj8:tU "K.I BF( ur'iי*B{ IѼOɤ[^"1[L^ ?Tҩaӕt|s%RdҘUϬ +M)Mu#)ּ>HY:*K5Ryf A0&{̡]0qr̈9 u[%)'"i+FC`x+*hK3C˄pLN)8 WM؂g+'j=)|3ﴮ7#$Ό]Q8r &=v/t:RhvDȠۡ?w>.IZZmsF8h.w+9n+`r7 kL65nHWO}rPlpa2I#JsݰZ0MvPcL$%Ie5mmVgQ:Y(Ԗ0}-^ Sɰ:_I)lSh^e*c傣D9B== }K\|6_(Z4]娸_P-4 X[td5,]$ttiJ"=̥~.˯j }r͐IoKGUp%GKHP\s(;3WJ.~]+L<#'*Sp\)3U D빲bU33%m(T0=FeZ(-ıX|a0&ݓ% ,5 YNW]^tuPFԦD݄Akcm^YZ"l+!27!2ʤjrNu94*9eU`{O:N`)C"}  ~zGahTΩV6V.vƁ9=ݭtw'oD*Sʭ&{R/mKEߴC* O"8\As!< [(7?xbSZ0ݠy*n/@ mhLX+R7zZu:Jd5#϶VZՁc*[-MM gu:lѭ),Gs|n":zlP({hY尥z݆rTą$E1b]tL(X`Ā0nGKK9rb"SZ!7`7y\?t?[p6 gZ{h]]CNf2eGyJc NrT_v*bt+"mO֚;XdbvEii/}eUA ^7nI#5MAVZ."l򒧢ʢn~WRK%㫎ײk+W*RV?S`k\i3s\HfD.ɼ~UPsڢNv).T"t!RLeb$efנ6Ju.TZ-]|ce@KmWo$lweʳTH+Z}q׼lb9lͲ+.D_j@E%ENDhIV:nܦ֪j/6Zk)G'}I0l90j!Y|FXDzK62rF]0{*J+7 =2eXFYe;Fygxn(4g`nyktwW8=vqGmp+^Vsv8r@mYOi#d vw܉[&Ъvq0L-Jv&eb0O^+?Cos!tnph{G邅q0.kghIXT^FyFnKG-6 \|VR'@I۹̅Kz]6kIloe)Nm%AD*97J Jk% [RT-U3K.J|2m+J\Sj +5[c%s35PB({|Mi=wVX{2 Z6_=_5S*z,A|4?>?H;rx&4*0)W{+w)6 1}`>c6N4)lnUgz Hb8#nܖq-~2:Io`> fPXQ6 k%wK_Դ!H4( L#?D%M%vN󑨫2OFsG90a r`k^dDExByqdQ?V-'ܗC"Ұ  qn`܊PlU 5lsO4"#܉-wg*$nFp,dD$[7 C-qtpק9b1bVҲeWAiW#AQ6R+rQٗ]ZVz/q:[3_npXIBisyU^ʼKי•0)墒+L 2@E1Thtږ)!LJ"րfPRZU3EA-F/'rcGA(ҜE%n2@Fٚ;s,ئj)ZXgu\UȥIfrp,xҢISDQK z$|=kTGD+T.c?\ z%rT{T'ܨM=MVYT2O[ʉ|L#_GIYwc>qtKcd=-ᖺZ`j8Bˁܴ3Dt4pXfENvf#YX[=y!ʈɉ`R=ht $ΉPk鑥 -;qwF"iΡȥι4D,yGv {GjBvNIEM;/c>ʉ=PTj’mVCPen- ;Aܹfyjb2@-'O}Ğe{3pw!ϩۙ' gᴖ@ίx+G#:<-Rm"6Ss}dr ١=wÏVIcj*.+te_<Ad9T:2KRŊ̒|^4Y&R`}(ݩ`DfX>]P DJS"k cv9sXHD˜ OhڳGf*H %GәJ8[ pS =,u0jXAեr&Z݈[\-&pkh-@4Ef45GV%8=Ũ%QaX_*AŞڬr& vuw3v`{%=f@l9zUi&(<iB3{Vnl{]Ϙ6R\< . Ug5Or2+] khu['1hvHڍng(ֱ\{Y[Zg>@7*-y|țY%{F$uez;'4L^_~%> \h.0;^xTL+s GpG8W9e.D1^gƹ.ъȟ.9Ȥe6CӊHL ̈́hQy5i ec%sOGOe.ʲ&a%W9]u-yN&_. ͖JIdK,L;FY53.&j+8/_"*0safk9TTIT_-gYJ/3Qw i.N l.Tj'ZR+GesT8Z?ʢ|ƪ٬!Ttf#3IRVS!mЀK' v\uRUcr@6G^@3oOʞBNϪ!AC$N`diahd%zde4C# U46"Z?=hhn.)Â&A2f+H :l+W7KK"ja?^2보9(w45Z|7=3C!l-w GMo{`-7.ZGMR`H-v4#bhi욱^i[!n[7 ,ն=6 IG`tjlP:d!3|0-*ys"tT(*_ƨRcL!o WzjŢ-I%uq+%xEaݤcMV `:WX{f*5S{SDۖJH%n`~$͸"\젮 Y@FVX4{ʟ9ݶ܏6stl.xTQfBqYfze yQm[NDKU!.dxH6;0V3;i/wY URz+^0Q(n1߫:Y9jc_Tr+4zld;٩N6v|x;6\)ډQYQZx3AM}dm&qVOjeCpΞ]tqG!cp\nf#_ótldCߣGS@i@H IDAT9$RmY vwvA8.nGe1c,ҩWtdŘHУߊ]y5O}`2*.)~F*aj QgCTGd%C#,Ե )3‰,EѥVhJ/~Y<=iT~ zjVYa\GvT RـԮtU9^‹/r%Ve2gAe l><_H*.eB*wLFJ)YReɖ r%Jbڗ-,\B%OGRgB4`(t,{d 4QTlVyKz|۲qd摨SsKL$Uּ܃ǚRժ~q;Y8t\uSZPaY"JPnޞUaa>7 OFFnN,aeNdbyNn )~"Ds79QX m'ʏەhգu 1]{~l. M倌r&R@003z\ytn=T;5ijA73󛖍獰 =uWE=`3&eS\rYݧN"ٝ`r8p<W+pdSLx#wEp2HDQVSi$i!#٪\23ƽNE!{e]/t$v$ D0,dBgssYU3i&F_n\,at (aiK @viY7W#|@jz{*}:e5+(V"W/\rz%Ĝ4}AciN̰d[ 2/%:h7";тKF6\=(KT"wY% +U}г=N7/=Bݜ3>.gFzDĞ ve% "B|j))g uVtg\5;="Iy%r=xXi7v@8=7g u 6AJ#poW$5P)8Rdeq^<wIIb'0c7&RRY$S3 =I=[e cj2nkUP:¥kRZ]RPo'aYZ,WqD-â}0NyFDP+Mf H^Iw`Yߐ臦08%̴hi=iv$-F߳;yMܩtPAm!r^OCzJig7\N&pvԒ Ąws%$485!hzݞ)&n߶sm 6уi& iD$7F #+t v a#&X?ͽwC;F>~;=ç9wCOP06)z(}'O.FcC­07QZB̊8H:yV ~ށ0| }Eآ3ds|՘U`5K C+=PEbI6 $o)d-YVIL&hƿKy,MQ ڟ&@]jK{kv+k.O[^zj*Mծ+i.rH<2_h4e%^&%*-*K$XUkqW }:c+?іؗhbڋ*-ͲXf&9Iy 9319EQm엀z=:S [ |WB-E zRJ+z+q ]O+G LwYi]*"{yoZuxJJmn[K6^Qb`csC6P^ѕ/{hh [3PR&JTU b5,uO<!qQvJV)|b`<pV*78OTɯh3vO'`']t^|t"n9uӫnC#l4o(nG-N[c*I RQRtUhe%OwdL9:?r]IDt@ e"a[.KL|O6.ʵʎ3&ڊ )|^HΜJNZ ݉ʪAkd"t=*hLE\bZUyQy?3gg]."\3}XHW>K}kQ͡6e|\ɽ2֧P[ sᦆ(aDoKuD@G& Xr@ ZPH5y +zXHiXmSOx́KI 8GT)Q[ գq霵q#9G@zIAUh"~+`lNern&ȺE9c8h9):ݔ!c]O"|w>;>x!~uzy}m_%|_M|}??o?G~|w_ 5 Bd69tŬgN-uC(x}ޏft~{{qJt]w4&Ё]9p=bt8o8~ʅ}g6~g///8޽{|a_ ?|۷k__.ݻϛf~'>/28;?%wB7̖pɕ5M8yp[&Lk)+Wl܏tnBjqK(whG~^˿9d(]3$KT*nUi6¢o[.]eN+JUHfHtFXwLj$Vuî(fh}4t_ %ļJu9 %тѨ/˂Nq jҊ2e$L=,עe)uqQz)$NfTRꌫ'PaA15ú; jRRn1SXѫ}%OPW[Z<efW%m[" 9"-ZIn;K[7O+s(BK3mF:C8^@~0(,TBK'7 6 ls…zRuZqHJ% cRd K3<v*-cfDo~HLRL ym"8I~$g6=p%gMX]rq3*W 9xC񐮝'P܍ZElx;2&-M'Ǐ|{|/V{_G{c/<|,> F8W<(ŖѶ6jI-]˹# gQΣ>#pԝt ̅/hF-: HPK6"(A,OU k; ,=W* ieMZ1]M*\ofɤ:*rsD2NMWN+Wh<>bYQ4!ZNK=NB BDs0k*pL{v\٣ )4dD-3 pdĹ]MzK+-hlg I͎Wk͑sH4LUC%rNVsBSp˕8 dhKT6Sbe= fYlHY#_WY ftpK)@+ex"Y#5MpJe 3kFd99M‹ҫj  8`l5]!0Zu_^<1mn Ti3H2}Iz>z|'707ΚB8Ӝ!YNHϸ92?1οww__OOO ??kW9>SChΦʽ۳s*hpR &KewH I[rYÀۀ2I{4IJcW`)2QZB9֭~QLsRYS6%Zt<Zv!<0|-n f%ګ7IlQH2'Tp4jyN,{QFl-p?#ht`90#52ۦ#K+%GEƮ-tOlĔ³o),U![:<(aݞ3ڃ& Dv8 z 9+C_+Χڧ% GԯtG3»c_7s}&|//x<,<,߭w'~r v֪OR07"&Zy22w^*ogԸLud!z,O=F>4K5oҜ^B2Wd3$5急2iZ1+ 2=u"T4]1-3EnђOhjackЉZ3f^zrsŪ/J)\998ʒz]3JKT(>' SkMГ ҆ZR4"{!AHt"^*lP,۵BRJʔ _W`WnVL;a{6³raJy`j\9Vp)% iiY9*v*dQBM'U +GhRvy+dLL6R-q)1t,Å-nEyM[{L mVzlj88iOOmc`})r(Fc9| {h,Z8d'esuBr^)؈:9'&OCkNSkjP?!6嘽pv&Cg#n_~iofwhovx5?|^~#|}t;/}Ennn?oeG^01S3?w}w%-u{xC DKs)Ȱ,5E6'TKi(KyUC9[#{[S>{O?4U5V+Pvfd;"V{u`F%<2fL;Y &UwUyܾA%Y-O1 %ZpʍESTM?ey+g,Tא1)PEeO qZy4iZ/DqYGA^-|nB\eGi0 %qIfʅʟDTҡe1Dzc披l]:_@"#9ˡ)JIB^q\F+u}:EڝqQ(F-ϕs:`0R:V lȚ)j OۉC3jP7fn9>ι2m셰@>yISm*!9߰ɑc%c}pV~t31iSQz@n9SN<Gd4N rX@C9$'1zl~ Id{ K$R7x`OuX~󪖂tUÇVrjx㇯Gw4W),95&VvnY/` G%5"r] uZv=h 54D&Tt땟~ y|^3v"J 0%H_>3Yܝy LâP @3ʑKpce_n|6OO4Z%bKWr9?5+" m^<-"Id542jg9fi]Tc lh&)NP3Jە2fd9[kTSYbU~]2NP^o9rE1.Nw ̔\Lmk% i7t Bgs;?ѣѬ I j&;(n(!ϵ97 a3ݳ-]|`"0nh87aHG5E͹iYb$] a߭th7Od/u{ݫnG5X;!IDr'Ohfy5 B[ɿ 晭RKàKP xC{~m_x(GiiIn-?9*k%u'IShZKhܳTiCI1bdIF$B:"U>Z"ܹ߉=\df1j5Q" _ZVx[iE IDATb s 1n# rhdpdE6K\-վ:iBDlrg%w E1(YI8i.diRUSvT8}5B>zjBgD"celm.z%-ֺ*|9޻*]䂃OAE\\ At9Ɉ\D&Ep@ $:);B!&!-MN 6}17.Up/ɲ?\sInN[zT9hr]躢ĐuA:7΢#e}͊hmO]9^`E؊#֒vPŢN4g *yrKXtQ|H c ΎTi&3Þ]jBa4w}C|.'_{n._c=3!4< rϤӹ^è@Цla\H/PIӜG G6XN,+ ,V H@#9!@ %ąh.5d,iR X|ꤙCLBtPS9D^WG?Ӫ%(RIa5:dJ.G}ת5X"?>bkeaUZqO,? V>{C#O1|i戥6W'd#dʋ1qmW#WfݸDVT:_r+jmRwb $::c7|,u7ָX%Xs VYF]v~َ!{Y//yopqqiޗ?cOdLFCEIGxnqvuӀMZjP4v*<Sc/ 0 hhCRZ/n { #u'Vd #K"0~rd]6S6WXR=FǐV,;|M/tO&Ƃi.)J+hYy2m-`)W쐊 iiN`O}xRh}@Q)'-X*7۹Syᐙjîk bvRcF棚#tAzǥKy|I87ytΐۑ\u?$h[w#\pQ_)_] `LM< pǟ|qA ?Wj"W)k)s]WL.vh2*"i[rVp쳭ҍ.pI0a4 VAPnAM_J}ZιI\M ԗ̢ZVVz:٠^X>=Y-QأzCS 3,g!G),۔ާ\L\:bhv1X@h H3T.bKy U;HZW\43zrl /t |qaMypi4j Z2pP]Ks{3"h]F`azxB5GYH WQ6;.b)3D|d| RqiGP.R;0`tLAzNթկY+9`qgM~8M"`!)C`XV,m Es6s.5N<4RV_p;g2ģr]v]нҞ؛Pָ$5C,?/N&>g4ɵz@NJ;14qCxhRuN8[JNdzIx&T"r!rI|s=]SV=~4JvRZ!t],*w,M>dz)؏>(㢺uLx7h[i {~3r<|4+D2h4xBo&Xe$qp+pӧeƞ $KULnu#rgژeEM f%QSHbiy[meJHE%ю JMJEڅԑD.2TkTyiRj,Mශ,3z)9ٹBS ѶڤHoӝڌ#'z;3i{F+#hb!PQ,x ﰄ|Q֒lsg}Ekcy1fo ,tx(CSX@ eoVΥnψdsn3*`d_.J%kʍWgV\L/;؀7E_o^ h4 d8' Z-RoQ95s=4r0%/?c|Z3|'{>e?_ݻ>z|ɗ| p2/Z|'"«_ZOOPaq85.JUsC2d!k&C 4;ܴ+:n adp` FQT h5(eeAg5=ݳDT4 Oci6KM"Ћb߹7A2KgWjh 0L uN(I-- ʭhFT_Em$0RF rkj]C:wTCTUhϒ)d4I!= l\U0юd Q3F)Q::-MӈmحBa.spKNMo@1}7zUлf1 wKWD!#hVn; ިdAHU13W%A,ni,jlTWhGWu57Fy6WKIiR[ ðLJ:y5 LBeZud)!aG@ ;CHKU( k&hbJ˃&&p *Pfk>5x]l ;܋gUNU&ze3&RQ]O;4yҍڒNIɐln龤\5"dh42F לh̞"ϕz &TSi`0bIoEj}Ij֮P9Dy]#MUq{!P.d}NGU]gՁV}gIVw%t 0 Iq.6FyUZȵ:*<;3j}n,H|e)js[.UPZڲH_"#}'!ŤI\]fi*Qj)4קUbET#ϼKLx ItߊE.z{<+>h4 %ɿlEF;{ 3nJH+tG2u1܌K/.Jwm و"ބr$7R[S}{ytʼnF;nuD\mc-/WٶOp-WxU Nc]]Ukk>OO_g~gr}繨*WWWww;/"___r~~i8(I*pNQX<]֢hudno ѿJHOFmϸ#O\wG wuX}fO-|9;a: eWZ#Z ?`;!bY ɾ2U4T8u<򋵧_7 18X zfϔVdoyKH J[FDQޛڐȱIEVq )ebL'hi%m6AhH OhO(!U:VA#pF5+9,Jϒ"Oם=naF@1e 腌3ɹQťhGlGTUl]vIVDbuNfPO/[ha \FnDk@c$G&iFfFADYnOA>޲q0؈LȉH2d-E8eS.`5OHȞטtܠ{&ܭ lKEofKK^v:MxG+lE2̴ڿ62*9S0rt\a,vN4_V)K]j,qFt ]uم 5'Y\__Wq(#^ ?9\o]׼7۾Od#Y?c Ff4U_j{yk_{ Aoo}_˿=8? 7N}2J^ctġk?7'G~^[//䋞j9jna^%{pۚ+:Xq 7":'ˡ|%}/nK1Mӈ{&#r%WeOs94S(5IZVk;^P0* CE.ugH][%n 7/& 7GO(Oo k&]K7{hϒ,;z>;T#'Kրݧe"̴$O,2Q?E% .Ek ne>d|XIL1J*"DoYX!<,EuO B: ;oFyM4׶8S11љ] 12yEEQ)o/R'8%ΪO_H|+ hGaWMSD f9aGg Z"Д&Y̫rT*]s`X3 ,Tsk3p$EFu)STe%[I eҥ"arN}5߹݊Zr: kzd<~/Y˛V^|ΠI hہMlh4Lw4VCb10A`$0f]Avk 9=O$G܉h9{k9w@4uTKy"?zn65w|˷,u=qqq~ᩧ{MM\^^O==5/9ooCo?Cox_[˿WoFuG9u-LTDҗ⛾EUy[~?-PM$>a.q:p*Zx]Fee+1nO]qhkC|pCJU2Z/B[=K½jGC|ЄWknrc ը}#Y"_01KP$0/1pӒZpg&=in[U m*Y-}&hM)N/꩖WjGQrW[nc԰m0OҩfIõTGWȌ̍$!r N˔Lh9Yi%e%`/w$z)|mrfzeQKv+_յ%6,ߏ>jN: n޲A*!<}(*"3_.<"w <mȐȎ9c:/Rjk"%ٶ:h[dh40kZEGM*R$h20;6Q&UlϴނEYʘLYIc#R8yH ,21ShÇXLt>=Nxz0b2؜ joMFzc%M1^VCXA%_#X&x첕18.; b"lCh9% +Jgt%ٹq6<àkk])4!o|#ߊN'"/Oe\\?z?Gx^V}GU齳, ??|a]w0'?A8u|>?>[@!_0^x֑n4sBΤyT}uoAQ^,f-iYCwc3*+=`Ow~\/`ѺsOLhޱ«V@zi3X/(ޖ*V%"Q^<ׅlP9"7@HT-0Ow4ebh/Jw íJ wgT.x*V"=& 6<"Hz.=x3A:cdj˶zRT<?t֟Wp*!3%4H6̺ n2'fgPwCOL2Xg}NϬ᱕n?IC}?H{5 {fZsdV?FU ,8̓a5JHLlss@Vfd~S%7:eDFhXt,iP@|MM!'R{]CL*mҳL=ci% 'wgHƂSܗYңe-ᛛ6#BF>*m=N 1"QlS~>`cD F76k{3d"ٳ98"d}zGų;qr:˥?yc8RU.//_UsW~Nj_[_{: M^< v1͸l 8 :(jn &r ;q$]A9Epć|:4լJ+{}LֺUғS!i2XH.JhRL 0&?8%մ*ѡTV0'SeJ`y7y{ܖD4s!#%:xZFÜS}Jm*.>9YGzcjuا),=EltپPf1bn&9*w9v(Y%m5xUYdopdSfIhڪ}dz!A-0}p)R鵹*.Dr0q%8RQ8zTmG E(ϓ,U?N/q^Bqܠ0,oπVyzzF‰RX%˵`ު12XZ }Jښ wriF1D8kh2)w.3 b t`g-_ڦL ͋=M2ar!zBiZ;e}ꊊ!cХZvN=Y.,ZK9JHoxj>>>k>imb XQiTy RUzFJMkBvhjIݗ9(2 wGw/>c?VET ;# z4Ly7NuIUdfnmeݫ%J+ONi=| ^Y8uЄ440CGҧC YP J"\l6zQnhIhrM8Y4ZZSQx;1X3{rV>w;dddd(9YZA@2#׃[+;3jkwnE ƒ3T vB69 &$P9Yu,;,qպ4RɛYhqȶrKͫǼ% Ӆ(hm*!1iZM۽=92MvVFŲ,L ߳a\ [ _ Q;!80|0D3iey#X8{~z};L5F&VL:7z^1x#nD4z%ZDl,l :(˞ӽE5'f,AleUKUW$׽k鉊/l[[O|e4Y'޳j6*bzY.pDaPtT[\I(fC4!WteY=w6{%!AeJ2=._+Cp^Q*-sڳX@ybe .SA2i36AK]LwzwKdMvEk0Ag-fnF1, =M%u5DrS[7 s[ڈz%w{vO^Vrk-y?1)B17E7=h[ 'M*"eanp@z# uKf} LZP`.NSRў?|kdV7&=q}dԶ  3%# };OOW֦Ȟ [bk%e8Oz3 m`n,8=ە}Y<uL#jΑMK4NVFXz-Ꞹ MI07ۀW)[hE2Iaw= P;W\=/cl{BuD XoEma8lZ}H5:XUMY4ȕznERJP tIbGڤc!N0 Њ*Ggd!Uk#;Ojs{&a&^1 rl,j&2\^COHS-1_FEC hGՔ\U_m395fOU^ {lncRjQf:sJ~sC) !Ko1>r܁mt2&'58 jd\,2Ny9[&P3`4ﰺzmGS6b (Y 24*@`7J֑J̩rtKm:e7t%4KRRIq5d<ƩaI6C: g,8ɉa mO,5%k&T#;2|`gdyb9εʅa4ZkhZYZrcأe)O=KO+^J~w~׼;>>돻C O?xէ$~&ק;Axc)=KuM]? uLEj{k#֚eYX}/|YyFn~ZfQ)ʨ֥@}ӧzi%Xiձ^@uwωX\%# 31{NEjiJ<[oD*jlrXӢsl\?@ᒍQi#M;4VjhIE#vVmoWd9UL4XܔIpzeͮ?oJ9xܾ /U~9m58q\w2*=dюt(`riRUT>%sm$E X31r`)1{ W^W|Ӳ+c|u $RX6V0]1"NM n/Xt MQH gɺrQ"}E,DzV+ѳO2طG-84 (vs RRZسu,E1@t܎WEJ&>m_*~[c_O_ee21rز1dtj>r#XqG:f[VȑiڭҌRdT ۹)-Ѣ:4 R$m9c6"Zn9ր<v\˳rg WX9,Y7Z~fi%;ԙÒ{1f3xصru”SSE!nDI U'VHNhYs ҸA+ @ =jvi*l2DB{Ђ)6 K\FVOtFli6A[ d=7W#͗$Wq DX [&1vUeQq"|Ed8'<_7,,j͸3 wVdc×AK:ʕ.\|ؤ]nx O]Dg>OX}J4Lݥ m lmgDWW浯+_J=L4s -jVVOD˴R .UdiU 5GZ0L0)CtW\^)va$s%Iӭ’)fl?AYnɢOx4Z%d6O7zż&Zf\2(nQie!͍¨,QxuzO?t7%))9کQH4[ viv dDcT3=<̏) isK s#RV3_]h#9E9~,km|^<44oD*ϱ ~CgdjI`jCsPa&IιMY#1o3`.7ƩmZ[]'q48B ,HJyJҰD(8۳!ޗOٳq'5? Fyd`qVǓ%etG2 Wp:Hr;u)0%!XƂ n0BNnP1ʧV^x34{F[8#E[\jOf?Rp C:Y{Bsc q9!֤Z3rv֤%'HnTRT# D%d26"z2LLGX( s'ˏJwE+cva5鎔l1GFRbiՎA"m% q/rOKAZ#u@ t:;ǙbǞ_UIvTBN³@dO:BST1dHTif 2Ԥ6.UMvMۭ[I~diZ Y}eUhc*0T7MI564,uA*ZX* /_ڴLz,X: vBϜC9bcXndmX^"F$m%" T4^q`RV ;M]D.74 wV6z";-= \o;瀓l\i'LAwԜ;#NeddYgN}<`k{qHs@/5))*+DiVp,n=5LIgwFEqh=JeOk>{,=N 4𱱔*N<.;vd> G+{z`Uͳl3)̂H,2NG hat}Mf0٦ZWvrX8 Wb041T"bP5&7_Xw^QLѫ+}H1 B0%o$W,~Kn==[CoKcAӢZ ;-rÚrU[C*4&FfA%uҦ2EOU0Z4o*q]FzBjЅ 6Tr͔T . '@hݹ,K*cҢTi~>Dφv^)ZxT܂ |fܨ.v|<̓)K/Qxٚ Yq4;u}iǎl"0rL HeHx @(R2DA ( i;_t]]9yk=TC:. A=g<^u.P11wު>:DXJ'#U撇f+kAU$gTARCĴS5IΪTw?lֿ͜tlߛ(#l\U*zO37#;yr w^Jl$, m-oͶc乡ө7KSd\ğg_Gd̐%'Нp=x3YFgc=&gȱYtўِUgF_rf.tهݴ}~M9#ѿl=c'RS'磩@*Iw'pQ6%1l:mSN7 ǮJ4W16`k9JQ@8Av/1rY\&Jn |\e>ULq`ƀA 6KHI6dAF+rF:nƾNȇZɳWd1Ǹ}oz|+cd42'{˘zqI?*mf(%#0|#K&71[cρ8C׏׏Dɝ97m? }779v Ԗi*nd3k]ĚwEʾ{̇mƍ“;̧Gj6[{F*y6)LcǹsP4LB9e쬙8뢎V1gcPh`}j, b??{rp~??rj(^VRl.0;:Ӻn8aHF։eL50`u?B˩`t3WKq44Sv%wz`5㼱U|oFZ@Fm1w9$,LaۧG6M FjX-~dNFJ}}#v}XU- T7= νKo2!=8~hAD({jԙwi彵,U1g>sy+s 93YyZۃWk0r);99uI~}7[5?[ 9dq9WRJ ZL`ns$eOH3efdw0;~~־lY.:vlyvo3"{cTSI~CyB(5[yˏX1}iҏ.aZeԔ%*c<7}[VAhݦ}-٥=灕tѸuAt wżܛD#ej0<`4C3}p.Z"u=pN+eKN,h?O4>ז|Wuȴb[Z } ߋm\'xQ7l`iu0V ׾?oIy/|wj7zSFQdmjW֤-HgR~6PLxM`?'±Xp%ZԘ=~uVHϰIƽa),[oŭ)-3THn%Wpe05^0q%FՍ#^Z6<-mpɺ()T5U8ظM}OYׯ }qŰ4ZJȬQ7gi V^,/E3ڧ5F~ l0Z]%̴E8t:H(6^y1Qx"e2NEKm#'tmEs$Ec :qfpdJ>K3Qu)X7S :=-n$\i-ռgVdFI:Ct3VvYgͶ/`mj4?kH6c{5Ft>R¹o聴.2s(ESn"ˎɁAt [ sŘ3BK[ xTGL3mى;%)w(*zqPff'lCQ3޺YiծrY,7t 0N,cgK~gzj!FCF:m%a({j'͹:tm:`& BrxA"וywd+DEK1|.>䉼8G}2[CNGHJ"`b;mb9nz/HsniĀQBmWw* e]8C`a(}_pFmmӊ{ fmFeeuaV>؎+ WocJ| OAz[* ww?L e ˘an %{x&PA_JtyN"0u[,u-O[:Ɛ%z9 +vkE6G2x2Jl{Zmf'ۛSم8ų1xM%#-oK ʪ̰qY!-!910<<y@nI_mttqSc 5]Y9FȻe2j|ZكBol  .Mh6Q!M{j `rAa`1I,uJ9$y8Md\VgHܟ ~31Qơp^t^0-h^t1e.umru6/KWrʔ2ôu)8?cc0stS6 9 C(Q{nY0BM,zJ`2^FaZw0mhx`i݈_3a\2!0s„y`^1ȺqnnT1kŋ, { Bwm o7(ɣ6!6 f.yp[Mqpu$[?xW~*/0jY%bLLf GҺu;8ʹz XC71J'%Gqyi\^>p;~!9#_uh[@ ^dv΍{/t_v .y&3,;o6ΒGgofoDjưi(gDaQM`*"{>]T:,ꅚbL.IO9Y9OֵZ ҿ1xż<`̃Ge?7FN98. ^\A=4t򚌱a<0'{$]?~~=~@~RhO #)9 ^"B6oDhuL~8*i 46ur?c?#7lzMy=l 3cH٬O:Y^̔\5\.Et7ʟA8HjZ#=OI0ڨt;ujnT̶Jf22<{`!S#5Sv_>ϯrnRb fGL(Q͜1q'dx \7=w g+Qu[-t)"ֽS!X%[ Yf?c<2:Lm >*Ah.: Etw.Xn2f N'گSۧj2z'Wﳍu:JhbܓMF*o#S.߸oUҬt?@ʉ5Yۘ|{\ҕ )i0gJ&I83}1d:$ 61;$Ag7TlׁFNyjk*Gyl 9 EhHa Ҷnv?0s<wUհޫZ'υl=4g>ml\g`e{ӊwgjaQ^⩍ _uŷb &7?$!א nIklKaRֈm:\=mjoߚt0C2xyp1l1;h5]>Lu1 Su(W'++Y3O4z[qF?]zy3'~W ַş__~Z}>1\J{o},بve\QM{\W s+y[^@I`wE \7wO\W6ȹ :bYwPJbM=Ct(h}F& T=佨f˜xs%Hĵ8ԡ%+Rpr2FC:.Xy#:oRX\F0k뾦iM~𑞽oL~({ʅdŶ쓉 y"GK+cՈ\67ܼ^z[1Ώ5gN=-<Ki@Xn &nvʖ6DdUM6=\7XzJ,Ǔ~o 6joRSƒhe4lqM[)5R+)4;ǾЖDNI'(Sudg[MY3?k0b$d԰)=i{فevcqiO/OMbEU DOfÕr*ڳ91$>ffΨL%rGj{Jsb$X"`)0'g2pI {_fN}A^[aB8 ძL`C qN0<>~ 'TۺޡƜW*|_g~g7ȷm~Gٟ孷znjjă-^r"HWdPGʇvdB:s#Uw~ޕ y1vʓh IDATS ! d_c_rjjm?5XA6YqYA9Sz3tY|j$1M%}4f}ڏQqyȳAѯS5-m,8M{Iώ#nFB紘~ I@/FGz{L0e"5\n2DueŨ@8Q$á4g~N4k\H Ӑ+\,mgn.Gh}V:;LŨ6͟u#xgwqwd8C6Q!PJLl 'Pt4zhL`2[r~:f[|މs|Kiҿ<*h8s5YHc PF3ō˶;rgŎf|us:e^ȍ`Q4F-RٮRվ PTx-̍9Ӗd0(f\vlZ>Μ_!?"Wzz~~/<==W/#ECs?Gt1a\*MׅN:c±6TgQʱc4Xy%GAbp\Wc_;-X) k bUԼL{.C ZZX`D*WQCJ6HQSqnīFyuYOܕO4P*LՖÃP2I-3@jZF.HN4P5ofx*{s6Û9:zUk<1zQXMfM ɔgUY:u/U݇Mc):k)GZo$Ww ZǑSzf,9R&,AՓ,Kɒ?ȇƒav[ET{ ų)y.HmA^VwoMBlcNd0%["7f ӗ& m^6',ll}Yp=J`ASgAQ\؈tβP+A\ 5@A}vbq+[:V>v!ExqԀ5ȵm4%/ q2#VZ6oC\֛W+Rԝ`1UUҞ<;n.H=q qiOnOK 1'%k<|OYWW30~|ȏ~3oͿ uwCMXگo2+FɦGql8\'T{]mBFoko|$ޑyw(7m\f4C,gPǚ7=Xjj{*q5YX7vrau|%J:.g'AEF#PC0F(Vʆkjr#gy7+c83y'rWג22"G8/SRjOCDÃȝaCv;ziEɢv8 UĔ~Y+cݱ 74Ք<່;db{ /ivDopvq(`4[|_pULE?%;k?z¶\._7^O?e _W~7/}K:>_Wzux`NOlIx#X0`bd<`|mL#aa:9怕Lj*uQ](Sv1n)d""XK/??-/qG^K̲.ʜ\ln*;`%!:֧?0R\Q*|b!s7X%1`d1Uѫ!BOhȡHא#yxZC8EPJJ$?R".G;y' <(.ʔ,dGq58}E+m&3©y&߫+pwfغbSgE6({o6gwuqdWwfrI9Gx6 ׫q(9+]o ^+DW{tPm8`avx_B$+Mg˻%L F4lMuw{kPB}"mvL[W:N͉P:*,mǹcxd=T1ln4Fs&ΘDrl\" 7}+Q;6"PYߣ_,2V&[c<_6ʑB녺-͸VRO(|_KPk|[?ɯx?13x7LZ1LDj>.>PC1Oj\2}"4FS,.rGge7X5VrlW4~ b xKEL ]v.V]$Y}<'_[|h|8:BVK?GoGR~` \}Xg')'Zo䌙8oJ SK79%OjYtJaW%C_9[;M3F3_xYG F]yohoEޠ; 4p}RxV{h>߿L0Hg龕NtSv1(Z u'#;aSuIsNdO':#?;ڔ+2/ٽGg zo/i`'IZ1U)X-wxd o9HPD;%W!Z:ʈmJw9\]r'G`^h)t[%oKo$>dFqp2NZ{ lo_@nWmp[Rt#=~n'cs5YlnxX%k_T\Z)ݨcK!u00o[oo&_׹nT۶q^y뭷xxx`w=o_?~gק ^嬨HfûF8ژq,晌ȁ``-mp0іSP.t wߠ>{ï1<,^%(>G,:`j}B&]ghtjCI`*l: +ZLr#G3fs&AG*x#TX*TKu[K{te C~&3[ 2[(uusQDž^Z!H;RSFKQ҆:{^|dzbI#&:n6'Z}?;d޴Hg-9eIj9Azu{ =N4䨎g\]T_7fx6dYߍגm]MCn[j6-idˤ:UU#B,ֵ*U4ꫲ;g{sdoJ!Tk-mdzΖsK=TL֡aTԣ`s5\çO>V )亷d(ңr.͌ݟ>xffᤆBv,| ~O6*lc&q#PƘ+\pSzmjtxcOy|O_d&7/_vۉX|;oog>YC^J}N{fTBQ2J}̼ͱg)sdAr*R抖wbgߓ[G{sۤgǶQѦW1gg0ksU۠[ۉn)U7WC1jp(=;S6zk k z,<^ʼnn8{4Ppy&mu)-k:'wU@2SMڪe0r<vf;;>ͦ\=ux lFiSF:5{_3d1i>BdRLޓl_O(TXWHdCEչN(@TA}[hg;SVZpWgWz4ua?c'~?c?s >zT}OypqW5 lIP-k͜Ŧs$;~E€m*V]EF$ZT1jb{pyfb4=FuӴ[WV~JdD_UV B A u_Y zx❬@&\\\秇*Ȗ49f)u 6q AW kA7A; 2jZսO傿A~, ioܚDk2<-l4#:oٻj ︶~1N֧n  g٩Ak^]p%hrsS)d|6EQp(iXݓ$Jҙ yL_m<xQ՛1TMQb>{;&bbr<h.˃Y)XsiY7LAwgX]=e)>f)Ppm2z34ŚrZ8\ۅIR 9hTÁil;QA.zlREKZ7g2̆^'k f^ֻ<Z;k^/lj[T1p<1XޟOZ~ϻkd$Gio۶z-=}|S1 IFQS #{Ž, 'Cgk'$NIsCTΘF_ކ~xܙ 'L] "mSf~, (MMv%yZ{sTL F)6- ='+dg۩x0Ѷef2[ V|f\e눷9=/q*R'?cǽ#̖N Uo3 *&<Cdo LKT,"V|J&GKWs@p֭3fx֛-;4Ix&"6Ӯ =ac=\oLJԖ֚ Pyfޥ>ciFW)hTyM S!BVF+.X(6ɥA8g瑡)W)? unG<~%R" Uj&K2w 6òhz,HOb-ԘS`8oەcKqVҀFƦ- 93'1\2`0?Zl,Js5x8-jkc/ɸ2la{;/W9v1Ys`n2BGWUWA+Es*OSq^,ԧYm%xv԰!޾Jb˃e惙$.^5gU{lkl%1xE`> ?cT2fZJ gN8sy 왽gF뒞,Ŵm6YÕJaCXX{6cDse?HYŬjJBpk#m1k6vtdeXZe7kǴrp{y^glc85xBS-k&莨 H厼2}W];(NQZؘ:m'w#so_ߴh*SH]+;J7"y*'4ޣ獣dfuv7-l [βykJpK]%aUEz_/X wzy j!OHkQ[&_ϛ{&0XJḱH vqeƦCLIx^$k`?ms2Bpz<D#SюԃA֒U}uX CaDmC(A"}RەGbL`>*< ɋY UG%NƵ#_OF:ް2'jnY̑aycyl-x*7\m0؂KMNM }ݛxLw#օ+O{M@|.n6|3rrkq1AUP&q FSsWmyG; u:-QBҁnV eZ$I )ac190&X.2i7Pj"styi5t/yʛٓLj܉ţ8$VUBLW `,"Eۦ:SeND7WFώ21z=ڲ=*m6 ~>F5͸R'q2Bb,|,.g%o-`(ПMGix!Mi72tn4C{QΈ+YOgoz#0GxɄ`MqZh5ZqvPmon0{`zyo# l"cBwzG?H6 ͫ<,Ů@ÐwON6sU}nK6)!3wS=| 3iWxGŕt-Tipu^d2{v1#F>]Wᵚl&mԡ:0,w<+:%Tr75LUKZC4 (!F66r1w!z(>L%y<^a&#sZB;9eOw| ,6浘d΋,KV7ҝ;* ^<~w>c Kk^<7znpl,%U" IDAT%/ + &96 E@?B笫0R0: c;n<𒱜5?v}kŚIՍQFm6`Uc?owWo}_C_?~4_7xsd7Kc#{(:ZSd'<=u7U.iE (SU3X>1'(|]qX+ESx.P"%cqIfPg>F4J-ErP^:u,Oѿ;L7qx޸$rOÃ`,yp<$# *B9ssFu|:. ytw_= 9'C6z }{h?6zS} ߉˽J޵kMweܥNSj_Qst2 ^ I{ڄ`WuV]6+YUzC:AM;ű6<_--ȃS[yGAI?fg^L]O$v/ ^w=M.cᒄ# Ӻ ?[_q޻ں^}1\kc0`jǴ@ B@DM J*[[JőR%EJB @*h")q slls?.1>D`,Q"Olcלs}xWJg ${Ed4hAxZFj !G} 3({IbGdJ]^}4!#^j0ߠɈl'#e)2a)f[U㵌0\JgTvc{)1v Ti!;"5fbx2ov]D|X;$?;"!Yv|Y;CNJʬꝪf0*R"*o wp+vɘJT(,he=aw5imл%M-~d&kE&*jrFV ^=7%A.ṛK׽*0]Us+)]' Ґs߰kw} vwjZKL%7E"lJ.x#`^ siɷ7b%= NQXh2M)>sqTgj<cTPeŨRR<ͭ,zT,5ʈ?5M),O85e܊G wz(s[u`>7qRWL2E,~xd`>gH,S: gQYBFNi…CIT@!?zo"_dK&e1¨5KۧzP|̈́W@^!oR+nӞ"<ۻ5ጱ2h7{qzJWH6E mT G'\za]w9;;C$q\4`n rrBÞrc/u$6b9%c]1>v@, ,"g&bWb1<յYPjG1$`gg=8oB* ~SCn<|ҹusqRZv0gGQQ*Beݢ=a(89Ԩe"q5σa[y:fQd|e0kiE1lH=dU]O":/U Qa;ރc3 %0dHhK+"e5z|e{5l>rҏ2cb֩VH$3u8Bcjgob یz*' Y4B|f( DQ#>ZӢ MCW;ﻟ;S=)6j3Zw a2iP4&uˢF1R!Ȩ!eAЋGkR$%vаNRR g{Zp| %H1W4k>ޡ1֠ ~ۘfQlz3W)`;Ny p0b '7-h9TW Famƚ+1TܧPR }bY.;FdƇYdTv,?H1zJ%wW:u: CIwy]^PcVzLaqcs3lmdU9)D;7nJр" zxEFD KzE~Cc{>([VKb#L{GHTBVW0MfyccĊ?OVyijjܐp:/޺#tSSʖlɪ V'Ah1ub3`^5I4F^SD1_t$8t,iK¸j{QBHvK҂>~S3rбkq9z}{n(j5L#]LYa[T=I:(hzd@|J} %7&sUJDzٛaV䳘8o"Ql飃jP-iQ $-e}2htQtiiw7Md%wzcd 8qx2=r>N1dt1ߢA!9eL|]ZL1s i ` ~~Bq?ap?+ KnvYdig{D390 QdVhŐn1&+mF naNjòPBFJ.Dѫ1ҝZeZ>CD7ٕ451$0:FœYE(Yju6Tjb{CW:<7֙lqh^qs 5j&|XדÎ%b?ĪE#4ShxrC5aaMĂ5@ieo)sH Jxp& pͭ>CzTKxɮRF*AbPUjf>0JKi+y$|`ʐ̖"'DCxB4N(&H: 7b}#"K0rOv-ɾ:!{TQf̑Wx j}tNzk9wzM(BܽخY$#2!2(bdp ,]Q 6iL10ˆ>2'T- S j0׆DXH;3À+[Ңjh'xN vP\RY>;Z?;:+](mhe@l. %L{qxh*G2v}Ba .gO-\{ Ψ'D61tNI9EkDH:R ( qo%H" vq1ovflYJ[S|^AXB1fW{ :(aH,glN#aIm"Sc%t|(#^ēk`ЊghUukF&cBE&Frh3GVJnoJlO< S v$!w=)Rɼ%X0iRέɾISlo&N)I0*JL3 ΐ؆0f >i)<%]C=RT;4(L D iD}?ē?n9UIs_.&0aK{oeylW=e(&-C I{+"l=mԌͻw|F'/ F"Fk"kD׼ ܁q ނ,3Ja&a{>(zl G",:Y<ә%*,ܐb}/GsAщQP`euE"N/^fJmP&mFWW4um.I(N[L]Cu#ғ_bl''Z ̝{H,^*En[6+'|#>xwǢ,rpnW?![( jc2\[uѲ => >h0 31΄(֒ <˝Yf5-(`=^W m@ݰIV]y.w814X Dl}ߘ;eET)C"N%1TMx8:R.A-&)aϘwbRÛܘdFu6y-_,m3"*P1B9)`PY)#۾(2eLeyazހ:=E:h?MJ$vH͌<+l/RAf u\J$,0l\0d&H>{! C5<]>& 9opzg5)7cccnɮzHfT0''a&8X~Yg=*N;7`z(zd#רClBa6K[=H'&@.wY8y5"Q`8Ղ;K?@Z^叢/oғ<C-bgS5,VT>aSEG06o=*2%8*Z"6>M`ȔAfY[P< KYYJGY[8-,s0 TLSe멽9v <װ3w 5k5L;(tǺQL~j?HcUZJR4`fu嵏>l\])1Rc{'5MmsVZ&܂ӣb/xrXdcGy~RҒ56\jHVR a$%e$of bl,LoIH{uyEBCJnyr ,avs`"Vx%V |oZ>>~&|Z9zKtUH6AXk`넏y.Eꐔ̜ p5FFkI VCx{H5:`&[heKe6k8-iwaS&vcLV鋲v Tr(klY1=G1o:뻘}З/K +q8rnU|EqڄzuU^FwFHBQŘe~ZW^ý1< 9LfO(VnI*R;oȄAB)&š}J EeG5&1 "qM;}D1=R0{D+6.V|(J ВLV^y-2VDDK4{%L"Qf1&RAo%aPy6EdzK!dɯ)wMZz/2.(H=AK8blK>-3,jΒ]ngۿp?}sKB\3Zy[AZAw B+I]"oXj1z&(QkڈTK?jPOWm\_@&eY^Fe,* M)];o뼴b9߭Q3v8_<0o~uy ,` /;vW>:LmtDh49Ro&L,Ǒ TTthX괎Jl6:Acf֐A5 JPRI)29~Y';UrM>u&g\vG}7n|FLJ;E-%Lʗ^+ 0]R1 ro%<Ìa*j+ٞ`:C{^FW0&zO>[*ˢ<׉[gܥK-D_DF=[>#H~$c&"B}[&px SvbGۊ&04|a5oQlIx-7S/sYg~J5me,CEa8_}Xg'?982uX|}/IDcmOF{P( )""e騄WG\xRndNPDE'9팞e/mLĀB$BXNc}6/.Wa^:> w6+J(m庈㣄l*6Bk:@ʶnحφ0*C0g 5=h* !Qk%Z;1g\Zl#?5Mտ׸}6׮]͛|7}ӟ?(j?qvvvj5 5tohYhREGLXa"qi~yJB+(t5kx(h)y22H4ls_EgKs"KyG ̻ ԂI2cDr]Ipƕ s z8ڿqՅ6\\#g4. @JJ\"R(hBc6پ AG^ۏX`J2oD%IWP@g9mPIυSvM9Gsvv5YEq v3Z5bevPNJuJVsi$|>j }` :ΑQ09J z0li 0ð]tD=[xS/ݦ<2;X)0@ȎOSFl23O1{"ܴgy˴:_%~V"wV3OOy>)k ;&t31 TCWgxGنu2\&Zc5bc/5, klי>d򱠺bO^+*3K)|7-ZYiSJ9l\("6Wy)_hR33w,dOu1g\Rxy]^饿OXPowt @- nFx8fE#ޱ2Fv9}XGZOqlB U(e.}efiJfcD1yC0FϣS=h,D!4S܌Mʐ}8Ҭe8o sXS`GUaFwKV Zk &Qjk"k"EDX.22n߉k%DAR(!IURv{oJlc<;rP1 SO000 q7!P󀵹6Jb`$}$X\Ǔ)ތ{8G:@142G3+2'zO<Y.gmbY9[.ڠoѰbEBRD?jrbVFoAdQi]i۠ke(VWl(ޕ,7 -]흳m3l蝋+&A cs.,>X~ʺ>-`g}_|xupv kI>>?~O&cmL@+x-A1ϦL*">FE-r}yR?2?p;kGVc 8n|]Cw+ũΡl ο?vK)yC0__o;?? 'Wv>7~#/"}{ws ?C?s?\__8|+|w}KW|W>/·s?s~y]^g'3eTtDkns 0zm^(j4Wm/} |D"EJETVǺ0 z R}X^4ZMqRh1y6T|p_Hlv-\Ny]+d[F6zj'/Q\rc41(=l~<@sO$+\'9v[38:0'KMS oOQ}5/af7l-1̉`ֱ15LV7A{ra'VCNeM,TMe cE|۾yWuUrX{v,568!f6 3_bpYacfpnS뿘|r6ZסNOwv>Og:NDgE*b%c( Daj*c}ddzgAXڠon8Tv8Ej ;{mD)T:BRa#=kR"[tjh;"Ǹܸ~+|0yz'ek8x;8we]oy;_w{y߯a0A ُpG_(o{Qҷsڵ'{<ԸpZ2sA\K7Tq^صΝ>zvEB8 BFSl64aRˠ1o|~XzHC kH<^"=,95Q`j-:terL"gb˖"F*VV/i |'|QQ,.эq㆏LqCu k_ ̈́*6 |"u(4مUjqS7\+=aWcu⯺FEnr aq̨Qqa)T~45)ԍJH3gyЧ2+ByĶ#eFFHrҒ gG3M=ٰ=c'LRQ: h?']Nr~qJkFSX9e_BLK~P 2$h&uGlB7I/D? R$Q y7<ΗYqt(gw_sN ]8(JJN7&Y)\4:փF*~-sYPnIڟj@yc/Nu~};-_?>;ɏ؏qNOCVNNN/~1zի7wnO'}~!WNN?ȭ[yzU͛C{?ԸdX)LC!8+PUB3_ e "_Lt /L'Ճ[fzY*i1DO_WfhES H#^Do5;]Zx 9ʰ05)hRaIӰĆcx y 8I2)́ b+ Dj_K0QԌ|{ iwa1dp1 W89WK[ (`@; ahtj Bo1daJtl-M#¯,(ufE@2Ils,c 9iUsqm)_WSu q}W] _o;DG!UH rry'}3mqg6nӥPJtn&9)EU7 Qǥv0 g|]hC7=sq$Db,y^Z^CK>>.@P f^-FypAgx_-(6kbOƵRUȉS=fK/}/YQJ靏~l>1&}׿hhJEm Sﴓӽb *ҙvĭ:B۝n`RtvXZQW&m]gIV48OFJl %෋tyǷ~+_w}0]t\jcXӏ=!\)wzF[.EkK$=#**H T웣8Ȁ G4< ֕"'2"B<σu(]mY@Ǟ}B aB-R;aG[|܁:RQ$J~) + :g[-CPOUWUHܡx 1̰hYdy bC$QcR'RBhڮE->KjajuHʊѨG'&̑;iT#J=&YOϡ=\w}/?O޹< hT)G3F #9qѳDiLs91`x_eBBz7oU~-ZNk總1?ףIEqeǫP 9n9!ؠ6SZ`B1 3tMg0 ogu21Mp]>o~n/DeSr2OL^U-E$>PQ-R\YG 0Ji=/!#a#F7CNW5<]Hr(Zp*z~I̍7n#O}fqu?|?_u_ϕ+\.6?_N)_e_·_5[ğww|+|#6ұ~/ef|﻾oo 7o~X,ڥLL7 C@ 1gfp&uh!%=4t0y& WAg٥2m!:;ŧWcON{ 5aƑZM,oe`(7=F׊rl/1UckR$'tkdQL:5ZLPzPq}ÐN)=e)uvL~4"A5Hr4Q)؈fh=J+5=Ͷ6i"zXf=YAR WœXH*H*0a SLB22I7EQiVNa  FB0avSɕhM̈t9 2U7>j&V[a[m|G{|Oov/^z]9lBb (]gVZ68I!8uoeX rr~Οo5v1$>گ3piNx/l[hB,R/K7sU+@FhߙQDjȘ;[b[bwK> tCc/Vv\dg~In/Ǿ\}pK[:^7-6Ef]g\A=ZK},=e☉;/`RMIsFźSJzF <.SE4k ΘJ?c 7? 3 {=ē3My{x#aݢ[V_ A~η/Sk勿yu]*~=E˧blqg|́E$r*Qdėe(arAW/i4ȆH,V0()$5x4,Sd2msϰ UXgC{qZY5*/g3쀪y,Zs\j(!+ x<yk~X޶ qlhGښfy>u~#?!zW._勇\eCG5o1-xӯF4&$L*ED.{{^Ϳ`6`G.a%DC89K+'~1熊S%͹Q"cm Q$YO25|emտwwrhC &uK Y.+#Wc!){! 57$Oj.0g4hH'SI#C5 D${UWO0$@,~LDL{{tIa9f(/t5Đ=kb)sR_b!C6Xnj g~q,=-?wBdHq%Ξ׿?OqҒedtu'R=NQ7vCuӮl Y}Od^ ;ⓑu%[P>tmhAjA#`wNwY(kSk(ָ"N>#Y PQh 7T }OӐn lo?L|Acw!gHh QꄘVФׂH 6ڰ&8~櫵(^mOͱU JZ҈b-m_CUyy~~e ;)$ ЊM+!5N`-a"L_סoH ebyC&Xi&h3$9øjBMһ !PNILlj b%S\3i a$$u +4 9j;ebpj.E;?\EZel5ZiRT[ l^}o ЩB*Dv1 m.O"JS7e牂)y 2 D-6x:I`6 l  ݛٛ߃䪒nvP.q<0'vww8i•Gpǹ9n9Z}\'."3Rgy_Ń>u)iuh dfBqs]w>dNq4= =;XY]^qG>v\U)9l9cQǁqBB+:*io&T= `f<9j ɡZY|譲ڄ2Y"`zF<h vNk3yInekRv|Lys!-$1c\P*Cb $`l"UnfL2X"Eχtqb7/?nv[_~k!~CMOEhS:-4+=զ`h4=I`mBk#F" sBQfF+,LMӇV*_/iS(xpuE-0%#rSQ%p+wX1BM (D@YHu >"GLN m{<o^`:4U%8ΠBz3; p {s >ϙ g8+{{,׭W=v*sނ>)۔I7⢷Ҋ6jfl!cC`aLcМcV'jMj\أDɞmSs'jݴc};*[ls3&Th킇_Cf^,_wdA'EJgj}§ʅBx(Ξa{2bi4"!Un6rY\.yYj{O‚VsyM^O"QlOC; ~6#lyÛcovz)ov%WK.2c]uyRBXMvH)zq7NbjrYk 3 ՑId 056>@&\dU8=aspM:DN _|ٷ> sZ2L* Ĥ VPVT/=-Tf#9d# mOmIx#EBf 7ziL"G՚ݽ=~~5\sȹCܫ/yqr,Sg;J$Rj bA';-&KFhIFwE{TBJ'*Ұ` MCOfs>LoLBGjk]VD䙒`#Rq2/7ʖ+-B4D*܇M:J187(ʤF۝;TΟmSIݜP\K2 zhl{Z0Vzvt׽UG,N#xMGϽIIG'{.w?h/c"ğ} |9s_<*Fg1tc!'Zg`,Si. L8δ >_V&*- 7 ηi(3`0)uUmCر@ 1zYÂ@ٱh?uuwS8fuDSŕ=Ei:%F"V:̄V gEbdBKl,T2j(U@R;a)?5ܞovo&4 N&/2җ:wMVG7_kfʙf_6rlh'qpgI Qe櫔,L"oue LզH;0m1&HN 3e5UH+)[]D8h?lЅ;UFR?HC0L0vdlX4*H#QdqĚ)I%32C'ܾz&?S5C0Yt>٭S%YVݸUx^cg Isg:p#TxħC\ 0laXyXgw,8)μ^S~&yUQRC=}D vLV ntNǎ:qIX(btQI&̤xhM(a6m11惥Nm*HC٠Zxo{c)w\Fk7`N8\_ [:ؙ͘N@3a0]UF e @*쳳3eל|^V6ahE}|ɧ3ܷ#=n1%?:N"A`.HkvCB)9ZVSfzb-aF40rŔ*ƁnYJdτk1o^O^)V08Z& ?x]7M쒙RAXFLgJg͇>fs)ڽ WM[QkSR Ƙ{bEK ,9jсSjz~cH 6A_E@OgRI\h!_!%'5jDp4alt:u ZK Q jL"XI<$r)VfIvafvQ cH`uuQZDҼ Xш1IiBVH&+v4UIM aL+չA,{X 4BvaN.G &!L $56"㗰zp`#CFؐz3U:8,ZX(jd z ]uŮ O`vjw07x=*bP뉳 |7>s|mIF:<| >g;}0vuԊFxꅑOS!Ǝ"i H-P@d20_.Őʋ K,dÍ)$Z6@of\?2H`h ,ilRHV($C,Ah,#o0 Ռ\P9RM`Wu~_u!V-I?KOu@Ҙr1D&' IwqFbuA& b'%,eA`:{Zs7pgоC CԼx5(!gj׋ŜDYK! @K[EZ1.89)6 \rћ@&k(Ks7!K&7,F+!+4 db(j^ P|eaъutzd}Z%t n,%%ME 9`:@"U@8 Ɖn܂vR1,dEL3xhlP6upCBx]HIH)#ma(Ƶ[^5u㮻즆nU}ဝSb811"]>Ϫ<7|C|ͣwȕ˙3=6vu 7B,;Ξs~Zaer`9bvtnҗ1a Jlm Ӵx@Uj7c'Ahflwт2CFަImaVPw`$ReO.&!'?4vs yܹqGca|(2.qّ6E@[o`8>x [#Aa DNqk>S"P'@Fbv 1#=|n7&76/z|!~~}%GG;ur:K-ڣMhC"iT,`U6'ZMZ<@,#-x;Jc쒉T A! >KO<Ω,$"(OJh0G4RfcC&1evS8<0ZW| V&3T" ScVְ6:|N2Ydf[Ǥ~orfMi4_D@FA lNw?Fk (  v=bAB!)~!EZb [p7:+A{œxkbLU-J~ ՁJorB-}9(c ͆3'mjBzq͉s||NecOAmc醱\`_b/r8 gvϳ6zQh k_!t)0N͍̈5 &BZqpX%٬7\t/no-fwl6OۯBŋo[[t \:OU M K YA6Z I$;J 0u*S_H huq2yE)tsh4 $&qtxCPi$ԛqD"BsXԭ @!L+2Պͭ٢(Jjk1"[m6 k"n FDoHM, .W?~3O? Df!7|G?MwbvΟ8^'4VڸO !O·[>cq[wگ??ϥK>SO=OOs?st]w)~Wflbo;w}Mz1%36QZ33}Z V١ߓm2F͡+ XAl Z dEg5~K֭6P%9PtN5qp SV=X­z頓v2*d̉&2,-R̦M%ʖ& bV' DI45rX0JY 20#exɫ֟'>iMsN:- ¶'lG8>;9w5q9XE u19B(>!EB;xgaras޳F᛻7Kms]f%pP6dTZY1ʺfX,sfm68SƝ:\O$xc&gaj ^ f+5 ,ggO~s9Z%{i+=˥`z/];F(/\M IJGTFJ-XYo/oя,Ғu"(T}˙rx ׯָtcM:8½DxUx[eu}Ɵ|pj;ӌ|e,{dvFM#ĄMmS!茨"M eO&fvM&XaZ)̴2얻kT'Q+9r.d3؝JbN0Vt)(U]zmaԜ@;GէX9דg9u!:r,-j{~A2EB]'Gc,4!MhiTqFECaAL~YbZA__vS?S<Ӽ)VZk?}?q~SB~r~}AEno~^W0]E?ΕJ'5UP &mQ(4:5,B oLթD( Vf5`H6YC@> dotkW$ QRh$%hmqHVU*N,"L ~0t!R45'56r(D3eD1*քE+LTfs5x$$oRN* I3bwO~\bUu3MtsWUJֹ0 !|۾8A7š4ΙrM610UثF i{PZm;}Lgxq6|b6TYٖh"TФ0̺DD}"WpE"!¤ۈc+䁝Sn_ 6N0imq]kהHS.lՍ6VJʈT.Gn8..PY K`Z`:B-gk 4.nXPu3|bE F+##2ǐ6Mj y@on a kiRLYN5J#pU:v؎[^w.ˏ0zWnj5ډ[)ctsz+y Q2.CHĦԬ65Wb (1)UeflscXK'3e|B)#Ν}/o}[_h14NO~Gy[0=nn {+d> í)GG<;Zy|[XHB¶wXlY:m4@ ̜$҄`T8}zln> 9!JkD9l]aXVF~{O^cs\X_V^H%Gt*G[# NXLRVԑk@ -W+/ظ|}bdBYWP 6rrQhEeƭ`5p)Nz$a^{!~en:q_25Owj/|5A:bkT1Y{R0!Sjn-dN30bA[ H$SMi-"a>hdw+7:XA,<̋  Mc̪ U"!4:KT]{'qZDqߕ([A4RP(1Ujuօ3Cl;L#3*#i6&{#|UD{hC${9sYjsד&q > 64khm Z`YK K)A6̴#K6;3R89#q 5 w7}~_ WꝄTiZOVȲL@x,3WJDewJ`4nt jxUãƎ\ĮǪT49bd,nZz@hLJ#A!Q $4gWJLqpe$h-REhJT#5y`S [.\^xdv]w /H=m@FSȪcPj)$*<2J Ї-[ZB S2? zR1BB'B VfJ"T&mTF'YMO9P%0DXZEߗ\Pmڎo~ys Qȧ uo>WxBak0)cf#%$rYN&D=mB4 X[x/S@6ͧ'6j-~˙xVu{[8{oYv}߽y lDI$EY#VlAYraH`HbY0, <$ q&qDX챦p{W__mfD7_9^דr0XIeVǭC Ͱ2cf)-J k4 .꿛F;hb=6O%~B3-dNbեF݇<=U47z_M!(o¢bJUhKCPﰸtJ[Rs S)YFfUnўNVy+AP $8o$vW}MD*-yN,0M3}F/F`% 3 \-Qf:nS&wsB tPvwi,D9*bx*[ȧ>eeC~? En:d]@;66Fxv4'F_ H塒IF%AR 1DS$stnwhvH>fe3N;z<{SOweS9>2lJLƔ}?:7Lt1`F:1NC9:}5%!,g?BeMl$L %Ԍ>CMNm-4=M"%g?H|W+)uFzn6HdRXuf3z[sܔԔTLH+P tFY uktH&H7mqML$S1zI;{hԶ҉Ћ&P5Sm7c`.T1_C|$)2Ȗ:{j+&15#hx?2B@, f#uL=Z( fLD-M=(]ȶE" 4Coݞ?яrܹ~~{%??v/p~Ͽ`5B`晷OO[~LOHhm&$P烯 QhTZVѤ4C!d2q.'%)ݔwRo͝XN$ ѥk(cu]$AiV,2oks\{b O75ýQZs!LtXJfM*\ާzW{q(fM(x˷Ѳ\Z4,Aٮvi>gQHd)emEѵ-aSxM~zq==8P<)3imSTPqD98peZ..gG7٬or 9Y |>]3{bbÓlKVtt҈!h;99xr<XnkقLݖqqt0휔 Yȳ5ɜFO%WHR]ԧOj7 &dHUrzB 8K;&l*JJZ6at7cj0Bm|I;Wp>FlRdnmKf_cJ'{ˣ`8).nLz 8;^b'pyCsTF9yN-w& gVtwCq<9`IH(!qUC *t"VjsjVnj7G'%Y,H;cFX\Ο?g><Ι3gx?GgcG~~_;0Դ\3^iM))7J02@S\&$eh$yGwL03`?4"?[;#?Y$;BBZ"<$Akn Ve;Grܬ 4")cCeMfh->% &SQJ&2pXim. $ ED:nUH:KV\OX@07y4S CvNn—pc^b/qpGş ˶P]1!H"v8юSgyܣ=ا<-E_4{|7ٝ:'.>\Y%N:e+ ikx%{/0aXfC55o߇qti%OAVtkn7L"EXc|\j'gHpƐ:ۍf4I HyA3VVv )|xi+X9Q H dX'ԇu$%81,qO9s47}A{5SAGhږF8J[* !1 j^O\_f go81Ɣd*e}*Tp|/%VZ/8W8uW% pw3yxeg5|#:YPE0!hO[_"ϑS5G4mk<#X5TwNߑf/>?;SOr|tO/OϵP# p[an`ȅA}iīiCpXvEu z::x:L&&jhD_K<=)z¥Bjesٔ89+͕" $ 6%4ŕVtKEh7JTиiM za4قlD` ̰yQPU͜*SZDMӣr!{ovn5 IDATȻd[jljS/NY;QE8=-67"8q>&(wYSE+v~?/|sg}qwWW~G'<8xpݰϵ.>{q%"^dqϼJ>r.gR*,ӂ.,`XcXِntXbwsnWsxXOds0xE1ZŅŭR-V͍3-VHtStwxb-<; =i.A0HMG&|@r2eD)^ĵNCl9jNkoFs.GtOd+-;xU '8 R0*- fŶ/+ݓ{LVY乏Q^{9Bn>`>l7TM\?S\;ysW;;y{w}K6rs|8Y!i9"= WUXڎOi;4:% M+j[rlvxč~/~?[(Mf=UĐ`W+cohA 2O5>bl͸whV}Ǣ?KBC9۴bGZS[NѬ+|*N]rr[-f6Sŧ[(w*u93,9-FMZwmj ~[\x*ٜ'Z5_»%g|?!^~9}oU޽/HǓNۄf0z8(ItZwڒP;au7EZNa,YwxK6|yIO}`;\8/eON)6(6a\l8irפ`G)K%fMj4-oQU^{5o W\s`fL#>V"9Թ*ъVKk:4,miъ2~mɡ,08:eu <;tIFZdgБ,gN|c~gle4-u nN ~ad4]rA~g~($(.-L׮ɮХ0mIuJNYei#h7Ǩ. " kosX u29t b}=9h$/!{=LmK^ J9|px2|hPDלͭJwWn8FʸD[=jl dH{aTƱU(Q&V`rr gKZ+ē Oqa+qPxWkU%LHI X/j9i~xo]R~?HH^)Vx቞[ܗ S4,1/1A.$1oB~I): hRP=Ϫa&{Q8 ߆3g|zmI)p[}SO͐΄ZiAܘ(`H "S<V $cÜrn\ͧbLedI "k:I$t C 64sڢy[7 OL5a珒)e$φCA=bKu Aϐ >Yn%Mfdât-jT` #'XOv y{#߽Ơ巑r(Qbmh G)pMewO0"%K"z_xgę4p3޸G#ygT_Dm̝NƶcJnv@RhBRɀ[*t{q&~9|o~jk&[FL$? zd }1&KhrMaUmNX C۬wE_ +<-`4wX`߁/d)`#XGf<%/C>ڇ{?[qLub#&UN)̸̈́^ƨ2Ed <сbsD_ jqx+ЌDcƹz15[Gl8)i">pe%fF`uՄ7ŭ%_7oγ;$МEYq3<]޼?͛|L8&0ΜJqk( 8)FB5:ڜ2S{S|{>)jpEɕ5(@"S]#a":#Q'E(B=uhᱷб<)ig,l o(ִ19nk]le2t]%t}/R*)kEUp1 @$cHy܂Ezx){eE2qMg9H-MYތ.eTflBr;A#@љ<1DBVitDF,ktۤZݒrڡ^Ai[.lշyNm^oVFsƹ$$&^9FƄTZ.hef; $-;n#? {YLtL)E(vPNHkJ4jQk$;b7rH 2Eb&,H$^8t92+9N99Y>O0݆+/&mh{~;FH݊gdph?s]dlYzBj9NEq+ŜMըng 94Jxj 6Mh աvHjC+4Q:,.lw)px>iмag'B\_ơ3yu|qҥ+LmپH`g4/46Vi4#A Π=\󅓇L\yi^GXvʮM֍HߓݙWYk'xgs<.H~H&f}%Z:aƂ0u,.52{lEC[қ=vN݇z waۂGgNsj{wY%ϩKóD-FMTjd]cςCԦ I&tf'LCO==>?oeq"٣s "@b*:!)MNlB,n<@Bn X\R)=214MM$5%3dW[-i9s!\'R#bTa7ciNE73]6]OrTD Z& jT)Q3<sΉ6.LS׏xjA63W!3TP<̇[$H4Qyc%WvCVcQLIFvbcC`csO^ t9z(ǏDvPHj >2Hܨ!q0p BI9g&T\T! p'~K><심4-0.SORw=z?åǴ'_!R-'n^[i`.bVPh(ԩ̤ _[R$:[,n,X(n JD>>+w(i\ Y9v~iON{fv5}Kdގ՘xv),mCe5"z%~?\eH2:',>5f%jk&'50KGcu]jacG'tO ^G߿˭x5|GD(8* eEA_$ҼÌn P,;gU.*!)3B\R[ϐ.c;|w_拟{a@ )4Lyj y"YB<ZtUCΉP9XWRf:<59٠DH4\Q&Jj[/uQhh""0 |(=(6||N?P]?:7 ΍"s"nj} x Z3xeOx!\B*,Ja6Yfk٣yA`9cn[An걭:"[BU U@4kgh&ɢXsO?υ'b| +0O3?z_jB ÂgQ 6V476qƭ݊M ( :k\TvqWAJț=G%jGjCg@6!aIX?n"ȼ h" }3R%3Zv]-vx|JϷ>ԌX\5~a䔛SkQ^uiohm pm*npݷbPjBf^LxCZpFYd@g|1idIZ%jh?Ll ީIMQsF68 := Fl\Ʉrw;np'na2&P\'Mb8ÌC7v'wgsƕnfUgYz.p,p}:{w:V.z{jJUe84+m&Kc-=b#Lg&4sZ1z;B":'g}̙'QϘ1n:rsZ3jũ qZi RUY++,=aIhjB2 d֛`y ٕ:NXjbJ .}lRmnU <]DrGkjBTv^<9WY[1ro\xnw~ ޜ {Oxg0G2{!!{l6E44!ܰ}IM8 ]Kf# { }9^zC\n (+tDm6T[%3})xhܸ69+;a>B9W?/ m`|i=ok[vE)QZCɈE5)Qڔʒn h+eәYZPy|CMj HH 4kw&^C (%">DQ_C λ1ZTB7|_}1M 9Im =Y't) -Dm r1$գѣ-͇EZv$1&D#jllD9x.ܝ]po@>nI@*|QQ1N0}WiWU81qa9_-y+^$1%c0|&sJV'qCwݖ:eW%m- =3:Ym01Ӭ L!NB9RLO#mxy2B<.ǪD 鴩MGTؤIpAD@LiH48mX4zG0]2jxp$D I&ZyAנT(hf/!}qO!B7• &w{5{ u*WkRF }lrA|rPur60̙A+Y J-JU/P:n $fixHG"q$cxŰS$$apy;Nol m"VNP IDAT1W(gW gU &FP5PS4UI5WʲWR*U=C,j\+ A*A"=2bUj -Q49(Qۄ%VV\&T:ECbxES„bQKtac/痗S>"BePKeU3Ee j4S]ն){-ZA}Nf(񫶸峮c 0~FrO-8nm&^In:V{8销ȼs3?ߞ+2>H=kUף'{r9w6~f#5ijh Um&@ɀEZTLBCoم6qWx9ʬ{xtE5voH+iu:BV"9#}A"8vV-[D\L05DA1.11bL@H#'z$"aJ ^)(o֣0Z$1DjP)-X[dOr6F)ģS+QG-m(YԜš*`^+9}.'wb9_*cRzƖs0 T18cX#p'pF-$q)ǀL8%v %SrUr0e5e؏t{CF v.Vl-bJ(:tJ NRh2~BWͦ3}q0b$x/ wAm6ScH5D9}9X>=de!r2ڕ1#2l_VЭ L d4ާvC/kU(]`F-3_ ňp}Z`23sVFL)d- g筅:'03|9vJ*7l)e*.NvbùsSu,󒚍WJΧA z $qy-W0Mn(0Hk[Sv h3 6&ǁx..ↆ],iۗ k'fdgqpR!hbY|=ꅟs|V"^BM:$> ^u<񆫸;ypa_,.col6lBl+ ڌhEoBm Ҭ 2~I h;aCG\NwUh>0 Gi"7&GE!\ BZ2xlLXCYQI@@žXGp:cZ`gJ 2Z%( hҹ^ETBJ;a3B7 9HFm*bB#a TGk@$S޶;>TYPʖbEkMLaE{-cX>蘑m,$ERٳz)3U"G>ܕr \"}26,σg"VЙ=~ tZ wDjG?:5t>XQH8ӧDU4EkD5x~DMs$T fVWZy.㗸;hj$l T9y85eXq~1Hde; U6BTjU1WeLiB7 ڒ!Gxܣ:%efʀ>{^eu6 }Z5XˣKUUMV9`sc2\B.T*YGcBjvkN& BL mlHMJND1:&q y`6I\q:[sq/rH"D$]A3ߤNIClrEg}8^d|I1!ŔVNLA DЁ#uK9y)E&]O2 a(Z\׸PZL4b x +"fTMskYz&o'@۶|C~_SG;CD?Wy׻ŏk|>{oݿʿ7;ٌ#gΜ᛾y*/FC d`:8$J€aD2|ozJoꑠ0!{YDJp?T$7"uL4Ы$҃d4H]&>t.@ `4Xm0(Q;1H2ae=jA3 3шA6,=:1&Ul ># $ZlqwdںJ -C ,Λq[SQ Qq2%!Jsmu7NA9/VKг\ȵP읾ޡ4jH- A& n[ H CK ZŁA4&CĽ`huZcO'ifE-x |+C+^")L;F`JJ Cƒ6>A3E=(r %4T LGL/W|V>aMxTFā;GYKc)HHN7_ɼ?,+Ĵ 4JiDMb%HCb B±c<>y.=q6+̨uBQ[YvNtCi&?3bT ]A{\@I(M9ܳ k@Wq2<`mmvz) ɅU)Ĩw4и~P Y :6+BB3<ڶ6 ^26׉NFe}}jE)acsם@bBkqk|RjI 'Odmb ÀѶ-n$Ll= ("#!ppp@jZ~~\qʣZ+N7~7ask!RSC߭QsxfFJ|!?d2LrI)ͭmv/?1p5EHHVH*nO5 =[ŝDhx%Q`Џ#"&UI QFNLN ,Fw?Ԋ =)W,$m6OLEY$Sb'䚉eE[e[I RPh [D:p}V]-* F)0L =!bQd~tUBn2Ԇ #+X `dqj%1,A+Va`¢r`z#k؀0z@)Ժb]w@Y\d\PW`wq<'~wCwU3 V"sa>:yϊsǔY.J)Ê\v(Ð;b~by݃ ߻NDž=v,V=CfY{VbJ`J/Η,ssexWoOT#`)o[xۮ񑌏=sd-obi"%՗\}C"Q MĪ^Ѿ8،YLÂYؘ 6ЄȄ89߽g|C*&VA14 8К{2)fՂs;\<{78yr}mokNsew3On苿SN/xQt/}^bb|| łr+/zыM.1r=p 7c[n'Ou.^Wss_1x;otw~H){ ڶADp!wpur%w9'[ܧ=sIax?m&y9GXjH "MtPq0q) J5w`j%c(5`6bhBiG,v:6`3;䪙BAy2%vZ<jh*mpȋj\+ւNGEC1ep6b.]bf˞ev܃V3 '#7"ᣤO)1"I] :fWU V" vlIsRV9(=y:t.J+* T̂'FHj .'1d٣B0TtX ~E, ^ЬPiFq[;ݡhSl>d9] \~X9WFT>Xp1?gDXl{RVe!Wo&|15 hH$ Q.YUȸ@HCDbթ(.g3X3NG:lyJydp!&w# no7qr'i[o+.cü5#~DfT< @mI$ЖSƧ[574 \" $5bi1."41MrZ"u6 HwyBs P| dj̚)UqpU=a`IiGLej"(M掚Sə{3_n&^7~7ַʣ OOpox%o7_po^M\';3zK/B?s|#Oө0xϻtb8zu}.kkx+_y[7MuއO|?Oo㩟4+O)/Zu.^䪫櫿p]wo~3˿d2U<O硳g#ł1RJU'tE HH:1/,P#&~;a@Spm2&AayH jh4AZL+q-F$532Pa:KLH$xh(Nb'è0'JL-ܓUAzqEc"@c3XKakF rØhٶiG;KGb$V`.p W05 4Γz]#f1l P= acecZzR0LZ3z[aTCK@'&&bҕ@feq0]oiRaznFb,seUz~En@LA#E܍3dGeĞPS{RMX{AY`#1!Q*5T)cgX-BӃB. !goo'OCgrw;U**}{)c_988]zۿ`׿rGoggH ?8=ԕWѶ-gϞӧ?ӏ|gς˼5 _4=tH/cct򲗾7u"|w|wAc:2Q=9vlU$0ݮ\v2%QÀ {3TYi\V&L!$y- 8ވm4M7H&ѣ 42 fjBj,tAelL$Q kN E,R-Ѷ}Jbk+;&bM#w7ny*&gvnXISb |iLQqwcsfc^,|Oh@)Jɮycn>̩I cTΛHh"5x e*2 @DaP%#(a .ގcC `85d(BZ"VBY q3 f #iUPƤ.J UCc8kE wH+NcqCR&sw2̓gh񮍗yit%zĘ8}ǷIxn x4JeEQF2GZS 1BBXVR2@3?f-;K- Ɔ>+c5'5kDji?`*א7n3!3f\ҠʩQl/l4$mVrН뙟dAN<*N0 jPJxO456曛|w|;zիv3L~ ?ȋ^">y'ax$!|u:b`ӏ){LJ?a?ˏ#Gعë_*T_XlZ!^5x??|돊#+~_wG#:|8q}CO+_t㍜}!^ϩSW|nk9|+-o߸馛flll2Lʯ*~BJcmO|^&E~Eobc|@ I,Nj-p'D*p5DD63V0͘C.V4ߵ2:S Knm!{qDHd0H"c2Рh>T&hr8b G)P3$ţqJ  ,xx-fUNBt2bLFtԔ ȡU B7<ۯ&Yh:$@ -4)A- E\W8+XLLږ5L1 R93th4e Ep4Sk6Bp=7>,?(+T6)I):&/H͟0E4 C6X7'ҭ§F~ݿu{p͔?TO[n9^|M믿nӧOpq74 ]_ve\}9v8_ gc$5^õ^7t#\rɣYO}xW|ŗXn6[5~:tX=IOkI΍7@)o[nyAo'<|Ӟq)Ez+ǎ㋾9Lkk|/y '~6)%R\s͵\{Z Y//@Dh'nFO >}w~yӛd/}ɋlI~׿dcJP P!mR;$4Z+CEuYV#cPq2ғtǫ'zl@GGB}Բ~ԉ,!n"ͤW:[cڀtTM#Qm S 0r`!|;uF9 ,<.`tum 'bƇWlHXoW S&}@e41>;k5s֔؃~LV$Ι"lpJNvܱgs]ӡ1e|-<66B5#,F(x!Q(ySscBH$Vj B"*sHFa&tHnT&@@#QBdC%XѶrfY=mѫ"R <ԌEz4' p.DU(3iZNNHM搪zZF룱QhFFמaBꅭ$èӢjb&z B Sյ, xGM*Yua[[^ˍӆSr6DM ![h&L*q&А恠=g[*,(v,oh0& }̙stJl;$(FVXuVN=2o鸙U'T)'Η_Cݿ&^OA)+άؕ{[\}WOxBMf[XDi;H(VIxu7-̶ݻ狟Ei>2_}[<?O= ./"[[[~LS7<n G^\~> &dP=OV-DͮnzNèGM1RmG!5jFXAӁUQ !$w~fj`+:dL2ݪ~qs0o)BjL;(\d,3u(YVRYHHNr)TоH &BQ|̖Go#]̜U@2ܠF] +:kOxϤmpB;a@EH#rskϣщI~=ѼPG X#W#J*]b'4G &#3v1$Do)&m6J(!Q$uDHJ 1LՈVY`SJ LR̨q N& 8x Gs FAgTa}/[NGQA<3[D!R/P$1FBCk-w.g,ˊVjtT(c, R%$v M,x@[K%EP ̣T8 5)W26Z!jHCe@YwPQB1c5Q@L(Y3g? ilܯ<,TGB$&dpt4 >D Jv.\A}+<帱8s7Χt] :YP8e̳ߒ)5,{ cj@_Y.Yfw}D&jG_Om-ڟyy_\K)q{>?PS#:̼CCmAjX&RzR4,Qj͈Ω9A_Xʈz&MFwP~PhIf@}"ۧu06 ފܯPCjZ/=qoMq;!H!$>Z wTn7qm\EgzJTIh˯`o"].dJj}٭X'G9{@]-c/R5x)3i‘((.'&\l K(&g/+>JNt0:v<"IB%b6,5Э4)0jLg|dZeI F4&$R*$qݼ9:51.e6DiY-1CqJ7n;_ C! V=x; ';Qw,^|?+e t=W"%CD'}|*LGSxKv`8mP$Is\3c\xP{c`>FH0_T\,/rtC{ mE^eA(dD{'Pu`4 *c b6ٚ+}s%F@3lL6Xٞ\+J@h`6)^ }dFDEp#H?ڥ "Wl<>e Y]x.zIqӄS֥Jr1({"ނtv&nl ơ1x;‚d>q啧oV' ;t? rƠ IB **IGj%ZLFQ++O*)\oAi Z '}T =D HSTB\gt]DJtӚ2r@1خ H\h{ $ojU;a!Zf&uk BQ(W\z1MU65 \( 97xri./Av/eCow|KEyȜ$|$2g1z+ F$vo#.p5j*lTjDH " ;C(&RJFB !6~ʘ>ĩj,h Lf#4%hgGOV,ڤDr1I^l؜:8Z@R%14gf3L M/i6zieb7ufkpdSG8vp:'^#I>I|ac T:jU+9}h!&B uw 2|]U#<͂H;ÈIF PYU=T3Rhs]8;O۴%U'̬ Qibd#Yz-1ܶx&)TѪLZ(7(uFbZ(Mf$Z fİG HAX c;a2'TܕP"]_2􅤑-]5;g!t7W2CZ*E{t'm'.)skoMl#vvq _EQM\9M"ڋ.-:! HyijqhjcvS #[N xଐut]G>*CG^]BQr @2M 4$ 8?%z7ax>?D_;PoHU\)%b\SU{'6vyk-]q6r }S |\u>ɴ+6]0A"PV\0.(/ø+<1cK-"뒸dw0`[S&H u'!"!&sGS# Bi"⟋(|4 sqgh#! bC@7MʤIn *:&j$4at)0I-=i"6Z0kAeԎ 턔"Rnv'h7 ЈaՠJ?`yg!xIݿLcX3cޡ kB`";&j48B(]!B$(Tv:ZՑabmͲs[k˹Խ/v qpv D@$O$x HQ0"HclwvWwWw]g9LCY'O?|k-.(San]+I4-d*M:'k ՌޮYD I4lk.P"ў:d`) <-.<QE 6r 1yǨY2h=.9)!JL:j#֯A>'xx s44d9ߺnsv {{lo59 &M'xu#5<>x :JŦD{BFiV;Jv4kH/'U&<@ s `IbMgڂFHwLat4kQ:'>q8dn" kMJWw=4`Hd|2>t~ɞbcW9E(}Mn~K|g}>¹8~pVB^B~+K)j$ǗG8\VV6QySh|##ݔđow)[P:͙:E(%Qԙ}҄&ݑE3B--Ѣ՝G؆M"'#QX*rlpP΂;3ŔQëaΕ)ZIwMݩvF@. &( .`@wj($Z},kߺfvMWœ~w?fI/;vU26emm t{iKB56S"VaUF,:YG SJZgƐKwFiEws'Ë& b@bgV p!f"6@P%a hIruxvW 6RaU{0=\¼ ѲL 6T$;at04)ὑXoM3̫?u?k7)G=~i1~_* may\x71^o0u>¯x!Ι;[$ GeĂsΌ;ٕKA$bjqI\TؠթB`ՈjIh!`y$<'/`W(3*< 8RQ/` d7%) YgT+۳̸;MAĹYjc6l)6D%81\)9>L)+cRyoЈ.DD1׌{{0aONLƯ{ǞopVR)lSֆw!xJRf zqfjh GcKjxEI-sJ֣Iu|&zĶO,0Dw ]e=6,C䊒ۙ{nxqrO_ybK&ΙkG?f̷i|˓-kqpX5 0ciS¤OtoR%_GH PQȰg!$dP5Ő86rb1W K7T{tyz'02yC*^. ,F}l/4Dž` ,Z| Wǭ܍Vc͉Ǖ?f{Hq^v)9~?he*:6qCrq+_=Ye`C7W;:,^FNsSzo'_%~$_~_|v_/?kjCmH~+|+̄s)poTvD䩱o(c3a (/{bnS6B˂DNi^f,!(Hxfe3: ,SaDr#%cNQE{b -*m*ʱYHWFn9PĵDr9SOqm 5Jm7+377G sIǪwgʉ߼BRx&eƯ#7^W|KP#ys_$KIrxEaЁݽ G攸nh ^$LyF|qV& FY.'e7)ZVKf.h&q,LiZg c ͭPRZiR IDAT3M }ϬFn"3h`;{7`%Y7c:3 n%E*tY{j͟8;[1242Uc+%'29>e%62BUe2,YuUi1,bTtjZl醦`JYߡP[':lj%̌QǬm=b#11OhxXl{J#Նɑ5V1wOZi}Ůoi[|xV$q~BLJN7K$=X|qCG#PNCr~мbDd;Y&\-3'K =cWלּه<ӟC!kV|ɼƃq1v o;| xbwLmF->ݣ3L19_GuӎV\QXq~-b2,cf%*hYJn w:хSJqp?S_S?FZE"zk*:-Xa :@(DdkHa U+\cE6㫳X&:=nNQX#I<亍@ШH.hz `Xhcm3b8%(ـn)i'iCSk}Օg˄_3OWx[?k?u.}eU.П~oZgk1 i JG'Y'vlH2\HHxY?藯ֳ\?6;8}Lxw9ӽ+3*lrBGS"͉ OtYp\#4xoϤD)ې^G?Gߔ8jM4ɤsa I- A55`ۘLlw愈Kځ)Oq [4\59 Vlhi-}G I|>m /wQ *|moaW@n_t7\%dqS* dsIMLiF3aa A/џ-q]:DȀ3RUQ|cI8d8y2!w I_ϯmx'>W;c D(LBk-]*=w6b#SGƱu^9f()EEAjs"D4dSa'p蓕/ ojC.:C)6BI@b{grWpϦ%v5852d5At[I-F\/HJ$,k$NY&c:TGBaQrO7__}Yy[EI)?A4f.x֐f(p=,!>EOC@qppr0]<#0[in=n{3z2MG|zVNc5{W L#`t瑮=m4Ɔg M:H,ГN9< `ܔzhdxD*%Y7Gx4>̖aMrOc(Ux O|S3<=ZɒDD{ݺF:U y)y$F}f${Oŋa%4ua4p/7:nBxlpLt`5X).Φ4, eN=(t/X=,ҎDskiz> 7:V6w\Oc=:ܑMG9j Cil:n 8͜D2GcPqZl$&!9K jәOhfϔ#Ŵ_;*&L`m+[ )L". vzQ\Tx34i~)Bk'R ƭ+st\Ʒ))qutqq ~+ mmN( 9yH$9XLhI1PZ\@N6`11ma)& }w$ c[&)A\3>){`^{5?0M3N)Z+e*Ե1?҇v#^xhz$CT{jQё]GꝖ:>Nv>Bt+b%ǁ{ ^WW츧V 1wi$40;(ONa0 ;D{?(AO#12R$<rL]Hht;+]$^.+yͼoeמ%yE iH|]҈GEFM].(&D9.Ppjωf4MXG6Ct>.4st&rّ n!}Pl+쌭,3WHM}2 "fڲZX@s\$zoL2;1wDXg Ay4ڵu i'+oiwh}z:ǍSjlRQa*ȜX hNDɊQks2uqxNmulN  髑U\OX,ݣR;aRM~qC+t<`=w׿2tCWuT*W!TcWc1@n2{$~J $)$!^>>2䞲SWS>:F)(:u.i% Gn|? 9HyRں*Ժfxwx7#Wſ/9˲p܌,t. e*@;O.(+=qtĮ#-nWfNNVYɚ#d|7X纑p*no8TzQYCK_7S(lt?ۛ~-܌_U~WNp9Cwu}ors}mۡg66-u8}=څ@x/Hy8OŖH!p7me}|. ]Z<\|X S6*l|D-5 .(qm^mRl`\uj#!#hqCF]L2A-R dL >ͨYtR:&V_~'_~ݥ0ͻWikoKўGX?M'HwRT0m ATܱmD#\DUaE*%Od73Sݠ$ʤL,>s! S l}R^I*4ڏlH9De^ಆ!ӕGfo9(Z[Fړ~="xBf&t# j'M3g¢f"DoAʲt)'qwyZ| _y畿˲qwXe~Yh ;?p'~<ӡW)cv3 j>NF#aLGb BY"_i8\]ӗ#˺70H7g;Mb6LyGw'Gez%{gگIt),=ӼFDV3Siۑ~Ôjm)iofLh<q:x"D}e:s8,M[u<4Kl <{|gMrf6-"'oVHT֜z+Y2\;Yk h!U# 6KekU{$\,BNoB[,VPUFOu"w :'Sm RW)^cgxpH 97K _ xAj 7N Y4Tt2JFǍȇO7$3(tr{x$ /1m,Bg`汥#]tlvT|˼~NY{ތnS//y-߫3iwjl$tc[4aj+ !ySu3}oB{lZlEu Ѻb :M:k(]"64b>5m8= o<66</Q'Mó# j(8qSV+!/-gt:{t/ÿՓwH@=Fߒ+&1X B?a\ػQ.ݙf+~b=7sZzq+d^r{ė(TD YfѸR4tr1zOh_Qa[RHUಣ`DsJ'dfR%r 9L%@vhv ."I>㌶V=`N;h'ݳzs(hm̱e;ХnCh#~XWJFLiz&hy#jhSO-7[r:m5 VǺqȫ(Z|vF:\m0&x;yu69HF;xXD٬+:kSt{519DjK͂2.-R"!HX BKm *2p-z|HS KC°4XU1:,)r1$у0y'`BΏcR߿2X=}Rԟ7>Ӊ䂺5Nt k{ܻv\F`]w2ys4!D)ӧ7 y1nΙh$H-rչbɨt}ey1e1cN41 )z)C_++F9_r.Td k{e[0zg;U,A#{dL7fUHzya}aƳ&5_)jmԫ'3G/Ѻ4~'WO=5K~uLslI4,CJ$t?iFagP#N W&INH"K%&cСlJ m `'~PBNkzlx7ZڌرұX5xN};H{}ogO:Gj4IwØ u~~O,ylk葮t\GuS0XX(yѰOSǦu0`T:&Cfo! ey3ƜsϹU]IڎHvl~JDB~ X 2E؊euvUuc5c}[C ᮒZ{Ꭓg1K/+Xz뱪:toԉyosδPfΩwx`{ݿ4)#+ ,6 $a2 +x](5%IjFwI$&% 98Y2itTlĶ&P R'?@l{LJ L.L]Qi.)}uu|ߤgdf>hTrHұ>Gmate:A]{Q3&x`T#&0 7M{Bs58nZ%*RI;5C4%QKXN.AU(*lƩ5ʦֹ(uCh74;"X|pgՐmxT`vg@JɣB!E*Z8偬JdsnƑ-X\!l%=m9J*͉^/L"(%%kY%Yc\,aߒXZT-\j$@N Ja#ͮPPb֏x60 F)^i>xZǗܕNĀ/(?upOGwCP7~H1D!"T.6݃-67-8,V_ϸf}Co4G oJQutW\CyXMF3 ]bGOx:>AIkQ1?5'WWL/]&r|8UCJDxe\9)fTUEGO(3XU<=Xؚ۪YjXzhaCOt FuTWā͑z>h^{56}:j8t[.iSgNͩm@+ͨTZtXGM5RfL>|O->.,IEE}tNYP[kq~|Mcn:o T4 \v/L<̃?p~͇|4|1jc)2Aπ$9]%ٰv;'bQ՞rn3  44'+FFK nܽ{]Y?K572TMb%N}CܿP#/[mI`-6a֢)B2Ǽ[tXm~'qO;,Z2y]hMi3e;-)"ڵ= Vf`Sg A$eY$IAGسZb`aܧrPy#+5 U%呙rMevcQH. 3-[[V]MQZڗXYS=WNx}$)D /PtU*b1u燓RW~^x9pq9 Se:O#LI ǧ>>dዡ5/ڃj-BeBbWޟ8Cԍ2(B.JɁ@p%R`Q6N]d-&qxr}bƗo{._=P7_ޔD=97X?'ų{.vUGrF/ ;b_{Б>QPCQ%Tj8hԳE8 <Ŕޣ2Õ0${599J,-j4Reh1WP׵_" w\U`-Ѧ>P<C`{*HL\i\CAV:]2 M}7>QݺD$(YJUsCO,7s.4[z&l?nb$ Cgۆ ŀBhUp$JJ!{gJ 6y7rʣ70t04nLyd7փ&gJ죒AT,9QrmHIψJ @fLCRVR ?VI<ȯU$;΂S# O&t;7*G04-ܫu5u7І'`ˊ. ͣ`/n);bxl,J-CfL74-钾YPH-jΌ*^RTL3}^$f#7$CGd{+uytllD_ c1H ?G<9j7ߘꤝP4gȗAEI, fل.롸NA=VZ 85>4LmR(C2S5?PFWi,5?=_׀/u=}^}~1pbJ?{t| g>wj\ۙqlgi'FQ4*,ԇ1Vl d^#)ĨVٱ `!:敋}jȢI'| 2)^Q vEjE]YZ:eJT➨V9B]fO_y-c0w istN{ cG9,kIHN ?tX{tʶ6K01XxOCĢ5i hP7$"ב(-y(R`GD\Ĕ|Ӣ{-֙=˿/HŪy;ͻH;X%e>Vlxy[+d$;'}[*ki=M$աv}d& 2z,xYBQz}%zVGAY,=iz{~=P#d@k 4s:!ct憛ɳW*J8MRbƩdﴍֶ LLD_wu\Cy^n/-,RWQ^Te Ta9^bS *D}{Th`d%䒘.Z$VU}!Ƈ_o1 9sXy( .F$ţ;lKY=olsz>ʬTɼ/2B=nm(LzAM[S?F^CIzוlre3I[XY J'in,2mnp88Vfb-a>(Zb0'-}}e e:*Hj#Za L $Rr 1@׉-?? ?R))=t8W:{yᆱ8V~)K[w\q?~d=ϻUq`[ikBd|lHˤM"%QX"m•Q6aP?E&ԃȜ bqo\߇f]q(9YWϯm4 7(Ho>Ms_hv8kG#Lht/kQ_=)cJh -j̢q! ([D2(, N_))KCGwKrBQ&Fu=2̵9"9ˆ$#O5ǖNs"|/ɽS`oM$)QsK~9 TqΏ:|1t 4bC)blj$.l3(\tx0;WäGo!e"Ɲ%].ب4kxBK&+.F= F,[Z n thBM8.'$OlSgRL:.Gd>ӅGo8,ӷ\}0FtxT~iZ1)r2#Yc0[mDcH23Tc= %S=:6kg)I锒c-Qk#hWg$iRz7 W`y߿73eԃ['ON|azu|LSDxv_x|^J=@}V^;+0k 9`&k:nuDZR'At:hH7%:,:ᩄgj0 YGj"="k1I D'v镴r Bϸ/u2%nVVĈGmFBht7Ht%\šDf0")ں{{Uu - IDAT4p32f1Nu%r*JFR$ IR DʉޝYRnP+$a^8/?o(i8ez kTc8l'҈^nجɑ5)a'Qfm) ^Tr\)kx$ hITtd'LMEm &CSxL _6(Cؔ] u!JԝNcPڜNmԷw/[nʤǹFɪr|r[3U_y:sFqa<0Cqt: $QQa[dm_cJRe:,QƚBIB*)-Q4 yґ1'O:5%ǰ%5i<%ITFϚITycE$Nċpyl@^kpE FsK?xƫJ@#8tE_8KK´TycƛƇ$/Cj N)=s=l %fF)᭣?oaCЄuWA-VxF,X6Zl0Йet@GJv4'D'vJJ' /Ö?GLp?@ a4 {ůij%bɗE%yl"H#љI)zl:):i(L @2xAB#z X#с%<HIM"mBѓ,pSsamT;ޝiޘRa390>=͞ipJn?%'2Gm"= ,c=CÉ\>jD_UPtt!6EAlIlԙ)muKKo/s{{ܘ$|.'Jʤl\󊱐zt{(f G䶘ЖS)D-m ikCu\oҡZ5jk<+naixӸYNUxo}{x;1"0hW s&|f:o:{[R2&3 ɼM"e4 ]rbNUP7%uơ~IV%iFUÀ%U>7;&"Whƿr33_Gi":0Ycl%XGMC֪8phRGPlGDRfsFEI:20 c+5ϯj3F_*m5O8UXLo13RI%&WwI7D{|l \ J)NDOsM$*,}Ej)Ng4 ,}$9̸SAݩDʑ*bSy=W vD[_ǀOWW62%Uc.BΉ)tiK\.)X-i(,nLBH0k}S H yPx[D)X'o-<˯ޖmq!'^U=Zz72:WPdEJ|b·]*ᅣ;)+B&#K}~P||2>@Ţ}0bR[ "5}FWݰFD{]55S-6^A%VRȢ|N|& #zJMlEcBq:$B60)JLZuzTXE5m-#,\8դ |C$CXx2jIĂsL*hs+⦭L6FLRܖ1 ƜJBLɚpӠNhm o g;:oO%>n34/o Ed%NH7PQy&霂+,WvL om3_ /Gx}.ʎ,yx4٣ h轲6Zy^L_HݞN`70%Npu2lv ܥUz}m}%G._[{s?G^˭c9rVhAKdz u1o3N'ԅFqI"ŨÉTI5 JH*-sOK##;Ea3~4sXzB2cUψSfbil'aUw:5u'KZM8׷ʣ:&}$d8c+ \9ك'>.ywI4~W(_eDouZL::A7T#{f8Vϯ58C"2cBohNu,;^zoTpqZKz BÐZGٲ0fZȨ縹>["pRqҁ(HVs6i)xm& *E֝I.}{62m&\*iCtbaI )\\lcx-jF;WF^< oxBejF EL?})Py,i44 :&BKKoߟx>y{p4qWxxYؔT.9-Զ];Uc{B; jM:ɔ.f z@Scks- es%%~t:rh+Nifg97ǎ U9͝Z;:m Cډ)@DzȿS jf[Nx_,* )P ]_Ï3m))2:>d\l;É ([CEIa Wj%`l 5 7T$7S'_(wQ@`H뫱X\&(z |~B3ڇIϪ"Xq|4 ?\WS_CQKGJh=+ȕ ɓ`R ɈM6JkJ(~6 |u"ϯm 5rTOO=Lp=Zdjl7d+Ho3Ǟ9Qf D2NGARPS#܆Yb oO^IҜCg t}_2K5 &>E;Ð(s D$vrr.6ih&J*bܿC%½r|迊k7.6x3,1lF37c7p 8i!,X= M!̊mx,GZWG2 ~yᎳBo+s Q)Lz 2ei嚾8S.tF"YBx4bqRNB]pD{ OW\^iN=ۅOWհhYZ;av?W?/;D7#l&>O?gO"Z.4q_ ۂWz=`Dw }{}ڶ~\SB RTN. zfa&YEAjBH-'uI#XY-".fPSxulx"kJpz4d{g 4*sCԍޟ!;iG:v>x(OѤ|(r% "N)2j.DkTy<}'u[׌HQtsEZ|s u ֻo=2>gYHKfic|')3E,mRmu*h=#ݺ; klM d҈;swD)tz XGU$P!gDiYsIoHO$㔖J&owbPJa> ڎ o`UX)$^MI87aa,N9[d _]oHp͹u8~0.^2eA6"]4sv;skh:ZlTbl& R[C%S4QsMt6spb\Wv{OF;-.̋і XKsTc} cpAOL&g;;U^yo>}`9<݅A8pBRNB!ƙ֝du4jqrzŢnK ðiR W*YկE2HI /hJ rLif.4_vd*|Hg޸+yb@6ԙv63 SR0zI~?1Ȉڏ&dS?{ub ώCq- UD=ӗ>8^=4K،zC }>6 FEK(V> > ?j<[G2]#-Zi8]0IA!Q7zJ#{I8-nꁰg6qmhNdȺg6%}b)ی:ziz\(ə:ک)S .RI:[$ma9a%o6'^{R76,oS2=c *4 ci#0Iᗐ1Pt؈(c3Q(hyJ%;Ʌ G L~yx0.lXf'%()ift ӞiN`yhV@*UjJ.;)=)XTv |ɑqob\_-džu.Fo[ױ&0'4 .*cdM*|;W|[2Q>a%OHA:Wx ?G NCC5JTD ?_'|˧my9/8* 580`oxkHWKS`NpX?d}=/<=~_Sd*FMr81[A)n\`d9XsT]MRrz&ӟ7;r,=G|YIqϕ4i o,Ki]&I{I$̥u~= RDBX^޲TGGZ:;LC%8J8L҈y8͆6!'1!qB]BV >m _6@×&̝t:st͖ anauocgQZrF.;D ƩwpJMXPj|277O<=я8\Ke9bhZZe4^ (T!ee2&Q6%x'~K}! O~Ww0yBuHG7&Ejr~؊d I&VRb(MlFqct-ltUT;:ENd) 2Z e-4iRG%1 kFꈪ' o ؝Պ0 Qj~lDt2ZȜڈ2Z h*f:4bcbQ0iDkQ鼵GG k5 "-A:zs{4ғdÙt$54Ug_ϯ18i i[1FF]mHҲPO@{$  cqBtqd'F9?]ku1so֮*槛  &$ HL'tƤz$h80 '(@l#]Uݵwg9ygjOd{j֛ԗj5Z}sTZӒ|WډX3WjUr g6ʎ,9,]۳F>~<q#a[Ugzc>q>o)[x_7~ %$|p&i VY {jw`?TfskhRS&7=S W|=p}-Yn|_{ Jx`S3܉T:x@~Em!1C{`$}o뼰g2v<+>:Sׯd^d|hrd01Ԑ}KI&Mp~?/k IDATmI,og.:wS <8f=}yMsN> Ҍ2' )j$=^b}~\uYŷS)bYJ'WvX5G'HS`qW} 5q[5ժJj!HF(u/bصngĔZ9.V_ sS-g-yb)Ul-J v 髞EyVB.7"_z/ԈQp[ Y7-ZE.j6* W(K!־?\z(ZސfK4fj5u0e>>vk_֍uCJYs)͘LK&f^j s"?Ly쏵~Td < 6|РoѮ؝r:yTO:J߹ۿ.4~~e(GY,Bv$9'krEQfR)Y+P< N5램ڍ:f%tr˕0[]^['f-jpVH$ڪ[;sFk?E_+F H]н|o՟qy|.zv}ۿG~o<5.˯,R b2a2*5L7T64w2LAJVWċ'] *!Y7$䨇 lPO8c"([7Y`\]ߨSRkI C\ 2S)eRSMzAΝIꔍFuCϝnNgLuէ>5#_YnL-׍p(b-,ތh)R@;~ct-σ,?L;x;?uy W(Ѿ (_ÿ?=|O]3\۠V ki#8͎(_!\øE \\EVTޔO_>AĎq:q.H|g2zhim+ zXѷ 3-E9xߝ'"V>7WP!T07NͰ0G*5P^T !p (8RK) D!XKDV4cԓ7viLb/I*t[)&]]#C=%sk5y[A_hKI ͥ0 1Ǡ lfG|`a+){ ිJ~QDK] 85yU/!-J-Ku>) 9pZ SʢafYW6P^IOT )H&i`(^*V}g&|=__TɘU(@\˩o|V^F1)FD Zm)j[kWBPnY HuS_u/j,j&G :Jm{IFFb6%%8ܑ5x%¯rR8gjջyWm0h?ą*kZ{w8җ^E{~RE}(VeOަIctZdlS.םUrVxDsizB㎖vNL7F|T&G/|+>tF(DŽ8%0$BF Aۄ El~ҊKAG6I6cleYU49g"eM#8FmzRUG%w܏h2#MW#xcQ_J0AgU<=f1Qf*ri)ː-:iZ5Hvq8P~T}AEZdJ+vG0$UiQl%3/:JDZd},"QRd VԺ:鱺xxT jAuk5u+LV}L)eVQ/L{y3R/ ԥxgqnlbVh(ؕZ A9|=__p}q,*6*mI1<2cMzk|l߽|eҭ=NC[v)28ѻq}|03֎\ hKզhOT:-'2cjk,^8J V<\vn4ENXvqi׬UVkEd=F`'x';ǃ3NzvC< ~1C YW/v0l GM9mƯGlC|!J૿_-2cA'8Z~u{NYҐAφ U;[8>ƅ|vǗ`@r2dFbQcbZEOB60uNqjSGκ $rhЪ`̢¶Yk:̬adOx /HȆ2P.DQl^PewuFzf0'4퀒1锆zhD޵гړ:gd :@@"'aгڥaD5@2GD5U:i&2:\֚JS!֊3GU@oV>U$gE iaP>Lrrg#}wTS U_}j7HQ`TTJWW<5l֪/i_t7,f6+Q[2Q|=__T!s6u"KU^ E$ ୎<6&4yGhJ=g `=rqG6 n$RS̒fޫ1&QImJQpnݓ0Ό6ѪN!5:bvΛDe''u}/}o>>onGnw[^H$rU>]կ_G' X _ z8#]ߌ|o?&o|ߊ7к)j'~?g~Vt'WW&=|[t4Hx`ꕌqtepåJ/ނM>>7.p\&ׁJ 73 ֌Sq4ZUm4ؖ,>ڴT!^C:80 fζ g`z%έ#V id2F)ZcD*;X(k+uuXœQrUp8*"ApTR`\,ď5G`9;Q%ax5\I C0"-,ah僮֕Z-Bo><@5 YiXT@iV!j&xTHA] V+ XV8Vfeq^s3EI;BZ MIdx *XAB[%'tdJIY+PDd*3*UY8xs=?Yҥj-w-'*Z<@W;+Q" XS֐0\P]e]+RT H.^LV/߭6rJ@":\C-6m )B dצ6j1`ڪ ,8ʗCEq*\5'ALGrDZXz@ڛ{Es&b4 d:r.RT 5Ws PEOة!y8F)>J\5es_k-eNaN!&y 0Gl5MelY=PJ9C"sI& kUI8FynZ #TFϬʂ\JE*)c5F!S<[& Y1"'CpLd('Anu#|%ʢS4H{JUFZK jRf*?U526Iu_T<_?r)0KVM(nJNeYM-W@{jDT)*$|kVaDX2ieVy#Fb0!Q'̹NZ=1mծKR"tk!*Ș xy6Z;aS) }x as$&7K!Z@|7ik3b\ٯW\95 [v~?ȿ?p~K95ݍ_o_E-Rƹ/y o<]xf o1#^ǝL~⤍c5_x嘾pEYuf>0w8.AГR$GlW\'Sp)2fI;v;;d_gL* s*mMp>Tk(r QA+QVӕ>jhj*)bES2+Ck>4-H{܂<ʔ,j.SY qC*q^,էV9p " S(/EtD)($'p gYOd*-RJHO+e),:7⨲X$Vn>kgr ǯ</x *-ouHYEbJECRe ! _k9#jU|=__S\]$E u- yZ uOa./u)]H+-(*'GZL)Uadwjv&Z iSuDg^Uq:U !-qHBL*rħFg>εR֍<|Rb[zgKzD?k_# i/+ܝE6x|%O{ϼr<|_羂|Kp}/ȗȧ"QÿW;xf)Lg;wK~ۘ$'ϊμzs!t8>)DGdObs;\E=Qm5RUϐ6c¶ ¬POI# |O :#ØZdד&)FUc\+;,^ÓyDV '8$%49ZMyR օs,QIלR 1kH6 ACb@z=3PyzpZ͊x'֪(`_[LL^哃[qOjBљBDkDSe.IlExuQE ˑ!b̶ֹf}ga+ Y5̕y;PA"+Tu|dQ/WuidǪJ<U^>#o 8Jpz/4dvcZY*Ul*CMWe!&jwW"XˁLAwEwPnKXSLQ7f@}AO4-vؤXjI 1çVJA81cJ-oB lNZ-s2Sk#3g "6[T-S )e'y3G;?ȶ![ oܽ6F ->=w;S ̧?&/~+>E{w,??'9xsq%"} 6(s 5ȑ~T!܋BG.pJ^\j~Lf:ڌ~GD{c6eZ!0hZ2V}YfX |8wڈ!_$RUtrTQoZeV+˽stSXqbU%j)fV^ iVI,dMuyN3eC1җWǁzur{<򄈢^9ՙ69BP9<^fUw#ԏ2ʖq[k^#SpAD ),TbX=Kk:@ę2fybA,E. ?к<38j$T%XKFS0{n+1y#rE-va, 'z yjZT5Lǒ_;RM-V6k'zݨD#@tbn L*|%Z7Chv\B$wg%h yR8bx0|BIsj:v>&ҁ}T9 O'8WIJ$_/X$39y`Q8.­a!j#7f! O@N4AP>?o~v7>_F>)>>ࣿ%x;PoB߄Hc|܃zgxW.}Us: ruA`;/׻{@ZoI3iWN4:CleN19ƬSpC)߈hGE<=bD<@ ƘNTJYZ4cTTzE+ 3#c\ IDATN7z]E^&X(KHݓ@Ә!Lj*!R 5q:K{@*Dݪ)YYDERjXg\ouTd.+FNh.,pj JBbMIuQs 6ګX<̕\Ű:) ߦU+sTV"O^S}EyB"vq$gUOKNV\+z3IS:}1m WE8Q>xlm[7IH2fv&#H MS[FbݔIz`0[0Q8bf I3߭+\qWC '#\pubߙQ-Yi59"=S,m/3k}b12$}~雃?_2o7>~)So~_ҹߊJ{"3$o|I|#N<\' h 3xro=xxu)o.2f6`ɸ;irp>iȧY)8WXd-H&VMvX0&:elN FhQCTIĽ#Z/DF=Cw"RZ{\*;UT1y>1YT褫ѢT>HFr`!end6$+b RfDQ** ryFVe0 > 5xn.]j_=eZR4b%~xPK},=ŵ3TӼ-ϭ;%ֈF5Qb.;s*wݒyR+뾔+7e%L5I9'l>R|}L*KNÔ(mq,IKEf'd(jmqo ڈ   d'S r r8ǡ䂖EbVȤw'KҪKISImN9>9k})7 E8^Es ;رp'#oѺyZ!4/>שCE@;0>э?w 7.|YN>L^7TN CG+(v0'NvIZeb^%5 COb4lNrZҵ m^/ܫR$=`3>+r8-̐1Ͳ:AZ}e*ߍcMK81'48cKh\B*F 73$cb 01Ӌk (e>$!#i VQzAׂ8quI} \bĪ;H:#G#T4VuɫNB ^;YV-0 Q^xW>wƷwcr"^B it׳Kh8l[VM\?'gHNs93;oUĈCُ ULܯpΣ;c!4$}+fG5BU޷^Mh#S9RRfL x#6Y_8tzS0@{[5fR9̦*RK'6JiIlYz5Qr:hK*Y&]UU@?_8i/xZD ^2]%ɓM׸BlVP:e½c >)#uIvn ̵h3Cht}$W~jN]T A&>?F}ű H-:qWUI@c6@Dp|}S*zok7 yBIhq-컩"y&w&Y2t,!@S&Y%sVWDѭ +!:J֌<2˯#yfȅVʂ_@Jع#vP2OUOZ<DC0as0pv?|Pq$+ @gu#..,Jp%UVvGo@oLِ(Å pvX/Y\M^߃OXy ^VSÝ0R:,9];ft ޼\cfNuŇϸ L\f1hlMi&)\Ge˘LύU( NbqG'Om9V/T'x/Mj[SX7MsYx2MPŒ1kj(BˉZg GJGe븯XxEd0/gA[ƪ(ARz/VꕀZTjh.V)UPD:FRъs#K5xy*bs-t-֖VO)7(u>;gaOE ™KS 0:!.4X./Ԣ=D$M<닯E*$|,X;L̺nQi7YBvBjǯy&m12o!G)^rW#~8!c1NKY2F0J-S,&oճUjUOR S]ج9* 6pWřٚrN̫'q̄8yqv^jAF֘ u^sm ]WG1f+ue3.\/?̦8N;1lɵǟ >\D^ٳPje*1) el 5بq\T'G&3:sD;Az%QN$;EZtdITu{)AΕéIF8GkߓXdE_CH a<(sZnm%$Z[U}|LO!Coܑկ&Y*\y2Od%=*]<#QJ_uu)Pal,YjZLp\W TWj ZJN"VBhe$f1V T@uxеr0óD']Ox{EkV\6ō0Tz^ i:}L+VD4k*9E+vDqDCI߽i%edMfs90 :r$yu[T`̑ fs~T],3lp<&{RmxVOQ 5<XO -D``"ܡjM齈*Цe Aq?q`i=;zQJǻw*//9&L:0s8jݶMrNL''//c#sC7'-y~4ƞ}27`OwX;Xs8'kh\4?D5aOƒel@"l(0v6^rrT7b$yd-)5TJbJg$gŏomԠj[g?fi'Ui3i든5$@F$aAx*μVY4[ZBbJo-\OdEyf(4 N8UݰX-`^Fauk]YkEϾtP)+]T*\bR*e}|_5,DUM4YEܫӢc*P" 4}jVbKѲI5uei2ʨ L=ǔyLObwq0vcUD\7oyv5` [Seg kvmQ킞6:'^mNG1rBShM83YA{6+]a\v8ԈYThbi 9q^^DV+Ɓ'uTfc4[ʈ>)*Iҥ1J[|kR֡jNE:GJMwIk췇vm*ǵN1h ⪕1`0i=<f@u6P<ܮ%4[b#[=ɂ+dkFYד= `UbQDC𦑫HB%.GӰj_CZ+Xjͨan 4j *(9X4q#-ĪP1߹{Qz-1.R(  nĩ0aŒX ȎHB!zg0ӴRSz  xͣk=e Hh;BhVíva5}^.њqPi6gHq t]j4/*7% $eb{QoH -ՂyxRVKVg r'Cg |>9HrgXQw qR 1R\)EaR 5EƐcIBJEgel2ϜZ8j@8Zi5ke|TŨ = 1T -˹z'(uIZ 5MIz|7(C M ~*B8y7؋PƩ3 mBhKxiD)x[6 nHm'F9Z$0;KUlRtqh *i#QLIܔ6K7[`,R9TfC@[2R y0%^*-$ Ze ͠h+AĬ\bF:#G%Ayv\I3!m*!KԆ)r_rՖ"iT+lKdm.,]!lա-0K 2_@J#SSySH cj$omy`C_j8;Knjf)e,xý5_)6-!آuFA#X)M| ^Z*i5ү[  pT?\)㈍nyeyM (%x'fңpU<4Q1ݖZ[6~J+ WGLОV-?ӈ9.2V2ʦpzfn`,wgsO"B.d#'siM–B"#ѭ^v簊]y (^:mCg )Y ' u9XP0Uk&LaQ#O&Z + 6< "tMb oa/j7xWZP(C=\C--hUh1Xd q#rыR5G4^il"lL 0d@RNaW*Z+[V[WbĬ,clc/d#QeYe)uoE ACb& O0$%F !acF(p<;m.YxäScgoJq -f6@A,$e@ˈMĨю,N >E{E²/qzތJ/3D=;C=1R(hۚaZlXQW,92bb;+Α2lU0vjHNd5Q` ?n*]%] 6r#B=l:&DNB0߳$ROnZ;aS=ATNPQw53{AOH NEr|?uelH~N5(1 )4'IUFCxf:QZZńǛDRTW]NQMÑ:r,I'ΟiqMYZkD"%>Q [(UDUr{A\5+7Qy[lIi0aEM jol[fRIFl('\scC\ɖ#PM %5S/Db9<d T!|MJ7YC ɦqN93Ykw6-‚u2mV,lEYLCX΢kKKl?p)MJϔ bi4x'i ݕIC’RC),ŃIB6dN`s^@*acl)X! n 7d0lQصRJFHMJJm͍<fi*7 e0ǖ#IPno:(PPZ'O$!4<;4տC*Z˶{eEW6g!Q2D|(,E iJJՐy2tOҮV$$R_3Ɵ6 N p"6"vyrX}NDGPq„ ;+j$'t"p!2ô&IҲ $5ZJKA!pl1Jd55R&Z79f\S00 R'AUYz&2eX,s~ L% VR^s$47$l u!8ͧ]Ԕ,{j ܩIC .ThXMs12r2dJ4,Gc kRfL dѭl~i*0znfr|,"6+dtN[mDS߼a(X6 [tad,,f-FDMWrq!LRE-H(<\CxJ UܨM!Akűh.COEDZW9Lk5"²VtȨ{7SH7C[pVTKѸYSy J#ڀv%EoJrD6o=D Rv}\4\\Vւeaae&Xu4b7CH'OH7&lGe D's|oLQ9yV<xtC#"u .e*)A/4S,\%Fj)xHr3UY-Iy]SrH|f $327l„wjR(,LVޢqBU6 ; *1*ְ%7$6hf/Qg8ɺCU9I5ysf[xXc%0R$C,Nu#Exf4?>(`Q0+`AO=3gD4T&] I9pA+QhhlܒB Nx ,\J\idsl-84)3q|=n:V4Tǥ d B^2.aPxY EKX?&fꨇY݌*Q5q# 7g Lgqo=5~֞|Q]{R6jwqkiqϚJ]~^ ETih{t<{L4y˒$$.uۃxϪtyh>RǩÑ7X@N~OxHsym>Pk}ּ'3G7UDR(YD1 A:>kNȮrA<nA\EV Z5tuX7+mMi:kZ*#u7_g@Pmg-k==HSlM_Er/34CDteܝ`k N^ P1aJ#sBgytigG=ZBM09q *M1(Pi:܃ U*)=TYhC٠jO=5Sy761ڹYCa[|]Kr8&ZiTbkХ.esoܬ*6>,e `ZCu0C♇\8:6f)Lj1l[d``&1֓4Ng.,K5xp4,ux1Lx6P eEf PRdTk Dd!ʐAf0+RHGIRkm"[z$i+]4EQCd9MZEZѤڳ$SjIeQcΊl 5]}[7Deܧ9'4*E"c&}֨ZIrj9PTp5zNZZݳ +S]/g"r<'źK*JzTt=84_gm8ۚ'}TH(ǣdR{k+9ݡ9FA v\-<2DѽʅR~8 9bќzȦS$>j @#;?iC( u5JܧZc6gU[IŘN78`&촨Y`hʸq ͖xM+NZHCl -8 iHx^ R96 1^U]D )|&xE7e #+vH)b6DWLo%wQwFq>Xm#8RY  $GcNl xd:If\. l(Lcc%ͪ(|cV,xT3l T% A+]֚y k"ׂѲEyhӎ y>r QSjq,g7э:F-dnH ml)9) Sp*Kae2]=5]E >.#'LfMߌI,,jHjS*3-Ѡi-lmtFjer fB5(c1z12AF) dQ¨RInQ\AlcRJe6uYzլXMս+.$nazItCYgDSzŭGbhzGH>-!һ}+;nY?©^X@"m#(L5T)ŏ#^7d̍wFLֲp霢Zt KJ"D,ustڀrUǰs9TҪh^' =Ee4~0aGEMk勞|#NC"]L~U00 N 'N_,UBb%dsH-㔈C IFvUOP7PKǣ8-i7rSEgdX$R<$x߭JO ~{$UbF0L)i꫔^$S$h27Co%<`&!M흯PX@RũDEh^)4:'UbYQ*k-&> <8]v[x_YGT]$،Jnkw$C)JEA]BIB Qk7PfQe1@O!n,zVzA!=@ֆw1GL`Z4{CCZh7 2X NՁR#>]ȨUg#U%kcCXٸk)iF +,Wqz֕>q٪s2ݦnЧ\5y ǮQ`߮II{wWAS |rb<ϊ.x5 9]J/i/-[qVksxr*3HّNJqI5aIrOpxտ|?x;;Z{?KCY~$'ݎ rk)_8_sQA~S3B~f|Uc)Ӈ:aNOc)=f„ &<\ &. &L0a*j&L0a„ f„ &L0a*j&L0a„ f„ &L05&L0a„ SQ3a„ &L05&L0a„ SQ3a„ &L &L0a„0a„ &L &L0a„0a„ &LË́ &L0aTL0a„ &LË́ &L0aTL0a„ f„ &L0a*j&L0a„ f„ &L0a*j&L0a„ f„ &L05&L0a„ SQ3a„ &L05&L0a„ G>pL0a£3z„5{vOWg„ e;"2] :;~$&L0aË́ &L0a£ kjOË́3q#=J1籵>93 "q+<] ; 3G *v= SXţ690sJ)Lt.esrSQ3ᴟXk{=ȑ##llnreWpZ۸{Ç?˯`Ծ{47u]膲kxƵ\xE8|qolpeWpjf{='>{#^v9.O|zw\xzˣ25O, G ->tMla゙DŽ@ IDAT} @k#=߿]]wn`޽f3Zk0z;x}]q#zvx=\tb#0Oi#z}Nsw^666G>!rSᅏzモٻo/:r~ˮrYB^5_;‹@+|<`GLqu/>ZwW\'[Ϟ\g0 ~'~_yC& ZܵF8knauΙT M);zR+IY㬾ʞ>!vο`?b]DژolI4k{wNٳ>׳>i՘ybss3Ngq8s{7k޽q\Nǣ]=3&X9M,+=QQq|yғt᥏{?{խuJocc{/ȑ#|+^gFOxk^ˋ^"w%o_׿}W~Wo9~J9/[||\r8lV_In/{| wI|BOSU7g?'>-/Ϗ?8pฯ/)Կ7DV-5z)%sYg1floo?ޞC2)zwO"O[FyΉ#[GӮ_zڊ!=|Nm=kq~~og~|Ew\j_R+|ٗ_ ⾣'ֳ͉_|g{O8;С͗sZj\z#\.v;;:_q8T^ؽk/9>vDQ;v:E D5{WgϞr*V硐rwTaNџ7C̍s9ʯ~܏2wg6_E9g\rLDgg:문W{?.ĩ#݇"b_#Gȿ}<? .xHJvwb;D0/^*^Wu#~wu7?MkCSUb>`=?L?Ƽmn-\ HiRD/=?y;w޳^})<]t*׽^vςN J)x‡7Lo]!txOzQaϞf_SiNP{9[}666g<{/z?o+N=ǿ/w- o@G`87= grwE)>9g7~ g!P?;/f9r{tPDqw>w?Y.\}\'oU˿?v!3$ylrS+_J7ZCNxy7ȿ7ZujEUO$r9=EadwG󒗼0?;灗<{Χ95uq˿o~Ce/B~~w;?z/B}VqQU>uRx׻ž}xSeé"⻶:S?V9|5TAU^ \a׮u>; TSj᳨I)s>M\{>i޻]6Y.qQ m66gÌ*nGO"^woUW]?0XaSkmo{_i?@D/R{򲗾]w>v58&q.e/{){>{gtsJ_ZwNNoy  Ӽ>}\֟{nM뿁 !'ezN㪫ڙɏ ?X,گZ'G^M/b='.~F^{< ",y[­?[S;T]9ݩ;,FO{A:\sM|DkΆzzO.tGFDVOX`D~K~pGr|ʭԻ&{>}-̮]NMJ Q=^?CN:{ $`kOx]ԧ=o}?t8A{lG8 ]b{{?ɓd^{/Z0p\p_~9??_{ݻy˾1v}w*\.9쳹K=\J)|rw>}w|www\ve|w}'FDλx~~#;͟1EZ㫾H)H>IQK6vz<|NKHf.+|RN9#EMXEOg'>}۷rW *l7h͟{Z ]t/8a'?oo|׿?DNa6Cz:W%B5Tl m67134 ~0 CTr$U~~n}ȞUj}z?fuu]G"-n<.k8p;3*{⪋~=7nx]x!{x񋿉 nVWD/xss>яkx;ɡO}^}5\4jmZy;ŧ>)MvE csl/:tM႓'0?b Q!uY '<{&`vl.Wj{t?<95>޽3gu/q9t!g;;@Y 'e=}z"ibcc~<\ϫfw;|/?b|>o6j͌!g>ˍ1c)?}+O$Ļ/"G5O:~;?Wqmx7~#_/DD[wؿ>ַR*o9|Glafxp!~WCo_䜹[yk_M7ĸ\Q}f"8V?=W8t^z)ł|wÇ{a%'Hxgk_ZRJ< O+9pロE/ ~_6z4v{W\wԫ3x٘Ϲk9sOx~tjV]ؽ{OG/]q͍fFWilFaGO>\j)d޽fvU}X j;mx/6669p9x [[[}pip)Or 6^w\H9$??|w_k~-/y/+R ?۾[ys?W| yͿw߿GvUu9KB~gc`C(@Jhۮ.*[KJԢѢ4݀F@fR !DHB #y?=g5?>L{Hrιk}w~wkKx 7dƬ?y^7|sY,/y~/oy fƦġJ%W#0P)k.j8p/~&X{tfl۶K.R y /}K831w>  Q+/N'HId?:?#N|~0;5s6=ݦ' |)GTٿg_V\_Wp|X۾+(*fG~ٟY.2Q#jsWvřg6w]AQ)>: \|%}KfWK)%/O:/~@|6c5̌a!eXo|}61G'֟;#C`a`߾}ԟs͵5W|}5,͹2S1ҍNl,s\y&'ԏ˗eZs= dN~ɽ̟M =ܬо?O7/f2;,{J=[]łݻws%۟7v뭼o{ά k< iO#k#rnۿ/BSS'(0RfԳ Z|^]qf`B/W#.9΁y/+_*DpΝ\y[Y)O}*ٽ{ }ϓ~2W\qC:"/<>~?ݻ;ށxee]vgi;Nc6qϞ,66pύbX݋?d}]vw}Ϟ{ҟ\|O1կZkk,FIԜ`~v6qqW^o=w:0Fۿu yg*{n6*}?c۷AܟScjb3g,ӒE&qWrwnD`3^zy{G7Wn.nQ/<)l۶m<1O{5SߘY~6o|yZ+ ^6v ^xO\r1Lb:Z#"c?Sota>~ާ*l_[ˌC>#"% 3%\_f33;2J_|e|$y?s~׼ Woz#Y_Rg+v3T5|Wn_&" x˿{lN?^p?fx{#?~K!e):,~a>ӽGNBcd]җUW]u&9N?{vɬ>͞={9d7_|>Ӳ?]qγXWO{f+)?Lrc>t]Vx䥏dccs9[n{Ts9/~T /1[%OTAs9gh<97>y[8Aae\~l۶Fk fUȌ{s9xיmtrf+Xؘ3VVeϱ4'<"W?l24@n2}~dx8x#1;VVV_\p>?O%x8\p W< XfF.=k㯥a[b߱ z#_=ox/0b9]ww>A?|VWW7?'fy<ȥ byχDx.4C`;k3Ϲ暧riQje4,N>nXdv!3O8ed%6yw޹4(NThC{@uc}ι9d KlvyI'y\|O 99aguxs5v? DBD/]?nS~h>]x'2K`s!za>m۶xbH\pO(,q恰X̩~szWqʐk2X7=0,ٟq%>L ;agX,֦?<0Zw@Pk/} /{K' 7ev A ֔'|toa`SOG:˩رc ĉq6?qrj++ؿ#9O|ݷw7ֶo~neuƁٶmҟ{v}&Cʮ9 ?}Mmlgcrڻg7O۱9>YO?sߢ듿_8pऴCg254cku*Cu;y|1CsهOQݻw[7lńDbS0җn/vHB16<'n=vzsoE|3#W]M .x8zvgXYYo-Sfssֿ_  OxyvۗyY,x:sYX_&gxaů7uk)َvt}cyn<=OOxjk6<kmj~]ڜOll6Q~7?I͸iOc׮]l.c7AM\|g) +x4f< }sFvG]~Z`k(w˗a;9<#qfoE}j'tʕotM>R`OV'qM?G<tms=x\sՕԢ[{9_k|3پm5(| @V<r [oWP?2V[Y̝vvx?|&o_̷<Ͼj[mmoCG))n44[fmնڃy[qno#Ph)_WնVj[mmoxwǏ(MQD/䇖qʁYCchu+$kQˊG;꽴q-[pߩraʱr//zCX|w113Yq:=ѯ׈<0:9ָl潕>fYmʒycM#nigcq9z0^B٣/Gߨffl[m>˹;S|=cnBgtP)h%Y5gQmT #JFj(ZE*>fJScB)FLpJPJtULHk=#B i m1g lX%|( NBy8Y%uHH#ŝu@i1wlE!2h/|9UAJ!4ЮcՑȊ`eB)v@)*Ԙ.(Ƃ(Wz-2kTEJuH (Bt_Y@Ix%t'5hp (,'b@-X7lD7%hHPp,+c4$*fF-=w޺;ZŠx͎mfJLfx1DN.p@! }RG* EP:]Shn6ҕh/QDAyEj%+BEJkOPM#t4"+fѿ0an#.% g#68*Ӛahi # Fc:^EgW=!PW㸏(&_Ap$ʍ8q+ث9նV6 G~LMM3tk :t!XIBȈD4%Ie(P%P)%hQzJ"7fЛ!$P- !-%Q č02pg4Y%P 5h= :Jt,pNEl@cpP\d[|w" Q(*jTYEg N(m,X6ij$(R +BhAHVev 7P 45"? \qk7- B+HZF6bFlC1ą`ZbPD3RP)X(NE)%!cySttT lFA$m֫(+ HۆHf(=b.(04BJGXA+iDG@9FDP"fTɹE/14 (]qZTd*S 2 Kw޿GPkƌEt%ªeq'mRݹ7*EeY'zp\(*B@4M  h:hm=Dl h37n#6.h: *xPF#L` T .xX`Zn>2t(FB RVD5:-|7E)ǧjMi:-D(1Z< zQ +gE!uEvsqJnTX7o &%蕈U" 'ԑF+Pq4#ODP^^3;L :}aH(Rz&?%9]hi%k#ІӐh9'BLE-1do)bȌܳ_K2fӦp3-"Ahsbp!.FE0%tAXmx :qp@u4*. ^Ґ8|R^ ՠFJuMP_ĠGA];Ex !( QĕXx!\p;0shAky$9X66l F`l 7!ZÆF4g2 b{LI#<)=0CB))4ݣE1jGZ [[ml;&S#ڠG0Ygg>gem;Pq ul}Hm:կfPCHwHDzxCbQq9FNFQJl$0D*CQupiMG KP8B5gB#>bT)XqVm ]O d5" CY0ʌ6RTbeDZ2" :âogudpͅӂ.4W+5 õpf4J(NusALڨ!4d[6CP"Ll:-HZR)ЄE,2D]8.#ք5(# c]V(u*A'JZ@#)>Á(01Z7cl!`j4IYl e݄ !aZU0\ Q p[;:*3daD( Qx,-0p0g1hVei! LF5bL5u @“2V5h`c#R[I6T:,X *cT9@W0&Pq"xQIRQB*0E! %2N :1 4e4"htYd ,BM!A#{̄aJXEp1U"Ș9gF\;Jg2CN"|O?~\ze#Mʥa.)K(H"7 /X < N* h(c&'АbdeFxn ,: g7u6Bi 2RciC0Z'VhᨌTFfhDQj8a1v.j6s~q O}:?W tS(F R15d ɉ%*נyPʤg{0QK#>gaL-T8: wpOl@}uT@ĈêZLR@Z#5RGPj х4u6svP,r?ussOhwՂkf]#N %&D` A+P, j F%p{ր\9cHC1,uE 6 !B B9oRdX̣Gj[mT;F)m;W_}5>1臭+T1Px4:ɯ0<gt@!r(H]GxI#!Z Y9hCŃ-TF!u5& xkqn墓:tfBD"1JԴK2 JQ#PNQj)hG?w]_5Y(:i5x#CH!<DZ⹠2"@5If)A,0{ ;͆Ըa ãÈZnNڦlA#6&k).PW@#hUjInzs4FD_U/o?1^I h'ԋ53B JcԒhE>I)-sN"uI0aҡqd2qoAspƸ 4NH1 `x7ZؤIìQ!_!(!x>ɨ@S5zHĻk}GkBj RQ3uIJ 2 G"Z`DFrd^hxqj m@k`8˒KÉQuMUXOP>P0E`S_S%j[~5ASkkk؏Sc6 JOJ h|]eh 0&E#&ΦP0-0,R1D0Mtq6cA1VqϘ"_>ȍ.l0".tnQE(i%ʑ+>ha.0˥I7W^y%;s>};w3Rˡ$H-SIGC,om%(nh$*Θz5ބӂjCa°C-75SǀqĢn*c(+-/MǼ#,Dh^n4}NP#23vA̐(L(RsK,X§?i뻾糟Q 6" ސ4"Mcy!X!eFX8EC a mPC0 1*ʺT,s72"4kX4zGDA0/SP2,R-Q7j-ǦArh^? wy43:!ht2ki-sG%x3QB0]h&d0<&0bLh)l!F#"C6cEG}z`~ -1WF Ȱ'%& < P(6#B?Vj~ R 8^*wBCW(Q&v`=7J #T"}CZW(Z0E'a3hPb7) \:I[bQTg;0ɚ=ZAff؍Rh>pNS )7oqs<~믿۷sw8ReNG 6ަ쨥 >R)$}fS*iG'J%bFrO؜Q :6tCXTq,NB0WX0D%tAׄb̌ m2R@Fȁ[I=I9F? mʂY23TEP's?cv}8ʗH@Pp*zU2,Quӷ2߉)A H>gh-J: 6mD GQ`B D Q6p1S+B2.`3GbFTC< pg4c&t3ą^ MBGB0>GGo= 8NI "L 43&`1Q|ȍ́17<."8%&ɔ!Ǽ K7mvIVeZhE1=4( 0Jd.dhʂdHFiU##˔V#,J LY 8KXP;B1SQ+*Њ~N;jz!@:et3%2 dH`Lw ~ﺎn/8gh.$}`$dBLYIaʌpg8Ab}QM a-#UbfW h!&xi$7d E6`b, #Y F,ӚPyH#:E+86eHuɦNmlڀַۿ,{Y1HxqU$JutB4 m>#{ vF<ԉ7 Ϲ[{IAH1“K Hj jkC>A`r0!EiŦ-Vj j`5cO  ؔi%b#Uq\ (ns@mD¨V4g)RՔA 0qJ dZ4b3tyb315$;/,X|ԝsJwKVHEfi`6d\3i:n-t\Qm:9&@Ac-Uo{7qf9$Ԙ*L3s=F'2Ώ04k2 !33X@Tԍ6,3ϔ IDAT&c#l'̠ig:& \]XuF J@BSbTt>(؝sTe5ِXGft"GA?qy ^7{+3 ۉYdI؞Y1"'Lp:7TM"96P&cR^Z12@iJB55SC@dl %0`i-YSdRQ0|1b.ɖ&(5+)4`TAE2~@!NΩy[]wV:{9|d`>ANt:#YMƤY?; iQF<2;1YafF"2 PǔkS5ȃd)>5`(2m;gmv '$%ORx,#FVKm;Sa0㚩UvJ4Nm)QFrFgi5֑g3xZ "xS-P0[XɁ4+xHd94Wn`4 |u3<{@!-oy 7|3o~4FtRDS& -(>IN,B-tҁDtN R^Lq$YTJĔ}@h`ON 2U" ɚt̊S4/Lsc15IcQ'qr H̗3ZM _Wr1xR)$H, NWHF cJ MNxC*5ĂܬMh4B"x N)ѺiLLC3zab8(])1DJn MI+RhҩtEx똀M'>lllO}??ogr-<$@:<<1"ub`@ ӿF2;I)cX2v.NL5J)W' OLe#Iis53uVn$S !OD$*imAӦ̭j[AMj{)ly, 07? &xd{\tҞ .RwcF)"GR?օfM ڀz!b~wå"C`!Eq::=a @$0܌Sn VѻIEHM:BA%T8w`O&r9&5袋x3^c{I (|T!:6V<8rL7SТ U2%ŔU7 IRaObX=A!jUL=IL K%oJu27rJ}0LA=QhoLq&N)$@ g VVVx0 , ??fHm EifHݴ9,6K?(D-ذL۴2}͓JCM"i -DBa`17)9YPB+z.1Y[8Q}1]uʦPnYzvb><=LH\K)Ц^FFO*_FdMLa'c<^!]c=ZL3&.-.EZڤJג҈hĔ #O^^}!Ҥ1R {5aKC#L___r]wqW mvJL2S#BH橹i /-'|SQخu[T Zc.qr X!#C#(e6+c2wfdp (4OEAZ$բ2%I&Gfg0'Ld)/}#4ci!X!OtVpŐCV̳KOdƒiWRi B l%kQ'e~13TM ABdtZC7}8KR7Nଝ'b`:%hplx{D#k0$H} d_qX%SB Yja #9/hd{,}I+Y%G4Soyt7G&gM&-r m5 E*&C -4PUYmmNb'o;|轎bPQZdkE|Ȣ3A1i+A71E܄x߇G@̚jNu2JmfAO:XO#7I,]M9^zZ[PhnTa2{ԫӭZr]CL?I#r2>vZR7%U騈rȃ2Q*XR;S4#-8VL#}Tl}Y_hh&6a>ZC9_gU Z":J'Rn⺸& K;WSwx[U] B B hb5;Sx5ɜĆ ԩV=r|6)##`jA`trx\)ɄȞ6?I x]pM:84kzN42bKTO|LѯXr/Ru9ַ>?g負Q|0I^0_ eiG|iSWљ— 5:x$l5-B'*"KStrJQ+]0<D `QAYR9ߛd4_NDbGĆ:mS2ߞѡtZ"|]Ѕt-DhL'otYyzDM-J/k;atsȓ N>(}U@7)އBEHqL"Pv^XaD;`;V> ZGdB'҇b &FDSuJsIFވ'#J]CsLL-'ʼnbGWO )GמG#=!ft4pj:4J~?%5¶f%V 44V,wXi4ҴrnA!ɦhIĚ dHlSIF I&>iVD#%wePjzIeC(UJe1HOCzN0uř4Ӈ,#U$[T=(Y,_{|o#;N@838`8PRla8gACǸssq_py̲,`BTÆPHGj- 9X<:gN6gEs?ѧeIx`HǠu.?FPlQ.=#IDH7)'l 4'K2QęoB\/T!3q!>Bㅫ=͗FG$?d@\S9C=s4SE(PYGsE0ԨL 'yV9mK9E0F!$&OJ2_,#klvaN5!% m~17T>gјb'<@$ TVuJx+i_AgtļӇ!\%@QcR!ZnK=Hf)[j#])=VmƞTYS D<ƾ'tIco,k7)|!]7QAB"T K nKPu֯Ec=p&Lbhu7TY3]d4V7=!(A0LVEz"Gi㖊'6ҊrpτsU Hd$Ҙ?;jN E5˿v*=·1V\%$rP4 B FS,zs*3j*F!)E_𽜞G}⺸.?& gM[J'Zи\1&T|B}#`DOhp%:E-%|˝6V#^3yVK'I EqYiN X6Qİ(im{2eЌbXOd+*Fٳ4`_I cA#GdŞ\}24S;mݱx0Fд؂.cp)^6R(؎xg蒥{C0:-㰽<z@,>TadLL=.Β#XxZnXR)[r:4`3n4 jy.m^N2^QY0n F72̡G":BJ|(θYSha.V b)EDfV 5cۣѢR{K[@:#Nc:} &X$AG?fD4Ϭ0%Ib|~>23PfL hx4"Z#f{ryvˠ4q:ג_~ύat hS΍iM933JL6Δ?kgOCcNENk0]uq]\ߏFNSq#~ŧ We^~_1E2h7`XDSlbNCer<ٓ&i~ KNL9kՊ[*1(_AM(%B8'(oאҧF )EE8XGu:'̴]yo4iqQ8KP5wRs% ʵoob1e˲N0DhD\O}Szcx$S`yF:z3d+u ԆC 20LH*K9E4O{|bgs7ϨU"cIr"S9jJ?]ozG+Jb4[|֮ >\v#X͑531r/i!4nOQИƋSjxUI(/Y\a2`(8%^Iz|L5t@ݒ dtDrY+еI swZ_*ϩM;&Dtw0):ƊF%m,FA h=͢ NW{eW+y$-qnuT TYJÏcS'dˊMΠ`ұ6U%(2LXda"byPT1kiB$X9}FYO5%[;!뱞ML>$Cɰ!U4T^ejb\rŭQiw (77dϸ4N0=PIr3M>bNASM܉(}q]\=TQz_dʹ{VtOC }=ly\a͗Tңg < J> Yx*]8!Ƚ{Ms-gN d[>2NHcE2%8I^jWG`TLD?F"TF\7A-L*Ճ\D4ɕg>gYSj=((d2{2eHKjhkIP*U1A{A%c\NX8Uь {o&|lQ O`Wڷ IDATal:hmq2Y}i W\U8#ڍ-$p .MjCYXcp>s5C#:\g3K&WF~1}b^l]) }݃(X)֓6Fa{IUڀʍ5j}x[kh}EDTw[`9T>^, as#urt|˄h]G ϒ^OB0`w`DhxLXLY "aJoQByAM3Xs3 d 9\) ^*uq]\"CM Sa5g2d'pӨ4:=\Ț/&g͓x9*"d{%"ex,%J*4:B94O$#mF/CGDŽ Xe,J K3k`}I9L&FCRՄ9i>ٰHH^}4-2jzQճ@ɴa=ν/W:k>m4I _=}F/qIZ=-63:y{4=iDo|NZ: ~x ǎꍐF4YnĎȘ\ZQ ]ήAH1\Hu:<_s@MG ΖbhOߐbJ6V#af["cҞ& q֭$F6 ^2\-ޫuP*s2!,Fi|Dӟu5X?;Lv%/+PbD"ǕBBƽz447{ UC<Ʉ6~>]J>\:d.Y{1\\ןPCtvLMpQ. 2kvxB>oBY@_&dC|MivMPYְ8Hf,@tBu>Nӊh0@)P ]gNß0R{ӚOec-FBF:^B&V0KmX!0T15gFôO =`ic RgF]O` kUf ׌v`[v1iq>i`=0%)'ibT+Z U&2}1SjI# f3Ut[MKd,+_+U ed}y`V 5\rŞzVHO}ZkuvP2 ֵҵbP ,7)ŗ:.[é Uۀjv/ &[wbc(1J(y zS 9[?Tafun K,VL;Bcc(ȒU^t7E*iQFkGLB0s:r 0S>RS! (F7ؚ)5*=:>em+T`Al+UlYrXt'KܥRu_檈d4lqbJqmF{&6dB&=ak&n%VRȘt[`h it󝮂fGФ3O%$( bNiYWS vlIw9IJ$XzUӤIQPSP׳8fDpf,hR^:"9꽼ۘ'VD ݳ;0Yk,džH^&e%"KHet;ЫRlK>*F9h5ˑ:69a)lB'BvH݃f}Kz$Ot+QNBͺq3ob*cYt0U” /<",-S#>2 ߧ*@eՠ5'rz_3Wp=+,]pQl/ݨR7KY:,Ƌ9W0ҙ{\0 x_gzԓۣj< @ ^R{,a}G 'u< U=yK?=73?0I}eS1S#jgOwƐë^0\\ןP#x(& H')׿<} jL " Y5]exr5GJHFMhC\)c!.ja s|3Ɍ m)|g~qٻiRdLL rtIa9;^*3-!³.j4*ȎY ~9}y#2-#ؔ3mG[+U%@e<8,! [\uDkGs8Ɇt)o?lw%No]0F[RӏcjւĆSbcK:$RA$ SdцqH"X[H8+M i&=/|UxϽwsQa o%&CuyzSed]XOST drJ*NxKm(L> 4j-XgK"JzF? xi\aGt&/$j*c=+D tP .Fz癏}cH͗yw^Gj./OQDbֆ2͝mmu.6#=Ja.XQh6 }_\I,O;BvGY[5/=Kp<.O)Sj,S_# 9f{`d$2jCYG$2MYeYc/< m6|tg̍V,&}?EТbvuhs ;ӺW14(Pþ2rM6gC{[ub{, |᳟EkZeev\SwYifzɢQJݤefVEm*}В ᩔI(^"N`ƿq0SmM.36 É U&)뺲SnowyN%3LՒM(RlFN bli7N("ʇDEKIwLO }P]00KѬͰy0ߔƷT)hh CI:&>x2_y 92 \tRL\w7vkc=M{x ^cW;fi[ it1,XWOY5e vSy\{xhDCă9Ќ08hL~&CXhiw5opsiw֥w:i==5aurzc'+7╷5`SB~ͮ0\{~=.|?H֣ t.S>D'ND6o!+<*2ڮj!EV$f\& f {?7_1XeTQ%E 5"#>NpSBBs>跸_A/?@:Q\Y21\V(sw9|cAo+CPd0M*hd0=%8!`&Hi(}8M"1P Zt+*,, )IZndi|>n?u'!E ʜ*H ,wniU-ĵ7i7Nz4 hf=ڂVjllEvoS>A5~#iOJ!q?Y|"Qe;.W(1j&RGT\X锦TDeB u#?fz_gy-\w|JQr%rigPA)qm9'}%J?|.o/8i%@}%|C0,wxNEYun.jʭn׶Bk*JiiRSRdZبhNoʶzjJXXjDSJ2ϙ02DxPxK=730 KD0@Y(bgilVtw?|Z箞rl%ŨfpKs7`9}Xqayfbd#FJ/?4m{|/F;+% +,tG >pՔϹ, Q jy"U ;N1S~r&[NJĜܚ|;d4R*3a'gؗmQ¥ʯ|';i$i G^:< q.qOe/W_QȪmn;K46+cX}ڞ+]/KFM$Bu/D3]KҤ;o !t}N3oTD C6vGXVftsD%ap:ƼqﰙB;rc/܅Pe78N;9OQ3SbJ_O؛PUXb-2 +[qbMm"A3މ9 5lT"I@KPvk+- &zA9|ia{mDC39/mRS6t2)ژ =F [c*JUX|o }UX#h­ӅٝwoeúB1aY+A1R 5FS޴"Ke!; Uֳew, kHӿ"z{_ _nqp+i\"['xkܳ;m|Ż\ ^vLe\yZX|#rsx㫯7Xp[{V~/o>?H:*l/LϢ6H^\?k-|?oƯCGGGͿPdMAAbEу @e) aQvHN vBC:ҙkI|'iEVzY I'tP 1e ڤ2c^QOhszp| 8m4._qā;{*G|rﵕSG֝{mu?Qhmˎ槔~*ζm)%Zް^($)U=Y'7,&4v&E&1VȈ "boxj4%yFYFc[PC,lc1nV@&BW\eˇ[ }tlVtuֵ3=\aBT$" Y>#ܼ*W_;|<!_R÷ƾH0ğzo z(S.M3P*{x Wz/LݩDTgh9[$43tKKces_qP KcQ**ggо* oVSwް?n'kg8$"Ab@¤qyCOb~ܾ:O?WVXYXWC?w%so"C+`;|p{e+oݐ?݇}z\7L e,oCWA^g2y;"k:<"TA7uDU.i51DfJĆ߯}Yږ m}cb}ğ87Qy{y 7q{_vo?]N\GO\g3zz1'yhs ^ Gq!WI(pzU\sa_}kj?v& sn#lj^<2{`fOӸkЦq)9܍SNldǍ/(>x ^0L6\]eAμ kRO%1( &%s~/ /vWy O+',ƺnbj,Fx>1!No}{|񕻜MkƾM@>gܧ8_W|eUrsT} Ƕ6#Шܾu9& ·{͆}-dө鿉Ns=H|x xA MVp) J k7FG}\uɑn9eݥΨZaeācOlxK1O+o/s8p->љÃ[m]~_W}o~yK?:tfZ\9=ͅ.qoW0=zmN4Dadk׼'r!zߣtlhI󬄍CP @lOpJEkE#yJxi6S늈`6!jL}x|~Wm7NԳ~ꡉ}*>F !ayT5m4y)4o IDAT.xīOry=73۞.+ߺv&0wk50s6;{9~;|o JePfXxiy`P(Lo~ f%M;D7:zt\:`F~M(yh3:aI%r}.t >}彿\{xNeϼ {čpR zhMr Q:?xov\: = IGz*V_==\خ'%޼&N*'j,iᱣT+3wnߢKId@x +]uCֆI{[l:?,֮<{i><Y,Ydd9-[qlĉA 1nH: _ 4tvJtHclK,RK*ECM*J5p,Ϟ_.Rv"wuU,׿}25Mҙ,Q{dHaSMR|w>Y(0ڌwr4):Qi45Ǐ4T^wlʤ8Tr~f`Eu0[>GgA:edk6IS0(ѾVR0|;^?^b}K#{677_e>?Ξ=CQ'6I6\hRNmg4++˙%)RUe Jk|/^˳v}䑓;nkL-G&M!7Sb=DH0Ɛ8qZsgwsɭSnoMՁaڦqf".{YEz΀|Q)n5]f*"2c #O]a; ]n]o!B|Ǔlؙ`B-07) ڽ)>F ƑjYP IjϿ/\8͝H{i}cp7/mu=|{' !7pxKgsq6=8Z蹂.# ڠ*K^z,Z:"Bnl27-pLà2m.T9Щ:D9NӗH.={\f?J!}̹ ;`2RZ?Xp rm[) yTXYV\x"nTdy(lNES5յE k0evxYm3 .9o*+B(4H7Q,rw.EQ\R'6ؼ{0"&H@,v)f4f$5/gRPhl!ƜaoC߻ ӯa:qPW_g( B|_ueY5y;lړ{>!j6(@tsT6@kg*x%w2!sxX8Wg/ؕM.F8w EvM7YVsgG+ W뫤JFN^?P .ߘQ;rƌl%BS 5mxʘQcY =b[sfk"7 th)D(lv(̍)Q;ʙPG`Jpgg|cxD;(nnN$)<|ŐHa9êNp  NWÏH9ZrI7"֜ v-4cc6:YN7:ڮeeqHKD/U:$PdM{ca5qs88%MKg(D}CAUا͗`e|7ڍ^#.E Q46 VU_%dF}l ?1,fw:}; O‡rm0"$aeZ`}bs6ʛtK*&7i}e0T4-称,|YAOө D^SQ"FVLZB4$(4e͟3/sqZ4J}-!יR_&& bkiЙA&ZD (IUHlD)Wo!A83]o_6 k>#g*HLgeڱ8ukf׷(]6pmܸ]W_0?4>ŸʹPXmLŧ3w8c~=>g '~n$Sem?cM~_uկw>A'5? B":LВVТi\J,V:vЪD9C?oW!Yzʱ %rwwāpt|nڢysof>3/Loӑl{9yl9/t`A'uܽq{;PP\D[!aFbrځNI< VӷեEb,RO [Z(iFO""{#'vmn9ԚZhx(* @-E-L3F g_D1 %|v6b-u$]fMhS=^T΅HMRK3o` :m1]3U:nxn2.]|QåjW_!gPtJX-J|WStSF0*Y|<p 'd ZJDfyZ%A+ɘ].gd:LJiNvVs_zY0*O,QIvЉ8˓O[nq/ֿPgoS`&Qo-N4.? *[mцcݔ0ΥsMjax:)v-VkGHVK)Rn,ӽ| `I#F;>~b<a77nr:9Fic`VlR.iҨB]Be:<`6Ełb9{d{{cz鵌\*`aV qvw/hk2aUGbX37_DR$d\tAo볪%KȠF|rHg\(vԑG>žl>~S%%N}#| 8Ȼ޾͵0%%Ke dJ$8tozB۬uHT@Z1Qz9X?O=P !56稜4%~WwffD \Ma$ᑤP*c3CV.6ܾI#)th&FEq-1vfbٶ-š(3&5u90wxqUW҅}{c,,>Whg,V ݛ@a|= 4huxlͨuGD_:\Q@Q`ڲ7pս I60]K7]wo!~3W(7nޡ&uy"Wu #^&T@SJgKܝEMMA+㯾m&lz@ Rgaz̚Rc+vze+e;nx+<8%HJ9,A®eg=8q{04m]7VY^2yp`T5[NjkjDe'$3Q忯u}9M>OgᡇNce}}W(R\cPPn\x"R "oa]'ϯ`0>r]yn 1Qe"6ȱ<\%n(ii@uHD*'q޻RĢ٬> k.kV3G~!+b8hچ271VNO$?I'-)#x1$%fוi*1fA&)[ *&llO,tHvƫӒ -um lJsIf"yOW g|fv!F)UGH)zP}֖ws_y <=R0>xbJB2GD%.\믽Ə3L?͇?a9ѣGݿIM P$xr+FѪ#?B J$i X؊ALz``Y~,:1t"UBKC\6\U7SV\IqG#{ Mw )߼4P2k#i56)ф#ձ%NZc84GNdunO (T/>?Fn#-ž3 LvΖD;7G:I8-*ZA "電<5j<[!p㉣<g&jy1 RvWB Dr GKX]ѼKŭ1GAo&t(FۻdAwY`{"Qb fGd]H|no<!FLagɴʀ! S)xx>5{>c4p|ivq+.ӟ "%zn3+PƦP;t1sg6y*̝O$Y2>-vN &qηMiœW!% huQ@4Bqn޾-%idvւ6tc γj|۱8\؂(tunMzg6eS~c8kٴj)zJ='cԧ>>u=cuu 9 F"CO7""D]ZqzeԍiɐTV CP'bH41֘=A+o+vophcJ+['=x q޲)\NQzDsK>~ϲjKNؒ5) ",W;_:>J3k HV+|0f!䟑`X pbZH*Њ)+PğWH*DSBivbhgXe#397jN'xq؟)|ҥEsu\"Y=/vX ,[S2iu}".EbLli4 + }Oe= ϰ-c,aREɫ5PU)(ۀ3l`iX_1)`&‹FЋa<ڼHg IDAT&#TȀ<[ yM!5v`se>EQL'7(Te#Ŵ>`yx5IɭZw-p r}ˢ Mi Sceu cКf2oF6QK kJ)]=6!ɒDCJX؞05!Xte:8`g035Ыr[!\T2+%؄VYHTx(EAP2^o G]2|[|<1kЪ"&h7:I_ط&br /7$P#si6_2}*Nb8i_I4B-kQJ~ BwtuLuPucǨTN(v9ho" J }7$ `^EHbIcbfd$aY,J4Q&0Vw`:mX^9hǟ|+̈*۵'Jv+(ߡƗsczIkɓ']M;ηTOC&CдV>66+:ؾycM˕8o=Ӄk\Xp̐sX.r@#ńr(%uϗ$Kߜ1k)Rtx1ɄE8kz12 ]FB;vY\wX1T6j!( :QTŅm@o`)#ln@5hU8TDt5ݍMזPf3J1w$˘7z|%&fF`H{5p hCY9 k)KG5Ii {X eYi?N5k'Jt\*$T0eJ( N=#t%iPTJK%+HQ+^[gb{aRu ~5JV%e)3\d˷HBň u=B#QeA,r~AxN7ϽFq;b]%DbU:cn Ml^iUe4>8ht%YI>5>)𾤄 2&͇6,IЦpEj., t1OaߟC3YDs0kE}Px{M۶8:Gbhl@)+)"F7@؜&4!y,YO/;Op{7(B1# C MLu8Rh#ᾢ b{%)ʈsoywܝ1`Cوm,a c3rEbS:TDrK I " }m"SFH"L?& 6@6( aR(aG(i+ >ݱw"0h擇<|gzcy}hPPXٱ  1* 54A:Tj](=z=ֆQU z0.2ME>fHիTLF4H&+zwoH_ƫ7)$ UHD@Ip 3(ؔhHWxsw4*6b,ZLF¢)sI_Z6T#vP9#ȈKtogBDP% #>PT64xcʁr4Ķ(ҬFZ؇V=U|K{&#Z8gI |@1}NL 1H]n/aqxZAgS-z>:aä@OD,Jy"<m8ӵV4I]B%Ͳ8DGȅ XMY`]~HҔ=ŸiڀcZ.VU( M`I9:IA1Fa'E1z©~Z؟yy\ܿq~C f^r~@!X zh]VIŹU;f#=ӹ|mMS{zP1&rED{j jvc`L N*EXmP6QJzĖRGqmn)0CIoCgkwq:z%DQcAOU\q䬲ܞܦs鬥dUVQxz[^ͿݿCa&?gI(D{$BЍ+bj%oZ+~W^a[p,XMvi&$U b(.øYEY!A5ONT"BD#]nГ'…>@+,"JyR(P0Yv8尅e00TO4Vryq=K&I]5_w 5PHky*k HDzx|^xRf7"5YLu`ɪlNI}Kah iF&IMc<1t*O "׋]F"Du9)?1_M!X6]J6\[I%,X; ]C|T(1]`1mE$%޼g]6G_+#\mV"mВAoG~l2ڊEIQJ9 L3>ro_" ̒͌mhQj^Syb 69P}r-8niOd T%1:*V( U1<$$*nnPh+JӑĤ* 8_Ǜ@HGl; Fu#N<eWq˜r;LJs(|2 bH*CH &3ombA"(f2qOJ|8&zb@<^@TF&*VKz .) !E?uP (]t!a@4Fk,uI0- xjU)[Bt!IcuIF A^%DT̡|\̵l#6)j1cbm˲sε>j7mwv#0b)v "X $0x PE@Ā%tp:]vNweG]_}oϳ{c0w!3_tܻ:s9 l/i+yODc4Zvr8E2M`H/G~ TSbp+Y{83'k!`=SrJz!r&JmF&@Q :2MxM26džM¨I\]#4w4&R=m"7|-DNdSa~dH6Ь3Oޝ|C- '90#J9#RH ie*Yѝ% EnhSjJ ~#q'Z$^«Uu$-J,+ӕ y,s!gJRֺ5wLbb$h3WA*Q@VSk]-|`+WD*Y6t40} )dZF8*ӫ̍aH Y3%9$%ХҪsa%%vW3VyXm4uR]]]$4 55B{Ki>dE ˎ՘\!-=-5Z4@4i`B ' #):QjbvzHB\IjD"bPRfZgY G7-_4S5!39 Ⱥb'ABO0df (&BI 6HoDV;(TybH*8\0h:X11WAJ ޔ 2h&Z PTqq_̛<ϼ封P9X[8Ux"e>`{$+ܫ'W<)ꄼJ`&G@wOȤd׵`F)ӞtX[*CA$u`"3؄T)Ԩ,YDޔڸU:P n%[2T3p5avOduS{l6Wq@^,i3;'ι6 .½vqL Oh~h?RBIh3&ѻ;63o, ͇w  #;xI8ogfA!Y8&;+<=f!atEL:HDMX[(PR-Gm$i֨=`&ڈ{c6{ԭsEU1{z\clpd;r&@0ƕ1E9JH OO7K|C7]" D!'%nTWN6Y!zNTY!xV{Q3E~ɅEZ}5zmґ y֘ )L,iPGUG2Mw@=.jé c(dw*XU/HGB툛ɽK(FR0`}gi"S#nGr;N7.Yn,jkxtvbyކjrJd(XJF51c %Zq4|ENwxbn\ND׹"![`eB;C"]fuj|ӆ%ZJhm=8-ld7\w#s5d%!QRTQX}_7!K R 𾱍S"JQe7 k9t]D]xp< 9fGmXJ"GƊxk?n/|#GFFD#֘1aa]ROK#.y ݙ0RPJ%@qܝ2d,*I)'FZk$%T;Ro,)}Wk'8߹WJLӳzX !s4߹+Fug>x'#n=12 %ƣ`y&"?wfm+[*ɽsǢ[18N3 +f d. IDAT.ID`Ev&I ٳD8s-h ݰD`TaCx3Ϟqv<"% 4CR2Vlw⊷vn˨Θw;G~'o$<=PFEBf o拟*&/!_1돾QR$TgS750Fg1 󼣶F{6$1>VAф'I%PQ9+Ǔ.Dj > Qe32s+k>'uX=Huz WWw\qpW|9~w?'>.g%n:"'% s<3/n_ڽJxċkwit'4صwˡ%.4Y#j5J9, P\i, 1Je(D 9u$ hv&F-x)=b=ѳQǟ~  PqJ7蓬ܽspG3ĿSxw[9΍?/ϲ>Mdh8Wj#̟wMv&?2Ͼvw.j$F.B4t&<+\9 2TaGɝIWdYPw$+NfT%0 IBÆ`ki("$Smlu:$L $8M:soz8x#Gly̟?v Mw(r~2ʙwU6)q4$Jw٤8I ~%V ٜH<he!L& p\zG!!zP\,X@:t`R.hH*d XcA2ܕsgvơ*LZXCgS78Yp<&lH,\\m{wbǃ?񇾕v~(;߾'n DIBB GڲNG8y^ykC88.O)3FJk cI>^XfغP$hRXYsHYnpǣ Lԥx֊[w _Sy惧 {mΎCMh"bL9%Ke+PQ̓ <`̖CLo懼L+,u9hjH]\J!Z(!l#GXMI*9; ޸cCKOҫ{??|g1ͳҠl.`3̃[_^~t{S xś xO+H6azhH"h9SL#! DxgcH+"z:Bsgw\!=(zkj+P!_V Oo4wݽ Ww؇9ŏg|q!jYǮxT6f%n!O :OX?ʻduVej0`n-h0M1zbOQxBJ-HT)YKE0Udĸ"W!OJ.ޕ!)5CCJY#qxF<9zxFɹPܸWwp>h_ylY0WF]s<<\\!p~~W.+w6qWʀD Gu30gxH)j} QX"CPg.=Hu7ZTU9düon}vHLNօ"HHjW\<ڢ眏O?ğ+Đ37^q2(I?}c^*j9cA3 oAprtL{LCFOm8-b BvPfPԣHTCe2#lX$oUVL(\ZN0=.F`:-x[# ~{nlotO{?w_3||Dh0+ ܣ s$[',sf;M13k!uR="™=^ΡsG%֋6>vU%T49%׆5Z[ fRS~YH9}{_neh9y\Sv,YQk{~;Ov{hOYRy3?n16ۙe։9*~j6.73T999uD^Xifn>`al'MPx, sVPQIh'NbdQ{=&Ee=@9 V'JɹwSO!'JhIsXNl{&k<#~O|G?{ 7iӼgޜRfa1Sj,Rp̔=۷2FujA :J<,=05zK51 n=)gEuNMѼ!+C=-u9ԖE I$$+T vv?d9捫|?slx鳯2ޚA8j&2- ,dD4&).LT ޜ)Ѕ9%[7!Sŭ`e3S5Ȣ&P0P![lAP#w۰V$-4ҡc!ɇmﺐ|sz5%lbG"&)=2[엠2NΆ,G~Ӽy }-M.C"@9j\ eJsæy%{f: ܜ:3'Dڅa]<<L9@S&"iֆE ^! * k" #Bc9:zDnыbUnMi!+ĩ5s@ŧo}sn>|#|E0yfH,3rDc]sG07#,,ibC!La }¤"vа0 6Ϩ BfFjp,%1>6{,็8bD`tKإ@ GZf$V}`[O}my(|}/W*.G <9b k&WfS)]\; Lyϔ fI:c8 i4;P "0Z ZdZuz]oJQSI0!ʐzGe, ~3 ųxOeJvWSF7_)}0ϟg_ub'5.,.x. ybaWAbAs!Ti "G;D+txV7) HL-мSsJCb,(.Fn +{Ĵ;J|8q;UrP)C\, 6҅ (UynFĤ~?fלל?W8Q8 짉Cb k GƸZCSq8&j]DLKU#ծ~f2եkBPhDFmF[:ر#QROn9TI ktY@c ݙ7 Amb3mC2q67ߞ)GkܫTPQf7Rv,yo짆yAP&sV"FbFOP(i%m xXs”l.BeܣVha,?b RB p>n0SDIRy'BEޱgޚyzo[xNm}$Ր*L[##z@8Gײa${qȑc$ws ]'x$ ~!# ),*v&$1t$#D$B7AB)5I ,eyXjV@hAWgfe#Ib# _B0]A×Di̋o>hMQ2-vC{n *ݠm R(*s$ #iC"dAl iP R41HꪏGhTRd hjdHId",UHA\Vi1O;KE=QrRl k^Ǎq`Syˠy# YyfH` ō!:Rqf7,*L5-l& KH۪T"f"%,*euPLLW(]ȇ<-EHɖ-Q=$I,CdC2wX<,Is4> NޞzH&hh:{PfčɃ2֧NhcUAVe[3:2eL37r8kSyR2A%h*< # ;D q$ - 8K%IiH =\Jp:4Lh %(uRBku*~\\r((*haFcDaqtorJBX"TX{! 9ku u7ZH#H]`@P Dn$ FjDsLu4C̉+1΄GG!S֓D{x$$mkNsCvKZ0.ޭ 00 as'4Â!= 7O{;Z PJ^$BGk8ӕhH@ݱ\>&(TIi &4;i2~OOnI*끤 g_ ҚXLq ;qjo7^:1Iq FImJ=}C{Hj$0xc:jt!tEd<#OȨ .)}4%Nl#FH9A LMuM:͹3xzZ5C Z`Gʭ')9s|\HBlyu0]/۝nesHT"$)Ifp@s?DzR%ս%L@|l'0HNXB$CQV=֡*ݮe"%co1PBXƭ1-3K5N`5X$SGQ8=ptՠ7Dk}`;8)_#V:7H8nB-a|zI' B1Xȑ ]4l#u^,jP\{J%dZR$끢J~KQI^[=NDd[TzqѠh܋HJvs&iZ` $ZU!|iх YCZpk&JD ~li(\vr.1ÚR)HQ*+YYQ-t$bmdy6 PPH ҡ4ԻJ%Y?(ԺGt8`uahBi<(TuyI$2+3I dɀ @I9tg  p66`0  aRwWf]i%8ge7S]]]tq9"08HGم_ 5p"r2ckYıUcp% $yQ{ P>a$Bk[K Ȇ*M$(LRU)p+\8ҀN üՔh#E9-D@! E64(D#l T6Ƙy)&3b D+v0-v  %öBXR& U!|h2o<;.*+*x-:ꃍ0) 򶎕He!I>@B)H,sI& !422(c8Iih-LIˡe(-R BaI"CJHC[vEABƜ𬿛mtcXWh)Ph\(8Ka)is\\`#0 |Hi5MxV: qB=!B`jUhk#f*D$Ȇ6OE"O'HI|r2Ä RBZhE$s'Gպl IDAT0`KބڵtLVG[OP)_I> ""оݑF 産L""DHe#M"II*H`iq"tdSd0 Ck5x!/:!+: ]e 21QRV W }.0,CY*II::>iD@,9MN٢X'D "PljjQ&DP&$D#+&(*h>lq-J]9FgZHaBa#ЄSQM~"!7JȂ?Dm QfC60 &!)+dB'2e(c%O$ӊ̓R0P"KY/I&$ B\|IIgt6MclbHJ"]krCPDF9!ۯ_#s|7% 0*KؐD\PIQV˥C"!1:kml_ʎPH\ZGT=tXg>FzhqD!?H1[PƖ`Jgo|s#^ <N G\c8 76ٕ `C"BC@yiխ/Bl!nҳUr +T@$<$$ /aAhGlJ~+/8~JxJewEJCV3WW(#/~a"c\amc t!W%lem!Ǹ(v":($n?*JJ1FF{xTH~%HAj\' D4Ȩ|0gDxI\_H%p|VFH˃yp! @x&l3E2B*^aa&^)mW[!Y)B "F8BFQ0Pz$IHD$(DI- )o$ZpQѶ".!rմPPŢ@h!@DFP 5Ɲ[RوL&OZmpp T Ƶ!֞sVc)mDM&VH|4Fg. W&6Q1jH%S?*;Nl 4Ԡm=6!l̷mF)4QR!9ig!,a1Aa^"Yr49b :JN"i9[82]IvGFEތqj0k#(ht66e%$AX_: 4چ*φ]z LhMA(yVlNvqL= #4Pm"M$ !r"rnk25L6#\isd J "Gj\B"dr9+\.GhI"!!RD!@јC0>(\D h1 -lUn I(\#ѡkì]С&.H\$&4Y\AC("ʴu^ΓIΠgIi#tT.^Aq][ rƀ|&PA.>MEHEDMXE Y2PITANAh~|Wv!:oTZ P 6QV6Xq<0ZK":hNj2ksLF|3Y?Pxhf օ$yC` L;!8ͱ 'G;ehshM(JhC6׮6`*y1B1( +L)f ! R2g b0B`E K71%K{բ/)m\7z Pabk9QX#-aL /.ds9q '̀nnΉL)V1$aw pOa[8ygy3S&VRP:A6 B yu֡ 2ݶΏX = /.CFnXtހKfk1hL?6v_ um,C70_Zn]95&&fsOB!q:˿mͿ6UDz_cbbG,]0pFk11111111KDa8ji]l1111111Kccƅc M465=7M>j i~RJf6$ 4NqRO!)/{R)uuTJ+/Q`K/ØCly11111111_D.|$_w/[gcOW0rd ouj,]5U5tx;ëvށ\.?/L2bɚ9C6(y~k,]'naFAgG{NۚZc)IEEO)a;&&f06+)NB\JI\R ! Sme YŲ`dK ։X+);J8wLLL qxa]Xl9f,}TVUaG+[>u*:a])f{R#2DFa0F [oD2ACCSI%T^)+&&fP#[oӮtRFm1.+Y y-vitAQJKqi""Cʵ|&Oٛ\.[Rc%l>"S|Nd8 0T,5/bbbBHQH>57:#CD4dHƚ;'/cm'UQSbSLLL Q(AEVٍYO\ʠ.~&'5uuRġwu9GkMCC#*HgTTXձ3@v111:Ͼ5mk2jTԐI1C('8KwO7uu% iCOR111%R9F/ELLPDڔ fknK !Gn1{]&Nܮ *.v'<~4bbbbbbb0 ϥ<)e2 X_ >bTӘcQJ_/6,m]/ 8OMLLLLLLG0FG|m%ar[!6Q1{)x0. ElL <B-Ǵ@:.t\2jjjJ1s:::dR Ð/ԗZkV^]j< TC&!"*++mn_J)!N}jkk7ԄL&CGG}CYYL}|@uuՠ1Euu$3f|PJFk2.MMM\eE7>N;HCCf 6TTT>V^RB<ϧT*罱qu]p]EQDww7\|Z(J}$ CTM\ 6{~B5$w|Nǡ񻾾>z{{I&;;;rTUUQY4l$n^{leee}2n_b) ŋ>}aELvK8ÿ}<75kկ|9sfd}#[tww/qQGr٥q}n, N.2sLr,o~qLֻ;5|`0eiHE\z%lV5NYpYKcpW?OxOO?0d_PWQGI*Bi͞'ssO,]n;c ,|!vura. VZ,?nd2_)$L#Fr8}W^ytvu_裿Y~-&Lwor\BM?$BH.<s?׿5ѸGdYp0 rGoo/R硵"Δ^?פi|\I'D.r|R::0 d2|!0='Ot !898{\7rQλRUU15l#M&_uSwEWW'3{,ƌC_FI$cr(cݑRRJRRJ|)Մ8>7Ɛdޭq̱=HP^^)?yǗvIx`A'# J.QfZS]]MWb}uYTVV2o)9唓9J9Cv~T׷gjᣏ>g[GMM s/_m#[ɤ38s᪫dvwsOq6ebѢ B={V(w"(eMRA@ExG2(ee8;hl첻^xnod2MEb q\t",r*>,_:u*<#[FņJ$pח0 5eeeDQD> EGEw}Ccf/3T0 "T*U}8APJ!)o]khLtwwsQ_c„ lTVVҷ(Ga;q\]e_w͢ 2+ 8Sylb7ꪫ9#9iX1?hiiG~%\/ 2F5OM?.H1q}q2fX/X@*b|;vku ؈'Jf2j4|J\%2cLƎۚ'(bѢYt)U5:0wpSSz*?ajtzX&0cיp=*FcI$DQɧB˨Xb=ú 88 ?OܚDR|kn<gk~;{NًW_}qOgR Ð:.R\!/"{7cƎƭçMyH;pihhO$99mO_<:;9oȢgOMm^"IooFBb vy'jjjRr_GO>ɂR8sNŋ1q#AK/-+i /=y䑼8R{a;nk|!!C.d=LkZ W_܅ 7ڎqx?dyMAěo1:jjjXr%+V`Ŋr9o`ɒ)++cڴ#{ihlf1bd >l6뺴13vGLNgg'{1m6i]|1xIs9k=@)C% '~GL?뮽sNn'1\reu],_\p>Dw|}ݏ/&gϞҥpYgrWRU]ϱ'/g㢋.9r3qO  1#F t?MMhZ3nXrP >}:/ )%tO>{;Nj/?SO?mOOL8SN9e \oo/aR___bKz 5#zmppu2b{QN;.]v݅X\xS/1cͣ9oOz̚5ʪj]>w~s9|>O2AͤIXq҉ +åR)~ÛUzi ?\?J)z{zhhlDkR1[Y-mG{AP0Gjj˭Him]8%ʹM{G;{u]cÐ}(s2Po0z(‹?fÜ9s8ʪ-Y#%M(Sj{|>O.9k٬Tqr˗3j(0d){&/k*"&+ve8K,?)7rK 8؞wBzz{I%455a u[F~t0Q1fVXjRJ^W^}##MO>!H2qDKGLz}fwtuu̳ij-}߮(fs]H㎥viGa}G?w2~?X< `,MM^-[Ɩ[lIL2eXϴwydXf BF?&-_NyE9eeedp O+&LCfj9 Gg~>jj3ϓHXVyy9̴3y?fѣ1ưo!]w S&a]waI'?ct#s~tޒ%ttuu1{lsutwur7KxGn٨IkرcUdw`E.>vUWP߀R='OXtj>#&Ne˖L&oh}>ZcɊO0 iko(젩 Y[pRw]455m,cZaȑ;-b1jH&,]uy7illD:VJ)~)׶F_ox饗B XP4 ohmQrJ=hCڄ?T6Ai͓$m.[o5cnjaĈ7KM65FjkkaX#֒I3}իo0&%n;ruutttj9x7i_JWgSz{{Z_<(8착gQJ6zE'>X{9ve j+6W?r4+Q!_f74RUY[o[ՑL1bqŕWo| \ǥ|o}^jjjhlldhkk%M(Xl_%Mp?=a~7u0o}[cŏ=Ξ{N8CxZjj:ִ<ˁ_2ZQ8&f(rZ1 `dseOz+.Ry6PQQAo+ -bҤIL0OC*b}g0}|__\QP6nVhYE]^{MUUGL;sOc&rЁrA[ncem8ݫj[nc+?~̙3{=SX_/hxZu-{6p}'SOBX77YgMyy9=|MfA 뮻5zmn^{5nFo;sORK(c dw 7HuMMIxf3sM7s‰'2z(vmW`YTVV"W]9h܋ceN'C(K/BL&J D{{;t9rdIeN*a=Fkk+v1룣ãj%S[l1lGtvu1ZfMڴ|g3'!d榦A  RJ>cF=*p]ŏ?β1Rn|rOEETWW?fDszRAOO5;u4N&u]+c{ ÐFi 8|HU9r$Bikk3(g|>O]]zyjZ[[1XmQkk+L#FU4-)%tuuQ^^N9NlyGQ]]M: "|/ JZkV\EH} OA@:&4Z웣m;tvv.J)R)dŊDQ OKccʕX׊*?(uuTVVRWE$`ڵdY***h(Zvm)tk׮%SV"ϳV[NYY٠1_+}RTaHoouu筳ɤ T! bX)+)hjj*E9µkMsssi !T*ECCàHdYjjjJxBMLfk 席amYBw}f͚נJ[}(ijqLxy7q;Y_̆5 < {O1WMu}jbb6 8TVV&XŐRr&Øy74jb2&f&1$v@]mM<]aaQq!!H$bbbbbbb!p4?c_LLLLLLIv?6Pp~τ@IENDB`qstopmotion-2.3.2-Source/manual/screenshots/tooltab_recording.png000644 000000 000000 00000140067 12536560630 025367 0ustar00rootroot000000 000000 PNG  IHDR5-x)sRGBbKGD pHYs  tIME )!] IDATxw|uה NH*`C *(;!~*v Q8:$Z23?6$< 6[+u nSU!B}-FlX֟ۗeYh2{Eqy+cǎtҥ[aa("]!گʯѾ?j42dQyy m[֭P($F!(b1,"4jl-+;ۦO -4%!b,4-4nPZMWUUUkT !Bn!f_%=q!B0SeWQLܧNO@#B,( 澮QU,@OTIB!R;g ;,IJ`eLDQӴvHn!Bo k21 N;*EE1 Mܱa˲_|zO}Kq|Դm{}>pJGx<8^a-UUٲu+iiχ'+3v;r:IKKf!&vBdbB!4iB\vmےByy9F`GojF'އ:.oݏ =-N=%yմn7766m㈮]Qf{e>=222l6t]ONev0 UӒi!wLkA ,kڔa&:t,-[ƒKk7vDB,bÆ4V S@UUnM┩, vEQ{ٸq#N{|`r%#8}Й<ȣAN'v{2}Yϻ00̝pN0L^s07o\sVY 7Ljj*}O;˯p8™G5B:/9_&cNu7͙awDSr7˲$Iܰ,ݵk?\,8HyAd3Qdgrj.1;xO};:wȼoukk<:udӦMy9p g}̦M8of 4y{IOKgԩtp[? ?/g?n#\5oLz pdfdpȿsd@HgL|ix-77ߢs߫O=<otIfz:^~>'#3|l9,PKغmo4:OѯuVڶmfmw( S#W/Be˸Qmӆ۷'GIA6jْ GqI 7,.6q&"Wr"_~A|_IC](lߎWxeˊ8wo}O?,XMrsi($P\q饼8_{T8`wk&¹gf ÜxBox-F338qݸ8wXlܴF\N崓O4M`(ikjJ|~a`YWS񧟡j7z(99tЁKG^EΝcBaL+fuc0 a MxZ7b~?t}u]u\fcXEn~&/?( M6n|2i$뢋.>5BL$* ~}YHEEh Tfr%GA0nt:5 O$Vm*x]Py3{p$LǓiLt]'ym3BtNp8eYATMfqٰaM4 mq\DQLӤ5D" &S]]-55BŶmիq\t觟v, 89k&K4$;:YH\Uk|b(!ݮۑHG͐lUUx܄á:IOKKvΚ/0$'nOk?qXUU%5BjiEAWd-̾h`lNJJJ/?tx~%)8km~sF& 96\qp&?l|b}wGuՕ D[.+ޔk8$fLT# !m6-9KᆲHxE[#f'GbdM~a_}"EQϧʪ?_M1M&qB!_@UU6mJngE5ƈa19B!KˉdT"XBqR>5B!8h3*B!=KXjjBqвdAK!By*PeYLauX4bTv~n0vo(pU%ߟ]*Ą}ijU0 TUI'%CO? oO̙3lgr1=vsȑvکs|ޯX C80ɧ[o3s,֬^Cl:k/%(J͢}U׬]ˬ?Νm۶31k/oмY36oǟ|B]BnI'E4,pЩs'իWӶ][ ڱ}VHOOyVs4j4IIIuVuBVzz:i\ѱcG"F]/TgEt:sx֭]ǙgI&qvaeYL6SN9͛*^ÛoQUUEӦM{IlqQ_|~( | ;w&++ ߏH>@ @ZZ:M4G^^P\\LFF)))A;di5͖Z46oBUU%NML6l@ux0apސ![p$ 'kn?=54~zZ| ͦS\\ ,Zq=ˊ+8`@vyC83D"|w\7: !( /]< ݆ix<"$VR/#~18y,XoE4 Fc 2Frb4ou׏'gϞ8N7E!55M<,n^>_j(#5sncm 0I^/EEEL$qaF8z.:( W /LGt9!;n'++w}_fs 7kҶm[ΛoOfә\2b.d`h4'4iѢz/G)).N"i. c4i҄W^y@AA[~'֭__LYyF,˯EC/DӴzז b')|)t-rqᇳtRF]s-C;UU!Ch߾=~y[G!إvԱanfӌ zx^?uVG%F:'ɲ,^/[lgϞXkYXYq nҞhF&MK>9KԞ(–-[ضmN \_|P#`֬Yd SNe|l{Y 1MI~|B!ke˖4oޜG}. |Y|q92|pJE`0iZlݺ,TU>qKJJ >O| !7vTp Z4M~?ns=W_}+/̙((hGct=(y4m֜1RE/NfƈӨF,Dz,v;F]Mcn'TUe…\2|8{> 7pyydgg3bp.B6kKyy9gџ[oN>m۶ΠAi׾>˲Cɰab!?|Gu4'Mtt8~ 3y{|cgʦ]v4= BA^{{15o{gv<'M8K.L>믿@ Pא8/ 0/<<[ڵ/{pǸqdffq9gӽGO= N??-Zo_SiR&7ɭ2qDsή,z&D(HII ˅n'`.+9& xmYɑ0Pq51|~?ɚ Á kheYNl5#b:]q:(iLDu܉&jDY  ##dn#&ߏ?>ә쿒8{S;t:QU5yv&Q\N'P@ ^or߉M$Nj*Uf(PQQI,> [~EQBuTbz"p% )U,^{FN;p8p\uH>",8&# %m&^^ay(uΓ4"@`c*Hp$AQ^~Xh 0qCSSS9ȣ(ݰζ`/͚? UUyr}:A2MF-潑±b͚5. R}nCԾi_̞}ݏ*zޟ(L2qwm`0ȶ[vSNҥKs QLUS!#'Z=8YI(Q&DwpP(O}%[ee~H4O%B?~~)))ԴD *!D7k.A`jjd3s }iOkD]j,sS}-?PR,A4(Moee! Xv>"⯑_uB8eF!KSU.79cfcw/xKm:RYQAIz5j@CJ|n5aRرSlxQ3m>5Bq`R5 ӱSбXb9==^|C?%Qn;mU\A!ā:GaR5^*'}lv:f:a_BZW2Pa^.F!GfO )HB!ġGC ~([t6?J4ܞUu~b!8N8YYYdffI':~GdffjB v;W]y%z*,+F^\EQ4MCӴdIt0VU5'KgYz,\jaZuN ϗeYV%t{$OBqj[PÏ<s ,_3f:B 4 ˌ3Xrp9ЪU+6o[oE醍:XeY=}:?#h` mJӦMywP&q)i%%%dgrjr4fȑ8l6k׭ߠ첆IMB.ZD^hٲ\{-s6r*ޟMel^)Fuu5^K/"{N'\~߸¡L<>gɔ駟.cl*+Cٰq#?h͛7s=27o1oͪU8״isɧb BjjAFlٲN8~it]/qs5j't3gePXXaB!-ZėsfjZ4o΅o²,rssyE#}cx^˂ u|oDKRiI1N]xٺup 5%E"55Bq:Xbw}GQQPQQ-[㏙\}Ut֍`( 1eYjncp\Ӣe+F'xBi,j*+:Oɓ&IGa!8.Wia୮NnFD"b1̚Z@ >a5ݾo }>lNѲ_x%KaÆdPЩSgZhYjEҿ]t7rTs$!ؕ^cn/M ;bo5{qdffi}HBʬmJӓρf"6kܫǪ^sTBB4N#tS#BC!DgYV(uf, 0u0_Ưĕx4v];s痪{KBBHilذ^{kp88#>|8?7tc ݻwBL8_~#<ѣGcA c4!$ι &i]wݟ%!Dg&P\\_'IMM%;;0:t(UM(,[*?z=f̝;gyM,; 9sqF.?4P8L8GyEQp\\ve8jB~zZlɍ7ވIJ,L4dA(//'F#;;EQÔ&\ҥKY!>qII eѲeK<OPh"ؼy3ZbӦM(͛i֬YYYRQQfM6Κ5ku@ @FFTVVҬY3PUrq8$ieTU]vIIIEβe˰lAhҤ UUU̟?R ),, n7iRTTNii)[l!?? `ݺu7nLnn!,k¥K,aƌ]44hs :t[BB4pBCaG~iٲ%h?9spBFE>}D"cwu[n% 2}t*++ [neڵtI D.]x衇زe /_$?zk;v,W]u}%ѵkW,bn.O>L2?vm۲dyYڵm{EQ;mڴW^f )))JB.v9ygPZʔ)SֵϿg$ 9S{Fc;t>/˗/'GUU6l@4&bbD!,^`ܸ;D"2UښH.6w{1_n'0AwqI<墢nGmJ8#K-p=l߾Gω'~}1 kMwMxG[8# iL4'~ʬY8 +q8s| n;\VZ-EUUliDBAp2FApb>Xe<|Wdd3eT>#FeܝE0b<6]ÑF8_,+34llHB̲L)`iݦ ?8g31tP, Ĵ,uĴ,nN^^04f{ ӲTVIxxgZf i`1@3U5 ӊ#1~x̙Cuu5)))D"PtÄݎnBꫯFuE.j;}v6Ű,~F7n;_Q^^Έ#0j~geѾ0>#a_a4q+>3lܴbzpew92``Z u_3t4m}Y;Fլ"/F!D=B͎eee|tޝTfΜ1$Vmk~6dƍ'1p 4iLeeeaضm;UUUs) ӢE 6mڄShٿeaY;^/2a-jMoʰa?N\.xN۶s=<4jԈ`0ofڴjժa /N̠Ap\GUbsr1=Yxq+}iݺ5'Oo߾TWW_8ӒKbg}ҥK0 -[6ӿ!&֗L' <$:G"Q^~z>^gӦML:K04Mbp0wԉ+Cr믿b&]v'w1=s)'ӷIdsg jX̨p8aFtܙ#8v3m4rrrŌ:a$4ho ڶmG֭9J\.WqwFҥ+={CUUr ~-:ufyx<LӤnrD"vZ?^5RRRHMM%8NTU0 |>_BK:x<5`nǃf#i>t***̤ 4?[n${gn ͎i|>E!%%EQF4kւt]' 4{y4h4fC$4Mvia v)F6m uDEUv 0mB6j7|3NvI$ &YPV> }v{},LεGAd؝h4Zg /h~@ @ ݣTUU|V^ac<]bP955;ii~P# 94ٚ`0?|HΝ0a6퐜β,`{O/F!1#>OpC?aBZ륲b;Շ{ܗEAY4 ЊȌB!p 8*++rߺSΡv󹑝כ=!unGɗgtb{NRu+ IBx嬨*۷0 > qoEqt;陙z!heY6:uaj%MQkfS 5Bр J} ȌBѠҹ*F! 5B!P#B!F!BBB!!BHB!P#BȌBq(_4ca) 5B!6ssٰa[4M9@BBB]׹{xGiҤ ڵ套_etABP#gm|<<Ѓ;ˊ |4|222PM\Nڴil*++fmAvboLbA)//aYYBBBzR~ 3rH|>_UKJJtMYXx1AVVUUUkߎ %X駞ꫯbٌz5mJIi)={^㮻fj 0jΗr˭cUKsLO!p8Z-ˢ ̘fctޝRlzHaϜy`V,/r1|&NĨQWēܹw>:ѣrӴiS~] ^\.' v]2oEQ, 0)*<͛70 X4 ăFJJ 99An^.+W" RUU7|MAA;wEEQp\DQB ׎KX_\eZ 5B!'rȑt^t^p-[eYj ,?`Æ q;v xUJj*]}<9c@^ypb~{:|΅CbZAYHBQOeaSts]8\|E|;?-[4:#vFC„'ob% aЙgD b1=F[n%3# Ѩ|@bQ&Md ]N4/mBqRUIVN}۶27@EQp8vPT,  anUӉ(}^EI[]iɟ-:UU(BkRIUU)))uv.,PmT'< PVuB}'M!8ap5J&J¢K <>W(l첝{djq}+Y$!D(  X|-f!q@jKϞǐ]p#F!5ibry5br~{;ii{^b!h`E*h,KZxL)ڷ/x=UgqjF.@nU5tcu݆aVBNjiݻSPP(h|l4f%lʽ[羄X,eYhƻv&֞]y<nF4MCuMƄ 0`4lu1EQXt)7|30 ._~noHGa!+5M###N; ( _5=zm۶\~XO<gffq_( 6*FAn8S|ɓO>I.](,,dĉf7ݎi… 9묳vyr;oY[M4aڴiiӆv1uTrrrvnoHMB4p0ŢL#F^^( {3/N~N;qMnjӹxqd6m@-A>d4;8^L2M ,Y b0 F]MjjA( `F'+3ƍ&p*{5!h,$( F,iYb1bFϊƆ u?ѽGd:BESO^g+D+V{&Xf-o&ea&HQy<?x~ H6q0Mp^a%%9=64jcyܻP#OBѠC Pab&>y1k}QdggѺuk6m>(^z)hA3|:+gddGabZ\}xA$$$y4MKũeYaىϲ,|>/v;_}gɸqwv-,Bz(lY^8Mnwt:x晧0 =\\.\qtޝv1s,.vc~c;Kvm7nޙ3sgbx<<8jTUU/6 :|1~_>ù瞇̘1#9dV^MT#F!0ӢNw}XMsοH.Cb&p8, ͛ft:())m;3Fl6z!0e%&̙3w;eRwHa5a3E!77wX2[!DJ3YCpq8uN}v^0'p(Ar)v.v,ypQ%Yٲ4i 9!e~>u.砵HB41 C<%>[ً1JeP# ixՀ4+/)U5ŗXHB[wѽG:B*/+vL*F! EUڵ-dFrPāu* 5Sdfe1j, M=ڭ[Ͱ[9.@I4@MDu,c/ 5B@-Bm躭}w2ק3!hfC\B! j Avk+i~Bh}j(n@*nCUzuP# 4>o5K/a-2IN iպu湑P# ,rr@i-k222ɑP#bW f9X׈2t+BvvY>r5*F!jQޓqUUQT5y!hjz^Jrٛ9$!fҚa@BB4Mcҥp\TUU͋/-܂!CyؖP#h BXUU&M+Bf|n9{gh4ef--1[XCRHB’BB6&5)چ4@ ՄP0llw,˒43.?sw4# D:Mt2D: -Dy! TX}e`!NN[$j Pd 8:85EL㟓&[TA9ս"`(rƶf}QU,'e˖79υn !NM)&@> FGGH$L&}bu%%%Xj:99#J{ÁV\m vB4rJq3a߽ŋާH֬Ywم'lNA= ur"H76_hf:Xx T|a X1KǏcll  q$IKRH Asr `͚ur?)v;lԗ ]< ,Is"vVއOKJJ$>$ɂ,gĉ3_O#N4]~P_t:v1Bp̘ޟOGPV-w op8in9JiZ]6l:#h8ĜE4TWWyxhkkC$园ȲlNNN"uTU%QC]!I-[hdYFkk+^oСCYE䤸OIαݣ(4M3lp_^u)9Q3Ơ( "Uz->D A1 ]X]d9(+jA+R!h |xׯOD, 'jm]uSl6˖LQ(L;H; '$Iؘ]I,YRjZ.s.W/Drz<hP>66)6$@QC=zԪ\_iz҈Fc+czsDqiiD [sԓp\b۸qk~w̥dY,pݐ$IědߢIx`ǑJ>Q\.l6w7ز䖊l9rdF*] g^3E Ƙg~>Qwm?n=pݘyN~v6e\u]s3&''-[JJJi&''g}xeYl̾q ]l6GB1qP+-t#H2? `!&cXsob(c8x`AT*w}wc5kֈV1hD"^a= Y:Wl8:dizXd LjrN3&&&(pq1>>nyyauEEEB\ZlH4ý7::~Qik{<477d5F{{{V`޽{g^bN'RpY-ʕ+QRR2]A__"ȼӉJxޜ}f׮]RCx^AtttLe! ņ OQ_ģb_$_ۚ5SטEWD u8r,eeN^^WyF\Z밲t$( 1>>9_Q[k]בNg ^acʕ(..67&šWRRR̴h]hQAei:tTĸK.bΝXt)-Z$&+$l۱>C̺׺H$Յn  3YI->.;ֆ1,_| 5L޽[\7$3z:o[DrUܟ,Hx>@kI|r899yR>W'cѣGhcӪ3ƐH$TVI`vZ5 au,,.HDӃX,fĞ={ J"g0ư~ƲrpNe՝s=qQE}DNj]ʡCri&kl׊bsJnH3A 'Dup?%1򧐡ut_]4Xp8,V\`%Cmu?\Ȳ UUk:cڳ c Y-,i19+B!-a}}}æb3ĕnϚ 11h4XldAd.\( n=+K:Vq^QQ^Wg8ѺnEH9N8#Af. ޽HmI!֡LEⷿE >,8l#$TU=G" Q:}hoo;qYTVV=J%-jb whe1i*cxx81 #^CCC&H^ B~( 0;fE]lX~ -4gp1)SZQQar*bŬUyy9*++Mi&&&ׇT*eh]ì[أ(:;;n1J&jt]raG?lan7|?&s$q[5`[d*fzV.|ߩÑew~ﻙۋgmIBkkkքg>vmmm,6|BMӖwɐ1˅QK(.d2]1{c efnR1戱[>g"0~x'`mf9y?2-$>VuVi Ē\[P\WkSkeNSMXj-*$Н EҜ'vH$̒.=UWM+-W_ =@dkjj0풱2zagZ q=%gZ$݊Ł '>3NVbr[q2ZUѨrSZZ*MEMfpOmmѨl.Ie+O>ԫg=O.T聜HIJp:,Vɽ2f VB-3ʗW+3~*JW-2A'QfCtƓ@za[ZF,qg9x9`z;NTUUYdYFww7:::,Jxc|IVn+`eL$^ByleHӘ$4|ƭg@ 0c2+ٍ41JY#g0f* bU 'EdV@3ь _+ݙ2s?vĔiM܊a+bBwQef;cޏqK<_;FS&[Ԩ&nD4\eB,3~Ȉ>p8Z2 V;99ikH$Ѐ"KEl\qa[6 qUUU,+~3 B+2A jT [nA1j66SOmoO)ܹ9f `0mL.+ r,M?*"< nɵ*BЌsdYF___A1EEE$I4$,9C٬_#vgfc<~`u%]m99RprL!şsVPQx^ 8柭XeeePUVs)?MӲu,m嚯no .Bl4dXA2lذ24FA(B0DwwT$+~?BЌB-@WFww7&''g5<n[XÌyi$IMk3|YxlCe}p8,2 Lnʕ+1::G"NCQ9c618! C}p`ŊC,C:+[zlqJƲ:v온u^sPQQ!1D"z/1p1"* "j2/jg[MO> ʡ_ fA0u:8OoXt:H$R-++U<\({>e2q%z\ 袋T.|_6+cf<~jii),YRP_^^`08}hl&477.%K`ҥ[xE c 4wL/gMȗ3V';(8@k'Zȼ/=e>k!9MkeξʕʙY'[8-dߵRS\gNv]ek lyH"_7eUeƍ)2I6V-6 3HuLe/{TFbbE ?< F  艄C,qS[9(Oh & &PAX֝?Vq8et& W:`# | 75ό"Br,8 Ol }C1H6O<1|G3O&@N/ 3E0Ơ y啀Ñ_`J5. P}" Qk$%<`mc HِfA$ uuu B,;Aqڊሙ#MBFA *  D 13ToOX3.'zA挅9fyթÒy8`A=۩3_Ng8V'S&UjA10677㮻B2c xᇑH$PUUn E1EQC$aҥg?;#0c pwdYiXd /I ϴ>mr+xuŸ{O+,x믛{Eqq#L⡇uRVVo|x7nv۬[^Jq}\s .iNp8''.4lقI|ӟFEEs 3&;2?\ya "D"`NsF$IϤ:4Z[[Ng9l'Fk6d ΗxIf  IDAT"`2E޽{m6R)qxBPUddR* IL.Kc]lVvY}>J811!_4# "HN7_R)$IqRvSSc8~8JKK!2gEwئ`с2vhKn駟8$Iw-vYD aTUիQ\\IHp8Ǐ >(vލO}Sذa(Ap5c߾}eD"hkk# aݐ$ ###kɒ%",8tZ[[!2cXf dY=*VQQ} Xf t]АX]t,fA!NC$appP'#. MMMBD b3*z{{100 DHKK 8D"b,[ ln/6 .zzz/ȑ#e$x<(..6 ڵ Be466"5!HT<lBYYIYuahhhq\hmm(ѣGuBE{~,^1b1{kbtt$I4 UUUD,C{{ELt]G$A8ojjB8FQQ֯_ƘΝ;Mm[^^ IkjjjB[[B! N#"Jsui^ulٲEņl߾d (++ Q躎7=$I(hoo۱c\xذaEA4OS&dd҂n D?0n7c+؈ 򗿄c  #fAQ\ve!(hn݊@ev\tE4p'jx^+xLʹ.,_ݍzNs0+[n6lo~lٲeUS]]nTH$_jtݫ \r  sǣ>*7ߌJ PgL.$`zQQQ~jv]@#^HD|( >k6o MӠ( .سgdYmzQD<ӀG$j>EQaKBKD"?qȲa;$IpݸP^^;v`֭` hGsIxbH. bͭ0vBSSEA<Gmmɲ===bU`/I Յ_|Q<ˑL&K/k^]v_vcccHR;aL+-[;viSS I c:1 z}?O$կ~t: UU{nlܸQ!PQ__x<ÁwOWU]v֮]Ç矇/^,Ċ+>,cHR EQP^^^xAb\{p\xGF:݋K.?黷z+E~3hY555ˡT'&&&x?ߏ͛7c޽lؿ,zSU7pO1ڵ \r 0>>.\f~PoEnEiiJ$l(**BEE r!>xwE?4 ˖-Cwwkx'%.rC?dYƫktWc };e(--`b QsfXkJJJxb;v $all UUUYm6A8xN'N'}]jeBpדfCcc#{11ɤR)|K_֡ɾHv`͚58z(bX~CŋKHQ躎˗ŠTTTp\.HR`Ƹ2;vL%IBOO;&]QQo1::۷#HO-gxUl2~4 h{$InD)VnBncbbd9D뺎Ç>P]]kBunnpXLƪ" bddDw{`!Lb߾}l"{ݺu3,N=E1ĭ_~-c\XpatR. ^.X%]!2D(--Eii)y!PJJJ LB~Ceqq ǃK.6'&2dYFGGhǃ:0l: H|`5$! رcb~M7@48N;`0ÁT*.yEEnp i!4YqkkkQQQUUp8PZZjeY`qA"8k!H@$Bno70M~# b``> 566TUŪUL'ύQىUVF/1Ax^ԠOĪ0؈6D( >lQ^}}}3<x+JG<ŋp8FCn} 8z&YGG:::LPk׮5Yw(T*]E▰D"p8l)bll cccB ׃1f/-\|>(Ç:~_$I\. ǏĄ(kk+(Madd+WBua zj$ ċ,+S A9#-5ѣbna paS῭±cǠ(m8묳 I8 /d{( *СC"NII *++/())1 &.g!/|O.%%%xg$=˅@gg˗S*IMPHL66 oS8TVVg?ɂ܌d%Zbdu]GGGWKK S}2`L3::q˖-.2cywd~܌^{Wbdy{㎷ÇSAIp!r^pX|.$9"F(x9 $7D:6K***DL 7i|lnnFooIcx /_*D(6یDd^WL{.FGG.zt EQqFZ[[qAHMLP\\ ݎ6R)Ȳ Ñ7ѣGE|1"I6l؀->,BpI{o<bOW^y%4MW\v !J駟FII4 FxvZü^/n6i .; ͆^K.;fr1yя~=ɤ؊mp.j [h:,lٲEX( ZSpvII \.z{{g|.I 3 \.l߾]/~[7Ӊ"+&rt:p㭷" $kȲ,wtt`hhHXi0>>.h&rܹӴ(#K $I#G}ywĂpVWWe˖aǎرc<-[FA ߯S7V4>Zj&(.gtZ0 wp7D<9M\.\.i;m 0t]˺krrRd;xr1rxqE~ԜĒiy$jqc/lߛ{K((e{6]$?Hv.\|e9-4 &1M:6(rPUuFfyY.Lix<3kDNT|mm≮(w׽6 m DVcj j j  N5uR'QCGG:EA9C)~-FUDґؔ}z^9Ni4}ˣLb$l/я<@ti⃶NS&H'0c[/uPhaر}-YaѢ(iF#8Չh4 P3%\.7 XY EQ?MLcmuUU'tvl߆-ڵg:Kycdtd˳fZTW̻a$FFŠ65Y)F|rmb5'.j 5gJ|]#ϕ +Wvq}x /DEDmy^v9<x7O .P0p[V^cvKp b(^۲]|1~o~s;Uբ~e .ЇдdA344>$=\TL'6;4.i^ 'ƍQ][;9K/NHg;@`nF4 B4t0 !2PO8nLqØ]\zpvqW`WO=Ǵ4*-^7nEpQ%c}pF7,| FSy*C^2%04/EYERf8kztuvbe*~9k-| `KG($  `UhhZ2/}LӴשO|{q3UUA$ e 4.isyXOy '?y@9pAr*H$`mXb%pdEU`Q311oFGGK/ J^ @"ǯSK7c_~kF#`LB[SR_~Z ~W^y6ݷ M'4N+r ]ۋr\.q0t:199 V*hi*+"H@%W$XcH&u.TLgElTME;^NU{F!HġcU**|ey+c CCC۷y{%qN oC8Qvp^ =Ex$MkMӡ24sDF#hii)覊6k'YT_!z];qxAp\@t@,×ed24:?3֮]|+WZ~\|?H{%Yd&tM+>|y;=od9Z\HO}SxQ__,5[SZo|馛p饗oߏf,_wƲe˲^_")8I?쌮15ȲW^yEEEHQqx_|qN[c :!D3h0@,ACb c >Otqtbttyf|-܂1Ȳ|Rv{Vn򗿌~w}8.ts EOaY&f+ϧ( n݊B!zu:믿<-[6`bs?V122nO=p 7v$2qL_hS#LmӉX,6kd [vv X[ Iءt UUNK5|LJ'p9PT"Mp>^`>˝gxh4 Ip7brr+W4sZ1|xZ$]dM+"T zzzD\(/-5kr9- 29$gSU?v4k&faΝظq#֚a\qH? IDATƍgb>8f3^fSs`iiRA9İs7]}z{ɨΣ9hni6v1J?7[qy5sD}>g4?znH&׿o}[|L9 r0g$I{yfQlc]]xwb ##P4 7nW?8l޼_װi&xy}f?{l6m';'e-ωx|xՅM6oof3L9(*҂;[1ĐZ\Y'dDR(..>E~fXjfຮ#LHGpmw߽AˊUWĿ0H_L}[lYj6"\q;p⢋.~bb!ʣ( >`֭EQ<3c4Į];0[y4MšCg[1;knٌOS ?9<Ϝw^ƿۿ[nٶV4ĉ ׾5|NJ+_".iC; &Eb $ ǏG*³>rlX žldvRhYGY`"d`﹫$7o(:R$TU#$f5$jdYfn2D"%xH&`TӅD"ksEUkD>l ߏGp8&H88 {U*04MO~9۹Ey>"n29r[E I.2s~u+1]8A42},_~ 'a|>O~~ PhG,˰8v0皆1 T 7}NAbBEoMI3g< v{,H[/?S399iԾsE v_ ?Oރ|Ly4]CWg'çUv2g?yl/,˸*fڵ6lay;]4Zzl'R=I^u㐤 O^ 76W\1xPZZZu3F)GLYLe.--E:Ƒ#G"+Ǝ;g;_=yP NsiwU~d O?:JKK-qHm:`';$TÁ""j4.sZtp:*, z:aEӧ 5ﵓfýwho?{˗1ÇNQ_UYeP]]Cׁ|?q딵fH&* tvcD@$8].HLB:Brz\yi*$YF4T>]6eĢHL9%ĐNM|!K2N'$YC,uѡe -ܪRQTVVbtttjϸ(b9!]+.t{/x7 ;Z{ō7˅~7Ç.bYkB4  aUk+֮] EQ( ^؈իV'޽¹nW18}2ɲtONNbj=՜IӍJ&P)A2XR$Il^15M0L%ysJ2ûxza;d.7p޲*EbhAߏ ^ 촕Jy$Ys[w?D PQbIA@dmu{sY ISETktjFi>?SQR[//`Gק\/mۇi+t#(e!LƓ8˅Py^Ԥ28vxa;+<k_(/%nlhv0|]vԲۏ)8cTUUQ__O^hii.o2ƲN07YJ,[oe=vXr%Ϟ _i\+xκu۸{m apYS?~<Hyy9'N䣏>W^[JO? z;O?g|^C`7`6P _|v+yyr)}dbgu&SLOcaVcdD{4a虍5MEEEp+Wf4MWq6@`O|8 3tP>NKںZn3~?Y¶mIŋmZ_߾b14M˗s/²-fθ}ĉG1 Q<p#5F$! Ԅcۄ#=] b  c: ilj⮻m\?z +3(d4UkMP;}9])BC}&2ؖ0tRöDO?*ղ+as13GCXAkY7߮HK aCġ>HtMhVr{kn*WвeK%)m1V͊w<>R֞{Vf4Q#yƀ+f[:L=ee78Cv؊w BX#Ẅ́0&lo&Xft+!'dհjx_Nhi>zLcЭ.ghZj-nY}^/_|X+;"մdNSO>9˶ӧ7|p (`MRٝZMgd%Lۅk u]pzvOkU LJ$|kZr<M=neG 烈 //RzLS(";;򨩩EN m>?OO_)ٓs#Y~=ݺUaFPBرc9zQ465r<<(v.xMMlڴ ׋x-I_-ew#Ү<2t 6xPKsaaTR m;dRX<Ƹqcy~y;eծneej*6mDr 66ŶvkJ*zt6'oWQ[SC(ByinM-yT%nJO}(}1߻ŠA8NWk6zeXvv678;>QlHm|>^>. ˓|Q-IJ_)e]J<vFm5`y(bZe뗒){ew9<׿~"^`M?Ov4H$BUUK.uXd ӧw-vlpI'%W:SN9s4M???_z=8 0?q?kopE0p@yaN޿;v,cs'gHᜳ1󨨨K/1a^/eekLf y}c޼'2-$gkZ%I&jU6 ]SSl Ƿ+5`eK l0yQt҉h˲'i=zTC,4MxxnW1EyT8É'OUU7&(‘ȎېObTrɿgp3Ѹ,]~r2 wV'fFM|n1Y5} FVtv[,zL~~F$&R nR\\BQQQjciA]nj97ɓ"]/A Fb-Y~1M=ZȀxJ%wT jI l$nYѲeN&k@@+'?ʳ: DFVPP~aZ;29̾,3)Ç3j0Mv5r$c+0k8EEEqB,3@7iМH$8S82e5MY3gb6}z_߾$̚5 ˲plpwF9tLCCM?!`QtTOKyg(//Ǖ>|3t݇Z !]~'9ͼ$˟EPJPIFOO<$֕\{h>M}ܨc.]-b|.8Omm6OX,6O@=Pެ}wj{źz2}>?#DZygJviqgrgfڏ6lݞ8* S)leh!p`wܹ?Q˘1c{t6}elH6׭_GAA~'JJ~hZ|>~AZ LP_WϨѣ3[UG.ϨLyKJYz5֭Ѝ->&5m=2|Y ? c&I ee^?_×2eS\RʪU|T#C#GeQVnl?9D㔻ì]߿KVlx.۶3n</FX,֏M>$mz<^FE}}]fZޛÈ#c݋v¼\ 1 ߮Oq!%G?Ӓ3+ս2V5Ԉ.SJV=^O<@f~JSO~2KEO<O<;(ލ|ѻel/gCm=WıJ& KP#v|g :l{IDAT)5rv{5J1~t|oYblAl]Q^YG^vv@?g!K\R RgJ*B!6#5J)t7 !BРF4]˗!3B xI񳣀}ҳMƵ mfٴnU;}Sa>KB!?]+ضkbTTTט1մ曥sqݝq0 :X,*WC!x;:Nx<'oY:j4McIN-f9R*}Mܴj!ؼ=Iw'J*GюQ!ضimt]o|ɿ[/5J%۲7J $D6*ض$! /`Xl)={ +$,HgǶuMPWH(kd' k|Tfݶ#O^BA>_{o[jdH !ڱd,d 8%e46嗟3xa8ĶR\4XM<E հv*FهX,Q*QEѸ)WCapq$@)MJI{!萦QicQ44M#/rsrPJHh%Q)%ۡ7W*yN8N2'!Dn+,Ķ-lGa[',B <+[a;N&wU9r4ĢQ4MKuw:~s'8%ؖE8&;;9tlJD!'~M  3t1ضCa*϶BnS9555tN^~>pUvAahjn07PZ]p`9 K)!f^?ec6"zA !DG,Ge0)++KN7i01E_}RLC^ |B!n^vz FM&,YL>J(UMսza?p;Vs]ΟS#B`PX<N/ٶi2~<ݻh]i/һ)uC9 EP$ !b6VnzcXJ&nx<FC|B!O+QD¡NRAR DBjL!?Y2mP!L*B!5B!Nʜμ]!:*b4p8sh撓:+ӻj*uiȻw(H64 YY3mvJ)Dhh躖2L$++kq6lؐy?MQQnuF1M.Ow.u]p8mx< plܴR4M#P__@mI/H_x{RW[GSs3.w>o;#YlM~饗8#; &1a̛7W_{}Z/8眳D"]Yp!Mλ{ؖ_ƍ7#-?< % JQa!3f //]P3oC\z%nSgv⋹ g}B }(S:XEs~la;}.pgv<<.t998 3c!H M׸l <@&(~?ӨiZDS 4MbP?1 J)>nqÙv3?xrmviI(i٭K. 4M(F^dgggSi}4 `h=X ˲j"rssSC$ŲLs;=C466R__Qiիix2ex< P)m3|pFA"@u~?3WF瞹rʩڌ(dee1x'0p zJ6H$bhraY8yyyJQ̽_ѵiўs48vO eT)ʕ+y7w=cWW\ w~B-!y!.lv; >A.v-rUWiO?4MM͜w޹(Z]KFzO",n7> sm.K_#]y8u_b1}nv}W)E Euu5]w-XsoCO[U-J(vۭgD"ANNPqXE<'777-3t;1M33bCss3~Ǔ0hnw ~}Ve&hllcaۗދ߇V\V սo9՛SN=P(DqI nH$mL=l*U1r(֬]"2eTzeY\{,YB?>3ۥ=\{9 q{.Mu\\\%;'Ҳ ^xE^/e1s֭=G`ժU[Ӂai %$޽8h71_|ߘ3gJ)ϟQVŕW]i{=g{7 K.e^cO0 R)%49zBPf;wM>Rݫ7r+^F&NDYy8x}vTTTҷ>c<zwZ(.. .' /OssG4֬]QPP5(^~eW_墋.Du `2KIIegMC@ٳoBx6X`c=}8h7{~ѐ-}Vȑ#SSmq>S.-i|/(h~a,lAfZKi[իWzjb`3E%,Z@ IG"NFyE%H$rQWWWo4z</fҤ_0|=kfi書\.b.t^x<fc)I$." ptVG޻K~A!DbMCIP#x92Κ2BƍG"_~,X;qǝ.cU 2뮻>3Fz+8p _/^̌32e*y\|%|d1.oC~hnjW_mߕFղ, ڵkǢ/׼~0_c<9믧O>,^+)Syefqgpg_P/K6_i|,Z}?-ފm۸\.<7r߽sY+yPJq7Crrf͚ŀ >۶xncQۘv9̽t5\˼yg\uՕx^N94N>$V}q窫-M:,e\lrr88YJ.OGaXfYYY[uueAuuu!JJKqqݫxI$L4}zi:h97)S,Yz"o:3#;RO@ sb~8A,8C=2#4Urq}swr˭Ͳe^obsyarofΘk89)p‰'qqDZn8L%'7k9/Y.#0 WfR8a|kN .d Yl9<3K]]h}/#~'2M9h{ ᢸ]Q߮dҤI477siw 8vr<hb뮻m;j,jxQD4bmܜӲR +WRխ 4{ޙ}aCSb͒Kxꩧgru`{h||Y0ݫJ)-[!mރl֯_Ά QIn4agժUxc֒%̺r̼e<ȣD#a>[ſW$ m# ϲb zA"`̘1]EEE|g8alܴ MӨ ;+e˖QQ^+ 9̺c&qƙ^&>/O=4׭D"ի|Ev4xWzCjLte,[ MMMD"qR 4+SW[C$☣z֯Ц.9N% C2w`0G$J%o0|;Iϑ0M/^&, ])//\>?x<>s _p 'ahhH~L޴nҟ3??"Y55Z+;ntTWeb Lj_dF,w0 D[f^v?o!]۶M7E]B}ss\}5 ?>pƙg1iґx +ZwJ9ګ8æM+w}q\9zK"it­eYӋl^vk'}ժq߼oQ*=z4߹h IxnP?8q"z*~N?t ̤#'qy3h@=ƍGnH/ 8p@@ W^ڵk)//G)EiI ƍ#77GOg8䐃?~}Cyeϑ, s۾oL~NֹSg…8CMM 3g\ʁbѼګ䦶3f}eƌdee]wN9d>Nnhhr`6_|%=qǝwҿ_;\J:H̵|9;ԁh4JKK }7~ݻwg='Ĕ)SA tc&q8-OK q8_H$L87\=nEK/1sƌ-&Gc1.B=<({@u^~U^ybW_} { ߃iSҴdPq͵pl#F0m;84ƌٛɓ?Ϟ#0cLwΒ%_sw\~u1 p]wc7͹H8bܸ$ Ə?[o7|T4A%_‰'LUU79|;=HC 7&'7۶ٸq7ϙ1 8W_}5= NlBlۨD0dVRmr]Rlڴ)!\^-999ҒIj,--p("3d][W磸Fo#BuuuixnrrrL9\ݻwy4ihht@eskR]]Rz}] ]ojSP(DCCaPZZW^eE\zXE]]x'4Mjkk,̓~2$LyYYNR4 =j2ضMMM-eyLRgVVEEE)g1Mz*+*2 ~}zڠSQQ+9ٙ*PSSK<>5eiӦd0j?p$¦1 #3PV^Ŏ+8Nf/']ijj@Vf¤rrrzv#Јm[x<}*Xni‚|>H$[MME,;MMM444rmOiiik,3*)-)aڵ֭[G~~>EEdgSXXch$BVV6%%D4g!ٓ:@{>P,qf:&siniv{%77۶3{qu}Ըnz j)4`0H}ٴӧ#ډ yyy(dtP#-?._~'!mˏǎO_Dp丈-RBL /$'''(7͛GAAT PPP 4] j$GUΛPɍ;A Ph wGq}yPNC B zh+c݅BKJ~T&rIENDB`qstopmotion-2.3.2-Source/manual/screenshots/prop_image_transform.png000644 000000 000000 00000102355 12536560630 026102 0ustar00rootroot000000 000000 PNG  IHDRCOsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxT?M镒$ҥf?*zҤ)tD"" M"]:BBH &d#5eki0I眙9/s敬_^@ @PɰxW[@ @`66l djuyk@ ,@ @  ݌D")o-@ HA @ *"@ T&@`FII~%>5? [ kfuM.n}\܉uj})&Y+6D u&ɏpij/ww5j*V,\go4TNp\wcNglފ3]fRw~DW<˓zk1c"N9Ak*˓ujJiRlyէe&H$fz5 NFбuK8}"]괏ϛzy"Ht_nJ*uZEкyW_s%U*գO{2fZ5#H|šKI D <~ū %Z KWt䐕 br ՞g#hP֨u^׫G *Gi4Amdee;G;+jH^u+h45QպҜzR=` |+#33H]\ZzueΖdcJ1{hژegrI~?qvcڨa4SH9@ R ?sFÛ/ "a}1m&GOiz%#dF;VJNuhՒO17ҦExZKQdffu6kԀgӷԮY,lmm}dbѷhNBCѱu"m~E^~gs?1C**<[Qw 72f[jV ׇI(22j@ xK AW Bӭ*k_WtP0 --ݿ[g}k"#w{,_QZU\tիƟwaj3࢙uqc^7+ݱU))l۽lǖSv0vvvܫRYo麙jkfT4\#ׇi#Ǜj~a#Z g.^f(\Rߞlք"m5;w1Y@ "ˑH$ '##J=cccHR* L-Rё'iiHRrrrRJU333iҧ1p$Jdgg.Gz?w{Ф^ؒ1n9zEVVV322t8~U0wxyLݵ[O2THRu8 g;v50X- B{ *33St@^'OF")P䮟,2֤o-999t*XJ%g/]F"F"d>^g65;;[oI=3T6sK Aߏ=k@_]HPѿ"75amb#Y~C899@ x*HWf˳|-.J';;Zk׮YLVg@ 9$ӻvZ@Po _g@ l@V @P)>E @ x@V @P)@ R"Y@ AD@ Jd@  @ *%"@ TJD +@ @V @P)@ Rbk{) SAn[@  uO>,o @ <3@ Jd@  @ *%"@ TJD +@ @V @P))[x[GquJZuRE} >><*1#GhmVGPnF:kGݐ:-G 쭿oEh0$I{1&a Ѣ9!+;7o_xʬ3-D,];Q|' \df#i4Y=} @"P-߾ijtE.ɓdV\B=vv&ύ; |ٓ-.WTbooT*V|z kVޞ#ߟסP3zVÆtёu6w>&}ORSQhАcܛn1+0_~l@ Crԉ"0eM^synUͫ/Ȼo)pN۫Ϝ¥K,z>"[ڴ ]{e֟!.w{̓xqrrMQJ$c𸗗r##"[|Mm[ukw@ E)@V}KXP5hg_|ɈClܴ;;[^4unǓTRSS=g.>i TLc̈w$Z0Xo`@~?/;wackCgRB{U}zubooGH\|;ۧ@ գ%Wת܋!0}dZժJR͟˂0"J%M4滕+ >!UkcoSs X8oNn X4 `/ ̹|h^po\'hi_O ˙DV}@ 6$ׯXA={ui^vS-zLUZ a\ZMJJ *>gjl @P>{l*F3v7pppu*W*a@ fԟ@PާauW擕e EfTP(JPvݧ"/]6UNqHOgҴhߥ+d붟[^ʫ_-?K1xqn4o݆7X۠!EA%Ex!3+h6nB*U,,];Q|'O6Fоiy/uC[( [8xS&N?rӢE]ʫ_-RAAV탋3`gN)r j5 x{>Q#HpK孯.s|RWƍhڸ16[1ag}v)sҚ&)AF!!1Fwh}.νFm5L +TfyJ||ziˏ|9o>pKLJ_rIT*ԮUw̹jlmmyq@ƍMBb"=k9v r9͘N6mm=,Yظ8ؿnj6_zE-X|Km`֭,^lp$zQĖo/7EszO6m8z8jfMMQGZ D"!Cf~6O H_.W^uk]+"_7dw{{{zϋ$%'U_ؾb7^]\@Áݻ5: [8w#k;zv/Ʃ5Ǐ)+=CwcbYpK࿋YNQÆe`sqŽX6koWQn]6, D +T;u{{yV999|l^"'jwELȝ=5vII6 ggg67[6gnsfMpu];QQլ'HȠWEקv?$2"w~iTVdZg4FSՌ*sˋ;QQTK@Ңys^4__? Adgg1OٳWz7ob3W^a@>$&&qMɓYlq3mxy b)T d_29ֵ-IR-F#kW$#FKfV|#GhRhoזOD˗,wf\r,;Ɛݵiģy!exyyWƌOQ4899F@a}V1SԘM cFX"XI+pwg=,^LZRE3~"?g"4$Kf-&*^A%}۶^Y3gPz5^61q9ޥ{.(P/$G-̹\tLG}5_-[Ex8ٷ=ѰA}<<>|4,n,1oob"Jޥ+øѣr=8ȫ/đc0KRgr ]RERnGE{࿋OH@ZҟVZS.Vpge덷]+ÆѶsYSs%=5jlg&Քc)2l옡>[oֲ!+|Cŵ9GcqǏ>111&/OOsM^{%Xmֶwi#fdJFrpp}Ӧ=y\o߮E(1BA|Bիٽ+f:ҩ]<[X~*n]קgOAvlV(Jlx~ݸ/q9D/aDFDv*~X=rgMLbRY} ~-hToʵz5cK+|Cb=R-%Z̽ghZ?l!>>l|-Ks^cZ1#+T݋eh4=~/;vaogGqR??&NƘ#.>H$j8s,NN26iB r&\.gA f|l9xxx憏7V}i__"#ZͲ$$&!o鎅 uHb8uCǧfQM0pws##=JvzPK|*߾Mu#Nm.]-aF 0 ◝mVRNe>hA?|93MϏ.3\}vT)>Ly0SvFKmdSF Ǘs1~<==8sYm(f2r9L&/==<-ɽ&yxfDA%Ӝ:}T/M7b[Vpޜܛch4 i2*U֥3~_wY4. P*4mҘV3$DBYtfR)];?U}eD Rd'N`g;hiLƂs,y}H/7V-[һg>1 )\RRp<@.3T[h^~a0gΝ@p5lcv΄Ύe1x,D~um΅gwKu”oOH0^cj)X[1gd }0O:r͚41>)9u4 իUc9TZRԨޒk6Km &kufx0%#m"=U q 2cVTҦSg^׫gdd_񦥥[ϓQk4xzx\j5)))dgp0 Cv*KLIjj66=vI>◭[& JR IDATs|<[Ҷ{{`ZZn9udee%~iL55,(3R{y6fd'LB̽{l\}yK1Ie*x888PsDOκyj>z!5LF- CVWA*,PT$*ƒ͔׮VRҲsq}(*Ҷ{{cA&ܟ,Kczq,x&YAɨ)oa>Y S+MAݬUZŋ$$&ʄlj-zlXg}{A5KufUX26QLřwbsmQnܼEƍקw˲6ƽ}X665ȖNQP'$Ы@OBD6ӛ}];wȱcddd ltڵi`2#lo=,Yظ8ؿnj.ҏ_z g3㑗d֭,^LɓݳYl?yJE@~9...ӫ'ȗspn3ҋ¹sv5iϐ}vLx<ï۷#ǎ3zxmժi11dSԣץ˗9!v.`fr~i;m%)9>25u߮"?^Z`g,!_]\wQ5_ fNg}46-geaccc9?mѪeKϏdKHEJXY7%0Z.wpE$5,f ~|:{6vmڠVfij 2ݼui^y7pd/[Vnjhh3U2AAL:jKf5ݺXePV3vT* ///DEQzuRRRF)u~qp/;iR!?2d'tӇ]ǟ]ҴqcA)1dczݣ[đxcj5ELo}a֘oG Rf|8f~BNZWsTcPϟf, נ1_ƾE+kD k%;<;TLoWn߶-YBF3YO*A" JÉh\fM,bgC5 CCicILLnLEY/^+W F 1vGqO4#C(g_ 55C3q8 [Uv1GOF /;w|'$0obg44C^osS6__]C5rhPsLsͺϙqoiK: W6ϙ]FiS@ׂCnO? +K7jɌxR^jx|/]ƿxڵ9lE7{GGGYoGEW" (N~d.R{>DBW#I` LI"HЯ.aJ EHԯW~,dsKT36-鲰5)U@ .S,eZNEf*#5)|DFDp->r&Mf維zא[>(-2w~tLLPZa?n=Yb%8Ȏ]ұ}"_Qk13FbJ^=ٲ'~G݃ ?ac [X ckg>fYT”O[B (+:d\ W [xX.۞}9zLP痝صgiɟSDE-Ϛ̷yVȟSD߽ˉ8q._;qvvvԩFNnT[ ??>|6'N">!SOr''9½XN>ͩӧMj(&}賅v&ٳ;q |}}h7˖sҥKe cgŐ¸V:tJ4 =q/= o}XoS>Ψuck͖qof}Azb+ e`*/Y,3eLeij&/5- r9S?hpP[xyzҭKg67$ѿo>!^haLc>c.掍랽tyNS(+J[sM)-\\v:)lOq1Կ XϦƽ1VR7K1UF~=+-)^cϏB2{K%4vkX_W燖2A]#[QCيGEɈWQtJoa>DV㶟H$,o9# d NU;F/Uf?˙J Q^C"+x8KƉӸY.*lEdī(:Krr2e[Jl &߯|Բѿ6Oe [Ygd=RÁ%͝ ^mAZ,>@J'eZ>/҃@w{fRW[z$ي8#[3UxEt99yJ;ߟ=;SPؿME~~ d]#d/NCE*R x:ۑMm)ըl-2oFd/%;GCv'Lhu'|\ |f Sp%E t ^,5fOu눒TJa& fdGE +A$QFQᩌA,}y*YcA- mAr$ 6^Jr~%*oA4 pB*Z΋Xq( PɆ1}i$G[ J82|]4ə1uQ5~=o&4C}DžG匛ܖ1y^}yJDG;)Yjϩ۹K:֫kȿ[{2c{n 1lZԔjK.4 LCzVH%'ټ6 '{)R w;TS($ ٿ'ቊQ0n&Ӂ|l {.?CnKWl}Ery(ܖ5Qd̍/Vc(R9Vy'>UX[H%YN/FC6).bFV ozX YVp&Z%g*oe"=I>}?J3{YGB~U{ZOH ,5,:זrqn7bm%8Ky9;`L)}#~;3yn:.W-6Gv{E4*sj3NIW1qsLa6).FVR$5*..ږlZRVT]n)nZnܼEƍקw 6.o\\ W(codOXC|+ 32ru'$TZpߔH$d"ՙR}ʲ,-cz̥,Z !117oU![Ô?Tx{[_j_Z3~d~J<ٵ{.3g4!>Ih?Y|}tlf}ڴ1'U'''>`j*b?@R`Wxyyq'*իbަiƐ j1*!S*3 M{MڶyDe"^Z gx{s/De17sZ^ln,{ʖdfwd70y_}bZA,^0K7ޢv`FF6Y1=%kC틉]gg^qڮ].᷃Qi䷁1*b%~mj܉}P(OHz2KRWa_ai#gO۷kE嘃1y}}~u錌`U{Ό4Ĥ$2ǖ&۟ˢO[6H3v-2CiCɽ~^\yc%#=LQAX3;GX[G)0!oL?giL͍G8|(*/$5TfϙmZŋ]жsE" Q|ŗ:\MAnllm^Lc̈w$Z0ns0-?gƴiqҥb|*߾Mu#Nm.]Yeoڣ =s,NN2ec| IDATiE_k_Dpr<ƏgΝ[r''9BVqiP[-~nOXMg3v(yXX_ c螖ПR(ys.WP1 }ΛO>eQ4kDvWR'0YvvʷT_kX } &ːd,;bz9ԬQ\i(Iy25ݺu3={+$b_kll%''h(68ӧN!<,;[[oNYLUZ2e4llm8z}/[oNZMJJ *Yhh4qws,=e%6_ii螺y 222HHLϯMYyiFVv6nn sibj J<#g1#+T< lTBSVeRǔ\׮_)JMe6C":=e%6VpU2ի-,mSV~^Zwa_+r=RLQAB@`N<ţǏY:W^cæ 0k? Z͏~F"TO'"+p ~ٹh<==xy7[B?x0i8= ӉX#+XZ#+jh48^(GFx{{( \7sqncxIާa`'J FѧziD"W,_kׯR\v{H d|/SHڥED ۷g6(:tJDEg>Y xY|j@ wn;ٓNj\GP`gooQ%CT [%.ZDE-C  O} [Z54nĞ5=$ j=}8@>u }znL :.`k[Lbc .uTJn]9s?iuM]}|,I:ojjyɭ1u:ܹôif}5o$E']TL瞣 :gb[cUwvTDGI5bpaZ㏕S(&:Z=w o޽ɤs{Ԯ)JQ/LxQ}˪k22olRb'EFDSu@M>]Ϗ).6={*/?_?q"s[c=ej岯'KdZO p&Y///] ;ꒋ/d<ͦ'jԘuH$'l.˃Cv+((HCZ8[fY/Oi3git:99Iϙ-VieZ18XN/^/NPTTF>3eff)$$X۶Ө]ݯ;vJ͘i3fl6/֡C4{kZvEj׶nvڷk[mW?3zJZj5(SGl6Imno <IҒK>z'dGK>մ3ƿҵW]Ye7m:ۭݢ5(**R^3W?U=w??*Ųeu9>:^ w9a*-+GK>]VxJӽTVŢ̬,:\z)L&Ϲj x"S/P׋\')]t[]:Tؾ}:m2,.߱!$8Xp8}_֣x}{v~7I+V+.33Kq-\w]]knn$)S*׿T{u5`GZZw:F>[kssiEګ;9sGuV\nKmb%I[mwսp&#dof~i6oRk}^liWz$eCw|(0֬j C4(Uj{}y?gKURrDq{Zxբ,VJ[:tLfsrj>:KmO~[_|LY+nS`D# x+.T))ڴyfϛYVWڶQ$9NܵKc)Ul ֯6kΚ1eZ;57h@~2MJOPP`K]vpki41g\Zo}SeggXsY{O}(3+K?YV?+N3iѢEHiҥ:th#WNNN8/O&جI8Ռx_UHh97~G?p]cҥ,->>q T5*-=uV+}>_Mh0F_IgEkeZ5PISnjSz't5;֥W]G|Z{4ٺ``-sb=81}S꿡p8`"m߱㤮3APP=J ON5V]l6j1+%uiw~,nGP{j:n[>?Vh̨=k THpiB7\.~ݰA6IMMAvv,C8iҴ% mRf^lVn-L 4vPegnCڵ{lIR8ݫKKKUXX^/((P@@Sp8%//KЮݻ=t:pt?'.|U^[TTXX$r@vvs~9dIU/1iqDd潾@Zztϋǟie2vuwjjޫH*_Np7K/]Wk;5L["oNw~bc<.uð[5bJYCos{vթcGuNJ?H03Z/ɤC4q4J[-ɤ6 ڲufϚz CyyyK#EjdVYE%.=\KUtĥ _br)}mL&yqοݧ>~snFLzjѼ$)s1eZb}Ê*++S#2SS_UiͷWrb"5nh3Za!c[Ԅ ^SjM5Keeeu ;[n(IںmffjwzvKYTkr*mZ~zb#r\z:qg[nw6M3MѸ1 Zf??Fs1K.[s_[Pynu3ӡC4uJNLd *,Į#e%JjbGVI[UWR _)-QXNm'%vҢ'lsc[om%Inب[WԮU޽*?VaSghs~_cسGUqq,U"??_uOMUcf99IvCEENɩw?]:'+44T˾^.Ij׶BCB*jgU{׍5i@~qvw| \% tOMUۄuOMUHpձC{ŶlNս_?^6oޫN:(.;u:u@MXZx`Kk[)ǬSEҋ4^*(WP@ֲZۻ7뉿?Ѥ*g%"e_k:-?__I:fFLI҄IyTjۦ"#q[}ɤn]S/:*J|X,qvwY̖)9)$ķYgԔ($8Xv,\T}]tNJRvm5噺$/UT$!rjzR(**RȈuɍ+APn[U-c'sbC5ox4t)/dV˘8M:ټ|բ-[L&jB~R{$gGiiz♑h(uU?@&ܮmD=nfԿo-}ŗZ0w^=JSgԓ#Gv+0j]ׯ״.|}}ݏd҅h Wɤ~}zׅu,+f=Z׫s檸X;v˓')4|rjzV&/'GdRJ'7PEX .]C6bIq4u 'X,V*r)IBTRRR{4˥C h wȑ# >nv2'7Wn[!2Lne5u^jמ G),4\՞ ٬Cڵgcl=ȣ*..]6 2>*ge OoݺAvBN3O>ޠvp o Vdddru<_ xG"QR꾾~Gi_vVڞ6c5kTEFDp]/NVT ڰ|է ڽAI;թc] O/ө̬,+?PUmսCEENJ\.dg+n|xH&Se ujCXEEiܘjW{{&NUie2&!^[nY3[:6YCyyyK v};wJV˥ޣCwF/OT,^Jd]6EkZps9.mWVm$I3u_G>>>zoz>IRXhHgu0'Grއ#4W5ad\.=ty;~~ǴkЗ]~|XO>3JGJJ41ӣO]s_[Y{sv5uOl-o]'Ԅ xl\.(,^k9RêsԫyֺGugp CH*!l1kEڱs A.mWVE ʶ\LyyꞚZ~~ݸQY[oI~~~*++S6ml#)BCCN諨)IJNJT$Iy=zh4ў={gnreXVs@잚 `%ǫc&vҦ-[*ϭnh-9uJX&vw{|~Y:hYC _ڃɥ|n8L&Y{r&>^}*˾yu ;[~gN톴U{3%I-+_Wݮ j*6MR!O4sBk?+ƯbYDxx: x(m۵Q5 qyAAa A5K/>YݻwϞ55ٷ$)&ĵ۶o_]ߦ_"ooo]|ujO-ɤ2WDG;=] p8t ;^.}&IzmjѼyƯ⾷nݦgwo:9dUVV ڙC[&Y@`igŵHܢwh tvnJY^^^m.effiܘ}p/GQ'̬,P/"գ{͕$p^V\Ukம6Ի(}_bO1sRڷk/Ϭ\Fejl,fK$'%)*2Rύ;oUQQ'L5}EMEjEEEjC_7nl:9dveX2&N{2w+?P͂SQY*(S˘8M:Y__Myi>3}zwU\\pu*gq5k}hǟ/Ԕ&΢~Sߺ^=J~=%IݺvՅЄIkۦʙۺ}2m]q٥yzM9K1꒜|B5;zfϟWUqq:v젗'ORhh;1Եh>za(M1SO%ۭfKOy@iV&/'GdRQ~:`Zh{u`ҥ:th#WNNNSp"ooo>"gJJBTRR5Uq>xP!5z ;[CoTrR^j]!'7Wn[!՞[׶ҖPPPI+(,lʴ4=?~ޘ7WQQ|Zt)3+++T`@BdX*_8Vue2*MVwУUZ׾kj>m[6ڷQkƯbzZ'<vVIIIS?k*/?O-ZЖ-[5xŕ@D2۶o/PzzBCCuS 6j7k4k*FSͻpN, C"0$, C"0$, C"0$, h|GhӶڟ${h"B>!Q^^M\!G<ܾLX\!AaD*&$J8%_sQ=K^;p0Ki?}m,/--J;H&#mX) 1m6?@~~ֺ ܁ZjlwEZpQfSvRqq{]> ׷9y9oT/,v١p{B_y2:]{v(>]Sghqk{kzCtJjoXz+_su  Iڛ'i2Я۽91H nՈ*Kz<≧r\ZA;d2{&NUie2&!^[nY3[:,ࡼ%RmwÏ?Cܯ1\.==YYoYOxD.K<\~X!ۭgF?Ciϙ3X YCuDfƏ@vDa!:ON%_}TuF󜺥v$%vkz>dt힚 `%ǫcNڴeKu%%vRhh=5"gIꜜ$I:G\99ڳg2 CSqq,Umu|!B-f-XH;vTmڼE3NQm~Nz <APA*(W= kr _AujTcƏWDxcݛ)ImYvTTddǫ+rWyn}l6IA &sNHpx岯5{|Ζ֊eUQq##*<,Jvm@j\'[P¢|%vPiiimϞvN+Ӧ}rhw+^dgo޵?L&\&IzmjѼ):۶o_]ߦ_"ooo]|T9&[nS7ip#Lq-3}ZLP*/kZ~JԯOoܵK;w;yPvm5噺$/U@o^ Y,8,fK$'%)*2Rύ;oUQQ'L55-'7WyyZrU]SI_c Wdd~ݸI3APn[U-c's,H>>c;E?9d5u9s06m$Im;DR1'`AmܼQvnS TrbTRRNP`ڷm\k=n):hOz,QPhHCr\ ӲRƺ*ded0:nwWbl=ƺa2U!n73vu4dxLr23uuBӘÁjJ vNيn:uxf ӇYpsƺP.K''+j4?@j̟_ο-zStŗo=-QO}4QWӰ;eW_+K?\.3^>U`Fs:>.++Ӳ%I_|S6CXQwcCm5 K dgkT\\+.T 2V^~~eTud45k~IuW_vܩ֭Z+n [0m,kɊ8nxۻ?Bu23I&\F _.[ZАk{._-S8IRNN~ %'&j5r:꜔vBCk=^QvyFsSӺ2WEJ[gy11\.Wgdk rUn~"ë񒤂B{}VH۵ S\l$鋯iEڷO6M.oM h2߷n{>Ua,13:N} SJMIW˗W2eff)//_}e~۵[O%GQQǏ/99qݺؾbof;$I[թ֊.++3>kꖛnc̥>cN8y;s ӲvTO-??:c&Uh[4NAc26+Vtyrw}P~ws{EP?~۵[~Y;vTTdŗr\+W>տb$|q/a&wۻu'!˥,ddt))R\.ٳW}{RQS&Y[iŪUM>Uai1m~uC^< 'uGG}]~v* v{`@oeԫyv'3#{Ŷl)ɤ5kTΫؓW|}e SfVZBcF=o,<ؖ-5tvn̒$M6>ψ>AӘ6տouOM|>ӷo`%I$EEF7ҷ/-9=Ζo3a ,RvUsϩ+*2R;=]a$HKrvҬWg/jޫ(44D'=n걮 AOӈO*++ӐkVLt]L0i֬UxIR־}/PP̞p]))r9j<^*$~|l6uA0uINֿ[sr4䙫-XOIDATIgήnvM^Ԯ)꜔$///ڽ[Yiߟ?ƫCvj&A3OxP%jі[kw[byVY,V%v쨈p{in鯊Ծd2ҹscǺ Y|}}T($SK>[^Θ.ͦ 'OQhh:'%5z=l7fsXnW.]t:xzIB{}վ};4yk׮ݚH*_vpwYIҨԬWgvYf|E꒜(XױiѢE@SYuN&{u=w+SGYVV>Sq<(((HVk[qqf]y٥74=l6[N]Rk<ǺBUU˥yy*--=,ʇJJJTTTF:ܺ.]ʌ,IE&MXY x_V}\.Wm>Uɤࠠ߫/ChX x!!*rT}W翟x5i{^M5֞LM=#WMUUCmǫr!^V|i/U燽ΔYXW 9_Q[А IU$]l6M0Ưj=΄,pe*:m38דtc,+GC6o$L&9\X7@Xl ў{,OSc8b>1k=7*2JYXgSruRd0!!r\lMf):*Z!!*++ȈHʔU8bQTT"#"uȑz_OÔ)h.p\.JKK9VvDN'9rR3\?yA ßi0$, C"0$, C"0$, *IK.m:z{$qIENDB`qstopmotion-2.3.2-Source/manual/screenshots/menu_help.png000644 000000 000000 00000015123 12536560630 023635 0ustar00rootroot000000 000000 PNG  IHDR@(sRGBgAMA a cHRMz&u0`:pQ< pHYsttfxtEXtSoftwaregnome-screenshot>IDATx^xT> Ƈ\M4(RDtA 4E] WT:@{H/I@B !'@7Ͷ=9',93坙svq-..vV"HptRȥ.R@jLPx֭>ݹsGj))`H]@7Tr ID޾}[R5(PB R_I#URQ(-A7FP ă ՠb 3nܸSF6VR8Szs0g@Hiu>&Ā  ,6tz[oq`n3CV:L9ܫB'T@8EK 9JbbFxڬ&)D ӯ]4t8x5q>& r|v_yM[ ~{:L]QȃF6x_GB 9''LVH!,"rD (d%qB*Ф)u Q "3(tN„l(M*P&WG d 'g 4IuQ(R8fCBIET@^mvPYyQ(pH@'8@ۨ Ofuƍk׮=- z: 1Sm&<- 7PWׯ_riio0.]rQ3066V`aJJ~jjAjjar{ HH^fHazzzLL@Ó==zyq` 7PW={@ӧOGI>>>??ťݼy"^V)@]9 SSSO:eP 揵j:v_Z{zпgQgh@wIIIVU†_رaTo)))'N07yyyկ_WBoǍ o,ҏķP?濛7xBaQ65np Zfj{EW^xFܹ{#v쌭}gnN=cWP~Zߓ>~G>hu~_6, [8~mO RxqP ,"9nvSXMY1ڳsGxexy Mv6oٶF o"<;Mc5wX_MK7iMciDt[Ud~ ٽw_•+YYEeu3|wfw^G_[[8{yl>r88;A!xBײ^z ˗y[ڼohModžy 3رwhRc2Zޘ *_`U`gP&`9ʣ#=R߭U.xS2k׮q;Fn/WJJ獬-~} bfYs`}wH=~Bwߜ9~gW@?Ǐ? .H*i@[,U<5j*r;o}%6cwv[C@Dwsp>JA!t 51)yNEp~)~8`YЁ黅X~>kp lpĉ (,C&LCeB\ I;ӂz)ԯFdfbubL!;vMZpZUVcdɓW>߲+W|WXFŜc)^#_Mb1 -[{&]~[!// ,>.l*CIeG!שUh `֭L Y..Gvs0ahѦ-6=96X;8Yr/΋g̲ʆ&tҌ_^fAz0K7[ȋXܽݱ:u^(` 2n§蛵l+)B%W z1subaD 煼 ro!Q(>ro!Q(>ro!Q(>ro!Q(>roX k$/_6Bj(R /`#R-䯀^Һ~2 bm5Jb ,iOb[15q]&#քoo1jU[isjo~˴$b0<i1 >au B``WM% 0'GMOmJS*̴ (t M$j4zڴ]M^zRpFY/y< HKO%WHN{Ss[Z[>~~~ǁ?oooL wUkd'`!?p698؍p9g>iOQhoIxK+ZvT(\⌔ oԨQÆ 4h4ibI4amuk*:w' FO?\Γ*BAbR(a+&˧TkYMPVOKJ;QADP  QH HQ(}P Bb@zBj@+ B@K)`+ 7MѣG8ɴD 'QȢ&(a4"ˢs a.Q4/r gQ̽/r gQ̽/r g .Yjm;WnT N2m4=vŁO3aeD+ܗiZOVP8iմA+{;-:ɶ.<44(#m6#xخW\q7"oP8xk>|ؽ-ԔFBykg50~mgvA„kgfL|j;|~+~k#ǎѯbA `q{}'!~Z_&B)|n_WZUPG;YtLᄉ9n 5IlN9>3+ U`<Tj Gm6(}݅Z?Wݫ e3b&1b ow\PPSeLx I|•pڼEZ5H+<|M!D(*)9(k6^v1\bii)G!rHȳP9ٶcĤdQ ʐTb(!+ t4::vo ,gxs0#L.]ziXo&%f_okgYħ^-;002w,w FfMqE: .QwEU'qyPA#omPa56^ָ*)Wq|1Fo0/d3b^8}V2=[ p(.f?3sj ޡxDl8]K")s~Zp`%M䤃v>bW'e˿_ĠBXm +vF? @];>ŋ׬ekE4\gQ6T(THBQ6*@PL*JDH(  m(&%RPp͆ 6Q(R8fCBIET()eb)|HO2a5(V@,))ڗ_'8p8*`Ǐl{%' FFڰT*LhB İ@ -6t?o.R@Shl MƘޒB P >oǓC0`j3,LTC$dW]f( œmh̝J)gfboK-Y(]J! ֫ ЦFOOO M6zdW]f(`@m||Q&M=<<\]]]\\]nnn7}4W %Y Q5vm')jժլY366֤9[uYuAC[}F!o_PXn7nޒU+(׾lG=}WkժuEc[(oIvՕnfVPՉn^e  sDPN:8m޸rd,֮ P֭ȏFa???7&-$JK7P We~iD0---((~5jذa _&M,?\+J\ Nrs;ѝ+2p pY~j\Rk+ BRBRjDgEVW28vtRЖjRY FlQhK5,q 0""B\qx3w'k׮]]ǪVU͵RW4nUtŏd5i /.Ea.q\|Ϲs>hR98{;&. /v=BggHC|c|1wYVx p }Y8q wCW*DFéTbZ!T~7s|35:K 6o??nzYO. IDATxwtTEnfSH$^@H* (IQAD@(TE@@D UzfdMdMٚl΁ݻs37AAj_8AAh6mȪTʎEAALb V AAEsEV"Tv,  `4)+  B@ fAADZ AjSg!(7me ia]8&Xo{zy:)#"E2W-oAx:+ tm>3 g]\i҈f9,Y{C_\.puv-rܼҹ3qt7J_c.xͭK `SgDfc2{6kL<şZ.Qk׋ tyㆼ+H$]~z=ܸ;\bkcs{ŏ<5%O?u?eω_ AGskEe"Bl/v=@D=խ;??Ӭa}G ztK=t?lgo4mĵ8 ['Pnm RSrSn)v-܋Յ"ESM׶JmtHg6s-@Bm_oLSF,K\A?/^F3->u:JdfeKg;rVoFXfHR Zvj^;t7ڇbׯkьzuީ=]oOC~Nf }{ameER)ʍ[|ͷԭǠ^8|O>^ L7F{yI~;~Rg۶^܍@vmiѸ!)oA|wUOXpsv[k87oo ]'>1 'Ǭ}Zͳm[Ι8}o0HD{c)x; mB6Ͼ_hp}G@ZH$ފMH 8X|? "+N)qM[D""8f\4\lg!VPR4|/|23{99Z.2H+Plߦન6^FVk>SJ (/@G,~c׳5edffؗc.x5eʒdkۏU\0CO+3njQ %jAĹj|q0s9v5(> yef&jj8:ĦK^6iZGHF8wKKKڵ Ϳx*L5v-4uj%t Yڇ|ymKBRr2]/K/؉+iҸ1F"0dAhH0NDAhH3N 11`\E*ҳ{7ML&ӺOOOmښ1{t\Ubkkˠ4n9AAx@ݻǁUq/:{a' @dTV+c&L$1)#GbooϦe@@50i'u7q[ kkF[7n@HgɬYFUxlشظ8fN}7WWRP&77Wo#"ؿ/Iܼj  PG~%^~K7/pkÃW^|o +M׻7gΝ˗Ybڄ y3Ƕ;2h :vsNܹuJe&4 ȱcE _LVVQOH $-^Α MT2#wW+˾yKԆ)mBEz:Sg΢cn0?T!iUYjj31Oвm;ǞA˶XqSWTxHV!̬ۗL"#ؼu%VVs72O}hxc#j.^D?0~PRSrȻYfɸ]iЖʪWS_PQT:VTz0plU}zzxpԉCJVZo[%S(XY[cmeUU999\aɜAT*j}8RuAd=ܽc/##X<=$==5jDj5Z194gE{jPege85x߸י5}11`\E*ҳ{7ML 55˗s 4iܘqG?3gR)jC^ʊ=+JK/<_d;sG8@5?>!1{tm/Ĥ$-NCM??}1 w.\DRaii 1qXoݺtddd ˙7g6ڵӚUbkkˠ4n:KDF $-?mBM?"囚o;vlJiSӫg\ʓr+\nX7q T*-5#4$[HOݝu"HHΛϱ'H$4lPkoÆuښqIlv ,-u[6^6W^-á}{ǷdBF`<~ey)^ SsC, mEGG_F Z/Z@:u 4n v6Wsf54_`˃ B5kv٣*77'֍P(;i2k}Wb yWOLHbRGޞM?lͷ˶գ;?˥+WhѬoԬPw72upI32ݳG}Y۽7mJ5 Wz~STL999|3ݹIHZl'Yz 4j,|!^^|`?Lf~0{eKbb7o6ޟ6e+W̩޿n]fϘNM??) >[H݊R_rrrcaa5֖kW!M 3+e_~ǰt \:ء='MA߬^nϮݻzQy.NW bÐpww/u[6?Ys?$7WΎbyP*|t&MaMj-˹c3W,X2ؾ=kW.盯b9ԮUׇE;{ѭ+Je&4 ȱcZ:w"]̌г{7?ӖODJŶ;i+=_qj4lЀu(?4>> w%#ۨ\vS&5t}綷|.NZt_VDĿОϴ%0ۓB(Dƒ(JZ WK3T-Ύ z eHtlߞ LʓҶMk6h@p\]\hDM[ܹsW:9"W]cI4oڔh\9Sۺѝѣ[W\]\JVu ˑѨa5l_ Wp9lL{4}θx2a4io// ~VZ'%Car4,S\ťTj⊬ TnnE;uhOyW<=5,N,_W󚽽=DߏA*ңk7~ٿcpC^޽<;"G`;#/Jק7ki9p H$t_*Mu'2 _(;+_~KQh_V~L=euYbXɫo %0#GҾ3ց.e=]PUXTCyWd2YMvv"WtIT^Z5Wu)m[61W(mQK)}Έ 5aeeŽ\,s]YA꼯/O:;l?]35QyOP@ylэa $&&ҵsgu}lظw3zo~g_xc Q?xa7nbټҋ:G,Caa_6|ܞSdTH$y? R/OI_xx `ݸƶŒ{Yۊ1} GȔX=g Q4viL=ט*}"+1<;jX[Yѧgf.>>ƁDBa+ΟNFfhҨQ޲#F ټe+VV0x0S6_0\]]qvvÃh~˓V|ﰡBCmpbbc9}}ۛ>^1cKdT-CBHNNٙ9r} ڊz\z+KKBC/8{baiAh}p/M*: k~1sfۛK/{ F8my75.C m \qWM1t]9ƍ͕s.u "=WD.d2ڥxr kZc3%h$P >sg JY&̝>,|aIgj5NNNڴё]eoeE|k/YRy|znny I$z+O*ҭs߸IC^ חfZi^J?mdΛOcmeEpd|h!sqぼ/%/MՓq%f 0VjZ*,rf7.¹ *4T@F_ V}ubeeeK>k6O@"h 8my75.C 1sǨ/Gz?[ss2Ï1z -53<|Rr/jjլɒE 54]JR\cccSc3%h$ٸq{'փʲ9Vff&tk(2a.XUJvګ0wL|FF x{{oZZYٸ8;y=99ZֹRHII!;;w_*ѕdNRSӰL9wl70(<6*ھ9w3t4>3D IDAT,oJ95[E(w6:N6ټŠP`ccSuDg^u8{*Z!5L&vZuv2UiHRe骃*|c7oaiiy@y年mŘQRL#} ]@SL&9?7.ksMU eSxvѸQC5 ;y4=NZ\~M[2d@s <٪9b5^ZSx$''s1&O_١̍[y^"pss_oVvX TQO@`ibYcMJJfsI0cؘ% /;A\@ҚPΎ7S ӛƛYTAn [*.XXsU܏!0i'u7q[ [,윭-6m2 f'QvC Vc<قe"kmz @ p+"G\khwYqRrOLȚ+@ܩ9w<2]̲/&5͛ѭO?ɐAe)o߁_ymL$ Pўځlai9ECW?([qvouYvNAA15`cFX[[޾#Pt9ϴ-Kə:<O3gH4$u}2]QA"985T,\'ڶA&j9cAAHb k@E/hk}ǪT/%"J윱Kk  T$DrL5{tBCãҗ%|{ZBMԡ5rSqVT&R;cֵéTOϣKg+;j~c3p0>Y;TJ WT<} {=ʪTD[-%jbՀ+nn:dzStqvAD*OOO1 V^۷*;VތVqVZKHHL,sՉrj.7ށo nOgf~?| c0u$7kV2nթ&n-(#P<=<8D׫JoTT$&&Z]VS*X[[ͽV3TNFF1xzxjUsrrHMKùFRlt\uPіS>e] 016qv͛6>e.{S"rl/Vb [Fb9E<'${ fϘNXUv7kkqv҅Ǐ\.gޜthx|{g7֖A3i8ŗ̟ yr\)ٺcVԬUSN:ENN5X888ho^lٶO?_^,YQ'ym÷kSAՎtںq`gΞ]?jG`IjլY]y2}x uU~0{~ک|=? )9:2Կ ߮Wg{+~k6cj.L]aos"ڷbԯ?"r/V8mZ6QUlUT*UJoSSKęł>ˋ,`'ѡ];T*̙(nGD09/3_yߟ6e+WțJ[* 3u2{tj1OYBzv`** S#''/~;w##U)))%CVϺpqqu) m0&]HW.߾ݷ?Ϟ%<,!{yӦZڌ苧 _}zdێ=vJ={l'L#C[[=pFtTsޟҔco_t`i~ 1(y~֞ Y96ԗmFm}T VxzTŕފ:vh_c,z9 7o]9(R $ T*i2V-ܢ9nn%vyuF@hp0-CB49?zI܋6iK/s"vX`F¯yQ1jGrQ-LJ{~!<,49”IuƮ8;Йciڤ1uy^{=K|B+JwP:sn OSx]0U:uҨas.u3~ojVDڗu1V3sϙ;A }V R gZ/.˾\̲+y3zHNS*WwbЧ4+nGƒJӛ}ϴ8x$YFW)k^$ g{T/ ]@V,ܿt!NcϏ;C-o5}}47uA܏PJb(kL˅Z`o^Xl%~.ɋx ك%_-cێ0Gʛ (ܿ10}kKӞu{#밠mVD Q8C "'\Jo1EVz ֬׃;qfYM?__bby^OjjI^DF+"9_oZWGN:MԽ{s\\]qQpN9c0Ƥ\\>wtomLio)m.Ϛ͘ o( }kMmo6(d(KMi_E\'\Ef C+Sy̗%Ky1rMyC yrry0uALƗ2g|7\BԮʹ);o>?mJq9V>Ԗ w77w–;>~ھ;ތqwsuX+ek3bl4??@:k/m>t4ĶRTo{lk(7o)-]kڳ~/gN%fy0Ceg%WGUQT! Bt|VW*қ̥VST{k2FVvV$$&]NͽZ&!1gg̓Jvګ0w aʋ9ߺV2OyXoqgcik/`k+CWxװAI,ͪa h7F-EJ|i脝W+Xv>w27yS^g|o|1\mWWQ}l◿0 P=y@ E-Ƃ^ ެ8T'kٲX*gzlfmÃGYק6{Kzʘ5.O$畷㼟"9RO-qbpsfo1eBkVϫ__?i9fﳾxװĔD _4 P}<S7Gͭ\7Ũ4i]w4oh{ rUjv&Sce.|張c>{):M\۞|wVRrUjn=H 2 d_Jf_+6" Wj+)rn*IJ*,p#:4iτy]O1;;&l^{8l,<(77-j(2+fIEAABR߹E&ąwhMzV@R*v ?7'u"|O{x% هo7NB+%x&]Zf.4jpNAA>@ր /;>T~3dcF^a5*%0.qcyLj1yY@Va1)@ޭ.њ߮TQcgP[1 P5T+})jY2;y3w0S3j-W[rƅTfZ8RՖ8VH|4ӻ+2sDg 3+\LZ)kѥ m91w?9ydUĦd]Æ]{ۢWDL9]{ vQS* *⊬A_.%~c'_vA,zjȕ̌,6fJ,zQFLϿͳ `TW?ey@˧{(=G*I#x/ak%rt]{ly,S9߬^3}d\\\m_*.ѩкeEzf)*2WkըTy9;0aԭS)J]1}*T/O@?{()ˎ`9*2sL;\RKTc,Ź QTXZZAL7rII >А`82#АfLUVBb"= ! .!mij155˗s 4iܘqGիE9o/5 } z%"ؗ+[w`يޟ6>zp?&HRzvƴɓiOHA̞1V-oڵ؉T*Z4kFhH0lE;_}9";o>ND"аA}]oR{g7֖A3iXǬ+M/P}݋惏s xb3p0>Y@ 4mo^lٶO?_`37䶧oݺtddd ˙7g6ڵ3M:`߅]Cļr)rrrǢO>ơ" h֭Ӵg]9 Qz2j̒d% }<ڃ&+V̤U˖eg ٽOLJ7P3vd֬Q#GhͧJ*r֖kW!M 3+e_~ǰt \޺ء='MA߬^nϮݻzz^f~0{eKbb7o6,]P{0&CQiu=ӖISaeekW}YbQmF]6}uSn2~Xчx{yт3:kgtWh[ݽD&Ly\܍VZ| ߆iFWT*>*T_b [FA^vlJm7[Ӳr:uG*;, ֛oTkQb [St Ax}ۜ;wYVW[S־#چ܅u2˾XL7oF>ضc'\.'7'F h-#Es\J+=#o`Z^ѱ}{?Abbwao2 q1ڶiMyq (fM"]HCWr׮q~.[4ortIqJH$?@TҪe(aZU\jc=_XEֵwp ;]&7Wˍc-m?;3m5[r mn:%sA.]k׋S:i/VW߼ ՗ȖXVO BY;+_~vy GpC nEܦ}gT._W󚽽=D/߬RWE`quq)U2;;讋m<^},`juYbXɫo %0#GҾ3f=fcۃxʳZ׺/::o3<Ȥ/7Js9Nd3 >ewslas` ՗Ț ƭ[L5cFX[[^XmW$ H >XWq?aܲڵjYS˟Gq_qSs5q>t!NcϏ;*˘\k)MWD];/qCXEWf \g]X3G;/mGEG7mM4SBUYC-uqv&C;Fv 85T,\'ڶK&ˡ?XXZо3%" IFSF\.gXYYF}YXZLhH0>L>qǛ8Hh:}C_]LJ?93gͥ˗KkԯA|*VFeL;+ΟNZQ/e(>|s&+.\к_7WWvv>zm‰3FՕc59ڹ1mB׾o84>|&]"hR uNKS(:v0GϚMZZK>_dtBWd kӺ5}z9shܨ֧ [;V 8 IDATz,Y\^^z~.\K_~R岯Yd)J͚Ui}-z?c'y_'Vqrr燘} /VVV\f3j$fę%Ky8oi\Όhf*˘zw>ޓ'jQTQͤӰquqa,[[zutN̚u1jT*c&L$1)#GbooϦe:۾GQo{{{< Csyf4zl#n`՚MϴIIyȺxw8֭^x DFE1aleڲa&b9= oFAAv-wuAjԨAB x2a4iwjP`s/uJe&4 ȱc9s.,b1m[ܼcێ;b#[pX"0{t^=X>9zbԱ;u~P=^6ΝV&ϐA[0)o߁_y  TO@ё<ï1~h~=t]e ::oޏ`ܢA}}j޳Ã1:cw=cyf̤A[vp+6.GA{*O$%%fw$''ӻg۹HusfΟ:_Fnd3 j,=Jo͕֬7oz_Hn8ޓIHBG(",6]EĺXDE@(X_T@4(@E $!! u#$kLIu!s.&<3"""rj#{ˋח-',۵t]$8 XwM`x_Lx4iɓ `0ЫGwt&}{^2?nnn88/>DFFt 0 Y#99wZ+ K3i׶ ae۞8qL233yise/\\\ZyX iڔ7}O7b2{e4 {|]`t;'''2ӟqX2x‚WfGfň[nWFΝů2wBɛ˖bTml-/S.>ZW^IPP S;GӓY|YٶW7VкU8 zN̏?̋fҴ)ݺtQˊYYY@ɜ瓝wb+}|Oӥs4f3VOcF3"{. prrDT`4rv>Hch>%"""" %M-s}}!"""riDVDDDD쒂%YK """"bdEDDD.)Ȋ]R +""""vIAVDDDD쒂%YK """"bdEDDD.)Ȋ]R +""""vIAVDDDD쒹 &55 +""""vIAVDDDD쒂%YK """"bdEDDD.)Ȋ]R +""""vIAVDDDD쒂%YK.@DJ U>SGfxVTfɆOٰ3h$Q#FЯOK^˟aZ1%ǸG'[դZ~H}ӈe7770Kc:::-sqv{-yZhlѡ^jYs1䆿ö]JUU=H}ӈe⽷V , z> \<-=Qşݝ-pCȵl s}{aؐj_mU]۶|qys5]t.BH}Q#_ܲ-Zd<}L[9p Aѣ疛ƵfO$$$Mm:y=4C0b/Zh HOOg銕عܜ\ڴnݣmU9Dr1|Pv={bYv Fl*)mhθp;ZKoW?V]׉q' ߏl.ןZ\sMI,[?ɉ-cnq[Y;A+bk16~]899=Zggg";`ӷiJٳw/s'};N8ɒCv9s=нkWsHLJ"*" F|y)i׶-^l߱'>ΫVYgo6G08|(s.ё͛sQVڶ[.UWeUZU4mZ;{r'N)*Դ4}rrrUl\jˋǟLBb"WPTTTc""HAVl+fHMM#DX/[/GnUKOcjӦZZU9V_[㹲gOk4EELxI6l]e:RUj4HHLϕ:i ZkG " @n^/4l>W/Y\A$%%u<v5{+?..ڕͳl߶mɺZm0&99'6x{SP>UѣG~Vߺ~ 6uݵZС^յ)Ȋ4[϶ Пv#<=Z훖ΐk֛o#l@}쏮"(1,Pah+.9Ae4]%]R +""""vIAVDDDD쒂%YK """"bYF}ws*5SX| mx\H)Ȋ4pI) l->^~X|i 0PPGZF*=;#\ߥԉH|:؟оU$n89;PϾ`2zD/Ngggł8*iHUTTȮ=;lM,qrr77w,4!m4젨VmO1۸v-<>i2'NW))\3d(~|_o悶{êk8t9/"r҈Hua-AVvF38v0-CTۮfgPTTS x\<~o }u۫93,[fmzY/5ZhQ/5\ " TVN& \]0J%MKOcw`0hޒE֩NYL&S.3O=IFF&!&<~ml6SOTr O²%s睄4m @t(ԓ, v+k?YǖV8Vqq1OOy7W7-Y̼Y3WimGTD8}/NOf͘tY.Y8\u))w/dB8p6oZۇ |n=B_K{<.KI(!9%}mw>r^8pݻUR)"HU\\LXH8GӢY8nÄW:*g)<;J_qqquV܌wILL+/8([/d2ѣ{7LFSYㄷlW⭷>[,Z}mtm[1wށ+[CʦdOW2gBxdeUD.dE(͆dY0N$O/Kn 咑y 5 h0*fdfrEH}݌`ND޽pvvg2g|zf My٩tܙAWdmZIpzxxpU~)_~5/iSh1Lf ÆUn0~ٽ_Ip0puu\\|yU\uv`00__>Xƾ,e41mKWeϧ}v,|e%:~9W]/g0YL2zUD. k֬ <;0rȋXJMM*0L8::v4y茋 >^~*j%--ww~Avv6xit25- ՆOi6ӧ.rsr~TǩWlLFbcyrs/~Y<<ݽd2-/]2Ֆh,{~uVg`({GN R_^JC \UD웂H#`(((2N223 a|: Ť +""C|qqr ]4 ""rFz #nkwED.%}7X """"bdEDDD.)Ȋ]R +""""vIAVDDDD쒂%YK """"bdEDDD.)Ȋ]R +""""v\WXX9HJ),6<zPDDdE/?,>4 h((#-#h REDDDAVK>H[h*O7oqp(g_TTD^^0Ygy =tNj` ""R%͑i ٵgm oł;NN899掟&Dfמֺ< ~r767ijϿf#9%k êk8t:^Nn.Ͽ4nQgj|_oԡk!" FdEc'H8 IDATo 77*swwh4ƱiڦƶSRx熿UxKF#))ȨtT6lx eunڛox\Y3&Nx&Mh1 ^}g  bْgcq;X<.gΜa3S),(O+WS{ia٘7e\݈}kS\\:ED +@X(,.h4U-gV¢|,5[z+ J^=JZlGcׯг{ ێ9(yBdd5>rBMUUd*7m"#3n]Ty.o{ڥ3s`sR\\LV*m#2>@Td"Gmtj*'N$ F|L&-[öݺtux8>ބlIvmKс}m[Uy,7/#:tѯϻN?Riܽ$\s5Xݻva0q'PҪeK>Riz7,}c))%#|U' mV  ve7!ϜJm|kqqq\UN хSDDAV ౽fU s3 mGQQQ0!t#=uonI: @sO:Čgqػ>znjmK[bk #~g*ԄD2f%ӣ[ ۥř n^cப{Թ 6o/ D*<1cd$m۴fe>^CT~M2MIP` x{nj!(($09ǮE2gBxdwo)"He04kƉ㸻yᅳsɭ༼\22ϐA&a ZYgΚɧ}Ζ~>$??uB^~>\տ6|ʗ_}Y3+ywh٢9/L>еsg]=KnIiݪґڴ}.ma{7J`:EEUFӦt ^_|ڷoW[j{\\yaT-Z̤)Slxzzpða< Vf/`˳4e*?SDÚ5kl1119"$bRSS뻄 L&9Mn^.%rtt/? {hel6)O]Y))c4'Y!וdED9x1_}E\\^~X|i 0PPGZF*=;#\m; GCID Y,t"?o}Hqgb*u+:> ؟#~AUpd?CD Y]{v6~sbBFs@P&/}<}4`@WV^êk*h4ņuY~~>OL~Cg^NN~1{e G!VD Y؉[8ɇ?aXD8a41 :L|üK=qm*m4ӛ+BBʭ;q$+zaC\7^xd2o{лW rV^C`@ed5"+"HI%f3QيE60aDRJb핆PBC˖0 oْƎ琓Cnn~~XVSRX0~J\|<ǎr}^^ Vqpp|tbˍΫ梢"pwwlr..ΕPU "X(Ȋ4Py9xy^vm±" l+iĝ;َlp78y$K.ѱY,_m;ͥm67vLYn}rJ #Mٺ=F֓ϏOyXXz~fP\_7\EQQfϠp2!fa1 П drJ FaℇԱ5O|i~ٽՊl{`0y@?p.",4:5"+"#+@9880^F\X9yg-b[aّUsd7o'6q4mR)Nu'OM| G'RRNNN,?O={N^z~:_{*㈊ ߟO)[ڬ3;Vҥs4 ^}byzʳlb͚~*jbΩQ'Y4nV~-?lf̴HOOgEDED6u*ĊHc +@X(,. 2ąL-f|][dBaQ~>*s8JLLb\ݵ\տ__v淽{?8`=wcOQlӍ5/խKZӭK| oْڬQ8ZԁȈB.]֥Kը:FEopeq:5_~M П|L&-[öUIujM߰$NMEmԈ4 " _S&ҷ%Vn`Ԑ^tiZ!C'O3o+:5ѓXɱq,?'KE{<.KI!9%}ָB0 [봏(ʥҴ*b˳o z=\7F>9p =w;:5GVD Yp桡mٔkw2 *ԃNqqq핆n>r1+ʞ=hۦ5.f̝w`63|]_l[LpP|_~dGnj$(0fȽcHbb t}5QjZ^`eo t&((9 # ෽{TB4 " fd2ӬI'\r;//3H8N&a jli8f6}v?^ˌiXb/[N~~>۷c+s- n?un0~ٽ_Ip0puuvg^6y3iTl60l];wf9dz@֭h\a9g0YL2~m°fkCLL #G%د.Ʉ#igNKAAθ8GAAA!W8/( 7'/// E;NjZ6 __Jhb[l,Ͽ4XNPP%SDrY<<ݽd2-/]GHUX'G s/gV:llLo:DqSil6Նѥǝddfu r]ٛ:Hc +"pt=:N5*YDD. Ȋ4PF77rַlѼ0f͝ǐ۶j4,iڷk'Ws~~>=GeԈ]a͆`͚֟ھm׶-_np^mTbTMAVX=JNQeYb%;v$7'6[s;iۦuKo嚫9DZ  bСy{jrA+=ڏ?a矓7m[aI׉q' ߏl澇qN[+]>M-(}kcsMAIJ+Noт??FU[\| "_%&?Dټ|y)i׶-^l߱'>ΫҴiK};Z#GpNhޜGh׶ =w/W,Y :oǙ3gسooIm<$OSTii0޵+9$&% JWeӷiJٳw/s'};x$$&rEH~~EEE5.""Hwa̳'YM_<3) 7~EyֵsoFdì/`ٸ}]$'%ڏx}r~[ @PFr xٓ{MQq ?㾱ws;9LbR7x{,k{Jkp~9DBb"}Oc0xoX\ " Xvv6xmZ*>..ڕo߶mɺx]g/oS ۇ$~3{ѣG~Vߺ~ 6{lСxkdE(Ƭy9q2aȵ+ls!@heJG.C]Q󕖖ΐk֛o#l@ ( Wǀ~oh("Wn}UIp0sCWkdE }w[`a۶rofn6?\7ԩd<==q'fQ#FдIp'(lڼ%^łϏcqq4 +Bj;l#c0˦ 4;~CAA! ̪tSmW_55WDb)-~mOjKCϑi>\999dddfdkHNI={ܩ#ΡEן6[1*<;F&L~ ":ˋ/L'88%oy?#%%lCg$7/uՕgsU~$$&Ӯ_0;uȥaXfmpn0rȋXJMMlRͭXM}?ҩ""rhj\%nA`?A9v/ȈK^T +"RtV;FNHӦTH%\]]Wiڴ ];ݱc}&""g)ȊTё}пo.EDD]R +""""vIAVDDDD쒂%=@DD.KNM&''l\]puu'GzPDꛂ\Vl6)I$$ѺU[<[ @~~8K @ C=W,"EAVDD.6CGA^0Mֻ[طe "Ȋe#1$.oQ!dCHIL:y +ˉFdEJVa53|a%HNIa$]Yy?_th_mgX\dEJ抐rN<ʷfؐ!T4T'Ӯm$FV}L&t qZls+ˍT),4в ㄷl}c\c䐛/V-sUTTDVV܆jxqrssϻ$1)᭱Zkd ^^yŶZg/ 6l` `\ Ņf!>(ȊH N<ɒ ptt +;+V-vmӆƎ) խ/߫Gwnfѡ}{:FFbhV?erŪgYNݻZfz $0j&Nx\s5l͍ 4{{hd<qv.4]ϙ3}1TXEt3gpqqNAō3g4@c0ʂ, ϱ>+,,$TA]J(ȊHl޲O6l`OдI jeg9ػՍcY|}]_ɉr&=3‚^z~:nnwwТysj՗iixzz] ?Ѷ:YFAaC_ EtdEILLb\ݵ\տ__v淽{yistwӍtTaח̳֥ &eKڷk @TD_i]ڶ!,_|}{]HNIa0j1ZGTd˯?qQ#n#??Dx˖m{Y}fғnǗBTGCZZkhd\]//^IDATȜ hXwlX3Mwu +"***bK/σ[nɓ 6+[憿Ʉ]_oe?[+%e0rl9+ZhNM߰$Rry֙s^)GTIJJ"3v#ORd48~Nddf4l%s C۷c+s-kU䔔 RMߧnntܙAWdmZIpɇ<<<?m/U˗22gvvN/3/LʼE4e*6 OOn6,8x3g.4fqa>4WW[P2zn0ln\Ú5kl1119"$bRSSԴ4lV>l6RNۻyyy>M`@@ω/( 7'///˻Hl6?%vtԝ`,JI"11?ҭK/;vuibbb4"+" O巜 CټR5΁urt0WX.,@NiѼ{J[9u* pwh:(Ȋˇ+{yCi{DDDDDRso%ݯ>i/1e8W_ldED.\: FAVDDDD%r["""FLLFdEDDD>)Ȋ]R +""""vIAVDDDD쒂%YK """"bdEDDD.)Ȋ]R'w"bj^c]Hcöt'NёaCc]qpprBz1B6_O=`VTTw'6߸n_xGczш%ymZbӓX:^5Faa![ncƛ`¸/l.\7>ޕnSGmih1D`_8::臘;V1cǟ0xiEё}z빥/jmɽ(%99G<>cǵiVEDD(::ZǏM s!YTPPYfqY*++C`݆Zb>))Qn47+ߺ}@|BFRt_/QQQ~^?'^c Y=hUUS\eyטnE GH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,婲2kYYYZ|-й|>*SIi.gcؘXeg(-%Me5m:X|PNV>"##YhUB0SvLURbRc ~IRzjz,>5YBEe_tgn YLIirs3N555^qziڳoO!{Ǝˬ[)g.rvѪ˩ĄDy

_Wb殏pf6B06hu۴ev,aƒE\瓥26 t>lJP[16 x~gd;gd%Q>wlV[pGno@ ׿\Wծ?Sr Z9/jɥr:]Zr͹i7u7o 7=l4 ,a#~znIҚB2sF!lXw5tK N뾟/ǣoQYPyyTW7ῡW[:kY)>-3ghpq >?qݡ ٖ ^xQGKeRS/4/ǣ]GTTTZqF4dɶFuԷOz54pIReim;v5"'[n%%&6aӢ%{o_SDDU۶У=^R^llf]]}V[moRjJ>󒤳iھHNKC ֝wр%Ik i*-+Wi'I*))K?VDD&OF?kgy=mޢk&WLLƌ TgT랹?НwёЯr5_O:Eڵ{w_VÆU]Y*>,I4p@@kmգӎ;uOu/~SuX -6V˖>O=m;wAYŒe՟% צ-[v5a8ٶǩBWOիBW_yONOt1޳'>_Y SzZ_VmZnk'8`=d.h^{߯{I'hz˶mՒ,Y'Ov)'{~Ӎm[Չh rܲe-۶|pia(m]%>^gik'wՏ~ʒ4ackȶɲ,ܥ 5D'~}4nQrRJJKկo=>Q|=_߯2vJJJ%I{s)f}1B06ϜVѮ]<]1fL͚]Vt)IRzZZOzUpfYNW]-:5j4.ƌW_w畞&I:v%INKYE:r^\EZ%%&&H-}kC=kYMIq&y^ꕑq)-KO/^E;uYV$LguyN/$'k̨QrMn^IҞ}ph˕PEen}tfJZcF҈EEEc*-+ӂGV׮]%CheYzW4[YGEFFi:z2 TTT 诏P.6L)Zb۔e,KF1*҈x.s!Z27 %ڢvPgj/*+3S{ ^u8^<+gdԔ54ݟ*عS߽}vm٫5U tG6%1!Ao.В6Q3~˂3s-G:l Yw4bbbt9 Z,9]N4`m0kѪ^tW#:1VէUݫwT ̺NWVzZzOfd۶JJKB~S9eg(!>A^}R䵽*--mv_\K.JOOWZjjkk[xB0z EDDz9Ʊm[uuuUmḿAЀpTSS#ݪVB˹VچH,DH,DH,DH,DH,)I^"pדTaIENDB`qstopmotion-2.3.2-Source/manual/screenshots/pref_image_transform.png000644 000000 000000 00000113261 12536560630 026054 0ustar00rootroot000000 000000 PNG  IHDRCOsBIT|dtEXtSoftwaregnome-screenshot> IDATxwtTLz:H'B@HG:~Dޑ*(TxQ)J)$Lf~$3LM&Z9wsϽ9sފ0 B!B0zq!B!6lؐUB!h!BQ*E!B)A !BGwk,fEEѠVkQw(B!!rkN6oܥ}14[ }϶b5|<'L*v^ÝX?-7_>g|((ݭ666:p7߹IԬZ?.^fwuW1/uU7ҺiU*Fu㦒LbR2}lV~CC\:U*S+ʖ (ۯ$nW-K͈ۖ&BpNq#F;|5eԫ+W"S\ErJ*~ w(| lW nry|1effr5 & $7nЉo"v1{{fǾ$ܽK͚СUsr6oFNR6 %/cϡ#XvqlP0gJsâ0دףWxѭ}Jr`{?CGi4/T'51/6yt?Wd!qۓpJv%Ofϡ%_|4Z6[)J{1A՘hGO\2nBFAׯq⏳hg=x7ܦe\Tp niׯ6[4#4J$-jW+OjPreаnm֨NFF} զIݭ5˓g?߷q4~K/x?>( jUBH5~Y!Ds\j=x@2erw>=y.p^ٟp%322HOOGeff,;;\1-]]:pzthǏu_S6q)'KӾ7k2h4)تT*?xor'#ǃsz?~+~c5nPUf1~=zvaʰyBa))Q+(Xv! skWGѢ*yg/]oOʖ.;lii21# _gy{*!n%Q*4 uh4ڙ׻ǏIȱhݴm苩Yg.ZkmLzu8z ڿLy8[[[6Z?8!߽GE?_ER?>pTA![ P#{wuu3ԭŭlll[绯}+Ϸ3>}TޏaÝ?QW%}2{{{ov5FV*VTt)}/6 -XU*J222HKK5JEjnCk* RSSQT?koo}Z׎66reʠVg>F!99-mTr@zz:R_sL !DN۷o{d]FARJJIII>^TZT9*##tSZݻbg -ZMBBjJEbRʖ4Q*gB*AV_澮Ozz:  p;>NzзOo~=p;w?kpuueG38{QJUi~?ure2ӹcuo'~':&MZclllUfAT\2Uԩ]ˬd;ZZŋYW~[h/VH_Ⱥk[6իU5mB߷&--ƍ i}"B,)l/ѪK|ݙ<~rͭ?}[ZZT4~43vUXd1W_KjU:x0-hpB!ϪKyzzæTXLN^ٟli;4$АFF0?nXB!J"y] חqpqcb8z8GV2y=v?qLmpmwpj$vvvx:;=B!uV_)Sq`0썸Xʔɟr0Xh!s>ϐh4)S^C&!XBf̙ˇ#FPߟRR%m'&%x2>z ǏweW!y X6<SRR+gvjS>e #Ա%Bd#n+K6ZIpppLNT*qww/6B!r9O\Ǯ m+Xh1f}v|}a@ɵm.\|4m?ND0|~+T0tы'ѵKg6m?|_n w0g|"CRQ|y>cWpj5݋#@n=h߶-!55̘N]+nё^=3fpW׈ (4O[6Q|\[:6neUddd`ggԉxs|cihWvC7SlޜjMINIӓ?[Dj B{9g.#P(]&.^^Esиө[ͯr]g .+\147>Οþ];5z o 2rUƹkqj+9CX>=3`+YrŤW.`9؜s\A5ZsPfMcXd!+D mءUff&CGϏaINNa|LȺz2lhaMl sc';GÀ.^:w=**+s8()t1_ݻvep~wBCRm קb &1Uj5ƍGRd<==E"5޽HQV^Cp` uKDgd3o,|}|=os?YH|4{uzvJB._j>:q"W[L0=mtVɓPrttd!#F8=K>ՅAClJ,\`tjقcơA/Wʶ9Y㜗q@Tt4+ƌ6sj] pc o|nnVgcs:NI^ٳL?Nf̟;L-[qp0 @=ԭSwww{PV-T}/@֕.fmR= 2aMCPZUڽFu{ߡm\"-9_gl[ŋͨ^*Z >!|Q*mP(}oh(7Jfj6l.4 Yh+5@E-HIM%!Edn;4kڄڵj,4w77jըA@zTR\v]^Cԙ3p cР~}UB tt;г[7:o[犱Qre\\\pqvNZԩ]?Ξ36k9Ǐgsƙ?5ƎN:uF&?WbESZ5MȽKS so֚nn5Y!J\[lAvYW|63,N,7nPj\]]"FJKx8cAL Б{J%^oebXv _nc-u-*?(ڽ%/v|<.Tz߫SOYUXd1W_KjU:x0-jj>0cYW56s%8kRNNN69;;:fhDg]k!+>: :(H=~9}Έ5yzx`ggGL 4ּ,̹}x5"+D drpp}æ:o>PZ+99Tuf{_[OBBڴ} T*:og0;g_xUK]dS>@fXxe?:ӥ+W4m:o֏cоz#4$ukoquqe$ܹc>P(4coqz/K~ܹ^عbhnc1XXcj\"FKȒX=ghρy]ddde4'ނkѷ'1?I Qܸ}h4--m`󩩩'$kDzFnݻwQk4xh.ZP}414NO} a”iu i ƹsŜQ5990)) 0^2>6)S-ƹҾ= OxxsE6%5k;vr= ~t?T IDAT,.}mP(hĤqczȚYa#[|<pppsBӨjCj'''籡TWT*MehQ2ݽ{3vE0\;Ý7wwXB3MLLb_ԱCE>ʾSϜϛ[єr۶ѸQ0/Hx\G1YP[x*5i\(B2ϧoIԕ)BcK`EzF=~ .]+]GY7ӖTZd4ڒn?+8o,]MwAR*|2{6>Żw\yM4uD-n琿PՌ3{˕|~A iKԪo =8;9QR%;QB"Vag~!+qϗ]bP9>s?oiIDc6`[d,lJML}t9+xAf[Nx*5iNB!Bc[ TgRVL3 cF0jxRRS T0g9N,L AȺji˜;ɢ%ϋc^9TIK !B/dhբm-[*SβoI]UkK6~}zcooOhVޣ*֥bo`ޒz z8ziؠ>666>"(h]zCYjOgE8o܄eJb{tǗװF ƄchP6֞%\$盾m5' i\Z ,cMlpXs\۵3׽S>O˶u CG">z ?n*<kl=-f. cԘ$PJcѴI緼=v9wj+>!󦾱06̙o5E6otN+;VEFJMZGjj[0d(|g0h0Xɒ Tgr#.ժ2qh|+6j4 w0t`\]]&[*O5:'G'Ya7oepwQbo>>̞7,e溪o4r%.l۾.Z} 7jī{͑Z@Zla4me<??6'99cƲo2x::=w%!^ԉYjUqSFjw}h5/CT:w;vs4 ˺ףR2#JNm7͚ZͨqQT,YOOOGEQbER3NfYdfu^Xvڕ zv_hP>+T09 h4j1,'1ڸkИ_]11mCmթS0Io9иkgO*U>yʗg'`!:hn16FxL16 {l m3 [ݴ8I#!qqq7yH͛[)>>4o֔@թÜOg/#2~Tlۻw?p,'gշǎ5孞yV]]Ȍ9spH E \qe?xX15G<O46Ǎe朹t*vv45ryilU,1T9YjE;TcPi˜0g.C߶\lINN^BX+{6ɓ //b)aofzqW\LREQ(柡^OJJ"=#Cw;MqHKKy7-|jj* iμ44f*J>1׆x :9vmӢ(+Ee/"+3NTP>ޫDުon"8VV{ҬMCkο &SMQT~?uZM윝rrr2Es楡1V4Zc}mG˒cTq? Ey>( B޼4CnlۊF[WQ(eS鋗'W|a 6Ρm4^tzZ=-qn7?n cG[),u]:Q#;!9B:c&{{b%q#ztJzF:WFӶyܙ3 ^)R |oU*W*tl+Zh>3Kڇ?\K/?~q³F]T}{ZxY{}-- -fEy~{ϝ"&VuU_d32$ ӱ};u˜[Kjv K*PR>T*?xgQ1\~:wz8p{KSTܻUSeOiiiF Ӳx|ZƕE,d=^Rb"ijY֬ ;@˶yu͜[`N5NzJگ{iii4e>_Q(h=(~JǮiԬ9._&11йGOZ+ky-BA}HscѬu^ؙ}_k mFPh3]*V@@zݫKTV ?Zl{pfCmٚЬu.Lob4j֜wlӖiԬ.>N^}hֺ ۴egK!BLBF]&f)33#G]GY7@֕yWףሣͯ{%|7VѵKg]Hh?MݝaFqCfGQ|>MAV3jxnflz DŊ:q"A g0T+:߷9{<gϟ۹ݸQ#͞ŷkW3 nf/Rչʌj4 t52)V~c-o)W!B< O#>>/Scv=ƆZ5jpaNC:qwwgծU*+S8u:~FL76{:w@nؾQ1q,ǏSx&Sf,ßgrEL@&TVv/Ύ pٙf4 ):vm_Ύ={{/e˖YDm^rŊ̮{}%2bOJ oMZZX!x=7{iU\!Ģ%xu763NJKx8cAL Б{z̎Y~ժmquuˋqZT4~{LҴxEaCٳo۵6Gy]܎Tj/Y;RZULųB!MB~ ͞M'iӝ;g |n= kӆظ86n T*:dr GE2ONNv|<^n뽦ztlR :٦ҹ~5_ݻwsVp&MaCק7~Ym u@hH!!\ =a";~ZdOBQ[ J%3NѣGjw˸IS8z811=vӽfTT/V}IHFP^^ZАݕBk  ^:d>{r8('OΖ{{>6ח܎kyn;{JRLV^CJs{.nq6oJFvmܓNqQqqvC܈?q>pmwpj$vvvx:;ےwZrr2VSM'!--w?Į{6s:t$F͚s||>OSR0eڵK^l"^޹f1*dz\.d!k6r\?svrb颅0d(z}I?ϳguQ}UTҾF*(Rɲş88K1eG(fWxx~TXBpH:uyu/j֩ I{*)d,ҎANsGhڤ t3ԭ۶B@m ڵe[0y*L7Nӭ 5 L)1)Kڛoѫ^q.i^)PʯV3~ }5Hk~q|z `԰aL;O Xr>/dzO",,LӡC??<~ʕ-k42TTH\"ݻ5=ppp0KJJ ?>kmw)|) eOJJtы'Ҹe@V0 @6nLrJ ^|"Wd=y j[[[Q(ܽwsr8( ڵjr%[ժr#.)(J:uhıc fع+_~E͛8::ҫGwƌ`^^#*:fe ~Nci|ۼu+WU:qtd_1|4{.vO?fԮ3]t2_(U꫽sXߵmrRSSqqqaΌl9ր9w|۵}z끃ܹ{YC5sps'1T*ʗO>T 9ѦMAr8(i1y8<=<φ0y !Ӈ%j BA*;Quttd!#F8=K>ՅAClJ,\d}wo||9qUH-9f4r%.l۾.cszS>f,k!Q^ݻpWԉYj7obʄO:͎GV3lhaMl {j*L< 3[NX4f0;;{]w77v gUf͙y>JL̟{Οt͞c' hټsbL9L} p{47JŒ zT+V;Sɍ8Wı_[χGCcVB,-n7?n cGKDM]+:w77jըA@z5  6Up%2RKq֭]CE` X'wwΗW"L_.ߐƍjKÇc?yF9}?Ξegi[jP|ڢ*4 U:ABbbc-Ccs-Uȿv թ@Ս!P_ Ys瞹r IDATUxn}dDʕqqq!S{SFo^=\ݺtۮ6vÒ+[M@VUɷɓCcpeǨ",dK8??·o+5E899庺줻sFgm㭿ܽyki[ƘXyxlI|yY:(?__Nε9yv<ݍe6w }-l)hٿ0o;\KMC\M%&w&~7͛55`4m:F]!5rEVgT\u=mggǪ˘4m:CFBP䪂; 9 FC2ex>4mo[\=%W._SmjN> RߟXO;~ŴɓƳl,Y.#--et 2}l @À鮔J%Ǎe朹t*vv4q}3'6oǛlCo{Ɯ|8b$^h!+U5VZk/Tg qqq!)9٬c6xIY!I呵\ZIp&L[{ܜF~fss?-~_IIYW&sӗKX^'96%)'>m˃ 䘝>yAU~:F()$bjr]|[[[|snnNesrZ#?–T?%m,/[}/vו g߫k Q!g9uq<|HJp6mOϞwhK%ǨBVԥ+WyNp~}y~v1*i97֛Ҫd\Oo//NZ{r as~kI[YJR K>Y>°b!+ gW?yjq!BsMNN&ݿj5;WO-JŽQe'(VJmgdlիU`C8y j[[[Q(ܽwsr8( ڵjr%[ժr#.)(J:uhıcpʮmXܹ˻ሣ tXb#"HIN^ݺ:ժ׷Oo~=p;wŭ[U&-tڅB!srttd!#F8=K>ՅAClJ,\@Fxwo||9qUH-9f4r%.l۾.Yu‡֓1cY7 +܈`Y~VdUF D^\VZE+^^ވ+pLB!A&\rٻ訪)!uN@Q.H6WP+RREzEQXKUwB@ LG\"鄄 g-Μs=s!\tA<<<ԡxwߍ}!..f*mȈ_#}D .t|HCQB޽>2,;wܱĤɌ}A cuO<$8> v___F]s %Kh:fWf1g^;xjѣ`Ig4lv;@ )۳1M<$>#"ɱZ+P|'{ɩk}%""7<**ܹk7fА2pss;c`4Q/i( ?rqG5c\}啘L.MDDDQS=M;w/Vs0.%믻;nidO-7-7Haa!... ZKHp0Ak/Ɔ.h+"""rՈ9뺎:7Sָ~^DDR> tJÅH}b|-%""R3VZ+m@ ]9QY oz$""ReU7O"""QY oz$""ReU7O"""Q~!?W-xbX8~.}'T}'l˩jȸKBENA1K竭jn/G5#["""QYge㿇kk8;Z!ށ\ʛ?!Zđz=y@"\}jށd6X-UO2VwYOW#.Fs0Bjv!6{}FFls#%!V zlvg9k3OB|] ȊԿFd+ o3o֒s eKb.wHZv>MiWE)lv <41PznGh}oO 6Κ]Y,yʔci卿 q{ߠr .r1tkFPwSFg6;c.г7v%T˭U <;2NZ;<@Ad7|#/7c5V'Y(luFdlLx&"W>IoGrJ`s/>ΑBz6ށlILxx\6!%d40edəA<]L/\Ie%umS~`eY.Xqaw%5fhduȈ*kOjK#"""]`c\{1.cbggR ؚKTc֥˞,3 v-,ntM;pIĥp㸘"]qWn.Fh>[z3حqWǬW٬?C\Z>&یݎjblds7e^ƞ<.̃ab>h`hgr-ޖKzNrsvjXQԖV-r m {6֋x-( NfHfnoZcjVWg0@\ZOL ,݌|ʺWr=wCUNԬBN\kuԶ65'Y(l]Z*ȍG|v>( :čN i'njsA3 ꬦWCq<9<[pܐu%4 pu\K~ޓ]ocd>j,ȊԿF9.?*ǬxdCVR2 wIݢw}ح d0EyJ(/5&ĝA|haq΁| P[NciB^<64z%}^ne8o"""L#Uw;2yhp)y$+]-*xdH^NB|؁!<{E +6c!*^nFnDw~1lvi"^dAq8?DzNqz>" >_%))DqèQz埊lfƒ;v'6XU+zl֨Gd .BBb";w*m]$$&2!dƢڳvl6WLl?1;sVxɧ"//Ol.yxݽAxIJJU˖f\]]z v]CRm"",!%|wo~ ^<&MoqV;lNN.?M##F?_űcXt6m"ךK6mmʹkۦ:'ȿ.C:DXh(#g_پc6!1nWx]MxQ&:+*/ 7n§Iǘ\?OV\kN),Z 7Ft˖l/n=G]Wi""ΦY] /ĖӉ-۶°rcٰc=+˗,"0 _27(..""<WMNf7{l6=GSS{?;V\n] ]㱷7?}5^}6mbsӦMk[KEvN Dj?DF16E qwsRpݝ}II<أXK#ԤI^p...ۊعmmY ST3-GѢE sԡ=ym"4iB9~8wWXINIsNY0#@va݆ 0 Ra~Z6oNXh(yJ- >۵g^WyWխ(޺*zq9sg32xZ kيu-UO&vm/0_l޲_ڥ3~9}{_x\: l0y w?<ԓ>&1pڶiMƍp𨴞}%P2a}7?~>ݪ%n;oA|b!!GlOGоcyŗ_OZDE1kԱnnn6f=JrJ W]y)yXK|B. gdΫy+˭sΝej\?Me‡E{6zYuMnjwkT֊A֚[aO'$ps-c(*.bÏ/*OZRZ&I\tA&?1YED9d}}|{|<0~{ tʔxm+!1IN-|`@@ l±ۛ`+9ތ^})ڵmÇ_m{jU8ܼ<>1痻kvNC5>t== www ;oWWr/9оcesK`0ѣ嗬juU'?{QuA~~2%%%Yko`\+9vOLzZfdc!\{U->een4;YӦ%wit0Y:&W+^kJ.ߏ9.Xiչxg^k-"r6;g}ח7-yT3:oW~zt'<,g X矎ݻu%<,Gx c#<<Ç`O^t֕N:{xyybګD2tHHp0/xxxTZOk~/Vc2{4i].p8)?̮,%W5?kYHł%0J48]2`|1? Gǧ 7nl6sèQSu5;D-x/{ZY5`wYn=nq1 Fc@y5ϝR*\<|w?!9A@n^ED9d]\\AG lHθ1Lw?:wv,Pܗgn˨kO^F29yѥs o.ZR Skׯge{h3+Wg¤'gcx'YxcdᒥiY3#Gʭg5WϿL"#"ٽYG-lOvMtVxxTomZӥs @\M##T:nnn~i .c?OHy]1lѼ¹u}]#86lH||mZ&촃8 IDATTf͞W|8+97/ZROOOΜ,a$$&ڼ""g3Ê+kRll,G>%=9'jϯc,]>kOн[W\f>dIOOoĀ& ZG]s!#=Ol{|ȃgM#66l)77_prig.o/ ko $8А?`0өk9dEDcxzʳ|M7\7"()Ȋ4<#l޲cDDӽytҥK9#d\Hp0+^D5t)""Ԇ8%YqJ """"dEDDD))ȊSRtN#.. ]H(,,`ޭIO&5`Bi PDDΙYkn.s/`/_͂7k^ .jH}IIMb+LBv=ܮ'22YJRRL;'Fdsrrλ9뮥Wsn~WnZkٰ.rMKf_ҡu {xm1&ؓ!8JZsrrH bL\HΉWСC,\0K{ӿo_6^&M+= Nf9r()GZ%av'RB6o@L|ۇ?ӺYϏȔk;Ҫiӿ/fbue U0>!}\-w͈ǟ$!1j>ʥC/V;:je;+ط9[5 竿!ԱR0},I .b]uX7K/2e髯ΐ#+z lݶLmOHLdwqခLzv*#R]q GqI(5ohl25 kƇr[obAns/ɓXUzQ|||+ܛoi3OmUuNA ߮css JCMM%bh,;Qeŀ򧘜~sS9V+@>>q=S 2ˇ sl1dggc2ycbv͚5#2"IO>ΐ#~Tp17d]6/e?<+M=‰K/"GI@ɰH)]7?o8O{&T=bG@@_ҵKZh^~ii~UoDQQa<ԓhޜ=[b0\>l(yGNJbYع ߽ɽλOHҡxsBNQ,ys9EEEf?A y^|k3+\`nswb6Yk@t+F뮫99,^7Km[iur45 z^F4>{Ǻv:v@N|3X6u -^cǘ9{o`0:eWiU:EDjKؼe cⱉ#b=q~y:#G},\\\8Pvdz¤g'0 W'R1W\\\kf0[`#H sOU `eyX:uG>c2N&Ob $PM].|0XaYAڶi]\<1BCY|V+O=,>w?KErJ  @`?5c񄇇1]'P\z|wl۱N:g^'p(>fMyZ ONztnf@ Dzo"b&XOL5H TNYR~QF#Ͼ0o={mvÃGn4ߋ+0z.Ӎrl%!1_EtVv]uAٽ{19 z&77. `͏?Ï?ѶMk7dOYӦUV1pzɤ'f/Vvggݪڷ#Y3:wgTze+;wfܽұ}{G5IӸN4YO>{cȿѽ[WL&;wf \9rK;qcF?ǎ/P m}ȱZYxyyqI#0m <,Gx c#<<Ç`p;9~dgg1~X;& 2ow#%(XL{Ë3׻7kfK}ٱk=5-bi 44c_# ,hj*@?rΘr2777d1 ߏ~XwΚ溫"a~}H֮__c.9TT3v///,Gm'~cWzN * Й|DD ~~~,_w/ݝ6mZI\<JݛC/)бC{FF'5-&v;͚6e8+T`3y~Ƌ}Av;jYAy-¹o+^Z97 C}x߹okkфվeҾm[" 00(Yǧ̾{_ocar+SD;ᘖP@qOR\r|#RS"'%ɪ:-T%,dCYJBjhj*uw:R[^ٳ޽zrl})"s"r7_Coe3<;iw/6K` t\ ܕQv-Z'j~yDqq1#9/&W>ki* sTKrGETO|ѩCL&la=Ot4mҷަ{׮GwV8>.11kۆs7'>lf)/Uս[WBCC5w<0`86*"RL=KmQvL&3›t(L臻{b^^.YIL:D j̬,FFo槟1 4d pwwg&3k{䆡0f2=uc%1mZ@&M?V}~=/)|4ݎO1 t#{V_@xXu5+^  Ȓ7;n$5 ח?^ɠK./KF^2KƢӡC{<nVelfxŗx|d CVkӯ""5aXb}> 66ѣGDWzzzCp Ʉ+˥ WWw<= Z!d6cx7͵rrr(,,mv|aIMKϯzZٿyj׫TvN&dq9gk󊍍ՈHcW\\L^^>~:*..vl+c4 WƫEKv'{y27WJs]TCKEW/wػof~ +r4tmظ̬L"##ٽ{+?]90I ""Rk{#O +ɍG5tY"rPZu5ԧF^""r)ĊHCP +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%YqJ.@DμvʑdRӏ` &8 vѝpqqm EDDjNAVKIMM??f<22YJ֏KXC*""R# "Ѵd+Z凛;..%EEE兑}JZ``0%THsdEB6o@Lh퍛;nnxyyh!48v]ټ}EEn?77,Y-wkF3ʫxMMҡ_Z,g?S|ֳ\qu0Vj"HhDVKO% *ȱ *mmMMeCut+F#idff;*s"<ӪeӺp(>yL{~~T\6m۷saO9H#m"&SXBIIMVs^]@~~> &$8ZY,|j["l>}դŝ8@A>W^^I]Պ ...QkaZ#00T,ƲU\ p/)"RYF*7ϊo\ݪj2 `B5geeǺutP2{Ø[8a<=ueÏ9o //.c0v#DǞ[lf.6{kKOOJMKcMc9|8;Y,)YҡxsB"O9.;'Kvrssi׶-w~+ͣرkWv |}|r'$r>b5K\NQQfƏc%8رsF3{qw?5HZt= oC޽czv;;tKL'>Y\,L:͛WZd;sX~ѭؽg/ J)"RYFL&SAnz}ݪIl6v;6hŸ{G<{yVx]t b݆ ,gcb>eNնMk%s];|JSRx`X˽''=CZz:r3^^|*=8oN`ƬlOOy/E7߰kצuTFAV PX\h:cloҏ cXE.s>]xZb9WSa(dwVSluڮ {3xХ_̬Lzv^u+v`gѽ:vϾXͭ7߄'Ŵiݺ6b:u$ s9]:pAެ]t #??DtVv]bi ѭZѡ}vݻVMٹk7gN;+KhӮSDd "YXªYzUn1 ߸}Un }d_# ,hj*@_m>*rpQQyyydp8).P&^._կgy<<aa%k'RV+GSSkslDFDؚJ{ϞճAsH#U\\Lhehx_Vv&<2ڣwr gգ]낋 HJJf)1ܼe P&';yFpP{8e |9kU+j{5n+,4D^=OY1KL ڶai ÇV~U2M9&А}awz+!$'@n]}ޭ+!̚;G@HH0vh:Eܠ +HvL&3›to/|^Qp^^.YɤYxsS;4/_>|٣;y4i҄c_wK3NigЪe 2У[7]23K>nۦu#i6m]q޺9y;dF#/L¥KycbС=^E@@+1T\<xjѣ`I"+==K8dՕiRPPr㐫;RPPpsDcIMKϯZGSS}&NON]X\]!=#N@V ȵZ|:骪sr0M]% @W"xjDV+..&//o?}1LKUwkM ǼɊW5zT{ڮI[7תQ;]U_}0ͧV_uH +r4trذqYDFF{V~C/sK ""RgGw@@@W^1O;+"RdEY,|sk[6ku59*_%]DDbE>(ȊSR +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%sC "g^aa;nHz2GJN6p"""5 +ȥ&Ǧ Bxp3@Aaa%wG%KYFhZ2c_">~w׋ mEDDOAV***d Ĵ늿_ e7^yRiYwVh4R~~><4#cݞj壕paiղeT(""5 +H%'J`@^^^hXVqiնv]t!M##Ú%0iSТySλOHҡxsB,ys9EEEf?A pRgb]F y45 z^<'{Vl6fˇ ;`0q3ga  ZGb,-IIDAT\*ͣjTHcudE)W\\\0LS2We~W>sw?%l6 7n[n汉aDV´Sض};6nbsSYlv;-/ON b)L:f͘T]ݺ2w)..IŢ3[w{lZܵKgzQ^}eZ>tv<˱cǘ=E3U:w8Omi4"+H[(,.h4U1<¢-n?992!\ܿneێL,=wS\7JV2϶gϏVо;udө#dfeҳ{wy%tK.ݛ֓Nbaauc2nՊ׮17WOjR Gdd;+Mٹk7gB6OOG>xeInzu4 "YXªYzU"NNpPugm'񜗗A  t{y<<~%K9P2Z:-"(7u]3SiCkn6M}+'INnQ)**Kw(͵thd) cV۷u`0P\l1@-|Ȉ:"{_ocar+}g^z٠udEbGFs ~?-Eۧ39Wo+?a@@\.87ڶazMxzzɪp19|(~~~n/,',4D^=1M9&А}awz+!$'@n]OgdLX{0k<y`!!l۱A9)Ȋ4RvL$&&|Kfqs2iT W_槟Yϧl_Ǽ0e .EϧC{y%KRUjG̙֭0/'w2ٯI4#< ֍A d̒m۴&xjѣ`I"+==K8dՕiRPPrӓ;RPPP{/( j׷)+=#N@d4vz>,&449jDV+..&//o?}1LK)sτҵm+Re {l6rX})"rR9v  7Idd$wa姫>2Ǜ) +"rٻo}G||\yHn<YfԵ0k_+""WԊbED* +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%YqJ """"dEDDD))ȊSR +""""NIAVDDDD8%YqJ """"{uA0e""u͒GmVv۶ݳ\3,[us-6wsFx[5 M1E 0*N0 x>xw$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" Y$d(HB" ̘1#˗/oı@" @,EIP$! @,Eo;zKgQۢwgXӰk1-T*ܷVOeڵg䈑o~4h˯ Y`/Ye˗e)<8˖/˃y0I:u>^:ӧN7>X|Y~ЯȂGBEm2e mxV^߇S Ϥ'l>L:ݬhnsfsz! L{G{G6HZ-#{,cڵfϺ2, 0u~>mn}s1ӛYDTVؒٙٚ Y`*TSI/ȚV{"d`ZGRz^Yo^ϺBW +ۏ+ g{zժUje]|@#j`<{R#oē_`',ɉ'&vv9?%K ޑsu8}97uo:-yݟ Z̫+0l_wwww[oM8{v|s1K ,]|Nym81 ҥKʕu5YD@Si|̻Yyou?>.X}'L6?|qonF׿\7el[5=#=C ɐ!Cr,A%jFM7ߜ=#_-7ξ9'I|S?)'gy̡L·?jnڿN Z*rss.W]ǏWz}EQ^b9o1c{l<$yfժ\kryiȤYg};IrsfmTռU3r{ޝ$Y-_x{s֙g䱅ܿ%K r娗o}\fQYvm>{yѰasɗ9seu?lߩ0T*6뎻~sQj9裲t̿u=S#^qD^u+E[xw_:ҒxSjZV\;1'x =~DmN;%IV^}7}?y|sd3xjZTRTO#L>8?嵩jycIGGg*A5gNϺ'uoYw9|~}g]؆%sxOq>r$9v}"^T*wϽ9樣6='.Iמ{l6)Gʢr͵3}"{W8myY-Ir.{1bƄ, 0\+3{s%Ӧm';s{J'\$imiO|;̍7ߜ#xi555,v5Cͫgf4?5rH ?ŋs>w9ɳ:pVN[2lXSsNȐ!C>{硇N; رcrW/əx{ZƶdST2Cru, 0|-ޖqƵ>d 6,o5M7IGI 읿(Ψ 7ln{.n/_Çguݺߙןڼok9T`~6mi^Rڵk3zԨoZzu:::n5p{;͚5YMYJyv-禷~z?VնhsmO>"CCpՙ_}[[ZӶ-#G4>S+JkKk^/d`9bdjZ-盖Zf\브12ݛܷelKkikk쾼N;ִmɚ5kB=&ZeРA}8ũjYvmj͚5s=3qĆ~h@U׳ztvvB5k [!4$d(HB" Y$d(HB" Y$d($5kVlDҊ3IENDB`qstopmotion-2.3.2-Source/manual/screenshots/tooltab_project.png000644 000000 000000 00001022151 12536560630 025053 0ustar00rootroot000000 000000 PNG  IHDR54>sRGBbKGD pHYs  tIME!! ދ IDATxwU3snۻDқ`D#E[0E hK$K X@7Dm1^vaiX`yY{Μ9s<3#~VM0!xWI)x<ik"bXö-[mճٳ³>A8pSCޯ_?+=5oo6}e1.\P̟?EL0!H÷zk张x<!k-BNqNX3}|Wcx<dzQ 5':uΟ,R"Z_x6^x<hb&JB`isxAx<+6B`S#%J. /l<l,5yj1X@ T//akWzjLnx<ۊ01 8!%oZkR 45o6g*᧶oyBMue%,ABxOdz!?> "_;]*1}0ڀ;K/cZĬ(G:ϦݑqR'L&~M7O?{$ C1TW~{b~fER$qt i E$Kka5 wG{?jDypU*֚Bn6NEx{m߮|X,F,`P,j@PQQ%yL{<_[_c[y-tڕ_y5Z[o^K׮k|w.yRJ%Ա#ow{0 HRryϘs=M>N8.ld2iSdq{8D Пl&g)3N=l6[frg~˓Gs?SN1{}c \=?N |ˮN:'|@.SOcgf>"!{YJ{YM||.]b#̚~5a„n/Zx< /_3ڷ?䇓&L2h@X=ǃ{3}yՋ9p">|{/&ߗ{7/bǟDk;TUVҫWOutڕS/D"ASSԶk^DC>cx)]s\{}7zn.nGsյ18H+~3ڵc-˨|(Ct|5xi|RbX(ؿ?ݺvweҥv[*R)>_tŋ\Ə^g_}}zoK]}=?`o}[3Øǜ񛳩x/~S/< s'WVV3h`?haqc綿eL&"oΜ7п*8̳H&lݫZkBCCj}`.{2j^֢{I> T#8u9?W_e-dO׷oN) CxmlգGr<9J)R+ Emm-_Ν>KH)ZJ|9Ftލ? ٢E]Mri=g,R ?AD17駟 /ҹsg,ϓL&ǴޖEdz𣣏⦛sRW__v65e0Tx<ޅs78WLw]IӴ唓N 8big1c{qcfr Z~r_o=1_xb3_?&{ )'H&!c+䧿zDM b&,D_{n{OtR{}Rx[,J)fJmtLH-T-Q򠀋eTW;F*- C 7%;ֲlٲ(С=tء5Kf镝`&aN0ZdTmѱcxxk_e}y<gGM0إ;?Mga挙HΝYlO> ʑJ82zhRXk\qU׏d0p˭oy<g33J17_iMBuu5J~םq޽YfkmYl)_555ttm j2da[WU]믿ΨQv\wݵr^"ࢋ/9o^{ұcG>|E;wCn]RȔ)grM7dcɒ%g钇caù/fфaH]]=z(w7R,\~}n֒HчR)TVV2hЫgDbȰ{x<gm·k2z4x<6лOoq42/FrX̺"GK5P#l6K>G)>}fE]# CKxM<GZ,ihhCUUDL6ˌ3٫dZ>[{ﻏ?TTTйsg-[F,#Ũ.bJc%2ֺ|d2IEEZt/a=etؑ\.G]穯P(J%"ˑhWӮ\把 ֫>K^HNTJJR \v5K !X$\x|8a!\{A,;r+#Ӕsg?ƿ܈֚3~=CHn=wN[vC@.?7gNa^+Ü9o0fn˟Kh\8Æ C%ϯ><#vy9:ub9B+pꫯCǎ,Y.+8zd>x=";'N?4yN[oe.vs٥N-/\")gҾO,Ne1-ڨQ}޻33f=dzyDap#GDatc9Éb/5b8H%xMeiΔ30r^zt)Z|_*x9jQ|ԇ~|OMsQP9D"Q+Xk"DY|9<|\Ϟ=w9 5ӎtҥlDO7nZk84&U ZWH!vmCϟOSS?O k-BO>مݴ){seBk(&%tc,=zϐ7o;#aNq‰';wϠA))Ǐ~x [uQ(ð<#kɒ,\nj-?ɓ&ìٳ9ytϟC=̥Sϳ.e,`-rj*++Ċ+8\KImmmyZK<# CvqG/YŠVgxy<dzU\[q/_NEE:tC1e˖аuR.X}ceū$0ưО0 y fm֭+}4d2A<'N3zxٳ'+V( ?SJX$LfM_%JNt֍;?}!%B2 ? ?0c^mz%_EƎ-#?O<"le=[n%ӧn&@6egO,ҽ{w^z2T*E&ـ-gd2ImZN8<.]Jcc#V,_NMv((s > jCql6[N-t:2j]+e͜~}9tЁ]F6]gw5c-ӧsqs0`ڵkC֒H$ݻwcґGH$b=|>!C2Lxc (4 h\s5L~0h@n>.UW]IuM 2d7OV~񬯧F\vHʴ֒NWdފR)H$A@>C<G)X6J4HZBH$PJ ^&a)k^<' Bx<^^toJr.˕EUtY(ʟ'#p}s?3|^חx<^sj~=)0ƅъ"B8ZrX-Lɮ|StT*Uu\۠,vJ!v׿W^  zxx筷㎤ӕh}?hhhhoc4Z]ָx<`L.\>Kuu L=$TjbWlZXslmڵzx<`]G/j<l <gB:FIYD6ݐK{T|SU7֒L&-i&5dz9xwZH$~9eWUUC~@6x 7G){nvx0,bGL6j =?y<&{ŋutؑ;~8b!DZߞ}&hjjZK#V9W״cvdv:(͏իwŮw_gN[2jHF,C'g{j<g_~t_k9 c :tO>ᩧ&,5O|>Rǟx~ݻ3~xAs=O #;#;sy#8ɓ'#UM+?ϙx<裼"|#8vȣ :QFyXB ./j<dz o7o>d,M]9r|2}ǒŋIhc`1c9sbxAx }K/ 3cLoѷo_ ƀ3fеkW圞B@P L:qD,n'L:h>_aÇK.+.砃ƒ%K}~3a~{QxR*~|qq>cCEEBc `1D"dhd'\~tؑd2ɸq7+xH&1v?kʋljal IDAT!MMMkׯAM抟x< ttbu` pt_xwx~4> -Xߋϳ#8WW ?Osw\3?q 7;b ~34ƎH{/܅4{3x$ J3vZH$(儅 **уN:/fH*K2Q2p2DH}lf('2jvZKEXX,b-T+A||sA5}bidi=u|Aƪv-~,;'FB̪BAcC=oyuޘςT=T*w݁1W˶N DϭJ>;O_c0tPHx6Cѳl29uz'p_a6Y | 4X(˗3ٙzm6;sf|NllhҮm$B2xP"lL6CzBx~Jx<׀e-tYy Zk!^x<c ̝'*|qv(mqܗlL=#f2dsYj=5†襗^bwgތ=#G?:/$&<ӌ5ѣG3n8n5 s3fioB_|0j0dD{j<$L&p(t: >~5Gu~;$ >3.8jkR^ϗ,Y¤I8c裏8ꨣa>|:W⡇*o*]ܺ(SLsΡj|yl$)°nK.P_^x<wyA뮻ҥK0,xێxΝ; R 1H)ITT\oٲe~r9zͮB_,Y;[]8HNczѣ@"7W_)%B^ufϞM<dΜ9[U466h"b .rf̘SOS[[˹˛o٪'tO>'x#FsWNiέ,{uqm1tP*nv~_5kSL!SOq#`ƌ\xtޝSN2h   ayqx<%|iӦ;SO1k,=\f̘A:^M̬ޚSN9p뒼}s=(;w.fb-Ǚ2e h߾=r }W_e\tE̙3j.28C9)%>,T b*hz͛Dž^?WnP+`ҤIyyTWWЩS' B0 fL6t:cfI$zJҿic-z}p 6N% Ƃ@8GnaExV cǎ޽{aA&S]]?~<&L`ҥxd:n_'yǸqSJ1h fϞE]DUU|Æ Ok}/ƍ+ /OItכB6ƒ͇hmFjKE"ΜϮ95iU 6ռkbYFB Jx馛ׯ'O歷Z|͏oa$憷vgfdYNZ֚N8{0j(.bN;4̸q?~|y׏cN=T&NHSSoa& CPG?ahKn~ءm]m EJI=^<;iw?p)%<${~wߍwͅњ>kZ,o]^gϞkԴۚ{婯ck0,o'һM)FC T<=sr7#]Ÿλ|x<aL*$u5_hUЬo9ַ oUxwcx<5b|',HQ(>~U8 p{65?o RJθ?t Fk倝;;tb-+x{~;nSs.χ 3LqKf}TO6yń2Gւ[v{Qx<)ZlY.0Гv{o˟/^I?%[tۖbֲ Z%j+ca lۥ)g1X Wpޞi(x̺"_2%φTWP\Q5<_4 ,P# (ڇ%KExc-ֶQ'£#8y^p:onŘ bhX<h_![>S@IH%&$ɘ Q͇%Rz#$=gs4. tӞ NνaJ3o,etJPSзk%>πw72{R@-R4fC)%kc0n?m=5isMOZ؉?kЬ6^wwؽj{k) ~c }ڳjCcͷ{&#x<EwkER̬D?uϫ9?x<^x:+]n^x<bm{Qx Zh~mxM5Z(yP/kLQ5B=VVVuڕt6 cw@糟IЉ+<y\gĘƫcEx,x"p@@ RE‚ PV T5"&JG#*X)jdeJt0&F@aڀ -" V H#c9`FJ0%BPX!hh@JK UHQ@ C"BI"(^i6ڀ )<(b\##B HK`#WQB (% 0B (?FbH!FMXVhb EZmA8K\hŐ@[U VaB+HaHb6V#1~AJ m*AL & ! Bj|Ec1ʕ{Ha1V=ClnJjw aAE#D-R*J9adQ#AH(bA 0¢Q J"!Den-0`11횟.VE$ ,"Xa(pܸA1`tĀ"+wΕi-EB PDGMHhH)`@+P%0`Pk`D (k1$=G\0 S A 4c] $k0-ʡ `{* ڀ4ZDK#P($Bbk # 3B=BAc]j AB( b!= :C[@cKۗov[t%Y՞k? &?2q"H=aPmS_PϚRgޒ  kqڍ%𬛵$(g! ,J QBP Xր b"*%BHE2 t$Z-ha 8;!Bb6L$JF#(VaȢuID!0 #c"ND1$ !!4'Z ]MZ,yer[FE8 $R'uF͂X+B#,H8C! a`Q}&0RDHD$RHg\҉4e,ht D Pģga HHgLBIEaU a RDLw]k1J`A"¢8Fh13VBƐn*L$,VHД~(r(uT#O(+ 0&rH+w %DaF!$# r}bc,UR~ [kֺ \#P('@"A( ĭB 1(+ *V#X0BbE#R>'&l $rMLh m@U(Q+ʺ E ?řt?#2mۍL.SyT3:UP0 _ԀP4ڇ(md,[bZEnQ'-JJvA@4D&!;bEEVEYIEK'z4hGZ-WB(p6%F:<"%A #ȘHבZ@`ƠTdqe DI(A3=ΐ:a  O1(27BŧDDF8D 562u^$0@I㌠Qߍ u[y "O "B@Pg##a3hBN:>j #Bqi1NhwgZJNZ]EBF+3C#Gf6s;/p״mn6=-(E4. &Σ+a5511#qBC[UHswnu$PK+P RCHQpZF" /Ha-:-8),)**ՙ4uϫt$* `H6MN+B6HBiMd]78!@`PVb0  J%ĕ,7"oP::ıG*tDMr&\lyUpH(B[Di5E#B!LֽPpRRB^N nPfD4(nH~B2jn]²eK4`F9վS*h̅ 5: qkƖĺW5_6kA@"@(<*[5BA:7p [ B#s}a1:OnEFH<:Y7C05c,BFFfJjk-M`k@:0,q y҆H댭b(l^ZmmVgrᤲCI ,:MI\#8qFωQ.y>rJa## A1' Ґw@vBHHd a=MTـS\F(ta GLْ_n)DEg#MN m2l!VG%ە l&-T0',V}O"l>6.XC$='VE5EV:kUV-RrK{8ŅKE5-&\+QZ u t|KX +!>NEe.y ˬE02(u,ڊ:2qh iJ.څdlڷ򋰑҉r)qZ7ZJB?^GgBmk2gε9 *!? 6H I_Eo"6`n6Qx#h#x54 Mgm|}<\'TTLÞȷ9k5ל*n\: fGe+n &rnr4v#q@sWٰaQmH:ėmlk\9H,Da| 5_|{1W]0wƿ'Ϡ_v|=F8ͯy,] >?'P 9 '=Ac{C3>m@CfڜEKmz"! 9S>pra0$i\4qz2։*M Kd!9^|5, o X э*j%(%hF}Рsg_BUJHw "9M.H-8|gi׎s=90;鏜B6 txkDK@BPm -X|tEãv^?0"*B XT|䎤 IDAT- plEh-)]5}$ 4LjZ .M;}! -P, xA"7HsأFx߁@Hj-H%fA4I`:5);(XtN3qc a$ާA1`p@[]F` [ϝ=Eڦ76<%$6~{M {ԉ@D`n whDa΍JM4QM4m|LaIrRgm|MEb>Á#_{Y_??Ѹg׉O?;kӟ!JHc?WÁƳgp|CQviNp;"a昱KqAff0)w@!}$}҉Cmx@-GF(Gہv)j?į.` . p`*YZ2^!r.X%: x۹qwHlJ.`:Ц;wmf m@t&͗ҡ1(@4BY|/w_FtiN6-11 eA 06T _-.`hp(0E XQJA륗n'a_ 3)Ѿ.SaɌAzHWnc@ITz3'zah0+^_ _n^ђ\ 8';N9nzp.e@MCbjWy'dہMtĭBI\/Y0K]O8[ (w0qI" d] LHj:fBzZ){ohQ".HscnllX%(XjD's'ںDy&w<0QY60m`sD'fay \0ߟ{?{F??|_ q vy̰q{H  ;v0t؈B]^;DSժ11;o`L_ЖX`oԽ#Qsɳ `Vk06Pm3JCE p`x-EN 8|hȡ`O3؄l&2{Υѧ>Ly0O!3\z_ME35Af!8LQTY@l ĤeNMappP1'ŋQ3.L6A)܆ T' 0T˲xt\S?S]C񁋺 }jt-bÆᰁs) 0l7wsVۛz zB2Ha;t'醢 i(03.1'"b eq4BY+$!q"H&*ΡV&j ~S#A8TqX($i}XÛ(p.K'š,1m!h0TfߞB7!A ~ϥu性!4?47L'zgV  }h\q!e? lrEm0 8\OкMo7|ӿƳCSc8).`Q` ASG#z. M֯7BӱC xn轑5tSI`8Fc638zYFÈ V) IDsZ0#R|/iIA5hG|@tL~EJP$<+3#,I+,O;4%=vu~ >Ժ,X(h_hQ|[M3v Fx j"$ YGljd$C&Jcs.34kV } SK`\cl ė|V䙴!saP/ѷLN!LHiBota-h."]0GvdxFxzưuZ\6o M)%;Kpk?Sv%څ 'mN@1*tp63E'MC'J4K:a`jh@yVxzf ҏ&@9*KdO96TΧp-ztLݽNhk``Cʨ7D  i+Ce?4~:?dDısP(\]2bsq VؔaZPr;,2 sҚiyNx3`D 0']C:s!BnȮb=$ 2L_蠹5`\|UiM 'Ŵt&j vSڷMYýu%&&Sȅt.[=U9C7Z"[=-R\hj.[4CGa!L=eY3JxH޾AaeiQuIRաeruzVs[߿B1IY%`(Q|8Q҆ťO߁0LKx@˄NCfH z7yIB0?Ay%?5V*h Ta-L|Ϻ>g$LluO&SVaKg ; NbYr#,<zyBGqn'Qѽr t 6D-mz15)ɚ,Y>Me\4OԱ)d9⪃|p3֓Z\`}E@x!ᖕ.81Ȅ.0wfhǓ4 Pv`  x|W< x0| CSˡvR S/gߚedžsx)Pq;6%u ݢatoFLukr> $~6[7-D1n/\D.J~ di^q]!&]ʱ}V/WrH NXy&s52=.G%\怤;!kHV=eٳ`diP/{̧HAA#s3$蓃1; i׬ 3[N((52[Q#}jH~bi~]4 Ҵ6Λf]28'  C~Swa卼xцKNFdilbԳB.6l5P{J&*1; b :H.~V.d+._(@fa* W G<ӛ9D3+(J vg3hx^|e0n@eo+tL\ SЍ8ugtbWs<&x|!g?5vᇅRSv? Ƌ{cܕR<aqtdɳSpo-CİBaV.X5&.@ sNHDеzę/BmKk\WL~W;f܌$*"w[T D+Vn\a*Ei@P[ j$ V1M6k#C@aȠ><{X_+^b+LIoth! xIor}¤BbHP)P+̮Rb+ D2Eنh>lP|ڋ eO7Xю"rUԉH`:EEZ88Uϓڑe PmȥBiPch<'U4iFx͜nYD\[a W6&aRO!Drw,B1׳ @#]v+S!Q.t^ BC^cԽ舲Dt"@6Xl$NB.I@ǫ^Lkx|ᎇ=OVzC ~hF @zձ` m#u=D@Y`W+*+SM;aTV0 ^ F\vje30%fzK5(㍱=(TJH&rOwOOE vPx=qAsˡJm ܶS|j;ABêTӖ{W$o(,uaa!FfGjV"/q`lLs̼07ݹv z̝yK!ʐ nYbaM:;m;)֨fHUY*Sɔa"ʔde0@dߺJAI9Uh,:M]9Y0=ƞ0: 3W&ܢl Wt?A&S x<+R֒Pt$NSq7< (ode ^x J9UTPXB@eq(-[daO!7V>?چ̏`+Жmdq5 kS ̆>D3_6ڋ(7>\M̞{и-3N09@<+d_VOղ*ܦh+wΘ [o^X Oe.\5Sz3}J Eu ;xMNeJ`Nk7t}tZ CARsܲv;f7J-mMv5 3ďڠ6"5Ki(ĂĬx1FgbysSt O)wᆚ8V?FbU}V< ^ Dg<ZeUg᧼7j#=J5~'Ռhgߝ@Vk`OfB,"V:Xm2iM:HWga 9n"츜(&g8(f4@! j}s~⟭g<8Mz86gE6ļiQ'Ma,Ϩ#'楐v':+<AkM95)q6]7b8̹F÷1qWQɹ]0l9=MsZY؉l`@LQ$˾=-lJDW;F߸C%@5'A");Ws}-@Nbk{r:^xQ'Ҙ{eyA%͘;{t ?C)ˆ̡nَqLDEO&S( y[F~Cv&P;;w x&ܮp0&P}A&z3s(`Ә#н+@p˪ i;Mѯ(@bbV8t]h IŤ6da ݡxya# .Vp;x߉c1'ilNiikjK8lhV:bVw`e٦-PrstWY','0we Qn6%!" G H% ZBjB=HF71zBT6T9^}ՈWWq>mo{wc9\W~/JWw:K8T`f?S|;[Ї/l!!߻]q  ݤU1WMEN{h7"/; l}Qbҩbtb0!.ze7ovD?¡̚aWD\%$D+h`fSAj8sTADEݻB\b+:bj!=Fqh1,oM< eL`8csvQQOtoxZLpNZ9mGʟi%+TYn1Ӱ Szv0PZ"i0vwOfSCkC%vȒ,DYԄI.5X% ωcBc!u붉YnvQp$>5v_tϳM< ã}kېǸCp,h蹠3k"K9 ;*Bۿ__‡?a8 ^y1}/}ǧ?i G} +?>o&~?w>LC = o:(: iX3 bl \LHo81'F,>`\u!2_f^l|1z&b8Q L Eү"fy$1U<:y`Hl4x.o.U 3wf Tq`ce~ep"إH9άr#FwXŠ/^= 36j= @kBITVWXԕZ F*p<K0AAkWt %%ڍ˸慴\SE}G@Yd >wy2x .Z *&l=A`l.8أt*Xс53=4h+!VƁs@0j c^*^4 '딮v*Q- itׯ!e0K#=NRfM=iWh 1{2R^i#FG%qyRUK r}8;/eOji.c+G N;86 BĨ7x_H1Ҟmb!c>%Ĩ;\^S?S>//;||~[[!5n_5>O//7|;׾?3?~OOo}+7ᥗ^//G) iXpEz}U\PmEOvE@ͱ{8?嗡kCx|)9ly7J凬(+ 'SNmX ?ux%.mS| jFj(U;szq@D"BNVir!ݣqQUz%ԔhH@(Ru&+]I]nVS ${ An_NP#J-Hj WS%Kw7q6gH=JkNE&'J ]?+ȚCtc׵ >9mPШH8&3$+F*% F; E\R|-,3"9@Ja:v/)x*\^h("#+((Vۮzn6(WK5vCOʧw IDATg#ӑ$ !~.{ ;'O"=k :|:&lس(;ThV牪,DY9TQa|]!1j3|V-ГyEpnC\ſ #VhlQ(O_[__~ԧ>8׽p///˿5kϞ=>Omo{zo/?jXew(wܟ>.1?@J:5T!\"}a.8q2j'…(ɹ(tQDQCKײr(2}T3ٙLWZq5B+ĭ{khq1?kӎkiYKlM kѺjuȕ%7>^HkQ@%-'zl6h9 2&Y59$TNYVNӒծAyWi7i8yD+eevsN;THj2-'%V]S(t9f0s]XC6JX-ᇂ+9y֗D^jRՇN\zTIԺݹ[V@c( ҫP:O.Bbճ]t`m0'UEJLsz:SM)yG`&.>Y 8D0mBC[ IR"̀4 hxҡ00qC'&B"J.VD CtipvN|a8A਼*!YJ|2HF AQuv夫n6 B"*:I2JSkUuƎ٧͠loTcìR%y}B01#y1kCmFad00.O/m0s#oU4y+ؤVo-XPs_ha🹟w-+1ުQΘ14BLO:Dc5mJŜڰMP^TQe} D8Me0GMPT'2F$i.\nr5.l[a[ZhL5ׂ?PGqU 1.P ˚Q2(q3.K{"҂lm.ٷP7hAHkI,Zn l#%ߋePn f 2mI;jC@ V=?tu h M'q|6zc0êUkuQl[ *r5!`*,ltJip*<`Մ*6jaUDq`5ʵhۦZl^йhDyہAѺ<?в9i .4eR( )=f3pb%j-W5b+9ɪ%gˁY t ],&d|!Z–P%_@U`!(`8f<>$vjn}cJ8LtY-}+a802hJ[itBƒD(3/F5SyWэ^ߝp+h(v #Rp o~3~/+;O03}÷~=y__K/Ǐ؏x_%_|#xއW^y{z| 5K,>T~HҞ:>B̉cH)=>~{}3k^ Zx[ߊ__ag z׻wVc ?z}k|yvfjT7E%\(SoҀmS‘UQغIa-`؃;s <x؁97| gנ6%>f 0a zd@.7!5!*K4Ţj](bM:gi٧͛nAX0ryƈ]Ǝp,w2KtG/.5|ɀ+8O`7$)w(nP`6Qԩ=V&=Q=᎛r(^T*ct0lE?)x|)׋.xmǁ a DE"R:pG榥oKoR<.fZh1`cS]ۣ+ц-LK:xzbFi/3j$I9JZH 艴tՒڃNK걿Zs؉\E7qP mH#$eB8p 'F's1*!)SatC:: PY$ ݻ"؅.j'hٲΟ~NzrNFF t4vE!8إ,q1S mA1'CBc zCÙ@ GuKR JRdӵ]ƻ{Cu O}O.8<mpt&b?UR6p':wv}A $Lli bl(rg´дht<i٥1-+![< R჊zj8v8 *Rgdtݮ1e#Rq۬"쓎&a@@.=]+5/w&iFȏ^O0M|Ji_;EU̩9NBESM̖8$s;0a؈4u0u'jVX)ƨ홃CQj` wtNX_,hҵ] Mm .l(Xo*vk-*vP^}=Z5anP{<s MᤫR3* ]4, M@`tXGD6jgQkfyq p~GP9ѹR1!9BM1dk aONΩi>б5(3/4)b{tkS=<?13 8[]P3_e° ܹF5vPD amt& Mx3:Ѓ@1%%C!N^4X>`A%Ҍ`_PǗc K,$ ȃQn1aVΊ O'(3+ rH"QBHm? I帘"}8OSODЌ6 ș1 :j :_̈́3bS@C/gՇ+ N`@ ukH(XYa!Wj.,dFMPqJr4昰 Mo?gA($4Dˤ9Z a± lg )lbB-BP@T!ԽE c)2 kgnTŶr=!yN N2l8"t/ZBe۫!`'I*'0PNQ@fsW(XؓCQQW$w(۔*qmC$.w t0zѸb`MyMF: [ү x<Pc>iW!rΛ>0ԐΗe)P\zŖV9C~q<ۯٰ#q4LnNjy:Afp\0shR|c2 c+RdeX[]KjD W0d:Dw*m!': a1fH/"Q3kaB%Hj[kb?H ¯bWtڱmqdvYG{NrT}h5@`60 ;arjc5;ߧrf̄Й!h+ef]:Z0Z"CyLh酺=A54ʮ@6 Wג,57O]B<"ݸc]MZumN huO5ݎN7c)DspmR) 4c Mf$rXy>Z>44K:.I><ј8W4RF߬T!-8zcǍ-h.BH $>} /N&:zCQs;~a'pX0Doo0AqeŘ3feഝ nһ]V8%Ty@~27$ogͅO צUPKd:7Qd xM+PY4HcAMR[97 mg"*`Qfj9n! W}I(C:t4ptU8، '-etZV99do}l:W qV5A7ǘC"gQsQ:, 1%CE ~PYWZ91!n. 4?J,;"vC(9 ;5761ϝOH={Lkk'|Ksn*p|*uhَMkU,S}޺vl|6 aYި if+y9Hsҏڨႁ ]T:4ft+ Ai{9Ov+م-<{٪[)]j}ZVإIY }pmcp%wCm]tR|vt?2z/M:S3FDʝf ] %}re_hiFRhIΪ^UxYI`wbRݐPByiXz@v ܭm6:x&Pt-(gc=K8 9vN }H9s=|82[&{KԄ"[hR] tep$ы.cWՇݪ d[7_z `yf5Phc,&z'B,.EEi`:sfb*QU. aRt0 YMAdCgMYH!TU!X1Cb\EC]*MU;UA4Rx+]췊x_\S'61i|&KUN6GaiDCډ̸v9dG1pTwr{t (z eۤ2Y:fBJ^KCԅ5ʯ5ojRP(x(ּQI}(o,%$`tŲ@(LT~~PӅиٚ/Y6 My.C!NkRA% h] h%^X`S6u#.jFd 4I唘) fk1ܑ ѓKi!JURhpL腬qw.rGeb4s6&qOh^˶kJPvX 2&5;}zɥ}PP)gEY++. v UҶJPNtsi]_BVPni CAR)ugKID]EҕsV|e.M+ɤ,HB4&f2T!KN0R=No7[V i*O%&fNU=a#zBF/{ű^t4~ʏLu+uQ |`M޳oJ)'Fa3ѝq/ '![(k3ۦ;X Aw]zMV0\(AMSIcBK{\&P1Bb<#"Q`CPCEP *&(xQACूODPcԊJo9h˯?^SBLַXsZ{=!fϝ3W}`VTIdǢ8u-1ȍFp~/aߓxEݛ#U0 EP F []faSE'w+ڔxXD  YJD]=H{בȂJ d[NJ{ ʵG2GwUÀrz[R޼ vtBl ǣT+&*hX"B"yj@ggj|w}Uz~EÜox_gf~w~~˿˪{=cJMLr!X^9%*a 6uy/f<ڱ+F:̞ \Ճ[lhD]=qBDK}4"=X1*9PtMnH tL:E $o^PN8!v%*\}F_]CvLN ϗ?@YbłQV_%v2Vꅭ9ѿ@~Lfc}u\PAc~ z谮 [: ] bڅGkR|:L /3Vs@ SV ɔL_;-O ?P dT;PTOdyMPmIg$ـP*gE?~´P*5.0Y31h`]PR 1 #cY'`ҸZH3&vJ <2P{B4}dyl@ "0UgJLp;vm7@0j4vl6kN 7jXavh [񝷡pjGLưX2?H8(ǜ^ڟ<>wv|q/'`Ͻ $qd/(Gם x;_xk_~__'xf7x[ނ#J"g%| +QhO*ɤHߏgTH+ jע KOT~&n J}mHbk}aX?gnJbYL 64'c\9'FUoof; ;hKJ5F0C_-͒݁,@D>L2.z8sǘJ,"ţa nn.Oc;7D`c:W@)\~XU>*uF.I-0iXC1a9{i/8e<m4Acq rvC{ss8L8Xe2hVt=L%J ܝl]SJ^14/lW?krDUMMXq;kdx/"XjG%_#0qqY-޽e3 V:QB>Ӌġ[С2MQCޤM|7}~/~+_JO4~/zы}}xի^ǣ>m׽7__ŧ|ʧW~W jfRض|ZV,?%r;A~T^vHXo|sдjո2j]g5N+e wJ!2!3ImD,$=BTĆ_j!+ J]hd˼xPW^ L] flɖ%3ȅ^?:b:Ԓ4x+^޷]苪^/N\he^ Cv`׃?gz TGe;ilCzT`,6z57M?k)[@LV|Ƭ$>qڄS,pJ8׍G! 3VOL껤Ĵp h^Xb1lWk6{,u5_x53 ݎyuݜnT@8\%"`W($=UlHwb@MgHj"5ݺ%m1(U'4`w4??|%/y >(^g?>(_y F@f"9E~F5 8|*%֛Msڃ-Ĉ9+W'>􃸝A :3^VDf&Oh$78cX`hc9b(*ɼA )eiĩOXҍ&'m~]-T.D-^q"J-ޞ2W! "ƭq063LoEOJS7 Ă t#9^̠`~N.lEI.)C[6䉾H%f(͑]u&8xSL&W}310Gzb kK2fyM*p;4=pv%+-E9taTLQF#T[dg31MhXafՒ2mQnJL _˲-BqBU4d2#'`$]jLJr!c h/j "i{Lߠ\j6 8SCJ!YS! AS4^?t]my& !4N4)p2wOz,v@xP@'/0$9=e\FSb`Dnwx̓}ss>_wǶmLs<>8ܽC 9 :Rx}t> 7P8_(UBU 'ZV MpxzrFH͆hvNJ q~3'M JʗDbpX@MHe+Τ Aq$ 0]n/&fk`ۍ}$a>9낪DX)čZGQJKo{6no,dH&=觲e'o%#1TQ>qڒKI+ƖcrGMJ-FvJ$ſcئ4 rј>z7N 4!F2Q֨H)MƎѷ}C5wP$}S'B]鐩|.iFmBj!-nR؉eԠ6U*Oۓ.יҐ>$r014mҿA6P8P,DqkQjO*MC:;H^D3䀍 +)8,V"k͌i=3 eq4"2AհP绡OOcs`N'<=y^OOzG`tzk3 we)/L{E#KKsݾp]L-w¿m|7.VmC݁ml؟Mb9\ SG3&Gcܰ{cZ z\HuHM/SE nWJgu(LKxRFgl7d4K4=PZ50-!q8Y7N4fwʠ)Aq\yY` )ǚ'XnOڶ4p({η%oEpBR+s)6dYRԨ6SY Eǭ`&}tQ>K͘w9OܻGaM*3qSSd;%ZcRG%+̤̮d<5%0[KW (WJ eqHLX@"XZ %0a8|'QJN(PœkY>zk\YdDi(#4f}JC2yb-MӚ2f/$ %Sq Nw!Yi]$Z#N$?Pښ+$Lv&2J$r44Ws1l 2phcG[> ݻxkkxo}j(da pؠhfMB6j=yˡy 6$;T" @SYgR)kLFv7ٖ œR̮p!HZWV`ipfE{,3mg(2at85| M-'?DڡՎpz-Xqe!>4V@#+x<&g6GWs0 (ʜ͹x 1YqVJY.ҳ1Lꨀ`90\7ck?RR '-ʘzAPE0lyzxeVUQriyU{VFkl$-yl}OZO U y IԀwv=Yᙫ }a#>5_5|~*>> ??m۰m~GM߄oo7|7˿W//SO=)O$ogO?Cͩ=u5h[b"gFCĂsp3n`; F ސ< =Wv僱T'f$ܯYP@|OLVb./>\4eNsKGܗ," n`_L\EM=yF"%/@Rl?z&#$}!@0}d]p?90IIa V W<ɰGcZϻ)?8!3핷8O+)a8mB!eh`h?A)S ͟32D9.CJlVE'n7>]N$O]:"p8Tv>U,h3؁8A_E(a9|&]2̺خMbagN]f.,öaF9V!a ԨkҜkù[[BR@Ë́a g!xYdfW&qǂjvYQ%iO5µzʀPJMylَ8:* hh,0J9CV~͈\>5΢P!9ȱD_r"P/?HSx_׿C>C k}G4wr?0ǟx O<n컊z YOoichd^=*X|X`7]31hˆ{ 5LɲpT#<Sn[Fʇ-)E! r&)xPhgZ`ye 8ۮUBZiDGV`FX͵zDm6ٛ~hdnR(0q"^.˰H+d4Lϭa7vXis5FBej$({gH^0%ͳ]Խ9 ڮ E2/ Wm Raݧ&2UfZ۝4';>`)aKhy|Θg_>s"nϜGҩv|~2Vc|_Kƀ9#IU%}1Z>眼Ubi}z_u~<-n?Q4d)k.:=qwZiNl5alhx-C/=5c=5.^jxbŻqjQtf "I C?8.Fyfw„ t# jp`0 WL\.n'.2=T*] &~6=2/1=`L!ÍfKD bv Ay%tǟKFf1jJM"` u&(DшJLI22 3S,Bqйz|cE=) AePI?M}CBNDUtQ Av puN czNJ).CcYS%찺7pL%'1UXsa5f%CIr_e6`81= @mJл|Tif÷ J#~*.#D 7eXAgz͍5*u@8k*@0B+ X XVҕO:Tlb ~"}k,U!MR^$Ss׀|ކ_?0Ǝ1, 0Q^0ϫC0or ٸ1IdP-NZF ړ-ɋ>'ku Yryƀc= Tyrwtbh=~P"K0yIbMxl=Ep]=]R͐%%3WaS i,+JlI6"Rƭhʠ2D3 gd+3[R۳!Ll7}3 뉓S-m\MbS )_t`$ntgѐmπZLs"t4v!{ݽޯv:@v I&'6ܩ"u%k$WD'BYAKx|=L_4`(Z;KnZ5,n)ҥkn^0d{f!t?=偶@10 Cн&g# ] ț4%$іw@Fa=q^R91PT};OƎ#JB4[ [)A冮ylZ$\̈{0݀ ~K%%M 1u5j^"6;6اɓ i@O=`v 'X]'^rPc`WfL8齳e+j0FlK HcidNF1myvd^ IDATA˱ES4(ö$:my3U߻) qgi""s2AMymSa*  m}d&dT.嶴 Ʌ8y6e9/l]SpʔB/".Ӵ'6Īr8tX TI*:pZݩvu{S#QHe~50{MM{46ױ[Pya9X9-{6(o<`30IZ!M +L=PA46!k7&d?BҰ;y3-F?R&7\h6 &.H6_iāBk=N:" kuzN@p9hLo|<;7ɵĥ eW脼!ENM0 2AւՊnjC9urU u 3S]E@E`גk:Q"Ȅ;ޙʃJвYGO;'I_LyOlSb&2aCFW9!&oUx͸K<>Xfe'vnvB;DZ1[O_C.q>n%^CR)hY-~GcXW,{(]GL;1SdIut;nPTڸ'[Ҿu:v[ݩIBC{‚Qa dӘ;"o0dxq>?R1͌(̅_5L*>[u( 6hFLM[5h952$;.?U* i|H#_U8}.*(ɬ0L7դ$-pɀYvl 齼9s0m}[ loԵHER Cp`5czdZ?[>:G*Hd_>g6$k2GVk7~qr g,CAuLʣɉS%+xԶKq1zpWRo vi8yQ^ޛҳ9:'<9|&aH֭x?Y9f)xza\ewГf x.]f:*F?W;Bm% Cx7s9P1уb2cp xaKW-,t߫#+zenf5JЪnu *sP)!7L}>7&| 2!a i0-qtɸk3VsKX qv֏4򗰧g5/0^H)bNXF )jӜJŋWhML,R,ey:1z"|Ym4ODQr͵B^Je+1^mbRWA}ٻ_!`vd%zq3g"b+@PApՖ:3Ś4"rURRn-fhmJ֩:4mVP4u$jyqB R6;w~{h`ě~*2{jeы-͎#`rӽNHB#I`ʩ=dkqoǽ{II:G~>oo;{1|G}A!sG;Nt7>c>av{ 5k!8N5kbx%(%EC`avaQ* }YgHQpHlam`a^B;* փYhu}Ћf-łNjZ5!^L)J sҰjV^AF˟ȚId7o*#1j:` a󊚯AsIpRW*ŏA붳x^:fIfZ[|F h,۔VF1Jn ߆`G{cPس.4RFY> D9м u}COi!PWJ85KRs`Y' uai}C5;+y~Kb.rPI&X)])1d'h ]@ )|I ZÚd.@zoyp[jIhc!zЌaZi Q6>Y.kWB10( ({0=R*+{JJ|!5U;cnb4FSOmym ١u(]-=hwh^W/})wOObǛ&%/6|:꫾ 7wExހ7 x=~~ }sw߁'~']gP3rlUZi w%)SnWC&՛Wq*V3d<aB.'~7#PpV#2Mů8J%PYFE%"Ǵ5pFkK=='(?o&zbf׸9 ߳cr`1R3q } 2s@ژs Yif#xt@^f05٘^6ap ( Nԑ,\>p]++?s/~1y{ =_/zыC^җOmo{Jݽ75mr{"RD1ǮtYAt̂ԎtyrlWW"21%PV? S< HkǰjV }hN=֨ՍM\}G&T(Mj!bڎ97! ZMVlD<*w}z'8 @LܒPLhlZ;I}]{0La@D`N!]PۭjG47Mf*ǠHvɄ܁gcG9P8)Iί["2­K,FoFMVm&Á5du8&&fۥ0"N/Yb@Nx܎BY(vXSXC#9( s*7Jƒ  <+yƭ_H۴9ZhhཕZ2IQůݫ8Gc{#8JZc;=g|&'/,{ gnRcZnOlk׷%Cxǰm11<O>$ࡇ:޳,D߿{w __׼5xK_zy& 568b/s]{0v ;uN`Ŏl4H#>51$o>Y8/N%֍pث1082Eqp>lƅr9(vLfo@l1grJ({r]@ԍҘhI_ M59Ur =-dֳљ9 Q&*[lJq|!\NDӬQd%e;d8qԎ 38Rn AѓAmNdܮ 7 Q\HSvsv7eH3z5HFJZp?d7* ;y;cF"nYb9HUȯFBs! Q)aȂ\x C1eV}T`nR9:9DY0Kh~R P,7AL^?y)Swh[x% UɭOH8&lp?DC}(=+ ̻va?w(\Ppl kt Ef`_ ܘ'dOuǺ~`}-VŽVI0{' W\ݦlk#_5}.. x <9|c=?|;]޽{/2|˷| >>B?䧛t\` gtHiƖ)S|r(ABiI)gl'7Pu[2MNx7gc q@FKӉ13r2OJ앇Q:P `TAnr 5E/y5Pp$?ǎ9_= dp]vAya?ϸ [R+!6,iw9WA|0n ZL]}۷ZNb;ډJ|&Ph7.8 7p;v:Z V'LlQH0rڑmȲ70tnv=%'Ҝ\3Ux8I=M[Dcˁm D_#ÂܴGmf&-[!Sv*.vɢPBgzzc!lMW*3ѽg2\ 5S >'^\fzCMV OTL1 |am`pSԪc(J3 }zvJ%k_Z xߍ§|ʧ>>ۿ9'9yݻx{ރۿŜo~Wگ{ٟw3mS08=º3^\@lYG p*FsG 80g^Dl,[\/[0K%*외gF#,56ƢI6YQTJ7Zj]t ;mBdSqw[]:2ଘp Im׀lmdtqh ]C97}xSN9+yhN0j aӲ 3UQYDfC41a؃0Z}is(mM@Qj*=k`7>t]f*=iAx/j1?r Ls7%ҖLt5Q~qknxnL6/%hwقh`*yI}ԟM ,_Wu -N9ٛ^T}ع1%vP)^<lЋ!iݬV|]⪭8;V5H< 6KFƝWUjVA֒e\F89̆n  pgWxHi@BEHf_th·O΃ IDAT/̚pg cag`xՅXv!4,ES^͔9Zܔt${1G4,dQKARa\(MOs0t1$qyp@@W1MéH~he%Ja6Qh8A+]޹=@wނ:!1J(G+5,7ZmIQ1!:$`{}ۚOt7^Moz{kz^{~?G}?^훚bZwHR:n5l SGb$Z3g2ާ-.0&{$Oi0;6:"jd,h`̓ ED)RʧEXи V3q'Kapt[/'C,(٪;Һ i6ݮ-YYGx y@B_[4wSӹ6Ķ/ tFd[ܚ]UzcιS\6nlBh"r.JqXҡ Ը[4 6U:?sbn~ :am}w~ךk1(<=&dҼt3p Qqd%܆5" +}%oIvk0dq\k4=|{yda#i':q (CZ]G:V>`]6ur)ڢ1B\8@zA5uH"6U<4 !7|ɷ5c. ;.ZOMsu@͔z#Hg[JXc(Q($㺰q"E?3oG-Ckh򡌟{ SrrfD~8&KŹȗgj:ʇpva۰pWۭ[|EQ|韏1ğoSȢxm4OphHg;9YW6JUNӒkCUffbсid?:Æ&3 TP)%1eJ^g*xb/_Z+b:votsnFnY׋=w?2uzmnfk!7UvL:*9z0J-7%)9]JrJqł~=ХH*qU;&x:| Dxi(cIWjz7Z R94GT R4ȕ+I1sn;Ŝl`sZ Y8c,l{.Fi vL:s;¨b)|.j(~ف1DJuOVEEN\6jW3um(4֟4=vAN=>S3D`46ksVAjx=npnZ@hQTuO[cBH/i8nؤbS8RD&xZxkZsW= tl$ELb yeӏ eW)R p M' 2Ѕ @&:],,^lX.liAIv(^) JS4`AqhW6@7RL0()bm+{'+RQ7r\+IC*"sѰY44.&W)FQr Cr4R|PK$AuaU,]W˷"Gl(w@ r:SQ`ts_g;hJQcijiǮr N4(uB*m[1C䢍=虃c[YX utFQ&W 崅?}<}<}|Ym^p MTlfLF+[ʆ#:|D@xq&F3V6 ;PHr(kT0Y d(λJ.?F?TL4} R$:lrNZ+8uZgBV!p:KIZ (&7%)auXi5_E5c=lղK"0tNա 'hJzn ΄.G. hζhqS~QR@DDE8ѩN`ܭ1v j&WWƮQ)mBUY htW Oi7+t1?,zo sJUE6Z|>@vÔz9 W,^-Nz#Yr01p?6 .o3NivKJ3+;N1#0/p遨s)=h~0Bj\h,T>ږxvtK&hLwDI昨1014aBr;ψxX+ ~G2=e<g< ,]{/y3+>ٿӳ|ͯ3x肯O4sFLeNItWEҩ$IL,xZ@Wvi,&Fɓ :Lxq]F1-tsr֖rvjÏ\9QJ? .Xf-U"W8 u" gAd&]4=Q8>25n=\CCg6(6¿fC54b_).An;-=Ct'b#L hm|H36ъMcnjz6*8J Ƒr`"M)3. +le^Lu1r@ ]ݰ\D{I{:vqS6) n1B{d6塮Sc+\Jdlv(L " 9ůb6SyVhiOr 햝LY7~kF*4O ~hﹼ݁_6 |V4E|8!Һ'ACPJnaFcρmrM(aQNİq|Yߠd> W8 LJӊ]x=4 u0`1ظ}G<%_t[;=@<󖿆"y/|7"Y~7~܁o{^f9 B)Q5U=*1i!FՖnfl 6/mAx'0 =ƃӉ4[f?YJ e4VzNp1ٙS73]Թ &l0rW05+,Q+A9u} *gHN- sciT(6(b4k:4%zA4?N[D;Е0$ ?h/vmv̥ x`TifY :t47a$H-\|7 H31LBk.56Y r/ԋ*Y08~cw0NikT¿׆<ȤfF1vS*  CbU, x1Po # dN:`T ٦^ӆ.iXb45$vVV#I {}}OD_bz!KFzgzqE@ sJy=<&|#){|9Ͽo6}a=uQc+b㬞NcM 3OCYBU@ o"VZ_wVY-N p'Tc;cR<XF _,1;1%N𚹛Rf)˵BZLNH OO &a6&GO8 <'=,69-H9PJ#uf*JٶGMd˿Zv!\F^ @6=Frε:8wTiV~:.7KiWOv-DfvtTtt &IuM6Zpu%ʆ œ.ew)*@LƆB[! ǥ5sLUZ [D]"MY[߽RW&Ӧ7qg$:O1>?/_*94bb\F7{a6W}Cn"1x#T[ŰiԹhTٙ#9  +܇=6vJ1ԽC[yGDjNvg2x/awilN۶;Ccٍ;v?օ[lx?>tO'qFi Ygғml4/W uq"fͰpIÑv2AӍhe!}=p.3ԉ QɮE-Bl°cɖ0Zz?9Lf&BS6 \-%E_8P!tCaUXD8aep3q#˚] jBZ6oljǢ}VB ƨBmV$ohT3)#B@h)5@ܘR6ɮo S\1<=5fcwCv reQ * FbNZ}aǮ \]\q9u Hq-DV3HӇz3Bbcn i4Y~lG,+;ρb岒¿WsM뱊5Z:$l6LcAi_V6Y NAaeQ7yE T+l8)"anRgp JN&* qqG4m<_P0`i%ug O]^Qu5B]:?p sQhav`PPc!53clZHW]UQ]  Ixض4a>aAN½DCZHQP9,G2Iv5G6On:mN1o MF;2 .82;vuع1`~ZdNH$"h,W6ްs;s+YqB`).f~[$C[hSSfjAb4YaQ86țEV=zu}Xn^]1f Y5^_Bh_l7rk3;w3Y.R5f5YuV c"Ž>  %?;hAJ%KL'YV+2AT93rkus{V%=U83 dy^DmS ɥ+mF,*t}  FiO>_Aݜ1)#_'J{AMrtrC[RYL^`4 ^=_O{NĻ v׎CM8c_g/ ?W=˰¾5?5n D1]i"%N@0OE `2F5NΩ)|YxMt4 O=I 6:-l\Tru'l&~sQ̧¦˵i bT-ӕ$M(-,ڈ8`a lĮV2M}.n<9[2xH «t 8)[CWPڤg a!P1XB &+ɈVhU66w >FOryj8ߗd]h2kJڑ%vWQnQӮ L%3uZIrf8|%"@]O},x/ kKUp?ٚiLAH݊&ѝ&K_;q 4˺&h<8TcvZPDw4>`>؉1 /INfǤ$pN nJkCD͂{x\O dޝ:<Sg7`0aiWQрdIS ZX@ZB'Z_'00}@|`f7|cox3&|w=7ٛ__%OǛ~_KGxw'sҪ~@ndL {^f4n_rz:7άr ɐiAMn _ep?QpI_ܵDH"x鐔;1iz}uJC'N ]tw==ڎJޭ4ҲNpCָC`o╋xE.hL0T-+DlbuR)ሲ#DKB`4v̜f3T:M`oWsQsd {f*Ŋ1x5jDU\De\ZbZ:8tT Ǭ fqcMdF c"T0۟ өjcn56-r4m>Sj;upcǡ^]T88~NkrhWF`=k]5[,hD` ԢZ Ay(soMcG {%z ^:5wlf̙}TT-}P7< tP:ع5= ' :Sc.2D"Isey*/fa۳.Yoxo~0^W.n|>{v7ȧqo+<>o_4^ˏwG~+C=Z ΀ r̯]߁m7nSŠ캑t}H o/. @.Hu! 8?~03T{M7bW7L}E#X+Z-ID)kCFc*oPZ\dv9U&Eu)"0{L= u{ ;ha7L0?h,.%',m, K~H WZ0ܯF}DuulyhjBҳlPK˔#բ6?:CD^; NE&N>Qi'['gx0l2c_5&Mu!g"Axq84]>:G֥[/CŠڕpձ[Q;v~|oZJj  7ßo\IF1Ixލ#D"T  Q/-9ꔈ:< Ubз Bz=QiSJф{mw#xo]` vp䔍}(^iu_xǷo1\f0[w3?_7EVcyoq7gT7~^_>^8 6~S0ga" /jXLN4dN{jT1d& @*FJsуyQٴQ+0С0Ȗt@9n+0cԌ3ZHX0]|HٵfMՀK9UtBa{펛cE᠑[x@?&K]SI0!'H yA+5~@Ů$xF$xJhw ם,ؑs }0v`:-7nDn,""1Q,El"#g`u $eGc}ICvYحP`1`UWhu7an}ZFiwo IDATTk.\ Pv, EDN-&r!$u84Pr2}uSSի{{X-Qu(R>@a687Ar'5Y48ת;J WZ TP=x[Ğy>}LikZbu +ņ+O!k1Ȏ#l-1QQZ=N Ζ>!c۱sZEiUfA?QM05:$:*^7P-ac!W}'"r5cst1::}+1jA&`.xκ~D+~Zsfx )`G1Y'J~j2au[Lد\cj0gV 5O ywl($!p;zʉOUCԔ#Qk[Wj\'V^cÉZZґT3 7ZTqqa8+]z}fw}T,sp?%<1° v̀m8Nlaj4Xp?:Ol5z?OރTRŵE]^(=eΈI|\OLjdMnsאڈ7xT* 1Am =9vq1?< lŶ- m8´߃O8mE6$E0!yv# #h$eCAhOaPY RõQN ݉'Jv*8^؜p+ H˵hkO $fh? 2G4eq\yMhzAo&f@p<GZYٗN#J"xW "NX"4=Y 4x0dl' /n5XV^pfvPׄٲ9pVd1ԐF41$wG'w46:0EUFՑUԥh#LkJPw"UdiL'IHw4ޮN5g@2zan\'TmJgv  މM{E!iբ مhޏVd$6`s0-"Q"n`'x8^x~;ǟ7?n= ׽Yw>k3] Z.za`gv YQ0C*Xq]PTY¹ˏ+BFz 6rBΜ(a Ym,:B1E8KySѤ@522ZtzH0܇Pvr]4L Q?HsHYTX9uUF/Oex]t *?Y7^yrK^|t/ƧɃ~!N{o!'w/w?:.x5.jmw蠰 a tBuoIJ¿e>[w!k\l=~^{1>|2/Ǘ|y߼' r%u#ԹP&`ŝ61KAtR l3f@,tO^,DpC&a[spC0+a:)MwGS\*$7Ƴ0OtN2l-؟Ht_^tb&dl`oZG3E]L?dZ:A!uB^94:F &{*m_TD8 gnwH2SmTb4NkKS70˸)QzDQ{.';[i)3}p3G`B{a.FfOaJ:A64B):vZiGyl0?B,bnm#cӿ D5.wXhl0cFͬ?,d-޹6h1oG0BT@E?i 72j3i2q$*Na~Q95L]_/TYu˞_^S x' NŴK2膘lC7h*x8B2KQ'\?cclϾYŶ`eqE\~РH*sSS D[֓Ntca~Wt$TN;lQVFA)R*T$(6Ţ6ST_{ٙPսU ˬ X9vw b$֝5C1}BX45s|x4 ~Ҙ̭]@5_:5 ȄΑfL"S$6XH,3u{Zc)NaB!Z瞘0KAr ]P>GZ.T)0^(no`W׌Jp\3*ch uO+ºCՒRH~Yr:L,uCǚF}7]z{\'SSeFxre"a& t;dy P0ݤl+ DRqU{bovxRXhmX\؎ >uK?scނoxsxV<~7sۮoކWɳ_ϽۿsE\ ~ݟkpOzn>xpո}xs|~^ ;6 ,rW τ{1_~'܂|)muonp ȩx%VPyMF%5>Tc :Ҋ& dJi)RPw7XLg3QncQw\\&@_+*$h@E]5:!MH7`8 '„6; jTK.k_%H0[lDfLNHKn95.Tcvc&+hN$Vv/[. |$ՉrLCm`7l G49)>$<7ALe1ph> (RแpÜDz_z=1&&F(53'j] ,g;cՖd7(kD$핸 05`m40!ױNQÎFy *ʾFꭨ]a'),f *vgQe j^gtʠ*?p#Սx!ooo>KÄur@v8YΥMT;q$%DݥFfU1&A}0V "1\ ŁTsGwVu~]kHOLdڤ)EQK_.aOO_2OxG8p@ら{.*Q)ѣ "̱ m"|"k7\XbuaH{G+a{jIS [6 _49\೸I=4 8E.ƅᩴivɠ vq1`KGGqSPNJpS$kߊagonmݦ]0<9ܪ"L.¥ 081D^qy49b0|x Y #7Tnv؄< qwrEYI|KQ#5THW׫;sE޳3PSï Թ3G!٢8Sn #DTĆ/#ip@YH kcW8ҔmmyvAtX"B#?FgEDl/R)P3jKaJ ^6FCrn$O]Qz9,C^=Dp IDN@Lvsԉ[Cn0׉zC9KbQЫt { X({bGƣ{$ Q؁R3Ӯ9z-cxC>}<}|yEaKo5tRiK"C]ị+ҠзZĘZ+y|r ƈ.`M!rRcc|Z-/pY(G8`ᮤ]>i^рVBݹb`FK,5IC:$ 4 hBbVknnyJ@:p\F Wq.DeR1 "X!) PA+3 t,:2zF9v*ZIꇱAi LFJOv]sQ]B}U ڢ+U 0w7t-vNq H]Tv\,& k{V*o]8(R_ZaΔ5rm:a&Fj0`*Hn8vx M"\-OUD=Nb 6A/W7жk)a\=ei/uŖ ^ŁTZ#jƒVOOq8^U=o~+{*u:Ijp))J>׸K~8W ۃԞh#K ӬwyPR4d]Zբ«ZL_}͆S#D(EN.rM צˮ0G3d7p?|?}w~c|[i6akx5Q9)6]#ѝݼn`rl7܍<,s;0QI#Db/|;-fINOy--~ob9'~~ ߈ŋ/H^~e雾 Ї8ʽS>ן4 p^YybjmE7wK\,qdb [r8IlaرWc}Np ݇=/@ LPñb<"SQ\9ÕŲbnt#p159:t!.9rVjN\mk뭏2.sG5+Xb$ǼV#>&?a~9WJ̒Y߱,%+e~b]`i40m­%.E_SMͫ)h~??f?qʯ ~ǰ;=z~^ /''wb?q>]Yc&H D_j*]k .*\0w M!cs|ّHO =م1fpSbT@luB/v0 5[ɿGYEy! ZAxʹƖ@54.obB #κa‹< 5:{_%l`X! rEe衞X9 crx aH.0kS0u@lʆ +W׆l$dBݻ˶$cusܩq$gɮeWrLBmb@7;  |\HCS3r1t.7=f<-x3xxy>"`ˑ;uiiJ#4"j螭Z݊XA X86ayʹhb򺯦Gi@҈h:[X:=" )hTE7DGJxHy?g[ۆ,7lox#4nkD6iP:SM J6;Z]76M[ u2XE#Fޣ×m{(x8>~7w(~??ٟŇ?aϭu㾟9u^loDZ$ )IC8P DRP##R@$*D$TZPiBH&mo{k9c~ym鶭h׌,kwwݿxyxgO71[<|7!2~Mώ5U+5*zHBM!s}5Fx;mf]-W[3**髍ѵ$%,TٞTV h–!$ꄻ%?$&\_FLԁiUџWA{%v#vmNoyhEn"VzkOy6#PAq%ͺdDTRJ2F xFz(J̉BK&~!iwΦ.[XG@Sқd !딒ӼǕm N雡EB"ϣJ#YU]+qFہ6>]~q~q8T8+y)ұmC,cEyQ*:^Rc6е7,[s`P6G.S#9SMxY =(6VT\$=NyPUvyUˁo<=%կ e:`a}քRW8y|_̊f/2chy -@9i~YxFſW~Wgt}HnekZ75>|XFo0&ͭ˒)U;j"#!"WhW&R|z CFA"zҲ'eL4bƀN \CFN$δjxͦҿWӚn @Ab;I`uʄ1dO,'ڤ*m2ɭ:mnBd_Xm{*!UIε#y2wTX GS-S&k4Kh#+>> IÐ4?Bz~$}H#\dUX0BF2Ass"S?0D.%c,ДTʏ-:VCKu(;. =Y&Vu=)tTRnhƭwj{ܫ2o8W=o+F26q4za t@g#)e-RE Z"3T!R>UcɀȆ="$Ͳg~>bS'|HGk>Blf`3/0q ۡ#BwG#>W\n-~c#>7JI[Z&38gKq˃71U,\h~԰BH;K:/VR_冶]"()T7fxk[+ C:N퀝 U2(*\g8?j)ʯ o'w-JR;~?}>Kz")?iZs+1|欰"'DXb+z Ku(hYٺ0pq8dAi7zzT I7DˍJ$]Rl 8EabrV|E{Gi"##JĈL[1oQ.$*HkHϦ޽V~ZOB;PYp0VI޾ٖ.k ]@dkw}#ńDe^7+MbB@L'%Edݯ;Kc6} 6p\X*KU.M+u3"8Z<\ Azys"WwjbkkDe$?$Wh\5?[˜,kqmZJC:"Ocm`*&̷FEY{VDBna0WtemeUt5u4"iZmkXHg|u`OIO 32qF41!x6m!z֝S7&OĤ7yY-@V 7Y;"ve$x6G1DF Tpi$TD>?>OG>~~~4__曾雸y&O?4//㑫+~iܝW_}uh>O~+l__Ν;tm˲0` 3z5A+$ȒxIIBr@b%J:dO0a\ѹfVQ݅cnFF%ըxC\8J툯*K[LbEj#vGW_}W sۨa'VXId^jhnضS*J<QBJ R!İԠ5͡iܠVpoKevԁ8Fdo:4--%N|Ikl<"Q+(>NDC#L|7 Qv*Ft1ewPmd*.3KRͨﷆ{vhTtoۢ@6E#_)9'ﱄgF]]U5H }O4UX _&G,߻Kbm]p!魵璫A\W3l.Sq$=T D,<+՘ɨ) ȭ0l)Xލۤ;4:aGqt` OtD3dӂ ,0KK]qf()?i{G.hbKEa=ʵ&AR a`S-,βKҸPڒ@޷k{O4?|~?_v+~g~?0??_?1t iKG$qca;UIbtB// aX8_x 3"o6~gW ?<cܹCD?1я~e:/E_  G֭[CO?n7+?sJ~JTS˗FIr:dqVT,տn%.S~+pg ,@\k=RB/Zmɫ\m6߯LTVI%|ڶB9 g GfUZ9{U5)ϝ{%J,KT4ڥ} z D[m2q)VlYlX;dL9ح\hxdfԢ8{VEtFڞ,M9H4Kb㵢䛙WyXO6ʵԩ4[7Ss[:dϫ_'tL&U1d[PgI_E"Xkx?@< ;Cb [xխF!%q LvJE֗7QV]& oQmeC*)>A#'%Y (X\ml4EyFOq=eܥWY0cCި8" vIuAumЁy"˲z"z窙8ۊ>XU<*U8Irl;5֊fmx#ɟ0!:mA!ń jK5jݨջu똈Zr!f1jEcb*VX=HmizjSΥfH+M2krlr-Nށ_4N׌T`XFU$ +Z )%JlmVl;<8%eIlN%ȷ!5M&ۜD_adlFD%(ܡY}^S9_zȘre;x̙AկQbk+f)[м2G}ݓQi$䛦imY$;aܽ0Z8;_ĐD2 EѾcة*{},4&m-*551dM ~{Oyݧ&~Zj<+SV\qeQRJm%l!P$Wyٓ,IfCᏖxrYM N F6ߝUX*_oWWxzz_۷{?|sn)yIfX ,5}lUcI'U0 %RV+vrb3צIu-9bH]ͽЌ6َFyy⍄* }Rkȿ&lEz+Scr|bƉKώ2HUIGl=O.Rx%v|zUTx=e,j5U>Cos,<.?q#NXKՅq1Áox)^z 7TEubKCcA8fI'2g~6ESzfv1zWH/*9H6q$H:5fY%glي%e$0 Evy"S9g&k!cu_OPXk+N%MjΛo]҃7mC`4ׯRKS{1V8Mf$7#5KԍFǬ[Kyn-gFoM"FzVX1ܘ B<08=W>v>UѶ9[X~H> [h'dOXS^2;hmB3)pT4O_+᮹KYKNhuvk|;/ǧq^|E|w|>ܗIU_6%;hd܍_&wt"ݫ4p˂LISdg͑*7%fF/fz{g:;k=#7h=7H5 #ZZrni-<)삊M$V:!4-)1Qoާ5d@BhâAtz87C1~] [911i@l q0RH;iX1-*3?tNc@ACVe::5QfӤ"lHUڪ1e.F,uV+Qi6{_.Vs>߼SkoZB%iahk~Zo rGCXHS|MV .t=0 ޔQ]UTKY;Ґ1*!C4:o|7=x*o2.qE/]θg. _ڗuFdmLGR+J2I[Ťƺc63+Q DzЂlj=<3<3OǯǼ4"4M|iYd[h,I(* < e: s1VSMKt*)eSch]ѣG-*̧߽÷ջ)N Q >x7۞+ l ,l`bиtI^MޙrςVPgAtĆX :ߡcKeP=Xhy5|?9|KYn00/8ϖ uN U8Ya'E nu9Ӏ'L}7\:V\r9]9ŋ=/#F*vUM [xR@ |0,te4j+;)-KpwZ 8Mƺ6l2Ņe-ǖ2><'pw0k>PGCvh^-͒$EYc|[1Hbҍf%Zu&y8\&3ɁіpȡţVSnͧE0 C ?eLs "e3 1}$ Zf4@zmmĬɄGؑ}J'G,tɽU 6[K2ujGlj÷hYXֱ1D:Lu e;XXyf_*ýTpn-zSg1LkSz*$p隷t`R}R FD(zI^ 1eW,emu&ngkܹ]a.3Lѹ#ʝse',9vύKoϼ7cI>m(Mq_7PrO o;N;3[Ʌ=Z{4fXm٧n+wNyo\=dl\28\2Pv0tY` F"c00!?`^x&ǃo2 O/?'^_{D^Bf$h4[j@R*3U͋K\&AVYV:d_Pdmi=ή {.?:x\T=y=W.h؇_ E&dטs#~k/t8cHE ;pѢr D6Za5E6VR*;,*]4=KcN-p?G'fed~U^;.\W\,'NDD><0K^DױrE-ޔ OOĮ Oswg>&/+GěokJa)]ͧ7iYng{moWk]$Tg9+KvIQ1gӱ ٺiL CZWM2[5Bz$ЅeCmwVid?tNd )߂,-)p'"3vyq$}c(Jd\1U[5'Y*>^V &5x}>|ɼ3Lpk)?jiTMKc`in4Abj%"&}Y2_f~?<8q̏jge 7휓魳C_Մ.4wKuD: i.y{?G73+ ~ 񉝞eXؑ鯨V.˟,w/Sx~{?K%6KE2*;`zd-S-!кhMUczzzWCMө/+97%0Tٿ;dm +<"5ωx01DJ22=(Ⱥr:UgêLָm L['MnB$ GյSVR6!QV[qnf򏲋B{ V=@u[]RMDƤ%AN(JªVD<lXtָ3#^_Z,ڳ\b5Ն$y&ezʪ ᰖna7{ u]@%hZ%ssVʘeEvפ*)Yj)4zoZ牧xܾ?1l2pN+~;Oƍ3awwqbx8Oܻg,;ca6r}@NxCygOG֥B5cqV%%H@Vx;|\K[\ .: xʝъG#1"83CֲL{{9|QZ^ !bՕ^0Hp4_q~7:lI݅p mxxÑZ;;\^:Wo\+G؝1{F/&bĖ"< K~o C1p=^cWNő/.;_xqyve7E%X0{it=q xTD=1%>|,ߦV\KU# *{}϶-]>֪o$s(*T2Ij Fnj,hӍZ)TYj@\hg-soj|_y-${}T2uᷳ0rledP$hV$zPyi9WŖ IDATšT%(ib-g E%/Vlޒ=Vo-jUԵZ[EI0Z)4!ɠ]yDe+A%dJ)ܴHRMTΐlr E,fN!u|8-F^ <|c4,vܚ92a|J$ВU6_U"{JNIR*MFqM7(&nj%xjį>/.Y̶= vb`9^ᒥ{FA, ]!蚥&-HX i˿E&f_0(M5P|+Pdgfs5q?w4^Z(+KZ,$ d`hRd$ai+ ei{'ƮF!ʐ׻jZvhzʇZv,:,4do5%~BoUy\|[OkYCĄX&d"FSlwƲ/tR. .=*j.5yɎI gW@kc{{=25&NF* )p"4ы3SOe\ccvT:0Xci;tw`_і3LUfv, lpR n-wx05ޞ&* y$S'<sfNӥ;3Fc M[bh-6& {QS4-=2.DRҗɟ"pcw+JVC9W'q..^k+ |sqx呋y0Ã˓㱰nq&woynxmFp~:r8‹N;y.ypgݎ[zI~{VCՂ[JM((hBc^[?^~!ic79>K_u^/&޴a^!m<s q#˲#XaX8J&ӎ0~2"9SkB/^ӢUi *tO3 5n$T6iMh񳯳;>uH5Jk)Ѻk[Vؓe&g،rpe%B Z *JJ֏\*1h-sOwCX:*Hv2K"y FXc={qcTlyI# gy45e Q}I,N+ OӕLy)c*IxdGdE[{C/";Z 4 <X|ItMd̳9X儶`HB;u:g7cwSƢ=vLo)O}悧)(אr9ajsw;y#+ eXҜX^YiMsc4Yz(M9tMoE`MT#-)U>Ԣ{qv#;4e6t<1s}َӣ#? ܹ՘CNcxX8\f<rO7o9.c{at3Kbpuq6~{.ف۷}w7uέ;g&: efUzƇ5~<3џ˯>],11<֬<{=;[& PAL8d0`J:i٤YJ:I˰:vm'K0ML:D4PPH w{o:xU!Bh`iH]Uu;~|/޵C!#[zm3m#noPbp!H eG985tZ3 K`=K)(Uhj,wWQY)F&>z 4q J}t7'~Dʻm$ g3:b6 hncfFGH0ZapU<z]}s}ͭ-^Y/կ~3!\5 I(-8T/@EXlX,*e ŋqMD!ƖjGb=D}2]wPctI\6 *C+)<ԀXjɷ0Y#$M0˞}d>`-)܋Z I V`Z)oEEb#HRJ5(lq3!ћ`q?mBDwv;֟~u ' l9]kA<뽀~s]E=lorxӎU(ULؑc C+*j0G]4*1'B[49.;:g6:n?-=9q\8uf`9VrKHwMyE+N|֋ý>Da8,Tȵ;}?%wxx-LwWއpmI"(TF!NhMt /2:քĕ r&Rr$dUFĢLj%T_cVP` $v P cѻ̩̰ORNELteԒۛ-} %'?&$@u;1צ յrr;@yfA6V Sux;LSV{կ~f{Ϭ1ؓ[O ))T QPE JTEe6'M%ۼQq [~`6,瘐4!/Z!bdr2F14D["!4v=>K_clΤ؄})ptl6ޚL񅎪FԖ/-cc<`Hu5CKJ']oѱ߁.pm#IM)2ὗvR{cG!IrqHCXh 4p*TsqXe)5R|4\]W\ۤSJ2h%I$&#ԶZsPɖ^)jšIJ{s\S4.dw޸u>$'V68FR ېc+ϖћ0:8T!CQD,T_OC;x+//u|~9ޏc?9s'N𖷼#Gͯ)?w/__͉'0](]ɯ 7y˾K6}p+_ϱX,yONL9>ͦkY'*';"o3I:pSU1hj–Q d0r[삹űRgF9U'\`tZO&Y3Hк?n k'Amiݺ3%:. T. mh 89$Hb+ 5KO\g{oV]29=%b8F+n׽}Ko_Yhop !_Tɉ z\'DsTЋ@6=UZ'˹S ŝ5' \K!K S+pC$ P8qccK]uwvW+jH9Ay}^9j%,˒Z1WX "IesV(jX, CVa{2!Eeod5 H9V8x0u n8ca{߻bsz{J_G5b㊻o=CWRbg_a@E*h."elo#__o=mo߿ <[m}硪lnn3?c[~7łW+x[w o;O$ŏyϻw_/滾;_5|A~~/y+Qg g?ڳ h sQqT/%V*,[0GeӀjB,!ѷDkC3aOU0[Oj73,(=yiD2XΥO&Q#*S^8΅ ?$pZjE8SY K@Tک 3mJ,Hjh@뽨k"!-yͺy'y} WjRV0CFcy!o~my nC #:!}ӳ؉37qO?,0*,Η<{"l AKt/ɜ=oLKQ}$(0dKNiN$0D6 LP:&%Z$VwH!cxvSJaɈw$,__{퀽ٕGx`Lj9{X +݁$1IqH.B.r,=)VJT"k#s|s֑۰8Xpȥ; +;[ʱ{|Wƿ+v3 ][Ê͋x>7s=䂽p(頗[ $mx;3J25L.rMJ0_(dqy [)ZsA# %Y $mAQ]cjLBO Ѳb:RĬ*re՘gO!gh$B4bbhbђŜyR)$?ՙh /4oNRF{$rȑm۾oͿ/ſ/yK:\.}/~p=K7lmmᵯ}-9gvg?26/Z(ۯi_/2,X-$Ph4۬CҲOe_,:*Q"ՔL!G(U#P;V6zeuX$,&Xyq)[U!&%4!u˶YU#&$@ -nUT*)$4BC ӊcJDB,&c /yg5qd Yzk<.1L±9~16^vlB,sg= g[,؜L&z*_:.m%`NC+XTN(A(RiaJ N7h|U[k4 Yᦛǃw4T1)qΘNo=%}`o X+GW=KH 9+%C}(]UKeXe`dyY 1(ě&f[=:̙_zi>gkV:r3YwNX\s>֫Ɖ#'xϼh9 $Fߔ\IZTDr 3Q"QuPT_d=(X)-J$V(Rӑd1,*5:4CP]vQ Q> 9OPCh N$bѷEqF`f S!g?άH#]@„bc^k{RƸLCJtBxfUz_â\FKo|NMJ?C?Ĺsx _ȵ_5 #gNfkkoo^uSO} )% /}Ky'x_ouoG??ٳ<|W}??=ϻoVyzdl.DZP"FgBe.F*:hۋMH2E;?XF,w)'YL-׵='PɃ1Fg=Ռ.&T@m^vCGRhu{ZC#yFSQѳj`.TI-s=cL"Ň䰑`Fdڬ!foH,=q=[H.H}b"R9}NƞVty?`,yϝ;`:aɨ#LY9^ y"Ղ93uAyG'0fla;r6j;o[< >;D:BXyuܲ];kΔybD{&]Ɔk*.tz%brMGy>W1j`N:R efL͔AC+z;|aEka_؟+ܮobxPQ5f} [0++ r ׎'VeOn(+fJFؙ, LHZZDԩ!8 i(u2wů:bb T<L ҇DjwVQ-D P;T` b$+0֑7ʋ}G\k$7xcbbQ+^؄b $ ̝|Ue+E30:JI4ǻe/o[:u3#vOG雿ロ|W~o\xn8of&8~(oodn9|S ?#?c=Ɲw/Xu8:5r[ IDAT2*V$#`Ԟ` S0Fa4U8 .4#NH2aJ ]+!P!6}pZg0έwH% 2e-7 jQbKZ.$xTۊ$7z^p:G$)LkˈrP#A)5"Ÿ7D`V7N"mn?rrt"OՇ9ʻϾA`;xbU+DPl#{]G./e-$ضvp%/BNS~3! jk h\aᮑBe\P)GĉɓƱ aݕ`\VKq|1gX0,M}de{?͉[n`o10,f8dqן0R׈sr9(t,b10gV !jK&2`GA%A @9g2^X[/&O]APc %F/áBmgijEh'DWi{  ռ(-Q䑤- Qj!$$V ? R%1 4m(] *D݅@@Dk^ҔZw빛|ɟnfJB $p 'GUP:kHx#;np:yk^7|7YVzիЇ;|_S'{{|+^0 O)l6LꜥeZkky^לlk-\i5?Iy '[<ņ[+=t;8!t0tca->NYnb f0 G?-Ȥ2D-ҡT۪sڮH](ղk:;$ۆC;:%h4savj=Lzf d1Pq!ԖR.>Z.ŊX-C"-Z,x %ƚؓz-[B Y`#ec9v} @1nt1&=Lf)5"cX05鐢H);2K kvPZxV0-G?0r4. {2IlD'-9h=Dݎ+Z]lB+66swó #pdO&(m#65J)tj,Gڒ1W0_T67#],WRbt{% rU#'1+PύGaj>WUC X?p=N?QRR\<^Zh6^׸s!yD"y'L#Q ȶh\i]^i:Gk4mZ$DS2LBkT 6 Ϩm-|ۚUJct)P2 Z*һ3#_6(L6x_@yOm B6mZ<}B(b[ikWlΌpZ숮XsC>E_FR >6%L)ۘVZ#08[W)ݝa~5H>{̾>>ͺpODcZ:CB:s"5j R@sC bpAZ;`SB(fD(Ø!ƒG;j-t ~2JC:7 XDOXFbM4YiԋHh"]l%-y\LsW&rla8nӍ% 5rc01hm /$2%ffpT6OU,&PG7MG"h 3RY4MD*#:x<| &;4"S儌vӟktGO"PIF:b db-XT.4zBݙ"G#7ސ'F'9 Y=ޡd32MJ4DW/̤iRo X,W,v8v4ٟ{'U>_}F˄PK D ouSIKZ>6VOvSf\=IዦiӺ>L(]pq-0wBhkȣt°PL& [I𵣎D#}sORjM =] rʫ#by1U$jkf񎭚ױ0/ ԡ{IFs%2b\맴A⦅#G_xMg|/w ?]w͋^lll|D.h9^C~8 n8{/ĉPq>fZ7'eh鉹uqeH%w_ԞJ]w8iZ֎+iݡ۠k TbIfO )GشQ5VkNӳCY3q3(TZm( bI\` AhҴƦ(Kۤĵ6r|WHKIx D`*Iq_VXu9bA=X(Z JRF.PjAp*"cu5+\<%'tq\9G[l//܇\0gxۑ ~B "OyA%, *R<=$ {WFtZBrmNzSi.2f KaqP* O^)Q3%)U4C蒻,0j6|4R,j+Z XG4&:>ƍ;kbdԊe%gZЪej;ơ2 .mY];Bkq5Dc;JX64w̋Vye=qjWaDS//?e_2n8{Gn~f\87yu?~3>UkwHL7f|3C{n^W}'٩1a"ԄȤ$Ör$xVK GoGk657!VBҖ)ڢ'ڭF8IALjԭCEiȚ&$СN-ޭlZB2yIJh.j[bg\iC;tM5'妽%N?$33mT} QdN6TC%wf@ltWZ,c#@-<3IT4eԊFܫZVK%]t~Awsw>_⳼yڊ s矘C L:/X}̪k4=lO-\^٘M^$/jWyj\2+ca {Fe|Zqqz0ۇP(f蘐"ˤ T 5TyoXWQ^HE!u$u# 2eB B)6&5M)td*wݹM/$&̈́V$Toi(dI0QkZfޥ5\:[-90 abZD2Úȍf@ 4zi`6rGEWvI>?UV݌c 5%W%tT+1%sǙ ;B bRQi[0+* OP_ULf:u4-"H&S^y}']}Hq?ޟk?OΞ/z+xÏp?pC?XwR]9K'y—}ٗ~^BTy -c~scÑGӏm 5w1 !HrJ`' ,}cP\o t:#ܶ65?s_ DIF 8xq\BDOHjtbrVֵ*x fVR)uc0Fm2d}:$-84AJnkJnH؟詜 zl[k"\6.0gO/6.Xq#pg(Vx@%0k)EyR$HQVa>$;ƞtN:>#NW~Ձb Q6ހUe}LFaj0Xp?PoFc"+.;s'Ҩ4qjimH-tmIX@ʬ P()2̱1$`HY(ÒEfh#μ6=|.K"HLbnA3A "pV!]dmuizT^. UN[!fMliy)$DS﬌c4M^Dx׻ŭ7Qx|~l3csk?>iE˗/s5瞏y"|d#GpnO;Hɹ}98V>u5Oީw'1,Fx|g*̙kqPͭnhĪQkuAƎ;C<1x]9-U(6{"۽尋A&a܂2PMqjвH?ù4AhR{b)!#v3ͪRh` bAk@,4ttނ.0%Z+Æ:! p/1C͈Hd==|.^f9u/g藰axcKn%ߝ7xd>q c)yPѐ(>QB# m ëU J \Hՠr.LdFA bL3JX{}y[x?|?,??)=O4eut9BOBS];vr]t`KP׵h] xX*y(A=͞ER\Ob4E411V#R {yRE=;AKg' lcҾ-X[g4 UԒLP޾ J, !gDi"0 z0)X)~ : Bi|*=Wsvs,c@UN,CM\XOjJTVLZaWeslu+w ʸ3rsvL:cn_B 3q.½/MulG\DZOl.|Qΐ@q:!!0&awgeso Fb6 lf`ufJQύeJ8[qkW!zp57U4;jU6B.ޱ1X[ r=܇>{1Ą }ZZ t- ] 6B 1\ +3.E.<C*b$DRmJؤRP݅UfFqC %V~fi.U <fEDGflI׃A"< XRd3Gf7ӛ>~ye[.\Yr)6~ݞXMѾr; rnjRl:iE`oMS?*H"XBy=" "r=Da"g}>7\ҥr/~+ W#O\e2x+q7&oyNxC;Ě0R%lJD/b(Ade긤#"FM.Oa 0ˊDG64O:R/ U-)U]*] Ol)JLLMg$tgv3[} E,Ke,Js8.8TK2$%bgE)b8[I<::`<.wɌ#{Hn™^9?,XR6ѩ(0kJPB!R1!:1`I"?OD>k^^>3?3 op:Rnllvd&Gm)ÑZ{Z>?MJq?vJ&`Á{#}_<R9pi ;(`DuncuCXy] "b՝ McZ8zvy@lJQPPm08`޶Ik}ܒ;aGovk,)u3j q.A~U ӻ6)F58eTc5B& ػa像p ca2veX]0 %Wv@\NX9uBd7(}3, V2JJy 9XH1oT)'fћ b|`؝3zVcqhd2{xdA S*&t{`˲++kbBZ*eCLCI B!mys1KqQ*=8aj1$M^Nf|?|˷| .\GGۋ'ث_⛿y __};1vu.3o;??ȏȏ?o_j~7o{?ղp_Nf6} ~L~?KٷԺ+)@^Y$70nGuɝ1F\s lP-8C8.Bo<8q D?"gZPuE##ETzC& ~H9whW;be'QBhqRpl3Ў\ I%j8&FFvر۷+^S*6;G5cDbY&cZpG֘}\ k17NENV+WG^E0qfFQ\h8ZC`=a.!knΝ-H$Gz&_IfN:oyPkF$]e&`wܵ!$ɘGZvs#4xxTG'z,Ywr\XTawSŹS=. WȥeP} y^ZH45ȡI-ƽUcX.9IBkD[w5)mrg'n\cjt֊NA樏$],1!dF~߂%ۻ]l8@WL)vV)4_00'Z+OO7ἠi;]S3^_w~wE(efo啯|幆# XXMobCD~:??׹tMc|{BjX7?Y5Fh$޻gG ]!mF"yl`H.%g@:%9 I}QFwzZǂU")B#@~_C;YKa !5).QK<1XٺzR⺈-u0XD⡅E6UxT%O< %BI@$VOM‰U0dB}#S)\HIeR6.Qa)0%VM_W$a b0UE 5P"o&a:dQg{av}$A}{jT9-xUé"ڊZ9zyIFx<|"3oV!(!㩱\ )O'ZPW6"U^K6axr14<ޱ JM=- p֫3NO8=;eL6+38aw\Ϩ쒁k>S&eud W/B.5xط#g% Z=\Pmf<+2k^ĕ{;`:2̈PG.qToQ'r ™6QHQXLb`-~iD@r![ =%f,%֩vxG˽ "MәcαDeg5"Ep؟a>P~;|~guc݇o;;TwjSy7A[,hOi;ƌ ""43\>U0-T%hVY6:IVyyzץ}WAM74J-H!]54&ED{Q4O.c$7 :M~pĩ*Y! "a aZ\Q.i.~c\8; m|۹Yl&Z KN+p5#ٕEur6pGpW_0\c3)$N IH{#uɱG I+"Fe3V@Nh"KxżE(2,$%FZqihÂ'4tg@2Ztzαk`O1e:H:<Ѻ > #|^kPeo_w> ?~iLY 7&y>dC*Er?}>?tzJYhGn @)fq~ 7ԯ}?G9qwߛ&ANFj-ܞe$5ɿSzOun4q Is'滶+ LF\J?䠝+Tԃ@Ka,w8,aH3Az\B]3 $qj5BR(ƆE;4cB't%u<'f$,XICآ;u*Dxfy`'.;\eʝ/lFoD4T%^۾i;ܡػy5ۊL[ QV]UQ8%&v.xTF5KسOsz[lNw:e^{_22J*ѭOȧ ڜBӈ1 \ c:8n -܀5R'蝌XaF#{:Z`87Yo&YaVa Bj}̼*x/6Db+ԍ{bU[+e }"c?o rq%nAe56fQZS2!җq ☂ύaH\ʪenN\hq,ƞ~ț3u:;+~يK Mtvh5$E >_a< חᏝmBXD6!AdK|_$ʒSa7"uۍ^yP#)2pzO=8Ϋ;xox}!B *)KzI?ʸwd]Zϸv-/N q}ygIy>wx2W|f7FQ#EvB L;:l+ =D!Rh[=̂X$~bZqq8N=h0L2{V!lJtPͣزx߽ڐr>W?10IC&g`i̗FV첞fY& xb$Ҩ&ZgWҘ)PRct ģ {0Pk284bi3 Ý噾׀MC/b❲E9F#="ri?Mzw^=biJknuo.Z]ܾw畯{l\ae}~7HiOC?7Gyן_Zh"BvE؏kA$+mfg?[*dmXU#32gxؾCcRqY椅uRNjqJf^\;KsG9' C]BёjyBM}(d EH28:]T=h} W4NC$'`",c,hJ!4|]l# n:lB9t¥!s*FƒRaWa$_@ 1xpkL0Yk8RmrڭZJw5T=,.%SyuB^BقG,%/S+FkOKY#Na/i^yuvYBS$LZ"oS0AzU\ P4Br{?Q.q¾evIXҷ(^jӘh%ha֔&zbQƓ1P 1f~ٍ:Rh}V=ɝkͨ&_ŠYru\Õ&xڂ4t"юdhWZ.E" Ds{ZVBd`oD5Rnބd.yHuhDpML%Dwf*Tjq]-=f`;> t ũ6Rc5:6 ouǖhVBd&N[߽PguAR%/7oqv|w~t&1,XffL-5u\̌ c//- II#MΞLuf8{;Y0hktv@VA)htBzM(n7wNIUL*XZT;aib;cW)HR^h=\4fC_]KE&?[nT I-M*(F\r\ʍ&֋j;ب[d#)F-3j9{g_A .i[CQ{Q҈ׂynn91]; r깞B`I(EE6/-mM](=cJ+Ƹn!0`…W6rkA}9 j$hV8n+Vyt*L^8m5 k/Dk9sǸ|iAz4܄dNd3'LwZC0kܳ8w^hXK`<ڂFsHyۥ^X`*4*F`MInbӗőJ`2MΟAՄh!@`ER\C6Amy#mP (;Gtmh7tb2q^tR;^'L2Kn'Kc O4iL_}<>x0s{pv:Bf2pIBu[4F/y_"'ά 4T1%-R$,/ruU8;trDP 5h]o*,= $o(5.\>`y\'61(TFxn1Œ򷿌qf=^"eة ~cO[+<g]ErZth,_6KS16Ұ[{gʵ<,oAxQ2bH\Y|>d:kDijѬk*,[Փ VfDi4ʋw+!'F)k&]3j3q|6X¢=9YɍkzGK ·/qERҀ`^N;gu__ğ`3EA BWRM4W =sL*3C=-xð _ L]'6d}CSיɍºg[9nO Y8ȣ59  C#"[ բhVPq68ǷXoQ5iWW\h5'>;#;н1lY͜zw8WvfffYi!k;G2DjZ62,aIL BNUp LcDMO (`jQ̋;Ny}5)?g7|^a5`4ls4sw Oޞg0N93ߏ|.W}ҵn~ YݼߦV_*7ȷy|7{O)~锓=9$aX/Co+Ruߏa):&~-^m}* -2I=2:'awVI)x)7oP  3ޜVٰUʤn4ԈY_AH=zpx{zέQ!cξvng2(?q铺8{ ЩY?/ߑ.|?%`\5 G|pqggӟ?0]{i9}|RϩpAs@H6Bհx /# \H{wکRэ6RHߺ#jtU1(1^/8p0#f3@lMdD0uc*ӄM4VJ51$ϦऀP]]99 =F=S\iyr6i,h,Q׍&si=ӎB@McN $J -MdŘʲc*㎢yTYGm0oRprrWY.15Rk$jCЧ"if%.!%ܚ,¸#7y^NI3;Ľ/36]"o Ո'NqI^:\2K?49r[Ʃ1^ 5GVk>Mܱ͆OmՓFN(]da>]P5Awt筝~VIYSh]VL_ܧOO 7~1Cf3'{Ǩ|r͕d3-Z~2`%|HL{6ٖ0Q:-Oe6(L1 A a@8 4J$`6uRêdcva;G<՞ƈ㜳17EnH$oFp%2hZ8s&`޻SP _Se@YXS^q! M4Q ~ J6pJc" 3Uy|=:3I"T`W `…up:Wj`,Dԙ2 |QkL} i?~^$$0q_B,*-hHG3=%l5 ӚH)Q_ N$as=0[ P /g(n͈m[㙧t'3ڎ.\$25tX)-EEP*5Ya=k!դy'(I5aŭR5wbԖeзem\#$ Dbjxј"=\]}`s>|c,֜Φk|p!͕䌎Db>&Tc_ "2,!δ.w2$%RFJRawwg2t dZU+VqMK4U"д 0;,scD̚ȶJA$! ΝCV=ڬs&^WgK' _OW <~\Z#a^1ū_/ڨ; *}4g6'ϻs9-t3y~C^w3NWO9}f9^q ]?&5RK 6ZI>Q#ykc`\;[^Ɣ=/kR0,[ph H. 5cd#j++`:k^ţc{86i;TmiT4VtoWCA8YA&}!2Eq>VB "Dž|W,ev!}9nj3gc#rƝ5ǒIՀ UpKcLI.41ws188J.jձV"Ӄ""\$Q_1 B*dԂfTQ)-aLz v FrK͌4[_rh?=p#RC}H61Wx:N@eU L˒촍RmVƚEIѱI,)8L[ҥFQej%ϝ+!%phЄ58aޱ1}֞.ΨJzVaogQ+& E

11. Description of the project properties.

Xxx.

11.1. Image Import

Xxx.

Figure 11.1 The image import properties

Xxx.

11.2. Image transformation

Xxx

Figure 11.2.1 The image transformation properties

Xxx

Figure 11.2.2 The image transformation properties - Clip

Xxx

Figure 11.2.3 The image transformation properties - Zoom

Xxx

11.3. Video export

Xxx

Figure 11.3 The video export properties

Xxx

qstopmotion-2.3.2-Source/manual/controlling_camera.html000644 000000 000000 00000014223 12536560627 023351 0ustar00rootroot000000 000000 Using Stopmotion with your webcamera

6. Controlling your camera

For some camera types it is possible to control the settings of the camera using the camera controller.

If your camera supports the camera control functionality, you can open the camera controller window by selecting the 'Camera Controller' entry in the 'Windows' menu.

Figure 6.1 The Windows menu

Note In order to do that you have to turn off all other programs using the camera.

On the right side of the qStopMotion window the camera control window will open.

Figure 6.2 The Camera Controller Window

When the camera is on you have two blocks of control possibilities, one block for the video quality of the camera and one for the camera control. These blocks have different number of controlls depending on the control capabilities of your camera. If the camera have the possibility of automatic control capabilities this can switched on or off.

Video Quality

Yyy.

Yyy.

  • Brightness: Determines the balance of light and dark shades in your images. A high brightness delivers lighter images; a low brightness delivers darker images.
  • Contrast: Determines the range between the brightest and darkest shades in your images. Images with a high contrast have strong light and dark values; images with low contrast have most color values in the mid-tones, producing a gray or murky effect.
  • Saturation: Determines the color intensity. A low intensity results in dull, gray shades; a high intensity makes colors more vivid.
  • Hue: Xxx
  • Gamma: Xxx
  • Sharpness: Xxx
  • Backlight Compensation: Xxx
  • White Balance: Ensures that what is white in the real world is white in your photos and videos, irrespective of lighting conditions. This is achieved by rebalancing the red and blue levels of the video.
  • Gain: Select a small value to reduce the image signal if you have bright conditions, or a large value to amplify the signal if you are in a low-light environment such as a poorly lit room.
  • Color Enable: Xxx

Camera Control

Yyy.

Yyy.

  • Exposure: Frequency to open and close your lens. Decreasing the frequency increases the time the lens is open when taking photos, which may be preferable in poorly lit rooms. Increasing the frequency reduces the time the lens is open, which may help in bright conditions.
  • Zoom: Zoom in on your subject, or zoom out.
  • Focus: Control what your webcam focuses on. Select large values to focus on a small object near the camera, or use small values to focus on the bigger picture.
  • Pan: Adjust the horizontal position of your webcam's focus area to the left or right.
  • Tilt: Lower or raise the vertical position of your Logitech webcam's focus area.
  • Iris: Xxx
  • Roll: Xxx

You can click the Return to Default Settings button to cancel all changes you have made to your RightLight settings, restoring them to their original state as they were when you first started using your Logitech webcam.

qstopmotion-2.3.2-Source/manual/trouble_shooting.html000644 000000 000000 00000003752 12536560630 023074 0ustar00rootroot000000 000000 Troubleshooting

13. Troubleshooting

13.1. The program tells me it can't import images

Have you checked that:

  1. The camera is working in Linux and the driver is properly set up?
  2. No other programs are using the camera?
  3. The program used for importing pictures and video is installed and working. (See the preferences menu (CTRL+P))?
qstopmotion-2.3.2-Source/manual/graphic/project_directory_structure.png000644 000000 000000 00000060537 12536560627 026627 0ustar00rootroot000000 000000 PNG  IHDRpGsRGBbKGD pHYs#)#(S7HtIME8 |U IDATxue>< ݝH J)k  "*(i *")ݝp8= ?gwg!fB\ 4BE!"@B !BE!"(B !BH!U95A{{*ZǓƽ:ZB@HSkm}4l⛪\h'BJ)4BE!"@B( ]sJp]O` !r-^ _c;H|ޣiLrHu@D[پԿ+@YV8eT(Plgܺ̿!O/7[bfRi>9+ck;]M@f "pY[L0Eay?f&EY Rm8uqn鏱r.Q137HQέ󦺓BXފ31[ ['B erOR7Ȭjd\ (աÎ:+'nQto/l1-vmݶuPA*ۛ* Z+"8ݽI:siZVэ?U0v t.imؽQ= 8N)|'fc({EHpJ~-6 x*uںeWuVcu{,tVA&M>=vOqy>@"_{W1|k?s,{2hv{zkǗ?dFm -Ϋ;s}=e6{d++w8co߬$CsphоD qI9P؍_hx~rs#4}t?맍',)_x-cڍ蜹), lAJYS=vЦNj&VA !c(*R8jwnq^Ac?ϝ=SC*ėn-SQ[,lS/+15f;;P{}osOG nw/F:7wx';8-o˹5M4R7* XخK~pV uq{lnQ/.'ڻ14fP~{-v׶FhJw{\ d/3lO_8y-qr`JGl0a Կe#U56Jv^`'){tOpV՗Oy_%k4ѨWX^JU}o'CկE 9Q"~ 6OѪűe͆. wtmY lI ?~yمYPAt+ ŗ/ɔ̰/ЙD`Gq*OFo蝢~t`|'::;Lgu"I{`Ǧ]d =3B4doXoi<_,!!re 3Q T:w^Oq6DG5iA&qp;QfQezE-oZ;w)E9vtQbj@&2rHm+߹VGRӟ(PiS0C<f|鿔3k-3.4>-7% pFF/l-Z]I(Br"+UKDc?q~̼1H?k8=άxf~n$(rOzL^ƜW V,ԥuHNUɑnтҽ=я|UNb>__FuF(X\*˭ .l#_&6JD*J+dy#gT[IQ?-xEֺ֤12+$PM:S=V"Ӭ%Y*qWl>۟QcFSlݷ~f #0愦22ٜڔs>s`(߆Vd!Bo B(L "L63łbEdЙA?3Li=e.l!+lCWUum"_nqwy`!@00¨uaiA8{$oտj K u/ ,|P~f:MÜw6CʝVgH3pa#_SAK!n.?U/f07`WcXILY4+{³Mn-C_.9/  j%!_i.~)అP?vTrc">uvEv-bl.,6 V[ "ݝ4l `R "3@q 3N``i,hp36Pl `+dfP 2G@a duB ~^}醬s=ۺʳͻv©G?|t|n`ƫJx|!ml[vJA{kx_-;HOaRr#WO*f0rJO[Chu4w`}˝GS+Qll_}x3͌r33oNJ8ڳʿ9eC#o\adF>4ߟ\̤"c뻯Yqdo:并M-"~xrD#W~y1dNeϤs>zx#U3:Ru/1UA Ҝf4/=unrʙR\=[m{Ω5>+?&_ tNt_oGD9PeCS<9ڰ_0"J'-KYK)O\XƶS;ߑ ҳrw)=g֛݊:ޫ/W4!ߓaD@ZF̶gu-J78'-lLv(־Y-^逿8Nu*V2epdO6)v0`G?*l:Il P<3zO>yN+WK~WfXS"<:zoz T%PUU-[xMK6CV.[Y>x.Z{[~oWYH߿_>!׽^1n܁/8ڽ!#ad.=-*}אYWDƚi TxlďzݑO~O斍ÖIM\|Y՚OoϦoZ=c[ d&nƑzإÜ9xܧק_wkcx`0w/ 80W=ƿ78Cv {^[SMjQFʱyőC^cyk{ mK?[˨YU/#׉]n&#((WeY5kر #9"z>[΅tu[~V@^uJ";(jZMOemN&8R"{<1]<,~)XSE;|P(RX ty-/fP{#\2^9D 6[x5MY6lαs\ϴnKi^ +cImMcP(kV>[ Ū{$)u9Gj Wi55O`vk9PZ碱-Ѓu<=VboI)uϸ`rnVK\!ŋ׮] Kϗ.sPvf-)C,ldq^l{Uxӛ<})̪Br% «&T8K_ĊsR.~N! ᴓ `)G{H?^QU@9=LQ;OέRcDJ]96ly6熆B~XQ倃 -bx"_~6RqnYsſ'E OxݚJqўONeEڎr{⋗>[dz"{`9X*!~âhM52v&jgw/ڑ9ZV5^bP}%c,۲].0`5tXVtN6l~8t"#ئ҃b UM(o4(4UozgvBupo.PDbHx:n}^ӡZ}ؙq)C}}Y¬D>xaDs}g~/߻qveHEF:Jt/F?Ҡ^ٺ+]~*<ArG*~FWnyee3&?m?`Q׹?YVD?x:n_?yAQWp?/RS=$h U븽U:;Go\XP쩙ٵ3fh.tGF*@&l,+%1Ա w=="$Pўg^OTGD#OHᬔij}8HO0M;>v(?1n&} q(&wJ:B UkVT'{Kv_1yg\e]-qGY qyer_mDdu {C:)79#@BH!n`2@NɐB?H~P%PO굮8>u_wi yۯ2zfR@j?|v^Gr,BH!$P(B!"@BH!$PBE!"@,i|ׇ9J'T^k]Pu=;xoHCHkvX|s2% c9;P%SU%';ˈ(lХ 'Ŵ4@B !BE!$Pn:Pp{-T'4d&.vsz; F^+3 WC`70rCW(zY~79G7(SVIe(ڍ!;"{ҡEa x}y}$(ƒpI"d01Cn# Sؔ?,̊\. ?M"()c :%M#.Ϯ7?a$r[{Ɵ7JԽ"1V;02BݺUˤ*1ؒWvҽ"uzws飵~[&[iBPT:>yno!qŤ܆#c t:J 03[ґ <ݰx l8rjJneQ:NЄ6Y]ӎmհ҂u)vgyʮ֮N7r39eVLq/S255B zeS5M8.ZZRR,=n|xϊ_xGA%ju-[Xh7k}`_gC'(7P(tW ٹ`ܿ;Vj~X; O|3nb _F ؝؊5|3+z?#c./8fܞ"IHd{=3*dCZTCSG*dOejoc}Ƨp,U&zզl_ <9y|^s9-H,B?\:FQΒ'(YJa,٤b}3=3sJKKa{?5aLsãDy ~nf\sO1(Zkv]K ٣ꔲeW9L4@oXTݷk(!Ji֩+Jwv[Z["svʠA;̭o.'>4T]-3A&+{P7C^[Qz}YE-Ǵxw=7{s`sk_XW|_RA)7|{3_wk֬6lؕ]ݦkzۘA*Ti0RU:3L632 R5`İtyoV&Ձ #:Wo4Pld,X&I!5|E]liQ߻͇/]")  ,1Lyc[pa¹L0HۦܥL9돷GD.^:(+R qkN:漘`6܅ @ IDATsGK@ _9dZ2rCHwm$Lߑ(B t G$=CtZ6wNa"\nw绑>&CAJvÖ;6~DeK/_W chڰ΍wwo7%]+HPϞ|^(B!"@BH!BE!"@B !"k&XZ:ivfIE\31q 붴LC"? -ok6sK/祏fJKkII>ybQHkХ5S]dPVqH!$P(B ʊ3=v4P48P@ǜ75rDF` cBdsi`u$f=LH.EE [=B7I 3ԭu@Df*R4࡮ɹ@RԽ}1EQlQ[EV^+Q8@d^9oEVvp$)גf GU"+qų=Z>`o@7"(F,M۠nU;8kҐWvitQ>7bN%w͌Mٰcl~0%CykwqK70m7߸Þƍz 8y+ofMk@͗c\E6in7).Yj_жRy7زՔ-sado|K]Gr bۏe/ԬN([ ̋<=۵œNtx75IV+M-Kcj\= &~q'J8'}t;STiH{1lƔ?O:U%g7[@|(0TU0剶Ee"0N(b⌌@Q"]nQx1`(Ĥ@ 0 vFD4EU( W$p{1B+>|_vik{tҡ#VO_tk?#{",ʕFrbIj*tP0#Ϫ*1ӧO v:URU=Jxa+;H)i~+PN8EȂ%+TЯ)x{STN3 Qve GyV;F79L6tթ$Pu-55պزJV.aYW)Q%*vJtBa& F\AW&Vc v47zպ+dBi[+|ٖvzwB*(QhPI؞D(UYz9}DzRxsUkUsg 3`^o%q[D!G73!z@rf 6" q]J, WPRLhuɜ7VًQoߜXnW:ꝣ鈈ĮoNPȐ?ZwV,9N ۞̭դ ~g>7ψ8+qՀ(Sc]O:l]Vrf康Eƕia}1gbvة* bݵ~(:6Y\jGD~3ՀH_6@oEPM2wo#8xUUݖCAJI=_ *b$4תNhܲ+;WfHx6-kr0H_o4[O;9kw߿@,eP;M1g_& (giqmh"^Te~d\Ӓ@v8A/]J\gV]_kE3LAl[Uxٴu/ZN C@ *ݶkmqz8A5Eo pV?-[kT0,#ŭgӎ]>~7o^6ѢFӔ@ZYKDžyqt?.~<D`?\_)iAu)S [H=;3u䭞2~ _;gtrD !D8YJEqH!$P(B !@BH!$P(B!"W\qmoi,g\/u.F_P}IU29RҠIF\$"vC#Md]?3ޒ@ch͒Ғo\XM!#"@BH!$P&GyML:̻bSAD["E@0[fx1[ HU Gz 7o͊O{7UvB7IbCԊ-~~wf.Y|gvHH۶cTή{Fy/^}b"=MoO熽#[8}ȷmZۼkDP f&F3ko?✸O3@@N"0Q#?7.wwZ4hʲ[˝D*]~9{O^۷Go>S_7{>>sՈ7D!'gϞY>:CG_=v峩9ڳ#dOpG͋{UA =g_ֿQ{>Х@ wI=H_JڸKԞOr1+F[L¦'U!fbf+U[PT%_އD*q䉕urDL"DBԳGRT  b D:٣QYԬa&" v^nKԋ0e!l]i>k3v9DW-og0-Zػ؝PN'(_nYҷ{<ˁ_רպTHۨgL"Qo#o#m-^l]H4M /ϪM# @Mto.oϺIfl:Ѫ. V̰Pr.-d E\ߢ+BM@JʩtOtԜu޿ݩ#N?2d=ݬ\6][-8Sl ={6-R 8ӥ<}(Tf@M?s؟qfYV$"bURALʯ.ՊYȌN(kwfKZVVp@TdlN_UΤHLL8NwmZ.:vngrU40`r۶̈Ū=#igUOECFfK%Ԏ,*Q<ΈQ.<}褡V&VN_jS'rsLe,שl~"1X+g̐'~Od E\?vtP; \Q{DŽ\nwl_4gTbf)sLmV^[?|T9ά3flZ>Pgς[~f6MZ7M{C<:~T-z5i^'uճFKPMw>SFX?] {E+;mCEOI+8MڢTs^J%O?ҿӨ:3k\8H.M*ĊR~AK6 _;-1ewfqI6FiG<_QѯEn?#~G.A""n gwV %X$ dŷycsݻBb)Url9tͿ5Rl%tl1yĻIʆeDUhU0M"bpngn#LJ !eXCgeDE&Dخvqˈ/)j|5L?~v2I-X̳)"5AV+CW?%*4*qѲy˳i/^C{AM>pj[dJ]<S~;*ޤ<Ӻ?I%w(OS{=FB>zbcr5tF/"58Սow~z|QD%)zN!wL}q/.7` Q>++"5cC5]V0'TF! ܪXg qGV=_3i!+T. 1˩(B\3ljK87Fܴ4?vB|;ϿBLac!BEqC1q-ٝ58%Pĵ4aH;g;J|S|$7¥o CaeZ@kF[ZzqY/}=0I!$P(B !@BH!$P(B!"@,p}^r.6_֤$&"_Z^2JJ|e˖/s)򳜌oVMxUEg7Λ%-%x/BRm !\H@!"@BH!&ds"eғY YB ) "2rO޹#d*V%3b X"3j+հu!ேOg2+)WĮDڥ[+WJeb<4U%6ո52|59 bjKq} NjД1bk?eܰoGfC*4+bҢ?yyTOs~^{w5cv4+A@glS: ݔC]&,&CT)~Ѧn0yuqGtyMޛ<)޴O&o[N{-JߣKe'MC~_Iot5_iԛ+84!I:p~/)3{[j{lyh99c+OxHN]Tݬ?*pyXɇV'~a_gvh>_E[*=8nV^߾c;}r5~LGm\}]kgs K/ oyowmMY^[m@ٖ;;gt'lF=P8 E?n\J_*V Xp(`!(K#VHO7B! @QcGϓP(afa~je -\}lBAfrDx芭+Q@XxN~#{'f{%t~G}o-U*qYކ ^oF$OJ 0paG u[@H0͐e1[MgS̺ae*!!"d:s8+YQ(uN7{u]:_Vʰ'n㷙k^nn{~oG[$PeÇ>|]-.tKJ,wg6 ِ扴.3!q]Ԍ3Y [NWݽ~怭L=:IJaڡ؂`$?l6̀כ]`!)A/[T{zu-(ၑ1b V.h]+QnL,j"]qY{,@W.JtOPsrD5.Ww* Tα%k൛R53[ٓKL:EsrYQvxڊ0l˖v 'fzJU*[*+ <_~k!M( v9Eaf2=G7gl^h(k)R%P R% VJZZNҨߌ-\HĶ=ѿ_ }z~;wibl]^AlpOOt||ẘa}QdT%* s{ڞ2x~l]3 ]6]ENx[l2wÚ>&޴mف2}{zBk/S\9ƥtDr$P6(q5*Yc l~Ķ֯Oʴ]Wo[El2 <`ஷ+ BԜ۷5"`o=_; 7H3V<ʊ0.SwymKyFenKP_&}l ݇ ^~5k &۵I-8WmLDVD*3l"yS[T"% o%RGp㯗 `ufՈW^[{J> R+oÝi*6_j7 ETAџr]sՊ=b(>tS$ZԑʝhvvՉKlJi4º~ A8KyX'Q :ҍ%)}7e·tIe7tj gKq]0_ADdXTMB&8@wĔ ]?v.anl>)+P(B ! LPĵQ@ ưeItS^C^@eYȷ+ĥyt( Rw}}`;P"?VH!$P(B !@BH!$P1\rK/Oٛ(B":tԽ=5K%#L5W/mݭp]adX;}W_ Kyiތ 4M3uz˖Y͈AD'{J7@-[fB4aQ0N_Xpil:΢(Q&nݺqƱ 4$kT@d|l->wmWU*{S>Tg3IG IDATz(=i=  q 4Bb|ct0O:|jaS̖3'Y_;gg6M˺yZOe!$P(B !@ Xp9 2CEDd֏,W_9tMX7aU9$KEX~_3^0<9kSIR<1LvfEUOUʆB&lo%4`7&[0t709 \.&"P̰;A Tdv{UYO)kDP@_dG:B E\#&}BdLeHQT1hhc`Vjs]5t૾ "Y}!hpB}P L*13pIRf:f|jV(,9che`ҍmd+ffwE"".wL{gtibZˬԎbmF0֜&>ٞ=t@ooea)S6N͌Y]D !*Mp.O w:Y"_p)E-9Kj%d th+sB>;qӞ.tT{f\uuF.3 䋭]&6|Νo?=zÂ͋eyݕ1ͼ&Qw/?|m`@:=RD6mȑtw.yеo>Wfek.}(j5} WC7G)MPQ#ԅ{Y];''2н+:4ʾ_-h,i"J ռyq; dBE饯PX㚉 ys otqP y_^`{d?M,+n"?H9drxLdJ -́tb79szP&2A!(^ƊMnƋc嚗jÍ po\ZtkRH".h3GGtRf2<#ִ}  m}ru#xݾ)Gy(?3aE'kl ?GcAЮ'lKn'R˕q^yqIMhG =[uԸuԷ7'|~v?}ڈ:R"O쥆N `2aLĆd:+9/Zd%7;^116̑s%5KnZ7."-8uIMGrO bR+OJdTOl{X7 {LD̬b mcS i͜юjq @@.BE!"(B !B"/<,P52t(j:5@ h:0jND2JWzi)v9\%P]EEE {Rno׮oEe=f9\%PŸi%jPPɠBE!"@B !BE!"(B !\[#ɵ< ¦-|[ԨQjB<@E\2-Zi>KvE fKKм LD@;h繱TB wI!. !BEQYQ13V5 RQuj6h( &"f& j^99J"e%BFo;ӰLI3m HZ8LIû_+ 03H]kRGԪZ8f ۓgǂUǘPH/_?Ff} ԬgH+|{#dﹷ yƋ0l([Դ Z 4͜LT|iw hhg)cٽ6=]eV%kC{GçY &ń|yҶ+-^wq;e[߾ZS~Ͻ=lH&,pE<(E>ܰ=k%- #&3OιfOƝ uh2z~vxapsI^aYxGY뻷J"u?Lm{J$Vro9Ȯmc]k]7:(szCYas`c&C1dC ~2١0@}PLgI"j6V`\Eyu{"Yc@pTPmLj_*` RލGݱjG0C7ښtWm{S6 BM;8qx'>/ڸ],Z5:Uw>XҎ0sLS$iEӰL8lxS ]*qF\/p%8ߞ~K8 /;jZ$zAa=EM:*RȄTy8Վr1@F3yE0ekdj'":U!wh#0^t(imC{>3z(=3zs3#=oM:0;7=23Ԫb:Fc U\RA/i~y%P(DFFZ, <(vU7"ʀBէpp E9jl&R948S>d:@RlaGLD\ݎ`jWTRB_4N !|9`;FumKڿ)K{w}v^_{@;vbRO'票wa$ōzlώ3;wo8f(V ȡ 0A)-<*Z,Pɼk&U&,oV-' *\Xz`( f=vJ +mfjn(/jX`*W^7^ *t-AZ"+ l6Cnr]l2YE\.R0pqgl޾5/*dZ#2žСaQ砿j쳢HeEFzk%"!!n*uZJni#_a&ÛQ/0D{Xˋ\ۅW7o~QJv< ff"sE _*f_dhDJPP6bfVaq!HMxUdؿ/0j+·7;[Nݹ詭*}m7{]&;y/?gF㈅_QU Yi~ -Yzwr3ݱz'o{臭#n?=*}̑W-ɾgVvy|{ǀ%5mbچpcW^X-X`"TkV]KO<$B_NUvV|h,/ Ztm KӻOpwtg}볣 V A/LJya =+!`)QEϓ.P䴱0[ퟆ4O_ǎO}{vۀuoC¦i\PXǣEn4j5bB@"Orƃ{4{ca7Vm:3ϣ|b4px|h0KXՔ!ݰv'AgKNu<> "ic!=d;B]EE!"<2".%U@hy3ť4a#!y*&I@w08瘡J;1Sq$P%:L uȞQA\W3%$PBE!"@B !BE!"(B !D !KF7xGNʮdDW/*"\Eåzݮsk7,)+/(⒩#&aO}3WqߖN2`G 2Ez<{G[2p+|AD(8kҵìqr\5&ھw "eR714Ĵs=FN0 //8qv :6+r͎:>=1W o}}V20dZ8wC2~iH Ș@G.kTF*QK"OET,JHHH|<Y7*(25j"hL :`ԊN [~;1܀ 6tGӸNLy w,>xgMV?숹7{gJ/ J[zwU%iG>n>o1939㥫#%"o(/p.FJf0lHY&DquR@ r:\l&EQ nAAav (bUN q %rkW>QZL5 ;9[:HQLi{FL7yv|2Sz]bQͻr6l s:FyqQ!@=Jɤ@=|'3A)-<记-ٜ;0l,0["2YʎV+ APA);4mH ( M=w-ePf@5-+0PMKpt|Ug qY'ك.tpEa8j'ڍb.9nmL*Ҙ 3-wG C{Mɤ%G*+22+ L[!0,ZԮ*JlMKb6dTpB\nQv1lc(>p7r fBvOi!vg_j X!WwȠ8NE(. w4j#Ņo1G#-ZvLZ>P sʞ4 +ج^r9[GKZQSxҗF.Jo>1aUbaPMR[,Fa'M|MQ'5=g'Q¤R?{co[Lf6fk'>w+WP続ZZD|N8BH7㣥8fH"j8Ï^o7'4Y;۹i#?8` p~=7{tj0rEVBw`ov-g[<%mPΆ93rpҋ`7{NMeV.;΀Ϡ떪{Է7|?Ujg =m5%<{/=nw;XmJHm Q+Qi{ޟ)yC-M?o˃ш^n :Zg0\HyߣNZh"͝ZWSۈɖu `tzu{'k/ko f@e a{fOw{Z491{E%9G_MB;mL{j6[./_ q6ێit~[+~6:9$\}-0v-UFPlJN۞߷/fg:G4QLN5[c?7ŷ &Myꂷn3=2{<}UܱM|j;U_s2N.=Ӷ_i=2 zW{DK8>'6^bKGo]O3PJX٧XOJnhkoj=q¨bm٤(G>#U@"0fSJͶ7YAE+Qߗ6wWy(B !1q)&3t@*YE\x'ɣG<~2SV\USE''.$%PS!$P(B !@BH!$P(BӜ1?̹Zk)^(B8cxDë3w&&慏=sKI(B8fޔI>qƩUkNɞSdۇS_(B+ !NQ?sz&uDP hDϯD'wnDvyKV [kv(,8m_D.c6zUf"W]ϯu=s.z{(BAw=IS;`VA.9{IO80haq-;VPiLzO)-(8ծ'C⌒l1AGԲ0)>\v}fuM {l3NM9N]5 23R; l2.-4ʁ+~DL ރ;KQ03{>}G;F9M/+affป׿cPo܇[WҾS}YT3uK7GZ^{%,خ@W{Q [IDAT /to2r @mz?G~ؤ&foxcjr `|i8'sU/S @|zrd!$P(B !@BH!$P(B!"@BH!BE!"@B !BE!$P(B !B??bGIENDB`qstopmotion-2.3.2-Source/manual/graphic/7.png000644 000000 000000 00000000642 12536560627 021112 0ustar00rootroot000000 000000 PNG  IHDR(ѿˊbKGD pHYs  tIME $j /IDATH׿O0qCL 9'f9aRK9H7|_ӗW(S&pE>Ǣ(0:2nrĴw]9lzVRJ-KtVC.˒"nHkEQC#BM}j叔}4[&:Gl/O c̴zTx2۶=;Qib !ByQ8sJ)PUUu UӪv qEN=NJSaFg IENDB`qstopmotion-2.3.2-Source/manual/graphic/2.png000644 000000 000000 00000000641 12536560627 021104 0ustar00rootroot000000 000000 PNG  IHDR(ѿˊbKGD pHYs  tIME #-.IDATHս@(kDXJܐ.4i,4ht+ LégFzߛo:qҮ ~}siZeaBl`yRtZQUc0(7M ?Ya(|΀]z4m۪z!e8>BRJIӴKS㔦ieb8IʱR ߇B{cs.4q$I;s(JBƘy B,o8Bib?$RB~^ ؞ =IENDB`qstopmotion-2.3.2-Source/manual/graphic/3.png000644 000000 000000 00000000662 12536560627 021110 0ustar00rootroot000000 000000 PNG  IHDR(ѿˊbKGD pHYs  tIME #"L r3?IDATHOK0ƥXx轠`i.C{p =AO=&iƲ]¦Ï7O1r)!]4z$dY&߿o~~QJUUE%;m, zz,1F)vILwRJ1ƌ1EÎs!LӴ,KEQ!i>mیmBfYVM mxx=>z`osQJ'fq]1j+[ ,84Mv^f!DJu0 ]כ(cNG44=k?H-^Z@IENDB`qstopmotion-2.3.2-Source/manual/graphic/4.png000644 000000 000000 00000000630 12536560627 021104 0ustar00rootroot000000 000000 PNG  IHDR(ѿˊbKGD pHYs  tIME #0{%IDATH͊0fzA+ EA!|k݈+7J7ĪĨ0LE{Zeڽi6e=eYYmY˲<{)!1F)( EQNOy۶0p9y'I9UeX4@)ͲluyR9Bt]'XWi\.!_NAض-(r߇as0z"8p8$6x?/B4M8}/Ia GQt>c,OX$뚦E\ߗ}IENDB`qstopmotion-2.3.2-Source/manual/graphic/5.png000644 000000 000000 00000000652 12536560627 021111 0ustar00rootroot000000 000000 PNG  IHDR(ѿˊbKGD pHYs  tIME #;(K7IDATH0p'NB" >C$ ]e(X]@)e"=P~C lc,ztB pݲ,(I3(0PJj6MӢ(f^!$rΕR]u]=ϓRumY(b<O&o1^-cJi焐0 g0x$\.}ߏF#B Z4i#k4z99_,zv{<!q 뺮m!\WJtIENDB`qstopmotion-2.3.2-Source/manual/graphic/10.png000644 000000 000000 00000000514 12536560627 021162 0ustar00rootroot000000 000000 PNG  IHDR(ѿˊbKGD pHYs  tIME $$AIDATHkP %}'8Л`?; skݎZoPr $Hཇ{; , , ҂=WiGDϷk+ʒ19uOA{EBypTB'BO!BE?!~B!B( !PB'BO!BC~BEj,zyjK!\C^GN5G#Ky{=eϦ B#>Xl=}4Vpک„q9lW>|K!O }!_t|ؿZ{}Y B)-CŕG}iܥ 9~zbb~o!Z=,Iæ9\}T|bt Edk1P1DE?ynWF8OU&-yeϧoXzׯX2"L(]JXܠտ~ѵ7l=uϾf;y', cfm'^PaҧcT@yy1DlzPYfwYܘ7?N7bսN'J`ә k̀Iֻ. %~E*O"!q~<㹥\9 6TqJ9gv'pOKȎQʺ粴ej5hX#떦QۻI&7@ հq=~Hrn{UXM"QK?T8]X\e,֧aYS N@*]v=MoٛV"^1ޝedMxϚ`ǒиjpS_3@cVϭŪJUJYg9iW{S 4t <ϐCn:oTӵ}Ou; 5qkyݸze̪h9p[JNt S]^ Xl;cҪNߊ-+T6CXp>aZEfprrάC]UŬI??l\Ú|{L0w&].EjӵZv\IlCl\4jiAVz"=f9>%g5ĭgO`Ш_ ^2c_{tّ )jSBǿA<.~of j _xC$QoO/֮ky@N9D`+۹(ؿoȾnr ߿? ۹[?kp϶GV,`ڏ?Ϻ4 f(<'hNg,= h:9At]|w}ɫs&]-x9Qqfٲ32/zJL OWθkV =fb_c2_"mb<`-[z-}&)~k5ߛOxQFwMc=hZP=jgg1%ŏ(N'2&@BXk?yku^x4 ̥3"0[zDQJ2+'Z!T3_ש9.69=_ZZ, DErN`/D, l +xSz婠~N!Tzk@D81 *Jd% <۶_5fUҚPÁ ,8E?tf$Hd9WmCQn=QUq(A+jk[U?pɖfS|70'(lwmj6ٕe@v k`3UƄU ;f[1*AJC{떫18˾ӚGy圙9M6,0x)e3eT͢ ]6DB +U^b89Z/=N4ˇJjɿ.zB)GokVrN =6>{Vp‹ ĴzQ޲+=m2|X?i6jm'Wfj0&"v℀WFxZA޵pĥ?ְ3k5N{]µ:?WO[~l\zS]G6l9񕎍RȒ]Le8]Jg*C.vӂ |vb],, !//dѰ;RU4eŎ-.Swkn@pI!uИgBH1A}fpXwՠ&G1(j`!' K@d""Ef yx]!˙GQ Z@ @@q1!AqKF@@^sZ@Quy;|oG̛"I ΁rsf_ T]g@:.Bܸ|z6y@ŕmAvcF@`2ȹRΌ|-9XvZy* nKΙ &wxuK쉻gݓZEj{:>3gN}BȣCr2ܕ7%ArP( !%5Av2QB(V?(HG}K!PB'BO!BE?!~B!e dЗB(%,>}Dޯ0qTFb6m`Nqk޼yHHHڵ+3dзj⏭˲L%&Nj.R5JQfNHHZP%LБ#G26o kW iCn\ b}̊yK Oِ aFM)!(ld`t2ȡ+i3nq)wB9Cwyj &RvO?rs-9I3y~<5vJicM:6=3& 후<Ľb1K?}=Rְءx74m ϴu7}p7r}b7z+7..:>< al}.yuW5B1<8 dc7잽7H̜lŬxłQ6O_b!ph?zqdM<ܽQei?uPluk{Xs!(g=T~kot]nի=ϘP(<@2]i;3)fֹy;Vs[;^+1Wm+Eӓ jxF WӨ}+d1mw=6 @2/'ˇwq]1tsGv_8o\ ƶu:X߷yfrncW1T%nڄA ~qriQtm{;i$B3":G5:`o3g7"u\?]g9AQȎ̙v髊;︞ <TD]:xnw|wuBse^>ˬﭠ5 78L5l`4bH?TRÇumjRYu1$'mxĸd(`ox[Aˎ~=lƿr/!oR2.Gc51uS*zI%e×_>b2GI"gO:Z[ǘm !"(Q[O!,,Pc.0׵rf{]UY0홄<67}c{PP zy_ U_rjȧ46Ǽ{)S?m9z x8pp?D/lgmf΍Jٜy|bHAZ.1XSX52. 7U+WV() 뛢wa`UԳnĺi ]ǍstZ`c撹7v پtfe׻oX|_}, AE\3ncÎc>㗡з1kNN['rTlt5Nm@@j cNttuQ*5<6)bLz )~¹sѾ}5jB0W;dd߲g@4ǣVo;/V^a2}p"8iϯ_u^6ͩ_6<QmȜt`0 RQ˲Z9Uhz7[;v倢?CUuGw,=hk<40":Wg΢P+h8OD]9sFQ7FQp(_ܛոs@OGl+v14~ډgvnWV$)<1UQpҭU%h@B#3U#+W *퟼bTy9W֩gw Sˏ% 'N֤fUSS~WRH`Xa;f5*lW8@^:oo왳Rp0?s\*G2cNG)o? LNp9S&^ufnyIjy_F?ZS.1ݦCqzeGD\DuM7֪̘PTٞUmbV&'jy9-wU=GCK/֋CNhPU!$]3mv*JjʩTWW>`BL0A/h4"튄k jȻzܟI_9`(p؈ҎW.W~R5XVF?ӫUed(I;|: qω+/?93tWCS-ĵn^=}0%aĪ8viX*kĿqI3jBb:?kI\O3FmΙ_Ny/9?ն,%K|hC|x g.۴ŧk6ꨣ )V?ӆ=jR:;L:?)q)O/ܔ]~H歯61є=y_Z?Ѩ-: ]tkkW.elz=MGsFF&uouhAme,qa-4@ t1q׎x|oȤV?o,܄eW]8(zCöҥ ˂~ }tZŚoK7oV;nt'w{vn#ȶtb7o{g,{k~x'c.h;tU/€k3h}N0}C,z",6 yѯZ?/{~1K@S,KR@4W`7ҽ:n_}392B^^DCniAYLbXHҷ~p*ձTQD$|(7hk9 NՑs6`",2cQ@pՏLqڲU(L1UvsdG:N*;'0t#~: C^ rǜc5SV^"JVku:C3z1hw-1fwH VٕQqee+:羭_N u`[6M"(lzmApk(Z-@@woO5Q#sZL?CKP4zwk^ Z)7A!{'&m?X 漕h #pQG=<&fN܋X+טs|߹s^/ۃ /|Oh4p]!CO!B( !PB'BO!BE?!}<˘j' Zak)SJ<{2T5{%P9EV\h! j$}_;ïSR?=Ur 9>נQ~btsOdj10{5"^G!>8*p=6dqCo6ؽ f(I',,| p=΋x} e T!Q:V࿝[n[nEf p8֯__vm5yH*Wj@lƘ{RT|+Wspp0<<>>>.ͯrTBw^@*4yHܧÆ +շ~JDC~??9}رTe𸿺W^ TT yѴi5M\\kyIDATU<솿LLL۷BB^#b\\h?]v"պuWh><M[fM^O.R ǭL21Xjռ)Jj֬gy& *Tpݴ5j,˫N:TbR<<==###~ԩ\7;pZ Pc&,I_[<.oڊP:n\{ nx#%$nb\ 8)sϲ 3[LZi` (g ~rL|R^ZҲ"uI󺎜?+0)z_{ތ/%0gF{2MS;|8Ʋ e?))>gx' Q4EĄ"*KV:"c[+0esؙ2ɒRo[bi/ݐ4l}C=˷a OeYk"=bcPӈ~=}%v}6nMS.l7f[tMXzlJr-5viÛ k3wtάy5>Nׁ>M|7wS2M3dΛg/5"2 |J"g9Mī}Cx* σ wvlG=OzS6_ַ*jsJt0rGuۡ zuͱw;3mZuC7HdKshxo-}ɮ5sءj-;4~/ȞoUY3}cb 0TAefm+Un" o7Lebh(!0ԘNca7"Wcl+eϼre9Nn4lo~ I{yf-.2@Tzة2S_D<wS1&DE=E֜f͚!*.yC||Xg|+?([pIFt7^HғxHspEIzSyL v&¥l5iSVT`֣>zo>k+H;?ŝ5{vl֟^݋8yY\@;^9~,>%*#3wcR #g5A}EN<*xU T%oH;;*F52ED.]tUe+Stv܅+E-zuzFYýg=MS!eiGe]ΝQnLeoR9Xћ>Q,mF?'F5#~B!B( !PB'BO!BE?!bs?c03I34:FOe{p>x7/U n FáQ u m6@AgҳVgJp :<:m_T}/Ç7CCCTe׶G)R۫TUeKz [>!YB'BO!BE?!~B!B( !PB'BO!Xpq]fxbQ!,v{rr2qeff&%%_RUlٲT<\xB1BCCyB6|P5j$&&j4Z8DLOO_bE׮]n}Ѹq<<< n˖-B_hQ }nt:ɓ'+UTKv_>=˼Z*tzu:ua1kժuK&r8E?c׷M6w4vXo;BhѢŝ/ >2/!1~D,j2VJqVVj ~xΝIy߭QF>>>tӓ⬀֭[Rf@:FBoڴiVV*y2J-<<<Iy̢bm֬Yޔ֭[S 5nܸZmLL >!dxbxx脄*]V8K5!rXNIa*q]f/~ #+W ߭+LXlb E7\p_h yϭc*Q?MB`Ӫ)U9blH޿_\1>ևVX=u3d:Dεos NUC+򆤹z_3` <Hff5{g ;{ t;A/\;s_7|#l6Wbu{4pɠ׃1n4&*cz-ح5ρl#DlwS13hj%e۲rGͷ7ޣnQ4zg9BjOO.j/*%~[fNPߓҟ'lN8l՝W-9yp.I2rk b~ +> r慙qm*9xeè5t=!x*t6̙ x1~լA*h8y(C]?{ 9q1}NJH=TE;kSkeOsRI:u`rb]?V*^1FYf5WƧ~_y-~ +뻽+*g5[g$h1n~09+a%YEt*9 xȝ5KD o#ۮ:w4ERܿ ejAe ֚LH"ը_fJ֟oU?Eg_\P:DZ+FCj.^^JWurQ1* 꿚ռz8W&`J@XN{li䰛V7+`CDQ[&ܯgN"4{gvZ1w[#gqwY]Y9ovdxltek?Ƌ茷߯ԗAMŅ&IM7O-?ܩ/W7NBcڮzށ^N:ѨY;XzTh O ZA7ŏG\06TzT'ܱUU]Ns4 8@T &7\@q_5քo'cE8^q OZ=o ){2 i/ S3V<^~wE?wgrήqRZ\)T ?pZfFs>޼ BJ!{zG|stQ~BUF&BXNטPM Z&Cst3;B$ ,\%zbh=*٠T3 ZSX֩{,s $wijLN1RסBiү_%d C;w d(Kr+vK]ťU4V-if a`Dt @Ve p}U;UONã*2wrŤ1&9qvo)F Y^W+}0x^9م_>a (!䉏~`uܻ݀Q+תcjٚkw2njLyv8{CyUJW@wSyzEq jhp]`id7/%:\c$O[T||XSt0P)gTQ ׁ`ۧKZÞ!"&cE5J!B_;D*Seѷ|pij23 WK|U} g_A|ՐBkpkW\g7w%U2t[?!b^'\L<̤r=!^==Mo(T77w֖}3Ŭb+,'UgLtSWfx毲1.otrֽ_H|QN\nWLV#cFf߱w"Պxz !,ջle2(G v'|G5y5РL9P a}z=1?(X3@ V:Wk7ok|]@qXUnJR{dS؋A@$񙆃=o0vm/=;>naT~\kC|:qZD(5JW/`^!SN |pJ㝈~S'0Tlg(=,xVhӳ^΄LvlO;ƃ;kXÕ0ν7ބcizu*=<яWH)x{Ezc8-!=qmnTƼX iǘD2ՂTN0.87/(ۯpp97#3ɬ%s%xD.QLvwZ;k1iD\|cz`zah} [(>:=(&6d[{ j Q ju鹿U^ȉig,%8r ~g {$<@ӵ粷Ϟ,ڻ)~9p[> "d[ޒ;dw/Aun]t߾L-zAXtEd5,/͝~;_yo{IZ!^̼![Ny|cBO!BE?!~B!B( !PB'Rli^.%s-O`tz}&B@je3}#!%&O_>c3OGBK]h"QVۘ r&ؽ1QeOv1ot!~B!%!K!BE?!~B!B( !PB'BO!BE?!bR`ԂIENDB`qstopmotion-2.3.2-Source/manual/graphic/9.png000644 000000 000000 00000000507 12536560627 021114 0ustar00rootroot000000 000000 PNG  IHDR(ѿˊbKGD pHYs  tIME $"aIDATH @VvTQɨCB>O=vSDQQXf{||s"X-iPFaFa? Using qStopMotion together with other programs.

7. Using qStopMotion together with other programs.

One especially useful example of using qStopMotion with other programs is to use gimp (or another painting program) to add effects to the frames.

Figure 7.1 Adding effects with gimp

The best way to do this is to select the frame in the project tree of qStopMotion and pressing the gimp button to start gimp. Change around with it in gimp, then save the picture in gimp (File->Save (Ctrl-S)) (not save as).

qStopMotion should detect the changes automatically.

qstopmotion-2.3.2-Source/manual/index.html000644 000000 000000 00000006561 12751646113 020616 0ustar00rootroot000000 000000 qStopMotion user manual
qstopmotion-2.3.2-Source/manual/preferences.html000644 000000 000000 00000014757 12536560630 022016 0ustar00rootroot000000 000000 Description of the general preferences

10 Description of the qStopMotion preferences.

Xxx.

10.1. Genereal settings

Xxx

Figure 10.1 The general settings

Xxx

10.2. New project values

Xxx

Figure 10.2 The new project values

Xxx

10.3. Image Import

If the image importing doesn't work or if you want other settings you can change the way images are imported in qStopMotion.

This is done through the configure menu (Settings->Configure qStopMotion (Ctrl-P)) and you can either choose from one of the predefined settings or create your own.

Figure 10.3 The image import preferences

Image importing in qStopMotion works by continously asking an external program to grab a picture from the camera and place it in the .stopmotion directory. qStopMotion then displays this picture, and when this is done continously you get live video.

If you want to add a new import program you can do this by pressing the Add button. A new row appears in the table and you can fill in a name for your setting and a short description.

You then have to specify the command line options to import pictures. These can be set by selecting your setting and pressing the Edit button.

There are three things which can be specified here. The prepoll, start deamon and stop deamon fields. If the program for importing the images grabs one image and then exits you can leave the start and stop deamon fields blank. The contents of the prepoll field is a command which is run before importing a picture. If the import program is running in the foreground this will typically be the command line for grabbing the picture. Note that you have to write (DEFAULTPATH) in the command line on the place you otherwise would have speciefied the path to the file where the image should be stord. qStopMotion will replace this tag with the correct path and file name.

If the program you use for importing the pictures is running as a background/deamon process you have to specify command lines for starting and stoping the deamon. Again you should use the $importpath tag instead of the path to the file (se above). Prepoll could still be used but is not required. One potential use for the prepoll command when the grab program is running as a deamon process is to specify a command line which performes a operation such as scaling or rotating the picture. This command will be called on the pictures every time before importing them meaning the live video will be displayed with the effect.

10.4. Image transformation

Xxx

Figure 10.4 The image transformation preferences

Xxx

10.5. Video export

Xxx

Figure 10.5 The video export preferences

Xxx

10.6. Grabber

Xxx

Figure 10.6.1 The grabber preferences on Linux plattform

Xxx

Figure 10.6.2 The grabber preferences on Windows plattform

Xxx

qstopmotion-2.3.2-Source/manual/shortcut_keys.html000644 000000 000000 00000016746 12536560630 022423 0ustar00rootroot000000 000000 Shortcut keys

12. Shortcut keys

Table 1. General shortcuts

Ctrl-N Creates a New project.
Ctrl-O Opens an excisting project.
Ctrl-S Saves the project.
Ctrl-Shift-S Saves the project as.
Ctrl-Alt-V Opens a dialog to export the project as video.
Ctrl-Alt-C Opens a dialog to export the project as a Cinerella project.
Ctrl-Q Quits the application.
Ctrl-Z Undoes the last action.
Ctrl-Shift-Z Redoes the last undo.
Ctrl-X Cuts the selected frames out of the animation and places them on the global clipboard.
Ctrl-C Copies the selected frames to the global clipboard.
Ctrl-V Pastes pictures from the global clipboard and adds them to the animation after the selected frame.
Ctrl-G Brings up a menu where you can select a frame to jump to.
Ctrl-P Opens the import and export preferences menu.
Shift-F1 Gives you a what's this arrow for querying information about a user interface item.
Ctrl-F Adds one or several frames/pictures to the animation.
Ctrl-E Creates a new scene

Table 2. Toolbar shortcuts

  Play the animation.
*, P, Asterisk Go to the last frame of the take.
9, Page Up Go to the next frame of the take.
6, O, Right Go to the previous frame of the take.
3, L, Page Down Go to the first frame of the take.
/, Slash Go to the last take of the scene.
8, Up Go to the next take of the scene.
5, I, Clear Go to the previous take of the scene.
2, K, Down Go to the first take of the scene.
7, Home Go to the last scene of the project.
4, U, Left Go to the next scene of the project.
1, J, End Go to the previous scene of the project.
0, M, Insert Go to the first scene of the project.
Toggle whether the animation should loop when playing.

Table 3. Project tooltab shortcuts

C Start the camera.
Space, Return, Enter Capture a frame from the camera video stream.
Delete, Comma, Period Delete frame.
+, Plus Add take to the scene.
Shift-Delete Delete take.
-, Minus Add scene to the project.
Ctrl-Delete Delete scene.
  Switch to image mixing/onionskinning mode.
  Switch to image differentation mode.
  Switch to playback mode.
qstopmotion-2.3.2-Source/manual/running_animation.html000644 000000 000000 00000006676 12536560630 023235 0ustar00rootroot000000 000000 Running/previewing the animation

4. Running/previewing the animation

Now that you have added some test pictures to your animations wouldn't you like to run them as an animation?

qStopMotion allows you to preview your animation before exporting it. This can be done through the play panel.

Figure 4.1 The Run Animation menu

The play panel allows you to play ( (K)) and stop () the running of the animation. You can also move between frames ( (J), (L)) and to first or last frame ( (I), (O)).

Note The camera has to be off to use this menu.
qstopmotion-2.3.2-Source/manual/getting_images.html000644 000000 000000 00000004420 12536560627 022473 0ustar00rootroot000000 000000 Getting access to the image files in your animation.

9. Getting access to the image files in your animation.

If you want access to the image files in your animation project you can open project directory in your file browser. The directory is structured in the following way:

Figure 9.1 Animation project directory structure

Inside the images directory you will find the images.

qstopmotion-2.3.2-Source/manual/adding_pictures.html000644 000000 000000 00000005102 12536560627 022647 0ustar00rootroot000000 000000 Adding pictures

3. Adding pictures

The next step is to try adding some pictures from the harddrive.

You can do this by clicking on the (Ctrl-F) button on the project tab on the right hand side.

You will get the following dialog where you can select the pictures to add to the project:

Figure 3.1 The Add frames dialog

When you have selected some pictures you can click on the Open button and the pictures will be added to the project as frames.

qstopmotion-2.3.2-Source/manual/icons/lastscene.png000644 000000 000000 00000000753 12536560630 022420 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME pkIDATXUN0gEABU H /T/tb _@J@ݺUntb@B+0 m& gwrgEj"_ITE\ITEU ,}jc*ȤEDSp'&%fK-d6r&NO,3FTJ3Z+  F@[cU&dgL5gG[ zEj7d w98b B9¨ѕmIi+3#!D5b904ju&e#[WO7R4O]UJrښn3{Q1QvP@$r~FUIENDB`qstopmotion-2.3.2-Source/manual/icons/lastexposure.png000644 000000 000000 00000002323 12536560630 023170 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 2OSIDATXݗnG?{; 1iRZHHhԪR^A{Qo @R(cp߮wgDT1AIXiO>Y3ϼ)jGu 8/SCxW(k✣_<ǩoSsx־B`o֖x`?|v)~.@9qQR:Bca'yIn\d^;#~܏2CbD1Z0vI=~{뵥g4ekZw8s0sI)pEG>Y :.T׉.VPB B*!U!}WV#oVɴy';O:--mlQ,(\%\tw1 xAW•CQ JW%^9A H` QJf|IH #R]PB"?J`/fK(;q^}4M.՝*fUqZ`# *X;p3Bէ%X^/QVn~CӠM !5"9Ac# 3 (%qt$D)b7"t"xO#@fͮ^X[^15[IO̓ʀ%vҏbdБjqf‹o_zs/`Xf6B@%AJ cV}0TkuK>3x ?)K$2CifA"<"(xH bnbZk='E/rNWw!xX<IENDB`qstopmotion-2.3.2-Source/manual/icons/previoustake.png000644 000000 000000 00000000525 12536560630 023155 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME -3_btIDATX 0 EoD}K=s͍VBj.>o 3;ș6%C ?kƊO/Kf](|+2'[t RED4磯Zx/H(m6Y`vLDxx3qlի0" W7-HsL Z!ĀR"/l$9IENDB`qstopmotion-2.3.2-Source/manual/icons/cameraoff.png000644 000000 000000 00000001057 12536560627 022366 0ustar00rootroot000000 000000 PNG  IHDR- DsRGBbKGD pHYs  tIME $ XCIDATXVq0}u i-ZP .܂4@ n!蔃OR30OOoW lذaW`AD,Z<@Xku]3qQLDq8/S{CU[C= =RCu]"y?!쾫Li5.S)S!I>xW|YdUN9m#66BH L*DC}['aj:c:H$Xۡ cԳ%S1IeSJ>ƙ4m-ɍoVNGzmrK.~lŦiWYvwֆ)$-c{E`6!t!Hc1eaD|nSUE!u:XkozH _D e3Y]ޯ`&k j|+K; IENDB`qstopmotion-2.3.2-Source/manual/icons/nextexposure.png000644 000000 000000 00000002103 12536560630 023177 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME A&IDATXˎGjxa HHP")Ow{5 y *,L43|kUUC %8RoJ]sJ^|Âu!;t@m+so/u3/Ԕ+.x>чxinso>!?6<9{ڌ)fB<()=E#8gYg9ȱe{\PLۿǟ~>m) !Z3B7#7|=5ɘu2LwʒJuwPB B*!թ~[ .n|ץ2{~I0S2hT;;g 4}v?Vk*\|sW(ũA#aQ $Kmn%[-cpgsdpFކF QPlƶι E5O:|QR,J"+ u!_yІFؠ|{}I.NoIBEH9[0L ˥!/++F J/Sl7[ݘ'%dM*ڔly[؈0u1N }%ׯ`~05q5/߬HоfxtpxLS(B+aO:n!*L%Z"Dx2fo"nNg66qV,+qIYDtM"sF#7Ox`Ʉzp`2@uKK ^IV(6j@L#Mv %3I2fƔ˒#5rH=DbKj;ƂR#H4 K9q^XY@JJ CQ`gk[7`<ȆPNT^1-se^"3.tv O'Ӵ "(!p@ZIoyC <IENDB`qstopmotion-2.3.2-Source/manual/icons/lasttake.png000644 000000 000000 00000000536 12536560630 022246 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME + 4@IDATX 0 Eo(_~Pjq[%dyHp]QWa'x!h :9[Zp*H {{=TⒺ{xU >yC SgfQ=nJPKOXhg"(6OZ1FRs[k}RW)FX=~#wf VȁzŐZ+IENDB`qstopmotion-2.3.2-Source/manual/icons/removeframes.png000644 000000 000000 00000002302 12536560630 023122 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIMEC֑BIDATXMEYa?X ѻG'1&ޑcegtWAcA yTUOUCkSOUsν XXiޟ'q>| !P|jL3MYʅ3ڨ=pB}XxZm&ٰ}?xJ|Ryf:XUrc= _J73T['c5X3_I֪1oճ+LũA#atWb $ʩ2W/oGs5Z0`$%:)0흅^ǪN '4>kta9O'(`Or!_B/&&;7)C!,Pc>A'SNRITEH;LsCo ic`s}msM !' lj d^L&|X-1# CQ&3'cHtSΝ>9Bz crv$ n^(koqenmh)о&.Y78‹R*i=|B (B+nΰcNǭ!]q3 Rd$/K9Iv * U*Un?OیC$"Y' w%xKM/E :ɀnFfxA<Q,,8̋ W%dr01נtFSA CѷRpoTّd2%kؾT@@9ÜL5*bMRV.y`}ek`~ Sp,B@gC%ւH+-P|oދ#ksOev>!Ij'LNMo%0".H ʼ)C %{/ۋz9\{nxQ77z7IENDB`qstopmotion-2.3.2-Source/manual/icons/addscene.png000644 000000 000000 00000001032 12536560627 022202 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME:84IDATXVN0.":UX3 1 ^RJ钧@تJU7T:1 n D*pH$kn}>-sM}{\ 3[8 7D7| %HNę@#gfW/DdI ɵ钐$EleU,uB,~Bf8J2!אOE4PB㜈?8xF2pJ# YEK4W ̦ӳG%V E9@(ͦ{<@#ϕ;}m H?0Q%*Iw ~M"-}T20\kjeE8^^7A@Fx{IiGI,yRM3fɂi?X 7ˌIENDB`qstopmotion-2.3.2-Source/manual/icons/removetake.png000644 000000 000000 00000000442 12536560630 022574 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME +(97IDATX LeHh:؍9ghÝ0e`2}qA"͛8"*Ao% h%C"ZݾmgJID#حcc^kT4=1sЫ$`q8V¬e5@ =`u/p4^VIENDB`qstopmotion-2.3.2-Source/manual/icons/capture.png000644 000000 000000 00000000731 12536560627 022104 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 'YIDATX1r0EL\6gp&T9nEJLR2vC~Aٲ1S3*ZV𴞦>Xp p>M#N 8/t ^HV 3\P /;BkA6`]yYu@C"E!>B/z Gz%)6Wve`8Fۿ?c?LZtzNCRYF!Ntg{Z"+:}7yP[,RaL;ѳ Et`Y7=Ӌ QN-|sslO. E(DTqP&  a$)k3Pf<`{ Wk#|"`J]y"Qq0 {4M; /f,xy6*$IL nSۭ>=._-j.y<>v& b& mkOן8IC+NJan'>aI/^̖1jVSeJe*+++z߶Ay("ѾW7?`w%4X^<,aA*hZ F=j;5ja18KxJ- ́i^ԀW, "&NR{.nm Jb o!)LbI*\HD +!KJ",)A+tî^X[^I}H,Ty`.r_c2Pa?|7Lw/|['aL-  @ 4T SIea5r?HiŃ1ܸ5_~~E Kݤo_̼R:Ŝm8ec p^ҟ cixҮE9`%,Yӱ'XYh GZ\iq0L`ӗSp8LLANRՈGe(Jnw7$"r0Sf*D*aixI M`rX+t^4xh^ԉHkn5YwLw0e$ʤx fprz>-ɜ31nA0;_r-h4](]ҤyhG jL78 R XF r ZCwgRoV,MO8ha&IENDB`qstopmotion-2.3.2-Source/manual/icons/addtake.png000644 000000 000000 00000000615 12536560627 022037 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 63p} IDATXV0"b0!r 2&FHSB s)}1ݦa"nn_to| &&%4_y %t:y'z3!8SV+Rd,v"@REsU\E|q⒛&Z$a඲AM]$5N#k5T$41ZDV-n/9 ͯd7Cuֺo,Rkm`n\UX5sjR\HZO %>ގq IENDB`qstopmotion-2.3.2-Source/manual/icons/inserttake.png000644 000000 000000 00000000600 12536560630 022577 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME z&.1IDATXU =ķŏܾi|&Z$ սp휖 ְp}hotߐf很U)q]촇ϩ`xNz=#MiᅱJղ;Tp5)`2Rxt*AB"IDATXVA 0 Nc`/Kޔt7PYXq2*(.nAܺYpN88L8)@nQ OGg ! ,c)\: y㷪y&!IgfQX-B"EW;c*"BxfxR%Z))k}Ukbqu[ qWf%JL IENDB`qstopmotion-2.3.2-Source/manual/icons/note.png000644 000000 000000 00000000361 12536560630 021377 0ustar00rootroot000000 000000 PNG  IHDRRsRGBPLTE@ӫbKGDH pHYs  tIME YRIDAT- 0 'B>; a t~| b% t}zY4Ը򠚞=hϚ[sIENDB`qstopmotion-2.3.2-Source/manual/icons/cameraon.png000644 000000 000000 00000000763 12536560627 022233 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME M╿sIDATXVq0\14p.-ЂZP h@-VEri@0gouq‰=wk>꫃K)㤔.{?%9#":g/kW[ݺon bOnErp&+JRb}# RGvcʏ! Tx!X "r}]ӽn_/4:|q}έ\k~xAbcGTpu5󖺮ж_?oGki4mXEaB}!=afk:]fDa:1 M L0d1 6",e`oNn x>ZX_8RS2W}ߗM#Ixw?'-[ IENDB`qstopmotion-2.3.2-Source/manual/icons/stop.png000644 000000 000000 00000000562 12536560630 021422 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME .aL IDATX헱0<%bk +p\-o1Dͽ98O a;"eziSioNs?lE6 r=ۂ c΃UpD/vl <=_) 0Vx ~D.*ϓ X3*ocDCǤ oD 4N !zIENDB`qstopmotion-2.3.2-Source/manual/icons/firstscene.png000644 000000 000000 00000000754 12536560630 022605 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME(lIDATXVN0}gEaa2f@b@|@1Љ%| _Q1wVU҉ uC H,hSױf,g;=_Z?MR0 Rx7TBh{0($$7"$wr}/d%nq%\fV|pFfdSH=Nj\^=QЁ@1獀\!50X_h1o6,˙\De.lڎƓO9:SB%ՓmN SHƓr%]:.H%dȢֻ+8Tq6Zyؕ͋qNJ!0U<ӳ**$A`mxc -)vؿA=;~ \ҐIENDB`qstopmotion-2.3.2-Source/manual/icons/nextscene.png000644 000000 000000 00000000730 12536560630 022426 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIMEl_FXIDATXVNA\ƚ\a{Cl#~$G_A 3Heab茅=ػ=%+w_v潛y_iYMB9oM*5$@`EP嵫E@De6gl뉓$W8os'0@lkL;Xq}ـYm͆Y"vNɸ Go(|?Jbsrky0u)m ,+9_.Z3*Yf@7S)%~ԚDMW. o5iTV2 f1{ط\86]pOXOKLvIENDB`qstopmotion-2.3.2-Source/manual/icons/firsttake.png000644 000000 000000 00000000543 12536560630 022430 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 0 M(IDATX {2x&yݺB<`[R^ ' ~$;|O8PF_F# H(ų7`脚~X= >Y)m.ǫ¦[O igfѲbV@,7Q^rjfuw9ϳvO1.iHbEVT@V[QL R!Rz+IENDB`qstopmotion-2.3.2-Source/manual/icons/removescene.png000644 000000 000000 00000000702 12536560630 022744 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME >I BIDATXc`#04`H ) e9`"Ł8QjU9Ba[7D1?:}JBl3000,&D pFѳͲ!Y@NAD(0\8grt4;w2U+ν0sLF$&¦ 9'0-H<,'6̙3Y$&Ɨ Y0#3000L?==["2Y3xZ|_؍HnݜCN"d9#, nJtX>h*#DV8Ą!0wRr26IENDB`qstopmotion-2.3.2-Source/manual/icons/firstexposure.png000644 000000 000000 00000002331 12536560627 023361 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME O{YIDATX͖nG?{; 1iRZHHhԪR^A{Qo @R(cp߮wgDXAqBԑ53 {~{ y [|/~Y >;//@\bgglC8f 5v Yky_M8.Bʣ !Pr\Xk z`҄[7ٮזB?/~$(8yC|%*Rњ~ٰK:߳]]<3 )|.Z;q @T>8yHJ{!:1-D_qNtR9\*pm5fLkG_yH/y`i~`AGmc'dm4Fyp*jħwc6XU "B]C /|̽uCAb}(kKj+>c,d:DFmAǺp{K]5F[iq0M29/P(egsMf wOP ܈&",aUT>{<ӴDZ V.n# *֋%jބpXI5d1*!m3/w1^^0_r]wh](=Ҥg@NՄ^V5uFĔ_Iv ƽ>O5x3;X#EJ<oT.h4^vܼFZRYN 2.8.0) SET(RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single directory for all executables" ) MARK_AS_ADVANCED( EXECUTABLE_OUTPUT_PATH RUNTIME_OUTPUT_DIRECTORY ) IF(UNIX AND NOT APPLE) # Linux # Create a executable add_executable( qstopmotion ${SOURCES} ${MOC_SOURCES} ) # tell cmake which libraries to link target_link_libraries( qstopmotion ${GPHOTO2_LIBRARIES} ${V4L2_LIBRARIES} Qt5::Widgets ) ELSEIF(APPLE) # MacOSX # Create a executable add_executable( qstopmotion MACOSX_BUNDLE ${SOURCES} ${MOC_SOURCES} ) # tell cmake which libraries to link target_link_libraries( qstopmotion ${GPHOTO2_LIBRARIES} ${V4L2_LIBRARIES} Qt5::Widgets ) ELSEIF(WIN32) # Windows # Create a executable add_executable( qstopmotion WIN32 src/qstopmotion.rc ${SOURCES} ${MOC_SOURCES} ) # tell cmake which libraries to link target_link_libraries( qstopmotion ${MEDIAFOUNDATION_LIBRARIES} Qt5::WinMain Qt5::Widgets ) ENDIF() # Use the Qt5 modules qt5_use_modules( qstopmotion Core Gui Widgets Xml ) add_definitions( ${QT_DEFINITIONS} ) IF(WIN32) file(COPY graphics DESTINATION ".") file(COPY manual DESTINATION ".") file(COPY translations DESTINATION ".") file(COPY ${ICON_FILES} DESTINATION ".") file(COPY ${GENERAL_FILES} DESTINATION ".") IF(CMAKE_CL_64) # Windows 64bit IF(CMAKE_BUILD_TYPE STREQUAL "Release") file(COPY qt5runtime64bit/release/ DESTINATION "qtruntime") ELSE(CMAKE_BUILD_TYPE STREQUAL "Release") file(COPY qt5runtime64bit/debug/ DESTINATION "qtruntime") ENDIF(CMAKE_BUILD_TYPE STREQUAL "Release") file(COPY ffmpeg64bit/ DESTINATION "ffmpeg") file(COPY libav64bit/ DESTINATION "libav") ELSE(CMAKE_CL_64) # Windows 32bit IF(CMAKE_BUILD_TYPE STREQUAL "Release") file(COPY qt5runtime32bit/release/ DESTINATION "qtruntime") ELSE(CMAKE_BUILD_TYPE STREQUAL "Release") file(COPY qt5runtime32bit/debug/ DESTINATION "qtruntime") ENDIF(CMAKE_BUILD_TYPE STREQUAL "Release") file(COPY ffmpeg32bit/ DESTINATION "ffmpeg") file(COPY libav32bit/ DESTINATION "libav") ENDIF(CMAKE_CL_64) ENDIF(WIN32) IF(UNIX AND NOT APPLE) file(COPY graphics DESTINATION "share/qstopmotion/") file(COPY manual/ DESTINATION "share/doc/qstopmotion/") file(COPY translations DESTINATION "share/qstopmotion/") file(COPY icons DESTINATION "share/qstopmotion/") file(COPY ${ICON_FILES} DESTINATION "share/qstopmotion/") file(COPY ${GENERAL_FILES} DESTINATION "share/qstopmotion/") file(COPY ${UNIX_FILES} DESTINATION "share/qstopmotion/") file(COPY ${DEB_FILES} DESTINATION "share/qstopmotion/deb/") file(COPY ${RPM_FILES} DESTINATION "share/qstopmotion/rpm/") ENDIF(UNIX AND NOT APPLE) ############################################################################### # Installation ############################################################################### IF(WIN32) # The predefined windows installer path include the qstopmotion subdirectory SET(QSTOPMOTION_GENERALS_INSTALL_DIR ".") SET(QSTOPMOTION_BIN_INSTALL_DIR "bin") SET(QSTOPMOTION_GRAPHICS_INSTALL_DIR "graphics") SET(QSTOPMOTION_GRAPHICS_ICONS_INSTALL_DIR "graphics/icons") SET(QSTOPMOTION_GRAPHICS_PICTURES_INSTALL_DIR "graphics/pictures") SET(QSTOPMOTION_MANUAL_INSTALL_DIR "manual") SET(QSTOPMOTION_TRANSLATIONS_INSTALL_DIR "translations") SET(QSTOPMOTION_PIXMAP_INSTALL_DIR "pixmaps") SET(QSTOPMOTION_ICONS_INSTALL_DIR "icons") ENDIF(WIN32) IF(UNIX AND NOT APPLE) # The predefined CMake-Linux installer path is "/usr/local" # The predefined RPM installer path is "/usr" # The predefined DEB installer path is "/usr" SET(QSTOPMOTION_GENERALS_INSTALL_DIR "share/qstopmotion") SET(QSTOPMOTION_BIN_INSTALL_DIR "bin") SET(QSTOPMOTION_GRAPHICS_INSTALL_DIR "share/qstopmotion/graphics") SET(QSTOPMOTION_GRAPHICS_ICONS_INSTALL_DIR "share/qstopmotion/graphics/icons") SET(QSTOPMOTION_GRAPHICS_PICTURES_INSTALL_DIR "share/qstopmotion/graphics/pictures") SET(QSTOPMOTION_TRANSLATIONS_INSTALL_DIR "share/qstopmotion/translations") SET(QSTOPMOTION_MANUAL_INSTALL_DIR "share/doc/qstopmotion") SET(QSTOPMOTION_DESKTOP_INSTALL_DIR "share/applications") SET(QSTOPMOTION_MENUFILE_INSTALL_DIR "share/menu") SET(QSTOPMOTION_PIXMAP_INSTALL_DIR "share/pixmaps") SET(QSTOPMOTION_ICONS_INSTALL_DIR "share/icons") SET(QSTOPMOTION_MAN1_INSTALL_DIR "share/man/man1") ENDIF(UNIX AND NOT APPLE) # installation of the executables install( TARGETS qstopmotion RUNTIME DESTINATION ${QSTOPMOTION_BIN_INSTALL_DIR} ) # installation of the content of the grapics directory install( DIRECTORY graphics/ DESTINATION ${QSTOPMOTION_GRAPHICS_INSTALL_DIR} ) # installation of the content of the manual directory install( DIRECTORY manual/ DESTINATION ${QSTOPMOTION_MANUAL_INSTALL_DIR} ) # installation of the content of the translations directory install( DIRECTORY translations/ DESTINATION ${QSTOPMOTION_TRANSLATIONS_INSTALL_DIR} ) # installation only on Windows systems IF(WIN32) message("Special task for windows package!") # installation of the general-purpose files install( FILES ${GENERAL_FILES} DESTINATION ${QSTOPMOTION_GENERALS_INSTALL_DIR} ) ENDIF(WIN32) # installation only on UNIX systems IF(UNIX AND NOT APPLE) # installation of the general unix files install( FILES "linux/qstopmotion.mime" DESTINATION ${QSTOPMOTION_GENERALS_INSTALL_DIR} ) # installation of the icons install( DIRECTORY icons/ DESTINATION ${QSTOPMOTION_ICONS_INSTALL_DIR} ) # installation of the .desktop file install( FILES "linux/qstopmotion.desktop" DESTINATION ${QSTOPMOTION_DESKTOP_INSTALL_DIR} ) # installation of the .1.gz file install( FILES "linux/qstopmotion.1.gz" DESTINATION ${QSTOPMOTION_MAN1_INSTALL_DIR} ) ENDIF(UNIX AND NOT APPLE) # installation on DEB systems IF(CPACK_BINARY_DEB) message("Special task for deb package!") # installation of the icon file install( FILES "deb/qstopmotion.xpm" DESTINATION ${QSTOPMOTION_PIXMAP_INSTALL_DIR} ) # installation of the .menufile file install( FILES "deb/qstopmotion.menu" DESTINATION ${QSTOPMOTION_MENUFILE_INSTALL_DIR} ) # installation of the changelog file install( FILES "deb/changelog.gz" DESTINATION ${QSTOPMOTION_MANUAL_INSTALL_DIR} ) # installation of the copyright file install( FILES "deb/copyright" DESTINATION ${QSTOPMOTION_MANUAL_INSTALL_DIR} ) ENDIF(CPACK_BINARY_DEB) # installation on RPM systems IF(CPACK_BINARY_RPM) message("Special task for rpm package!") # installation of the general-purpose files install( FILES ${GENERAL_FILES} DESTINATION ${QSTOPMOTION_GENERALS_INSTALL_DIR} ) # installation of the icon file install( FILES "rpm/qstopmotion.png" DESTINATION ${QSTOPMOTION_PIXMAP_INSTALL_DIR} ) ENDIF(CPACK_BINARY_RPM) # installation on Windows systems IF(WIN32) IF(CMAKE_CL_64) # Windows 64bit # installation of Qt runtime IF(CMAKE_BUILD_TYPE STREQUAL "Release") install( DIRECTORY qt5runtime64bit/release/ DESTINATION ${QSTOPMOTION_BIN_INSTALL_DIR} ) ELSE(CMAKE_BUILD_TYPE STREQUAL "Release") install( DIRECTORY qt5runtime64bit/debug/ DESTINATION ${QSTOPMOTION_BIN_INSTALL_DIR} ) ENDIF(CMAKE_BUILD_TYPE STREQUAL "Release") # installation of ffmpeg install( DIRECTORY ffmpeg64bit/ DESTINATION "${QSTOPMOTION_GENERALS_INSTALL_DIR}/ffmpeg" ) # installation of libav install( DIRECTORY libav64bit/ DESTINATION "${QSTOPMOTION_GENERALS_INSTALL_DIR}/libav" ) ELSE(CMAKE_CL_64) # Windows 32bit # installation of Qt runtime IF(CMAKE_BUILD_TYPE STREQUAL "Release") install( DIRECTORY qt5runtime32bit/release/ DESTINATION ${QSTOPMOTION_BIN_INSTALL_DIR} ) ELSE(CMAKE_BUILD_TYPE STREQUAL "Release") install( DIRECTORY qt5runtime32bit/debug/ DESTINATION ${QSTOPMOTION_BIN_INSTALL_DIR} ) ENDIF(CMAKE_BUILD_TYPE STREQUAL "Release") # installation of ffmpeg install( DIRECTORY ffmpeg32bit/ DESTINATION "${QSTOPMOTION_GENERALS_INSTALL_DIR}/ffmpeg" ) # installation of libav install( DIRECTORY libav32bit/ DESTINATION "${QSTOPMOTION_GENERALS_INSTALL_DIR}/libav" ) ENDIF(CMAKE_CL_64) ENDIF(WIN32) ############################################################################### ############################################################################### # # Packaging # ############################################################################### ############################################################################### ############################################################################### # General packaging settings ############################################################################### SET( CPACK_PACKAGE_NAME "qstopmotion" ) SET( CPACK_PACKAGE_DESCRIPTION_SUMMARY "Create stop motion animations" ) SET( CPACK_PACKAGE_VENDOR "Ralf Lange, qstopmotion.org" ) SET( CPACK_PACKAGE_CONTACT "Ralf Lange " ) SET( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.txt" ) SET( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING" ) SET( CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\graphics\\\\qstopmotion_logo_installer.bmp" ) SET( CPACK_PACKAGE_INSTALL_DIRECTORY "qStopMotion ${QSTOPMOTION_VERSION_MAJOR}.${QSTOPMOTION_VERSION_MINOR}.${QSTOPMOTION_VERSION_PATCH}" ) SET( CPACK_PACKAGE_EXECUTABLES "qstopmotion" "qStopMotion" ) SET( CPACK_STRIP_FILES "qstopmotion" ) SET( CPACK_SOURCE_STRIP_FILES "" ) SET( CPACK_PACKAGE_VERSION_MAJOR "${QSTOPMOTION_VERSION_MAJOR}" ) SET( CPACK_PACKAGE_VERSION_MINOR "${QSTOPMOTION_VERSION_MINOR}" ) SET( CPACK_PACKAGE_VERSION_PATCH "${QSTOPMOTION_VERSION_PATCH}" ) SET( CPACK_TOPLEVEL_TAG "/user" ) # CPACK_PACKAGE_VERSION - generated from major, minor, patch IF(UNIX AND NOT APPLE) # Try to find architecture execute_process (COMMAND uname -m OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE) string (STRIP "${CPACK_PACKAGE_ARCHITECTURE}" CPACK_PACKAGE_ARCHITECTURE) # Try to find distro name and distro-specific arch execute_process (COMMAND lsb_release -is OUTPUT_VARIABLE LSB_ID) execute_process (COMMAND lsb_release -rs OUTPUT_VARIABLE LSB_RELEASE) string (STRIP "${LSB_ID}" LSB_ID) string (STRIP "${LSB_RELEASE}" LSB_RELEASE) SET (LSB_DISTRIB "${LSB_ID}${LSB_RELEASE}") IF (NOT LSB_DISTRIB) SET( LSB_DISTRIB "unix" ) ENDIF (NOT LSB_DISTRIB) SET( CPACK_SYSTEM_NAME "${LSB_DISTRIB}-${CPACK_PACKAGE_ARCHITECTURE}" ) MESSAGE("UNAME Infos =========================================================") MESSAGE("UNAME_ARCHITECTURE: ${UNAME_ARCHITECTURE}") MESSAGE("UNAME_LINUX_VERSION: ${UNAME_LINUX_VERSION}") MESSAGE("LSB Infos ===========================================================") MESSAGE("LSB_ID: ${LSB_ID}") MESSAGE("LSB_RELEASE: ${LSB_RELEASE}") MESSAGE("LSB_DISTRIB: ${LSB_DISTRIB}") MESSAGE("Infos ===============================================================") MESSAGE("CPACK_SYSTEM_NAME: ${CPACK_SYSTEM_NAME}") MESSAGE("CPACK_PACKAGE_ARCHITECTURE: ${CPACK_PACKAGE_ARCHITECTURE}") MESSAGE("End Infos ===========================================================") ENDIF(UNIX AND NOT APPLE) ############################################################################### # Source Packages ############################################################################### IF(WIN32) # Exclude: # * Mercurial SMC files SET( CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "${PROJECT_SOURCE_DIR}/.hg/" "${PROJECT_SOURCE_DIR}/.hgignore" "${PROJECT_SOURCE_DIR}/.hgtags" "${PROJECT_SOURCE_DIR}/.hgtimestamp" ) ENDIF(WIN32) IF(UNIX AND NOT APPLE) # Exclude: # * Mercurial SMC files # * ffmpeg Windows binaries # * libav Windows binaries # * Qt Windows runtime SET( CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "${PROJECT_SOURCE_DIR}/.hg/" "${PROJECT_SOURCE_DIR}/.hgignore" "${PROJECT_SOURCE_DIR}/.hgtags" "${PROJECT_SOURCE_DIR}/.hgtimestamp" "${PROJECT_SOURCE_DIR}/ffmpeg32bit/" "${PROJECT_SOURCE_DIR}/ffmpeg64bit/" "${PROJECT_SOURCE_DIR}/libav32bit/" "${PROJECT_SOURCE_DIR}/libav64bit/" "${PROJECT_SOURCE_DIR}/qt4runtime/" "${PROJECT_SOURCE_DIR}/qt5runtime32bit/" "${PROJECT_SOURCE_DIR}/qt5runtime64bit/" ) ENDIF(UNIX AND NOT APPLE) ############################################################################### # NSIS - Windows only ############################################################################### # Installers for 32- vs. 64-bit CMake: # - Root install directory (displayed to end user at installer-run time) # - "NSIS package/display name" (text used in the installer GUI) # - Registry key used to store info about the installation IF(CMAKE_CL_64) # 64-bit Windows SET( CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64" ) SET( CPACK_NSIS_PACKAGE_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} (Win64)" ) SET( CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION} (Win64)" ) ELSE(CMAKE_CL_64) # 32-bit Windows SET( CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES" ) SET( CPACK_NSIS_PACKAGE_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY}" ) SET( CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}" ) ENDIF(CMAKE_CL_64) MESSAGE("CPACK_NSIS_INSTALL_ROOT: ${CPACK_NSIS_INSTALL_ROOT}") MESSAGE("CPACK_NSIS_PACKAGE_NAME: ${CPACK_NSIS_PACKAGE_NAME}") MESSAGE("CPACK_PACKAGE_INSTALL_REGISTRY_KEY: ${CPACK_PACKAGE_INSTALL_REGISTRY_KEY}") # Installing Microsoft run time libraries in the same directory as the executables SET( CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true ) INCLUDE(InstallRequiredSystemLibraries) INSTALL( PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION ${QSTOPMOTION_BIN_INSTALL_DIR} ) # There is a bug in NSI that does not handle full unix paths properly. Make # sure there is at least one set of four (4) backlasshes. # Set the icons for the installer and the uninstaller SET( CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/graphics/qstopmotion.ico" ) SET( CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}/graphics/qstopmotion.ico" ) # Set the project name on the first page # Use CPACK_PACKAGE_INSTALL_DIRECTORY # Set the bitmap for the second and following pages # Use CPACK_PACKAGE_ICON # Set the licence text for the second page # Use CPACK_RESOURCE_FILE_LICENSE # Enable modify path environment variable on third page SET( CPACK_NSIS_MODIFY_PATH ON ) # Set the executable name for the desktop icon on third page SET( CPACK_CREATE_DESKTOP_LINKS qstopmotion ) # Create shortcuts in the start menu # Use CPACK_PACKAGE_EXECUTABLES SET(CPACK_NSIS_MENU_LINKS "manual/index.html" "qStopMotion Help" "http://www.qstopmotion.org" "qStopMotion Web Site" ) # SET(CPACK_NSIS_INSTALLED_ICON_NAME "qstopmotion.exe") # SET(CPACK_NSIS_DISPLAY_NAME "qStopMotion") # SET(CPACK_NSIS_PACKAGE_NAME "qStopMotion") # SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.qstopmotion.org") # SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.longsoft.de") SET( CPACK_NSIS_CONTACT ${CPACK_PACKAGE_VENDOR} ) # Run the application on the finish page # SET(CPACK_NSIS_MUI_FINISHPAGE_RUN "qstopmotion.exe" ############################################################################### # DEB package - Linux only (Debian, OpenSuse, Ubuntu, ...) ############################################################################### IF ("${LSB_DISTRIB}" MATCHES "Ubuntu|Debian") # We need to alter the architecture names as per distro rules IF ("${CPACK_PACKAGE_ARCHITECTURE}" MATCHES "i[3-6]86") SET( CPACK_PACKAGE_ARCHITECTURE "i386" ) ENDIF ("${CPACK_PACKAGE_ARCHITECTURE}" MATCHES "i[3-6]86") IF ("${CPACK_PACKAGE_ARCHITECTURE}" MATCHES "x86_64") SET( CPACK_PACKAGE_ARCHITECTURE "amd64" ) ENDIF ("${CPACK_PACKAGE_ARCHITECTURE}" MATCHES "x86_64") SET( CPACK_SYSTEM_NAME "${LSB_DISTRIB}-${CPACK_PACKAGE_ARCHITECTURE}" ) # Set the dependencies based on the distro version # thus only one package is build you must list here *any* depending libraries, # even if they are only used in one module IF ("${LSB_DISTRIB}" MATCHES "Ubuntu14.04") SET( CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>=2.11), libavbin0 (>=7-1), libqt5core5 (>=5.2.1) | libqt5core5a (>=5.2.1), libqt5gui5 (>=5.2.1), libqt5widgets5 (>=5.2.1), libqt5xml5 (>=5.2.1), libv4l-0 (>=1.0.0), libgphoto2-6 (>=2.5.3), qt5-image-formats-plugins (>=5.2.1)" ) ENDIF ("${LSB_DISTRIB}" MATCHES "Ubuntu14.04") IF ("${LSB_DISTRIB}" MATCHES "Ubuntu16.04") SET( CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>=2.11), ffmpeg (>=2.8.6), libqt5core5 (>=5.3.2) | libqt5core5a (>=5.3.2), libqt5gui5 (>=5.3.2), libqt5widgets5 (>=5.3.2), libqt5xml5 (>=5.3.2), libv4l-0 (>=1.0.0), libgphoto2-6 (>=2.5.3), qt5-image-formats-plugins (>=5.3.2)" ) ENDIF ("${LSB_DISTRIB}" MATCHES "Ubuntu16.04") IF ("${LSB_DISTRIB}" MATCHES "Debian7.*") SET( CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>=2.11), ffmpeg (>=0.8.9), libqtcore4 (>=4.8.2), libqtgui4 (>=4.8.2), libqt4-xml (>=4.8.2), libv4l-0 (>=0.8.8), libgphoto2-2 (>=2.4.14), libgphoto2-port0 (>=2.4.14)" ) ENDIF ("${LSB_DISTRIB}" MATCHES "Debian7.*") IF ("${LSB_DISTRIB}" MATCHES "Debian8.*") SET( CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>=2.11), libav-tools (>=6:11.3), libqt5core5 (>=5.3.2) | libqt5core5a (>=5.3.2), libqt5gui5 (>=5.3.2), libqt5widgets5 (>=5.3.2), libqt5xml5 (>=5.3.2), libv4l-0 (>=1.0.0), libgphoto2-6 (>=2.5.3), qt5-image-formats-plugins (>=5.3.2)" ) ENDIF ("${LSB_DISTRIB}" MATCHES "Debian8.*") IF (NOT CPACK_DEBIAN_PACKAGE_DEPENDS) MESSAGE ("WARNING: ${LSB_DISTRIB} not supported yet.\nPlease set deps in CMakeLists.txt before packaging.") ENDIF (NOT CPACK_DEBIAN_PACKAGE_DEPENDS) ENDIF ("${LSB_DISTRIB}" MATCHES "Ubuntu|Debian") MESSAGE("CPACK_DEBIAN_PACKAGE_DEPENDS: ${CPACK_DEBIAN_PACKAGE_DEPENDS}") # Mandatory # CPACK_DEBIAN_PACKAGE_NAME = CPACK_PACKAGE_NAME MESSAGE("CPACK_DEBIAN_PACKAGE_NAME: ${CPACK_DEBIAN_PACKAGE_NAME}") # CPACK_DEBIAN_PACKAGE_VERSION = CPACK_PACKAGE_VERSION MESSAGE("CPACK_DEBIAN_PACKAGE_VERSION: ${CPACK_DEBIAN_PACKAGE_VERSION}") # CPACK_DEBIAN_PACKAGE_ARCHITECTURE = dpkg output # dpkg --print-architecture ??? MESSAGE("CPACK_DEBIAN_PACKAGE_ARCHITECTURE: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") # CPACK_DEBIAN_PACKAGE_MAINTAINER = CPACK_PACKAGE_CONTACT MESSAGE("CPACK_DEBIAN_PACKAGE_MAINTAINER: ${CPACK_DEBIAN_PACKAGE_MAINTAINER}") SET( CPACK_DEBIAN_PACKAGE_DESCRIPTION "create stop motion animations\n qStopMotion can be used to create stop motion animations." ) MESSAGE("CPACK_DEBIAN_PACKAGE_DESCRIPTION: ${CPACK_DEBIAN_PACKAGE_DESCRIPTION}") SET( CPACK_DEBIAN_PACKAGE_SECTION "graphics" ) MESSAGE("CPACK_DEBIAN_PACKAGE_SECTION: ${CPACK_DEBIAN_PACKAGE_SECTION}") SET( CPACK_DEBIAN_PACKAGE_PRIORITY "optional" ) MESSAGE("CPACK_DEBIAN_PACKAGE_PRIORITY: ${CPACK_DEBIAN_PACKAGE_PRIORITY}") # Options SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${QSTOPMOTION_HOMEPAGE}) # CPACK_DEBIAN_PACKAGE_SHLIBDEPS # SET(CPACK_DEBIAN_PACKAGE_DEBUG "ON") # CPACK_DEBIAN_PACKAGE_DEBUG # CPACK_DEBIAN_PACKAGE_ENHANCES # CPACK_DEBIAN_PACKAGE_BREAKS # CPACK_DEBIAN_PACKAGE_CONFLICTS # CPACK_DEBIAN_PACKAGE_PROVIDES # CPACK_DEBIAN_PACKAGE_REPLACES SET( CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/deb/postinst" ) ############################################################################### # RPM package - Linux only (Fedora, Red Hat, CentOS, Mandriva, ...) ############################################################################### # Mandatory SET( CPACK_RPM_PACKAGE_SUMMARY ${CPACK_PACKAGE_DESCRIPTION_SUMMARY} ) MESSAGE("CPACK_RPM_PACKAGE_SUMMARY: ${CPACK_RPM_PACKAGE_SUMMARY}") # CPACK_RPM_PACKAGE_NAME = CPACK_PACKAGE_NAME MESSAGE("CPACK_RPM_PACKAGE_NAME: ${CPACK_RPM_PACKAGE_NAME}") # CPACK_RPM_PACKAGE_VERSION = CPACK_PACKAGE_VERSION MESSAGE("CPACK_RPM_PACKAGE_VERSION: ${CPACK_RPM_PACKAGE_VERSION}") # SET(CPACK_RPM_PACKAGE_RELEASE "1") MESSAGE("CPACK_RPM_PACKAGE_RELEASE: ${CPACK_RPM_PACKAGE_RELEASE}") SET( CPACK_RPM_PACKAGE_LICENSE "GPLv2" ) MESSAGE("CPACK_RPM_PACKAGE_LICENSE: ${CPACK_RPM_PACKAGE_LICENSE}") SET( CPACK_RPM_PACKAGE_GROUP "Applications/Multimedia" ) MESSAGE("CPACK_RPM_PACKAGE_GROUP: ${CPACK_RPM_PACKAGE_GROUP}") # CPACK_RPM_PACKAGE_VENDOR = CPACK_PACKAGE_VENDOR MESSAGE("CPACK_RPM_PACKAGE_VENDOR: ${CPACK_RPM_PACKAGE_VENDOR}") # CPACK_RPM_PACKAGE_MAINTAINER = CPACK_PACKAGE_CONTACT MESSAGE("CPACK_RPM_PACKAGE_MAINTAINER: ${CPACK_RPM_PACKAGE_MAINTAINER}") # Options # SET(CPACK_RPM_PACKAGE_ARCHITECTURE "noarch") SET( CPACK_RPM_PACKAGE_URL ${QSTOPMOTION_HOMEPAGE} ) # CPACK_RPM_PACKAGE_DESCRIPTION = CPACK_PACKAGE_DESCRIPTION_FILE # CPACK_RPM_COMPRESSION_TYPE # requireses must be in a aphabetic order # Qt5: qt5-qtbase - Core, Concurrent, DBus, Network, Sql, Test, Xml # Qt5: qt5-qtbase-gui - Gui, OpenGL, PrintSupport, Widgets, XcbQpa # Qt5: qt5-qtimageformats - Qt5 image format plugins # Qt5: qt5-qtmultimedia - Multimedia, MultimediaQuick, MultimediaWidgets SET( CPACK_RPM_PACKAGE_REQUIRES "glibc >= 2.12, libgphoto2 >= 2.4.7, libv4l >= 0.6.3, qt5-qtbase >= 5.2.0, qt5-qtbase-gui >= 5.2.0, qt5-qtimageformats >= 5.2.0" ) MESSAGE("CPACK_RPM_PACKAGE_REQUIRES: ${CPACK_RPM_PACKAGE_REQUIRES}") # CPACK_RPM_PACKAGE_SUGGESTS # CPACK_RPM_PACKAGE_PROVIDES # SET(CPACK_RPM_SPEC_INSTALL_POST "desktop-file-validate /usr/share/applications/qstopmotion.desktop") # SET(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "pre_install.sh") # SET(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "post_install.sh") # SET(CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE "pre_install.sh") # SET(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE "post_install.sh") # Prevent conflicts with the filesystem package SET( CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/usr/bin" "/usr/share/applications" "/usr/share/icons" "/usr/share/pixmaps" "/usr/share/man" "/usr/share/man/man1" ) ############################################################################### # Activate packaging functionality ############################################################################### INCLUDE(CPack) ############################################################################### # "this is the end" ############################################################################### qstopmotion-2.3.2-Source/README_VisualStudio_Windows.txt000755 000000 000000 00000014142 12751646113 023264 0ustar00rootroot000000 000000 Building qStopMotion using MS Visual Studio Last Change: 2016-05-10 1. Preparation of the development environment ================================================================================ 1.1 Install the Visual Studio 2013 -------------------------------------------------------------------------------- * Download the "Visual Studio 2013 Community Edition" * This package including the Visual Studio 2010 command line tools. * Install in the default installation directory (C:\Program Files\Microsoft Visual Studio 12.0). - Switch off all optional features - Start the IDE and search for updates * Add the binary directory to the path variable (C:\Program Files\Microsoft Visual Studio 12.0\VC\bin\). 1.2 Install the Windows SDK -------------------------------------------------------------------------------- * Download the "Windows Software Development Kit for Windows 8.1" * This package including the debugging tools for windows. * Install in the default installation directory (C:\Program Files\Windows Kits\v8.1). 1.3 Qt5 for Windows and Visual Studio -------------------------------------------------------------------------------- * Download Qt runtime 5.5.x for Windows 64-bit (VS 2013) from qt-project.com/downloads * Install in the Directory C:\Tools\Qt\... * Qt need write permissions to this directory during compilation and linking. * Add the binary directory to the path variable (e.g. C:\Tools\Qt\Qt5.5.1\bin\). * Set the environment variable 'Qt5_DIR' to 'C:\Tools\Qt\Qt5.5.1\5.5\msvc2013_64\' 1.4 CMake -------------------------------------------------------------------------------- * Download CMake >= 3.3.2 (32bit) from "http://www.cmake.org/cmake/resources/software.html" * Install in the default installation directory. * Add CMake to the system PATH for all users. * Create a start script for CMake (C:\Tools\cmakestart.bat) rem Set the Visual Studion 10 environment variables call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" rem Start CMake "C:\Program Files (x86)\CMake 2.8\bin\cmake-gui.exe" * Create a shortcut to the start script. 1.5 Mercurial SCM (Developers only) -------------------------------------------------------------------------------- * Download Mercurial or TortoiseHG with Mercurial from "http://mercurial.selenic.com/downloads" * Install in the default installation directory. 1.6 NSIS 2.46 -------------------------------------------------------------------------------- * Download NSIS from "http://nsis.sourceforge.net/Main_Page" * Install in the default installation directory. 2. Access to the sources of qStopMotion ================================================================================ 2.1 Download the sources (last release of qStopMotion) -------------------------------------------------------------------------------- * Downoad qstopmotion--Source.zip or qstopmotion--Source.tar.Z from http://sourceforge.net/projects/qstopmotion/files/ 2.2 Anonymous read only access to the repository (latest developer version) -------------------------------------------------------------------------------- * hg clone http://hg.code.sf.net/p/qstopmotion/code qstopmotion 2.3 Developer access to the repository (read and write access) -------------------------------------------------------------------------------- 2.3.1 Create a Source Forge account * Create a Source Forge account on https://sourceforge.net/user/registration * Add your account to the qStopMotion developers on http://sourceforge.net/projects/qstopmotion 2.3.2 Create a .hgrc file * Create a .hgrc file in your home directory * Content of the file: [ui] username = Your Name [auth] qstopmotion.prefix = https://hg.code.sf.net/p/qstopmotion/code qstopmotion.username = qstopmotion.password = 2.3.3 Create a local repository * hg clone https://hg.code.sf.net/p/qstopmotion/code qstopmotion 3. Building qStopMotion ================================================================================ 3.1 Add the ffmpeg encoder to the sources directory -------------------------------------------------------------------------------- * Download the latest static version from http://ffmpeg.zeranoe.com/builds/ * Unpack the 7z file to the qstopmotion directory * Rename the ffmpeg directory to 'ffmpeg' 3.2 Add the qtruntime to the sources directory -------------------------------------------------------------------------------- * Create a new directory qtruntime in the source directory * Copy QtCore4.dll, QtGui4.dll and QtXml.dll from Qt installation bin directory to the new qtruntime directory * Copy QtCored4.dll, QtGuid4.dll and QtXmld.dll from Qt installation bin directory to the new qtruntime directory * Copy the directory imageformats from Qt installation plugins directory to the new qtruntime directory 3.3 Create the Visual Studio Solution -------------------------------------------------------------------------------- * Start the CMake GUI using the shortcut to the start script. * Select the directory with the cmakelist.txt file * Select the destination directory * Press the configure button * Select the generator "Visual Studio 12 2013 Win64" * Press the generate button 3.4 Build the application -------------------------------------------------------------------------------- * Start MS Visual Studio * Open the new created solution file (qstopmotion.sln) * Activate the project "qstopmotion" as the active project * Build | Build Solution * Locking for error and warning messages 4. Installation ================================================================================ * Start MS Visual Studio with a administrator account (The problem is to create the dircorys in the windows program files directory) * Open the solution file (qstopmotion.sln) * Build the project "INSTALL" 5. Starting qStopMotion ================================================================================ * Select the video source * Have fun. qstopmotion-2.3.2-Source/Changes.txt000755 000000 000000 00000022713 13011063365 017445 0ustar00rootroot000000 000000 Last Changes in the sources on qStopMotion =============================================================================== qStopMotion (2.3.2) - 2016-11-10 * Some spelling corrections. * Update of the Czech translation. qStopMotion (2.3.0) - 2016-08-02 * Overlay intensity slider now works. * Change the onion scinning to gray scale images. * Remove all gstreamer using. * Bug fixing. qStopMotion (2.2.0) - 2016-05-09 * Change the controller dialog from listboxes to slider * Improve the gphoto image grabber * Bug fixing. qStopMotion (2.0.2) - 2015-09-09 * Update the Ubuntu package generation. Fix most of the lintian messages. * Add the CentOS package generation. * Bug fixing. qStopMotion (2.0.1) - 2015-06-11 * Update the DEB package generation. Fix most of the lintian messages. * Update the RPM package generation. * Video4Linux2 grabber can handle BGR image format. * Add libav as the second encoder application. qStopMotion (2.0.0 (Beta)) - 2015-05-21 * Remove of the Gstreamer grabber from the Windows platform. * On Windows qStopMotion can be started as an portable application. * Video4Linux2 grabber on the Linux platform. * Camera controller for the Video4Linux2 grabber. qStopMotion (1.1.0) - 2014-12-09 * Last Windows Gstreamer release * Media Foundation grabber on the Windows platform. * Camera controller dialog to control all posible camera features. * Camera controller for the Media Foundation grabber. * Gphoto2 greabber on the Linux platform (Experimental, not finished). * Camera controller for the Gphoto2 grabber (Experimental, not finished). * Update of the user interface. Preferences of the project in the file menue, Properties of the application in the edit menu. * Optional grid in the live image view. qStopMotion (1.0.1) - 2012-05-15 * Fix Bugs * Full implementation of undo and redo functionality. * Full implementation of the recovery functionality. * Call gimp works on all platforms. * French localization. qStopMotion (1.0.0) - 2012-03-12 * Fix Bugs qStopMotion (0.9.11, release candidat 3) - 2012-02-21 * Fix Bugs * Add packaging for Linux DEB package. * Update the German language translation. qStopMotion (0.9.10, release candidat 2) - 2012-02-10 * Fix Bugs * Add the Qt runtime to the windows installer. * Add the ffmpeg runtime to the windows installer. * Add the download and installation of the 'GStreamer OSS Build' to the windows installer. * Now all actions are in the undo list. Undo is not possible. qStopMotion (0.9.9, release candidat) - 2012-01-03 * Fix Bugs * Feature freeze for version 1.0.0. * Conzentration of the image grabber functionality in the technical/grabber classes. * Change the selection of the video device from device type list to device name list. * Handling of more than one device per device type. * Check source code quality with "valgrind". qStopMotion (0.9.8) - 2011-10-21 * Fix Bugs * Selection of the capture butten functionality in the general tab of the preferences dialog in the preferences menu. * Insert Scenes functionality. * Insert Takes functionality. * Insert Frames functionality. * Check source code quality with "cppcheck". qStopMotion (0.9.7) * Fix Bugs * Syncronous selection of scene, take and exposure in the project tree. * Remove Scenes functionality. * Remove Takes functionality. * Add / Remove Frames functionality * Implementation of the ProjectTab Class as a Observer * Remove all project tree functionality from the animation project * Concentration of all changes in the project, the views and the frontend in the Domain Factory class * Add undo history entries for all changes in the animation project qStopMotion (0.9.6) * Fix Bugs * change the configuration system from automake to CMake. * using the CMakeLists.txt instead of qstopmotion.pro in the Qt-Creator. * Add installation functionality * Add packaging for Windows (NSIS Installer). * Add packaging for Linux RPM package. * Add packaging for source package. qStopMotion (0.9.5) * Fix Bugs * Add Scenes functionality. * Add Takes functionality. * Config files only used for linux and mac systems. * Create dirctories on windows systems using the installation path of the binary. * Conzentrate the handling of directories in the frontend main class. qStopMotion (0.9.4) * Fix Bugs * Remove of static get function form the PreferencesTool and add the PreferencesTool as a pointer to the QtFrontend. * Move ExternalCommand to dirctory frontends/qtfrontend/dialogs and rename to ExternalCommandDialog. * Project tree on the project tool tab. * Add Takes functionality. qStopMotion (0.9.3) * New general settings tab in the preferences dialog. * Move the language selection from the preferences menu to the preferences dialog. * Remove language handler class. qStopMotion (0.9.2) * New default value tab in the preferences dialog. * Separation of default project settings and actual project setting. * Save default project settings in the prefrences file. * Save actual project settings in the project file. qStopMotion (0.9.1) * Full implementation of the FrameViewImage. * Replace FrameViewSDL with FrameViewImage on the Linux platform. * Move special widgets to the sub folder elments. * Move class ImageGraberThread to the FrameView sub folder. qStopMotion (0.9.0) * Create new subdirectory preferences to the qtfrontend folder. * Move preferencesmenu and exporttab classes to the new folder. * Rename directory tools/video to tools/videoencoder. * Rename class VideoFactory to VideoEncoderFactory. * Use VideoEncoder as a base class for different types of endoding tools. * Add FfmpegEncoder as the first implementation of VideoEncoder. * Reimplement the export tab of the preferences menu. qStopMotion (0.8.9) * Add Windows support to gstreamer grabber * Rename ModelHandler to ProjectHandler. * Remove all status bar variables from the handler classes. qStopMotion (0.8.8) * Separate the access to the views from the domain facade in a view facade. * Replace all DomainFacade::getFacade() calls. * Replace all ViewFacade::getFacade() calls. * Remove static variables and static functions from DomainFacade and ViewFacade. * full implementation of the new component call concept. qStopMotion (0.8.7) * Replace UndoHistory class by QUndoStack. * Replace Undo class by QUndoCommand. * Rename all undo classes for frames to undo for expersure. * Rename all undo classes for scenes. * Add undo classes for takes. * Add undo view. * Integrate new undo functionality to domain facade. * Replace all DomainFacade::getFacade() calls from the domain and animation model/project classes. qStopMotion (0.8.6) * Move all tooltabs classes to a separate subdirectory tooltabs. * Move about dialog class to a separate subdirectory dialoges. * Remove class filepreferencesmenu. * Remove bottom widget in mainwindowgui. * Add single dialog for projct, scene and take description. * Remove class scenearrowbutton. * Remove class scenethumbview. * Rename subdirectory framebar to timeline * Rename class framebar to timeline * Rename htmlDirectory to manualDirectory in the namespace * Add version to namespace * Add graphics path to namespace * Load all graphic files from the graphics path in the namespace * Move the helpwindow to the dialogs subdirectory * Rename the helpwindow to helpbrowser * Remove the Qt Designer file for the helpwindow * Test SDL on the windows platform. qStopMotion (0.8.5) * Move project serializer from directory technical to directory domain/animation. * Move all directory, file and suffix constants from projectserializer to preferencestool. * Rename class animation to animationproject. * Rename class frame to exposure. * Add class take between scene and exposure. * Move sound functionality to scene. * Move XML read and save functionality from prject to scene/take/exposure. * Expand XML layout of the project file. * Clearing the observer messages. * Add separate input dialoges for project, scene and take description. qStopMotion (0.8.4) * First Windows version!!! * Replace the propritary logger functionality by the QtDebug debugging functionality. * Delete the logger class. * Dove preferences tool class from fondation directory to technical directory. * Delete fondation directory. * Replace the Linux inotify functionlity by the QFileSystemWatcher. * Remove oggvorbis audio driver. * Remove oss audio driver. * Remove non gui frontend. * Move directory frontends to src and remove directory presentation. * Remove packer functionality. qStopMotion (0.8.3) * Remove device tab from the preferences menu entry. * Remove import tab from the preferences menu entry. * Remove commandlinegrabber class. qStopMotion (0.8.2) * Separation of command line commands from the imagegrabber class in the commandlinegrabber class. * Implementation of a new gstreamer image grabber implementation using the gstreamer library. * Add a combobox to select the video source to the recording tab. qStopMotion (0.8.1) * Separation of the frame view implementation in SDL using a interface. * Implementation of a new frame view based on QImage. qStopMotion (0.8.0) * qStopMotion (0.7.0) * =============================================================================== stopmotion (0.6.2) * Last version of stopmotion for Linux * Base of the qStopMotion fork =============================================================================== qstopmotion-2.3.2-Source/qstopmotion.png000644 000000 000000 00000001743 12536560627 020451 0ustar00rootroot000000 000000 PNG  IHDR$$sBIT|d pHYs3L tEXtSoftwarewww.inkscape.org<`IDATX[hg?nlhi  m#`Z_""~A> hLR.`IENDB`qstopmotion-2.3.2-Source/windows/qstopmotion.ico000644 000000 000000 00000010276 12536560630 022124 0ustar00rootroot000000 000000   ( @ N S S S S S S S S S S S S S S S S S S S S   m m mv]~G mq]! mqi3 mqwG mq  mq) mq) mq) mq) mq) mq) mq) mq mq] mqq? mq`% mrԗxD m=  3 3   Cc 4 /q+ž}+pK; N xFy&ϻ˿e ^1Zθʼi i8z|}-++T b q` e0__ c1o.g] ^@?   >qstopmotion-2.3.2-Source/windows/readme.txt000644 000000 000000 00000000471 12536560630 021026 0ustar00rootroot000000 000000 qStopMotion portable application CD Version: 2.0.0 (Beta) - 32bit Please start bin\qstopmotion.exe to use qStopMotion on your computer. This software uses the following open source projects. * Qt (http://qt.digia.com/) * FFmpeg (http://ffmpeg.org/) ralf.lange@qstopmotion.org Dresden, Germany qstopmotion-2.3.2-Source/windows/autorun.inf000644 000000 000000 00000000076 12536560630 021224 0ustar00rootroot000000 000000 [autorun] icon = stopmotion.ico open = bin\qstopmotion.exe qstopmotion-2.3.2-Source/cmake/FindGPhoto2PkgConfig.cmake000644 000000 000000 00000007606 12654352322 023300 0ustar00rootroot000000 000000 ############################################################################### # CMake file to find the GStreamer files on the Linux platform. # # (c) Ralf Lange, longsoft.de # # Last update: 2014-12-28 # # # ############################################################################### # # Originally based on the findGPHOTO2.cmake from the KDE project # # cmake macro to test if we use gphoto2 # GPHOTO2_FOUND - system has the GPHOTO2 library # GPHOTO2_INCLUDE_DIR - the GPHOTO2 include directory # GPHOTO2_LIBRARIES - The libraries needed to use GPHOTO2 # # Copyright (c) 2006, 2007 Laurent Montel, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # ############################################################################### MESSAGE("FindGPhoto2PkgConfig.cmake") IF (GPHOTO2_LIBRARIES AND GPHOTO2_INCLUDE_DIR) # In cache already SET( GPHOTO2_FOUND true ) MESSAGE(STATUS "Found in cache: gphoto2 !") RETURN() ENDIF (GPHOTO2_LIBRARIES AND GPHOTO2_INCLUDE_DIR) FIND_PROGRAM( GHOTO2CONFIG_EXECUTABLE NAMES gphoto2-config ) FIND_PROGRAM( GHOTO2PORTCONFIG_EXECUTABLE NAMES gphoto2-port-config ) SET(GPHOTO2_LIBRARIES) SET(GPHOTO2_INCLUDE_DIRS) # If gphoto2-port-config and gphoto2-config have been found IF (GHOTO2PORTCONFIG_EXECUTABLE AND GHOTO2CONFIG_EXECUTABLE) EXEC_PROGRAM( ${GHOTO2PORTCONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE GPHOTO2PORT_LIBRARY ) EXEC_PROGRAM( ${GHOTO2CONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE GPHOTO2_LIBRARY ) EXEC_PROGRAM( ${GHOTO2PORTCONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _GPHOTO2PORT_RESULT_INCLUDE_DIR ) EXEC_PROGRAM( ${GHOTO2CONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _GPHOTO2_RESULT_INCLUDE_DIR ) SET( GPHOTO2_LIBRARIES ${GPHOTO2PORT_LIBRARY} ${GPHOTO2_LIBRARY} ) # the cflags for poppler-qt4 can contain more than one include path SEPARATE_ARGUMENTS(_GPHOTO2_RESULT_INCLUDE_DIR) FOREACH(_includedir ${_GPHOTO2_RESULT_INCLUDE_DIR}) STRING( REGEX REPLACE "-I(.+)" "\\1" _includedir "${_includedir}" ) SET( GPHOTO2_INCLUDE_DIR ${GPHOTO2_INCLUDE_DIR} ${_includedir} ) ENDFOREACH(_includedir) SEPARATE_ARGUMENTS(_GPHOTO2PORT_RESULT_INCLUDE_DIR) FOREACH(_includedir ${_GPHOTO2PORT_RESULT_INCLUDE_DIR}) STRING( REGEX REPLACE "-I(.+)" "\\1" _includedir "${_includedir}" ) SET( GPHOTO2PORT_INCLUDE_DIR ${GPHOTO2PORT_INCLUDE_DIR} ${_includedir} ) ENDFOREACH(_includedir) SET( GPHOTO2_INCLUDE_DIRS ${GPHOTO2PORT_INCLUDE_DIR} ${GPHOTO2_INCLUDE_DIR} ) ENDIF(GHOTO2PORTCONFIG_EXECUTABLE AND GHOTO2CONFIG_EXECUTABLE) IF (GPHOTO2_LIBRARIES AND GPHOTO2_INCLUDE_DIRS) SET( GPHOTO2_FOUND true ) MESSAGE(STATUS "Found: gphoto2 !") MESSAGE(STATUS "GPHOTO2_LIBRARIES: ${GPHOTO2_LIBRARIES}") MESSAGE(STATUS "GPHOTO2_INCLUDE_DIRS: ${GPHOTO2_INCLUDE_DIRS}") ELSE (GPHOTO2_LIBRARIES AND GPHOTO2_INCLUDE_DIRS) SET( GPHOTO2_FOUND false ) MESSAGE(SEND_ERROR "Not found: gphoto2 !") ENDIF (GPHOTO2_LIBRARIES AND GPHOTO2_INCLUDE_DIRS) MARK_AS_ADVANCED( GPHOTO2_LIBRARIES GPHOTO2_INCLUDE_DIRS ) qstopmotion-2.3.2-Source/cmake/FindGStreamerWinX86.cmake000644 000000 000000 00000011034 12536560627 023101 0ustar00rootroot000000 000000 ############################################################################### # CMake file to find the GStreamer files on the Windows platform when the # # x86 buid of GStreamer 1.x.x for Windows from the gstreamer project is used. # # (c) Ralf Lange, longsoft.de # # Last update: 2014-01-31 # # # ############################################################################### # # Originally based on the findGStreamer.cmake from the OSSBuild project # # GSTREAMER_FOUND - system has GStreamer # GSTREAMER_INCLUDE_DIR - the GStreamer include directory # GSTREAMER_LIBRARIES - the libraries needed to use GStreamer # ############################################################################### ############################################################################### # Unset variables ############################################################################### unset(GSTREAMER_gst_INCLUDE_DIR CACHE) unset(GSTREAMER_gstreamer_LIBRARY CACHE) unset(GLIB_glib_2_INCLUDE_DIR CACHE) unset(GLIB_glibconfig_2_INCLUDE_DIR CACHE) unset(GLIB_glib_2_LIBRARY CACHE) ############################################################################### # Read environment variables ############################################################################### FILE(TO_CMAKE_PATH "$ENV{GSTREAMER_1_0_ROOT_X86}" TRY1_DIR) FILE(TO_CMAKE_PATH "${GSTREAMER_DIR}" TRY2_DIR) FILE(GLOB GSTREAMER_DIR ${TRY1_DIR} ${TRY2_DIR}) message("FindGStreamerWinX86.cmake - Start") message("TRY1_DIR: ${TRY1_DIR}") message("TRY2_DIR: ${TRY2_DIR}") message("GSTREAMER_DIR: ${GSTREAMER_DIR}") ############################################################################### # GStreamer directories and libraries ############################################################################### FIND_PATH( GSTREAMER_gst_INCLUDE_DIR gst/gst.h PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/gstreamer-1.0 ENV INCLUDE DOC "Directory containing gst/gst.h include file" ) message("GSTREAMER_gst_INCLUDE_DIR: ${GSTREAMER_gst_INCLUDE_DIR}") FIND_LIBRARY( GSTREAMER_gstreamer_LIBRARY NAMES gstreamer-1.0 gstreamer PATHS ${GSTREAMER_DIR}/lib ENV LIB DOC "gstreamer library to link with" NO_SYSTEM_ENVIRONMENT_PATH ) message("GSTREAMER_gstreamer_LIBRARY: ${GSTREAMER_gstreamer_LIBRARY}") ############################################################################### # GLib2 directories and libraries ############################################################################### FIND_PATH( GLIB_glib_2_INCLUDE_DIR glib.h PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/glib-2.0 ENV INCLUDE DOC "Directory containing glib.h include file" ) message("GLIB_glib_2_INCLUDE_DIR: ${GLIB_glib_2_INCLUDE_DIR}") FIND_PATH( GLIB_glibconfig_2_INCLUDE_DIR glibconfig.h PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/glib-2.0 ${GSTREAMER_DIR}/lib/glib-2.0/include ENV INCLUDE DOC "Directory containing glibconfig.h include file" ) message("GLIB_glibconfig_2_INCLUDE_DIR: ${GLIB_glibconfig_2_INCLUDE_DIR}") FIND_LIBRARY( GLIB_glib_2_LIBRARY NAMES glib-2.0 PATHS ${GSTREAMER_DIR}/lib ENV LIB DOC "glib library to link with" NO_SYSTEM_ENVIRONMENT_PATH ) message("GLIB_glib_2_LIBRARY: ${GLIB_glib_2_LIBRARY}") ############################################################################### # All together ############################################################################### IF(GSTREAMER_gst_INCLUDE_DIR AND GSTREAMER_gstreamer_LIBRARY AND GLIB_glib_2_INCLUDE_DIR AND GLIB_glibconfig_2_INCLUDE_DIR AND GLIB_glib_2_LIBRARY) SET( GSTREAMER_INCLUDE_DIR ${GSTREAMER_gst_INCLUDE_DIR} ${GLIB_glib_2_INCLUDE_DIR} ${GLIB_glibconfig_2_INCLUDE_DIR} ) list(REMOVE_DUPLICATES GSTREAMER_INCLUDE_DIR) SET( GSTREAMER_LIBRARIES ${GSTREAMER_gstreamer_LIBRARY} ${GLIB_glib_2_LIBRARY} ) list(REMOVE_DUPLICATES GSTREAMER_LIBRARIES) SET(GSTREAMER_FOUND TRUE) ELSE(GSTREAMER_gst_INCLUDE_DIR AND GSTREAMER_gstreamer_LIBRARY AND GLIB_glib_2_INCLUDE_DIR AND GLIB_glibconfig_2_INCLUDE_DIR AND GLIB_glib_2_LIBRARY) message("One component not found!") ENDIF(GSTREAMER_gst_INCLUDE_DIR AND GSTREAMER_gstreamer_LIBRARY AND GLIB_glib_2_INCLUDE_DIR AND GLIB_glibconfig_2_INCLUDE_DIR AND GLIB_glib_2_LIBRARY) message("FindGStreamerWinX86.cmake - End") qstopmotion-2.3.2-Source/cmake/FindGStreamerOSSBUILD.cmake000644 000000 000000 00000015661 12536560627 023274 0ustar00rootroot000000 000000 ############################################################################### # CMake file to find the GStreamer files on the Windows platform when the # # OSSBuild fof GStreamer for Windows is used. # # (c) Ralf Lange, longsoft.de # # Last update: 2012-10-11 # # # ############################################################################### # # Originally based on the findGStreamer.cmake from the OSSBuild project # # GSTREAMER_FOUND - system has GStreamer # GSTREAMER_INCLUDE_DIR - the GStreamer include directory # GSTREAMER_LIBRARIES - the libraries needed to use GStreamer # ############################################################################### ############################################################################### # Unset variables ############################################################################### unset(GSTREAMER_gst_INCLUDE_DIR CACHE) unset(GSTREAMER_gstconfig_INCLUDE_DIR CACHE) unset(GSTREAMER_gstreamer_LIBRARY CACHE) unset(GSTREAMER_gstinterfaces_LIBRARY CACHE) unset(GSTREAMER_gstapp_LIBRARY CACHE) unset(GLIB_glib_2_INCLUDE_DIR CACHE) unset(GLIB_glibconfig_2_INCLUDE_DIR CACHE) unset(GLIB_glib_2_LIBRARY CACHE) unset(GLIB_gobject_2_LIBRARY CACHE) unset(LIBXML2_parser_INCLUDE_DIR CACHE) unset(LIBXML2_iconv_INCLUDE_DIR CACHE) unset(LIBXML2_xml_2_LIBRARY CACHE) ############################################################################### # Read environment variables ############################################################################### FILE(TO_CMAKE_PATH "$ENV{OSSBUILD_GSTREAMER_SDK_DIR}" TRY1_DIR) FILE(TO_CMAKE_PATH "${GSTREAMER_DIR}" TRY2_DIR) FILE(GLOB GSTREAMER_DIR ${TRY1_DIR} ${TRY2_DIR}) message("FindGStreamerOSSBUILD.cmake") message("TRY1_DIR: ${TRY1_DIR}") message("TRY2_DIR: ${TRY2_DIR}") message("GSTREAMER_DIR: ${GSTREAMER_DIR}") ############################################################################### # GStreamer directories and libraries ############################################################################### FIND_PATH( GSTREAMER_gst_INCLUDE_DIR gst/gst.h PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/gstreamer-0.10 ENV INCLUDE DOC "Directory containing gst/gst.h include file" ) FIND_PATH( GSTREAMER_gstconfig_INCLUDE_DIR gst/gstconfig.h PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/gstreamer-0.10 ENV INCLUDE DOC "Directory containing gst/gstconfig.h include file" ) FIND_LIBRARY( GSTREAMER_gstreamer_LIBRARY NAMES gstreamer-0.10 gstreamer PATHS ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib ENV LIB DOC "gstreamer library to link with" NO_SYSTEM_ENVIRONMENT_PATH ) FIND_LIBRARY( GSTREAMER_gstinterfaces_LIBRARY NAMES gstinterfaces-0.10 gstinterfaces PATHS ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib ENV LIB DOC "gstinterfaces library to link with" NO_SYSTEM_ENVIRONMENT_PATH ) FIND_LIBRARY( GSTREAMER_gstapp_LIBRARY NAMES gstapp-0.10 gstapp PATHS ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib ENV LIB DOC "gstapp library to link with" NO_SYSTEM_ENVIRONMENT_PATH ) ############################################################################### # GLib2 directories and libraries ############################################################################### FIND_PATH( GLIB_glib_2_INCLUDE_DIR glib.h PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/glib-2.0 ENV INCLUDE DOC "Directory containing glib.h include file" ) FIND_PATH( GLIB_glibconfig_2_INCLUDE_DIR glibconfig.h PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/glib-2.0 ENV INCLUDE DOC "Directory containing glibconfig.h include file" ) FIND_LIBRARY( GLIB_glib_2_LIBRARY NAMES glib-2.0 PATHS ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib ENV LIB DOC "glib library to link with" NO_SYSTEM_ENVIRONMENT_PATH ) FIND_LIBRARY( GLIB_gobject_2_LIBRARY NAMES gobject-2.0 PATHS ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib ENV LIB DOC "gobject library to link with" NO_SYSTEM_ENVIRONMENT_PATH ) ############################################################################### # LibXml2 directories and libraries ############################################################################### FIND_PATH( LIBXML2_parser_INCLUDE_DIR libxml/parser.h PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/libxml2 ENV INCLUDE DOC "Directory containing libxml/parser.h include file" ) FIND_PATH( LIBXML2_iconv_INCLUDE_DIR iconv.h PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/libxml2 ENV INCLUDE DOC "Directory containing iconv.h include file" ) FIND_LIBRARY( LIBXML2_xml_2_LIBRARY NAMES xml2 PATHS ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib ENV LIB DOC "xml2 library to link with" NO_SYSTEM_ENVIRONMENT_PATH ) ############################################################################### # All together ############################################################################### IF(GSTREAMER_gst_INCLUDE_DIR AND GSTREAMER_gstconfig_INCLUDE_DIR AND GSTREAMER_gstreamer_LIBRARY AND GSTREAMER_gstinterfaces_LIBRARY AND GSTREAMER_gstapp_LIBRARY AND GLIB_glib_2_INCLUDE_DIR AND GLIB_glibconfig_2_INCLUDE_DIR AND GLIB_glib_2_LIBRARY AND GLIB_gobject_2_LIBRARY AND LIBXML2_parser_INCLUDE_DIR AND LIBXML2_iconv_INCLUDE_DIR AND LIBXML2_xml_2_LIBRARY) SET( GSTREAMER_INCLUDE_DIR ${GSTREAMER_gst_INCLUDE_DIR} ${GSTREAMER_gstconfig_INCLUDE_DIR} ${GLIB_glib_2_INCLUDE_DIR} ${GLIB_glibconfig_2_INCLUDE_DIR} ${LIBXML2_parser_INCLUDE_DIR} ${LIBXML2_iconv_INCLUDE_DIR} ) list(REMOVE_DUPLICATES GSTREAMER_INCLUDE_DIR) SET( GSTREAMER_LIBRARIES ${GSTREAMER_gstreamer_LIBRARY} ${GSTREAMER_gstinterfaces_LIBRARY} ${GSTREAMER_gstapp_LIBRARY} ${GLIB_glib_2_LIBRARY} ${GLIB_gobject_2_LIBRARY} ${LIBXML2_xml_2_LIBRARY} ) list(REMOVE_DUPLICATES GSTREAMER_LIBRARIES) SET(GSTREAMER_FOUND TRUE) ELSE(GSTREAMER_gst_INCLUDE_DIR AND GSTREAMER_gstconfig_INCLUDE_DIR AND GSTREAMER_gstreamer_LIBRARY AND GSTREAMER_gstinterfaces_LIBRARY AND GSTREAMER_gstapp_LIBRARY AND GLIB_glib_2_INCLUDE_DIR AND GLIB_glibconfig_2_INCLUDE_DIR AND GLIB_glib_2_LIBRARY AND GLIB_gobject_2_LIBRARY AND LIBXML2_parser_INCLUDE_DIR AND LIBXML2_iconv_INCLUDE_DIR AND LIBXML2_xml_2_LIBRARY) message("One component not found!!!") ENDIF(GSTREAMER_gst_INCLUDE_DIR AND GSTREAMER_gstconfig_INCLUDE_DIR AND GSTREAMER_gstreamer_LIBRARY AND GSTREAMER_gstinterfaces_LIBRARY AND GSTREAMER_gstapp_LIBRARY AND GLIB_glib_2_INCLUDE_DIR AND GLIB_glibconfig_2_INCLUDE_DIR AND GLIB_glib_2_LIBRARY AND GLIB_gobject_2_LIBRARY AND LIBXML2_parser_INCLUDE_DIR AND LIBXML2_iconv_INCLUDE_DIR AND LIBXML2_xml_2_LIBRARY) qstopmotion-2.3.2-Source/cmake/FindGStreamerPluginsPkgConfig.cmake000644 000000 000000 00000011376 12536560627 025260 0ustar00rootroot000000 000000 # - Try to find GStreamer_Plugins # Once done this will define # # GSTREAMERPLUGINSBASE_FOUND - system has GStreamer_Plugins # GSTREAMERPLUGINSBASE_INCLUDE_DIR - the GStreamer_Plugins include directory # GSTREAMERPLUGINSBASE_LIBRARIES - the libraries needed to use GStreamer_Plugins # GSTREAMERPLUGINSBASE_DEFINITIONS - Compiler switches required for using GStreamer_Plugins # # (c)2009 Nokia Corporation FIND_PACKAGE(PkgConfig REQUIRED) PKG_CHECK_MODULES( PKG_GSTREAMER gstreamer-plugins-base-0.10 ) message("PKG_GSTREAMER_VERSION: ${PKG_GSTREAMER_VERSION}") message("PKG_GSTREAMER_INCLUDE_DIRS: ${PKG_GSTREAMER_INCLUDE_DIRS}") message("PKG_GSTREAMER_LIBRARY_DIRS: ${PKG_GSTREAMER_LIBRARY_DIRS}") message("PKG_GSTREAMER_LIBRARIES: ${PKG_GSTREAMER_LIBRARIES}") message("PKG_GSTREAMER_STATIC_LIBRARIES: ${PKG_GSTREAMER_STATIC_LIBRARIES}") message("PKG_GSTREAMER_CFLAGS: ${PKG_GSTREAMER_CFLAGS}") # # Base plugins: # audio # cdda # netbuffer # pbutils # riff # rtp # rtsp # sdp # tag # video # # The gstinterfaces-0.10 library is found by FindGStreamer.cmake # FIND_LIBRARY(GSTREAMER_PLUGIN_AUDIO_LIBRARIES NAMES gstaudio-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY(GSTREAMER_PLUGIN_CDDA_LIBRARIES NAMES gstcdda-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY(GSTREAMER_PLUGIN_NETBUFFER_LIBRARIES NAMES gstnetbuffer-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY(GSTREAMER_PLUGIN_PBUTILS_LIBRARIES NAMES gstpbutils-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY(GSTREAMER_PLUGIN_RIFF_LIBRARIES NAMES gstriff-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY(GSTREAMER_PLUGIN_RTP_LIBRARIES NAMES gstrtp-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY(GSTREAMER_PLUGIN_RTSP_LIBRARIES NAMES gstrtsp-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY(GSTREAMER_PLUGIN_SDP_LIBRARIES NAMES gstsdp-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY(GSTREAMER_PLUGIN_TAG_LIBRARIES NAMES gsttag-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY(GSTREAMER_PLUGIN_VIDEO_LIBRARIES NAMES gstvideo-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) IF (GSTREAMER_PLUGIN_AUDIO_LIBRARIES AND GSTREAMER_PLUGIN_CDDA_LIBRARIES AND GSTREAMER_PLUGIN_NETBUFFER_LIBRARIES AND GSTREAMER_PLUGIN_PBUTILS_LIBRARIES AND GSTREAMER_PLUGIN_RIFF_LIBRARIES AND GSTREAMER_PLUGIN_RTP_LIBRARIES AND GSTREAMER_PLUGIN_RTSP_LIBRARIES AND GSTREAMER_PLUGIN_SDP_LIBRARIES AND GSTREAMER_PLUGIN_TAG_LIBRARIES AND GSTREAMER_PLUGIN_VIDEO_LIBRARIES) SET(GSTREAMERPLUGINSBASE_FOUND TRUE) ELSE (GSTREAMER_PLUGIN_AUDIO_LIBRARIES AND GSTREAMER_PLUGIN_CDDA_LIBRARIES AND GSTREAMER_PLUGIN_NETBUFFER_LIBRARIES AND GSTREAMER_PLUGIN_PBUTILS_LIBRARIES AND GSTREAMER_PLUGIN_RIFF_LIBRARIES AND GSTREAMER_PLUGIN_RTP_LIBRARIES AND GSTREAMER_PLUGIN_RTSP_LIBRARIES AND GSTREAMER_PLUGIN_SDP_LIBRARIES AND GSTREAMER_PLUGIN_TAG_LIBRARIES AND GSTREAMER_PLUGIN_VIDEO_LIBRARIES) SET(GSTREAMERPLUGINSBASE_FOUND FALSE) ENDIF (GSTREAMER_PLUGIN_AUDIO_LIBRARIES AND GSTREAMER_PLUGIN_CDDA_LIBRARIES AND GSTREAMER_PLUGIN_NETBUFFER_LIBRARIES AND GSTREAMER_PLUGIN_PBUTILS_LIBRARIES AND GSTREAMER_PLUGIN_RIFF_LIBRARIES AND GSTREAMER_PLUGIN_RTP_LIBRARIES AND GSTREAMER_PLUGIN_RTSP_LIBRARIES AND GSTREAMER_PLUGIN_SDP_LIBRARIES AND GSTREAMER_PLUGIN_TAG_LIBRARIES AND GSTREAMER_PLUGIN_VIDEO_LIBRARIES) IF (GSTREAMERPLUGINSBASE_FOUND) SET(GSTREAMERPLUGINS_FOUND TRUE) ELSE (GSTREAMERPLUGINSBASE_FOUND) SET(GSTREAMERPLUGINS_FOUND FALSE) ENDIF (GSTREAMERPLUGINSBASE_FOUND) IF (GSTREAMERPLUGINS_FOUND) IF (NOT GStreamer_Plugins_FIND_QUIETLY) MESSAGE(STATUS "Found GStreamer Plugins: ${GSTREAMER_PLUGIN_AUDIO_LIBRARIES} ${GSTREAMER_PLUGIN_CDDA_LIBRARIES} ${GSTREAMER_PLUGIN_NETBUFFER_LIBRARIES} ${GSTREAMER_PLUGIN_PBUTILS_LIBRARIES} ${GSTREAMER_PLUGIN_RIFF_LIBRARIES} ${GSTREAMER_PLUGIN_RTP_LIBRARIES} ${GSTREAMER_PLUGIN_RTSP_LIBRARIES} ${GSTREAMER_PLUGIN_SDP_LIBRARIES} ${GSTREAMER_PLUGIN_TAG_LIBRARIES} ${GSTREAMER_PLUGIN_VIDEO_LIBRARIES}") ENDIF (NOT GStreamer_Plugins_FIND_QUIETLY) ELSE (GSTREAMERPLUGINS_FOUND) IF (GStreamer_Plugins_FIND_REQUIRED) MESSAGE(SEND_ERROR "Could NOT find GStreamer Plugins") ENDIF (GStreamer_Plugins_FIND_REQUIRED) ENDIF (GSTREAMERPLUGINS_FOUND) MARK_AS_ADVANCED(GSTREAMERPLUGINS_DEFINITIONS GSTREAMER_PLUGIN_AUDIO_LIBRARIES GSTREAMER_PLUGIN_CDDA_LIBRARIES GSTREAMER_PLUGIN_NETBUFFER_LIBRARIES GSTREAMER_PLUGIN_PBUTILS_LIBRARIES GSTREAMER_PLUGIN_RIFF_LIBRARIES GSTREAMER_PLUGIN_RTP_LIBRARIES GSTREAMER_PLUGIN_RTSP_LIBRARIES GSTREAMER_PLUGIN_SDP_LIBRARIES GSTREAMER_PLUGIN_TAG_LIBRARIES GSTREAMER_PLUGIN_VIDEO_LIBRARIES) qstopmotion-2.3.2-Source/cmake/FindV4L2PkgConfig.cmake000644 000000 000000 00000003600 12654352322 022473 0ustar00rootroot000000 000000 ############################################################################### # CMake file to find the Video4Linux2 files on the Linux platform. # # (c) Ralf Lange, longsoft.de # # Last update: 2014-12-28 # # # ############################################################################### # # cmake macro to test if we use Video4Linux2 # V4L2_FOUND - system has the Video4Linux2 library # V4L2_INCLUDE_DIR - the Video4Linux2 include directory # V4L2_LIBRARIES - The libraries needed to use Video4Linux2 # ############################################################################### MESSAGE("FindV4L2PkgConfig.cmake") FIND_PACKAGE(PkgConfig REQUIRED) PKG_CHECK_MODULES(PKG_V4L2 QUIET libv4l2) IF(PKG_V4L2_FOUND) MESSAGE(STATUS "FOUND: Video4Linux2 !") ELSE(PKG_V4L2_FOUND) MESSAGE(SEND_ERROR "Not found: Video4Linux2 !") RETURN() ENDIF(PKG_V4L2_FOUND) FIND_PATH( V4L2_INCLUDE_DIR NAMES videodev2.h libv4l2.h libv4lconvert.h HINTS ${PKG_V4L2_INCLUDEDIR} ${PKG_V4L2_INCLUDE_DIRS} PATH_SUFFIXES v4l2 video4linux ) FIND_LIBRARY( V4L2_LIBRARY NAMES v4l2 v4lconvert HINTS ${PKG_V4L2_LIBDIR} ${PKG_V4L2_LIBRARY_DIRS} ) SET( V4L2_LIBRARIES ${V4L2_LIBRARY} ) SET( V4L2_INCLUDE_DIRS ${V4L2_INCLUDE_DIR} ) include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set V4L2_FOUND to true # if all listed variables are true find_package_handle_standard_args( Libv4l2 DEFAULT_MSG V4L2_LIBRARY V4L2_INCLUDE_DIR ) IF(PKG_V4L2_FOUND) MESSAGE(STATUS "V4L2_LIBRARY: ${V4L2_LIBRARY}") MESSAGE(STATUS "V4L2_INCLUDE_DIR: ${V4L2_INCLUDE_DIR}") ENDIF(PKG_V4L2_FOUND) MARK_AS_ADVANCED( V4L2_LIBRARIES V4L2_INCLUDE_DIRS ) qstopmotion-2.3.2-Source/cmake/FindGStreamerPkgConfig.cmake000644 000000 000000 00000012314 12654352322 023677 0ustar00rootroot000000 000000 ############################################################################### # CMake file to find the GStreamer files on the Linux platform. # # (c) Ralf Lange, longsoft.de # # Last update: 2014-12-28 # # # ############################################################################### # # Originally based on the findGStreamer.cmake from the KDE project # # - Try to find GStreamer # Once done this will define # # GSTREAMER_FOUND - system has GStreamer # GSTREAMER_INCLUDE_DIR - the GStreamer include directory # GSTREAMER_LIBRARIES - the libraries needed to use GStreamer # GSTREAMER_STATIC_LIBRARIES - the static libraries needed to use GStreamer # GSTREAMER_DEFINITIONS - Compiler switches required for using GStreamer # GSTREAMER_VERSION - the version of GStreamer # # Copyright (c) 2006, Tim Beaulen # Copyright (c) 2008 Helio Chissini de Castro, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # # TODO: Other versions --> GSTREAMER_X_Y_FOUND # (Example: GSTREAMER_0_8_FOUND and GSTREAMER_0_10_FOUND etc) # ############################################################################### MESSAGE("FindGStreamerPkgConfig.cmake") IF (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY AND GSTREAMER_INTERFACE_LIBRARY AND GSTREAMER_APP_LIBRARY) # in cache already SET( GStreamer_FIND_QUIETLY true ) ELSE (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY AND GSTREAMER_INTERFACE_LIBRARY AND GSTREAMER_APP_LIBRARY) SET( GStreamer_FIND_QUIETLY false ) ENDIF (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY AND GSTREAMER_INTERFACE_LIBRARY AND GSTREAMER_APP_LIBRARY) FIND_PACKAGE(PkgConfig REQUIRED) # use pkg-config to get the directories and then use these values # in the FIND_PATH() and FIND_LIBRARY() calls # don't make this check required - otherwise you can't use macro_optional_find_package on this one PKG_CHECK_MODULES(PKG_GSTREAMER gstreamer-0.10) MESSAGE("PKG_GSTREAMER_VERSION: ${PKG_GSTREAMER_VERSION}") MESSAGE("PKG_GSTREAMER_INCLUDE_DIRS: ${PKG_GSTREAMER_INCLUDE_DIRS}") MESSAGE("PKG_GSTREAMER_LIBRARY_DIRS: ${PKG_GSTREAMER_LIBRARY_DIRS}") MESSAGE("PKG_GSTREAMER_LIBRARIES: ${PKG_GSTREAMER_LIBRARIES}") MESSAGE("PKG_GSTREAMER_STATIC_LIBRARIES: ${PKG_GSTREAMER_STATIC_LIBRARIES}") MESSAGE("PKG_GSTREAMER_CFLAGS: ${PKG_GSTREAMER_CFLAGS}") SET( GSTREAMER_VERSION ${PKG_GSTREAMER_VERSION} ) SET( GSTREAMER_DEFINITIONS ${PKG_GSTREAMER_CFLAGS} ) FIND_PATH( GSTREAMER_INCLUDE_DIR gst/gst.h PATHS ${PKG_GSTREAMER_INCLUDE_DIRS} PATH_SUFFIXES gstreamer-0.10 ) FIND_LIBRARY( GSTREAMER_LIBRARY NAMES gstreamer-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY( GSTREAMER_BASE_LIBRARY NAMES gstbase-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY( GSTREAMER_INTERFACE_LIBRARY NAMES gstinterfaces-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) FIND_LIBRARY( GSTREAMER_APP_LIBRARY NAMES gstapp-0.10 PATHS ${PKG_GSTREAMER_LIBRARY_DIRS} ) SET( GSTREAMER_LIBRARIES ${PKG_GSTREAMER_LIBRARIES} ) SET( GSTREAMER_STATIC_LIBRARIES ${PKG_GSTREAMER_STATIC_LIBRARIES} ) IF (GSTREAMER_INCLUDE_DIR) ELSE (GSTREAMER_INCLUDE_DIR) MESSAGE(STATUS "GStreamer: WARNING: include dir not found") ENDIF (GSTREAMER_INCLUDE_DIR) IF (GSTREAMER_LIBRARY) ELSE (GSTREAMER_LIBRARY) MESSAGE(STATUS "GStreamer: WARNING: library not found") ENDIF (GSTREAMER_LIBRARY) IF (GSTREAMER_BASE_LIBRARY) ELSE (GSTREAMER_BASE_LIBRARY) MESSAGE(STATUS "GStreamer: WARNING: base library not found") ENDIF (GSTREAMER_BASE_LIBRARY) IF (GSTREAMER_INTERFACE_LIBRARY) ELSE (GSTREAMER_INTERFACE_LIBRARY) MESSAGE(STATUS "GStreamer: WARNING: interfaces library not found") ENDIF (GSTREAMER_INTERFACE_LIBRARY) IF (GSTREAMER_APP_LIBRARY) ELSE (GSTREAMER_APP_LIBRARY) MESSAGE(STATUS "GStreamer: WARNING: app library not found") ENDIF (GSTREAMER_APP_LIBRARY) IF (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY AND GSTREAMER_INTERFACE_LIBRARY AND GSTREAMER_APP_LIBRARY) SET( GSTREAMER_FOUND true ) MESSAGE(STATUS "Found: GStreamer ${GSTREAMER_VERSION} !") SET( GSTREAMER_LIBRARIES ${GSTREAMER_LIBRARIES} gstinterfaces-0.10 gstapp-0.10 ) ELSE (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY AND GSTREAMER_INTERFACE_LIBRARY AND GSTREAMER_APP_LIBRARY) SET( GSTREAMER_FOUND false ) MESSAGE(SEND_ERROR "Not found: GStreamer !") ENDIF (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY AND GSTREAMER_INTERFACE_LIBRARY AND GSTREAMER_APP_LIBRARY) MARK_AS_ADVANCED( GSTREAMER_INCLUDE_DIR GSTREAMER_LIBRARIES GSTREAMER_STATIC_LIBRARIES GSTREAMER_LIBRARY GSTREAMER_BASE_LIBRARY GSTREAMER_INTERFACES_LIBRARY GSTREAMER_APP_LIBRARY ) qstopmotion-2.3.2-Source/linux/qstopmotion.desktop000644 000000 000000 00000000470 13011043104 022440 0ustar00rootroot000000 000000 [Desktop Entry] Name=qStopMotion Comment=Program to create stop-motion animations Exec=qstopmotion %f Icon=qstopmotion Terminal=false X-MultipleArgs=false Type=Application Categories=AudioVideo;Video;AudioVideoEditing; StartupNotify=true Keywords=animation;stop-motion;video; MimeType=application/x-qstopmotion; qstopmotion-2.3.2-Source/linux/qstopmotion.mime000644 000000 000000 00000000217 12536560627 021746 0ustar00rootroot000000 000000 application/x-qstopmotion; /usr/bin/qstopmotion -caption "Animation Creator" %s; nametemplate=%s.qsmd; test=test "$DISPLAY" != ""; priority=9 qstopmotion-2.3.2-Source/linux/qstopmotion.1000644 000000 000000 00000004354 13011043104 021134 0ustar00rootroot000000 000000 .\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH STOPMOTION 1 "May 25th, 2006" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME qStopMotion \- a program for creating stop-motion animations .SH SYNOPSIS .B qStopMotion .I file .br .SH DESCRIPTION This manual page briefly introduces the program and documents the commands available when running in non GUI mode. .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBqStopMotion\fP is a program for creating stop-motions animations from couple of images. You can use your favourite video device for grabbing the images as long you have a program capable of doing it. You just sets qStopMotion to use the program. It's also possible to do the same with video export. Stopmotion has a set of tools which helps you creating the movements smooth and precise. .SH OPTIONS Stopmotion follows the usual GNU command line syntax, with long options starting with two dashes (`-'). This part of the program is under construction and not yet fully usable. A summary of options is included below. .TP .B \-a DIR, \-\-addFrames=DIR Creates a new project containing the images located in DIR (e.g. /foo/bar) .SH SEE ALSO The full documentation for qStopMotion is maintained in the application help menu. Visit the projects website for more information. (http://www.qStopMotion.org) .br .SH AUTHORS qStopMotion is written by Ralf Lange and a fork of stopmotion for Linux written by Bjoern Erik Nilsen and Fredrik Berg Kjoelstad. .SH REPORTING BUGS Report bugs to . .PP This manual page was written by Ralf Lange and Bjoern Erik Nilsen. qstopmotion-2.3.2-Source/linux/qstopmotion.1.gz000644 000000 000000 00000002245 13011043104 021550 0ustar00rootroot000000 000000  $Xqstopmotion.1UQo6~8f+MnCKR71Ć +QbK Iտij:lxw}w^0U~`k~xI'[ &pwq;ol+(PKkqx>Zw_&ʁw'c51 TX{7˯V%{GĤ*U}ǁ ]ٲoфtRږW^ȭT:ÄC\ڊ \F'NCZQ!Qfx/w l^2㡞{IǞ]-l LCXc*HJjE[ iI5jg[Qھ:l ~>aplЖVUh$A`Ed R%X U#FC‹1o,F0Qs3z8U6FyZO%"Q/u*Nwd#Y(bZ lAI9)Z%ZjMh\<[ܺFzֽ?1ML_&/+&lt?kGIߐGM_g'q*ad}Eo*ڛ}p}`^qd<1r':SneJW\/ybWzǪzϟ+W,7 '*R{h[RlcGWM''ti\|49?MP,%f8u4?7~>)$`q#+CiP2qԄНvlY9~ZY*hhpb5|f[2gVޏ}21xɢ30s3)1Ê_]8Uj\k y7qݜ;iWt.m~-ݝZg 7_qstopmotion-2.3.2-Source/qstopmotion.pro000644 000000 000000 00000033561 12654352322 020460 0ustar00rootroot000000 000000 ############################################################################### # QtCreator file for the qStopMotion project # # (c) Ralf Lange, longsoft.de # # Last update: 2016-02-02 # # # # Please use CMake and the CMakeLists.txt file to build qStopMotion! # ############################################################################### HEADERS += src/config.h \ src/domain/domainfacade.h \ src/domain/animation/animationproject.h \ src/domain/animation/exposure.h \ src/domain/animation/projectserializer.h \ src/domain/animation/scene.h \ src/domain/animation/take.h \ src/domain/undo/undobase.h \ src/domain/undo/undoexposureadd.h \ src/domain/undo/undoexposureinsert.h \ src/domain/undo/undoexposuremove.h \ src/domain/undo/undoexposureremove.h \ src/domain/undo/undoexposureselect.h \ src/domain/undo/undoprojectnew.h \ src/domain/undo/undoprojectopen.h \ src/domain/undo/undosceneadd.h \ src/domain/undo/undosceneinsert.h \ src/domain/undo/undoscenemove.h \ src/domain/undo/undosceneremove.h \ src/domain/undo/undosceneselect.h \ src/domain/undo/undotakeadd.h \ src/domain/undo/undotakeinsert.h \ src/domain/undo/undotakemove.h \ src/domain/undo/undotakeremove.h \ src/domain/undo/undotakeselect.h \ src/frontends/observer.h \ src/frontends/frontend.h \ src/frontends/viewfacade.h \ src/frontends/qtfrontend/mainwindowgui.h \ src/frontends/qtfrontend/menuframe.h \ src/frontends/qtfrontend/qtfrontend.h \ src/frontends/qtfrontend/toolbar.h \ src/frontends/qtfrontend/dialogs/aboutdialog.h \ src/frontends/qtfrontend/dialogs/cameracontrollerdialog.h \ src/frontends/qtfrontend/dialogs/descriptiondialog.h \ src/frontends/qtfrontend/dialogs/externalcommanddialog.h \ src/frontends/qtfrontend/dialogs/helpbrowser.h \ src/frontends/qtfrontend/dialogs/licence.h \ src/frontends/qtfrontend/dialogs/startdialog.h \ src/frontends/qtfrontend/elements/clickablelabel.h \ src/frontends/qtfrontend/elements/flexiblelineedit.h \ src/frontends/qtfrontend/elements/flexiblespinbox.h \ src/frontends/qtfrontend/frameview/frameviewimage.h \ src/frontends/qtfrontend/frameview/frameviewinterface.h \ src/frontends/qtfrontend/preferences/exportwidget.h \ src/frontends/qtfrontend/preferences/generaldialog.h \ src/frontends/qtfrontend/preferences/generalwidget.h \ src/frontends/qtfrontend/preferences/grabberwidget.h \ src/frontends/qtfrontend/preferences/importwidget.h \ src/frontends/qtfrontend/preferences/projectdialog.h \ src/frontends/qtfrontend/preferences/projectwidget.h \ src/frontends/qtfrontend/preferences/transformwidget.h \ src/frontends/qtfrontend/timeline/exposurethumbview.h \ src/frontends/qtfrontend/timeline/thumbview.h \ src/frontends/qtfrontend/timeline/timeline.h \ src/frontends/qtfrontend/tooltabs/compositingtab.h \ src/frontends/qtfrontend/tooltabs/projecttab.h \ src/frontends/qtfrontend/tooltabs/recordingtab.h \ src/frontends/qtfrontend/tooltabs/viewtab.h \ src/technical/externalchangemonitor.h \ src/technical/preferenceselement.h \ src/technical/preferencestool.h \ src/technical/util.h \ src/technical/audio/audiodriver.h \ src/technical/audio/audioformat.h \ src/technical/grabber/grabbercontrolcapabilities.h \ src/technical/grabber/grabbercontroller.h \ src/technical/grabber/grabberresolution.h \ src/technical/grabber/imageconverter.h \ src/technical/grabber/imagegrabber.h \ src/technical/grabber/imagegrabberdevice.h \ src/technical/grabber/imagegrabberfacade.h \ src/technical/grabber/imagegrabberthread.h \ src/technical/grabber/gphoto2/gphotocontroller.h \ src/technical/grabber/gphoto2/gphotograbber.h \ src/technical/grabber/gstreamer/gstgrabber.h \ src/technical/grabber/gstreamer/videotestgrabber.h \ src/technical/grabber/gstreamer/linux/dv1394grabber.h \ src/technical/grabber/gstreamer/linux/usbgrabber.h \ src/technical/grabber/gstreamer/windows/directshow1394grabber.h \ src/technical/grabber/gstreamer/windows/directshowusbgrabber.h \ src/technical/grabber/mediafoundation/mfcontroller.h \ src/technical/grabber/mediafoundation/mfgrabber.h \ src/technical/grabber/mediafoundation/mfutil.h \ src/technical/grabber/video4linux2/v4l2controller.h \ src/technical/grabber/video4linux2/v4l2grabber.h \ src/technical/videoencoder/ffmpegencoder.h \ src/technical/videoencoder/libavencoder.h \ src/technical/videoencoder/videoencoder.h \ src/technical/videoencoder/videoencoderfactory.h SOURCES += src/main.cpp \ src/domain/domainfacade.cpp \ src/domain/animation/animationproject.cpp \ src/domain/animation/exposure.cpp \ src/domain/animation/projectserializer.cpp \ src/domain/animation/scene.cpp \ src/domain/animation/take.cpp \ src/domain/undo/undobase.cpp \ src/domain/undo/undoexposureadd.cpp \ src/domain/undo/undoexposureinsert.cpp \ src/domain/undo/undoexposuremove.cpp \ src/domain/undo/undoexposureremove.cpp \ src/domain/undo/undoexposureselect.cpp \ src/domain/undo/undoprojectnew.cpp \ src/domain/undo/undoprojectopen.cpp \ src/domain/undo/undosceneadd.cpp \ src/domain/undo/undosceneinsert.cpp \ src/domain/undo/undoscenemove.cpp \ src/domain/undo/undosceneremove.cpp \ src/domain/undo/undosceneselect.cpp \ src/domain/undo/undotakeadd.cpp \ src/domain/undo/undotakeinsert.cpp \ src/domain/undo/undotakemove.cpp \ src/domain/undo/undotakeremove.cpp \ src/domain/undo/undotakeselect.cpp \ src/frontends/viewfacade.cpp \ src/frontends/qtfrontend/mainwindowgui.cpp \ src/frontends/qtfrontend/menuframe.cpp \ src/frontends/qtfrontend/qtfrontend.cpp \ src/frontends/qtfrontend/toolbar.cpp \ src/frontends/qtfrontend/dialogs/aboutdialog.cpp \ src/frontends/qtfrontend/dialogs/cameracontrollerdialog.cpp \ src/frontends/qtfrontend/dialogs/descriptiondialog.cpp \ src/frontends/qtfrontend/dialogs/externalcommanddialog.cpp \ src/frontends/qtfrontend/dialogs/helpbrowser.cpp \ src/frontends/qtfrontend/dialogs/startdialog.cpp \ src/frontends/qtfrontend/elements/clickablelabel.cpp \ src/frontends/qtfrontend/elements/flexiblelineedit.cpp \ src/frontends/qtfrontend/elements/flexiblespinbox.cpp \ src/frontends/qtfrontend/frameview/frameviewimage.cpp \ src/frontends/qtfrontend/frameview/frameviewinterface.cpp \ src/frontends/qtfrontend/preferences/exportwidget.cpp \ src/frontends/qtfrontend/preferences/generaldialog.cpp \ src/frontends/qtfrontend/preferences/generalwidget.cpp \ src/frontends/qtfrontend/preferences/grabberwidget.cpp \ src/frontends/qtfrontend/preferences/importwidget.cpp \ src/frontends/qtfrontend/preferences/projectdialog.cpp \ src/frontends/qtfrontend/preferences/projectwidget.cpp \ src/frontends/qtfrontend/preferences/transformwidget.cpp \ src/frontends/qtfrontend/timeline/exposurethumbview.cpp \ src/frontends/qtfrontend/timeline/thumbview.cpp \ src/frontends/qtfrontend/timeline/timeline.cpp \ src/frontends/qtfrontend/tooltabs/compositingtab.cpp \ src/frontends/qtfrontend/tooltabs/projecttab.cpp \ src/frontends/qtfrontend/tooltabs/recordingtab.cpp \ src/frontends/qtfrontend/tooltabs/viewtab.cpp \ src/technical/externalchangemonitor.cpp \ src/technical/preferenceselement.cpp \ src/technical/preferencestool.cpp \ src/technical/util.cpp \ src/technical/grabber/grabbercontrolcapabilities.cpp \ src/technical/grabber/grabbercontroller.cpp \ src/technical/grabber/grabberresolution.cpp \ src/technical/grabber/imagegrabber.cpp \ src/technical/grabber/imagegrabberdevice.cpp \ src/technical/grabber/imagegrabberfacade.cpp \ src/technical/grabber/imagegrabberthread.cpp \ src/technical/grabber/imageconverter.cpp \ src/technical/grabber/gphoto2/gphotocontroller.cpp \ src/technical/grabber/gphoto2/gphotograbber.cpp \ src/technical/grabber/gstreamer/gstgrabber.cpp \ src/technical/grabber/gstreamer/videotestgrabber.cpp \ src/technical/grabber/gstreamer/linux/dv1394grabber.cpp \ src/technical/grabber/gstreamer/linux/usbgrabber.cpp \ src/technical/grabber/gstreamer/windows/directshow1394grabber.cpp \ src/technical/grabber/gstreamer/windows/directshowusbgrabber.cpp \ src/technical/grabber/mediafoundation/mfcontroller.cpp \ src/technical/grabber/mediafoundation/mfgrabber.cpp \ src/technical/grabber/mediafoundation/mfutil.cpp \ src/technical/grabber/video4linux2/v4l2controller.cpp \ src/technical/grabber/video4linux2/v4l2grabber.cpp \ src/technical/videoencoder/ffmpegencoder.cpp \ src/technical/videoencoder/libavencoder.cpp \ src/technical/videoencoder/videoencoder.cpp \ src/technical/videoencoder/videoencoderfactory.cpp TRANSLATIONS += translations/qstopmotion_fr.ts \ # translations/qt_fr.ts \ # translations/qstopmotion_br.ts \ # translations/qt_cs.ts \ translations/qstopmotion_cs.ts \ translations/qstopmotion_da.ts \ # translations/qt_da.ts \ # translations/qstopmotion_es.ts \ # translations/qstopmotion_fi.ts \ # translations/qstopmotion_gr.ts \ # translations/qstopmotion_it.ts \ # translations/qstopmotion_kl.ts \ # translations/qstopmotion_no_nb.ts \ # translations/qstopmotion_no_nn.ts \ # translations/qstopmotion_no_se.ts \ # translations/qstopmotion_pt.ts \ # translations/qstopmotion_ru.ts \ translations/qstopmotion_se.ts \ # translations/qt_se.ts \ # translations/qstopmotion_sl.ts \ # translations/qstopmotion_tr.ts \ # translations/qt_de.ts \ translations/qstopmotion_de.ts DEPENDPATH += src INCLUDEPATH += src unix { INCLUDEPATH += $$system(pkg-config --cflags gstreamer-0.10 | sed -e 's/-I//g') } win32 { INCLUDEPATH += $$quote($(GST_INCLUDE)) \ $$quote($(GST_GDL_INCLUDE)) \ $$quote($(GST_GST_INCLUDE)) \ $$quote($(GST_XML_INCLUDE)) } unix { LIBS += $$system(pkg-config --libs gstreamer-0.10) \ -lX11 } win32 { LIBS += $$quote($(GST_GDL_LIB)) \ $$quote($(GST_GOBJ_LIB)) \ $$quote($(GST_GST_LIB)) \ $$quote($(GST_XML_LIB)) } DISTFILES += src/config.cpp.in \ graphics/qstopmotion.png \ qstopmotion.pro.in \ qstopmotion.desktop \ qstopmotion.mime \ qstopmotion.1 \ configure \ AUTHORS \ README \ COPYING unix { DISTFILES += $$system(ls -x manual/*.html) \ $$system(ls -x manual/graphic/*.png) \ $$system(ls -x manual/icons/*.png) \ $$system(ls -x manual/screenshots/*.png) \ $$system(ls -x translations/*.qm) } DISTFILES -= qstopmotion.pro \ src/config.cpp CONFIG += debug # CONFIG += release warn_off # DEFINES += NO_DEBUG TEMPLATE = app QT += widgets xml target.path = /usr/local/bin translations.path = /usr/local/share/qstopmotion/translations translations.files = translations/*.qm htmldoc.path = /usr/local/share/doc/qstopmotion/html htmldoc.files = manual/*.html htmldoc.extra = $(INSTALL_DIR) manual/graphic $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html; htmldoc.extra += $(INSTALL_DIR) manual/icons $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html; htmldoc.extra += $(INSTALL_DIR) manual/screenshots $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html; # Dummy target to fix permissions. dummy.path = /usr/local/bin dummy.extra += chmod 644 $(INSTALL_ROOT)/usr/local/share/qstopmotion/translations/*.qm \ $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html/*.html \ $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html/graphic/* \ $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html/icons/* \ $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html/screenshots/*; dummy.extra += chmod 755 $(INSTALL_ROOT)/usr/local/share/qstopmotion/translations \ $(INSTALL_ROOT)/usr/local/bin/$(QMAKE_TARGET) \ $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html \ $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html/graphic \ $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html/icons \ $(INSTALL_ROOT)/usr/local/share/doc/qstopmotion/html/screenshots; INSTALLS += target translations htmldoc dummy qstopmotion-2.3.2-Source/graphics/qstopmotion_logo_75.png000644 000000 000000 00000041662 12536560630 023602 0ustar00rootroot000000 000000 PNG  IHDRLXJCsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxw|[Ֆގَ3 QP ~(0Z[JKBϧR(e4JH$d:⽷-K!Eս$ǃչC:udUU/8AAAE  ;$  D DA! &  H0AA@  BLAA"`" AA$  D DA! &  H0AA@  BLAA"`" AA$  DPDj83`O&</8O h 1.Fˈ $𿥷/Ħ%9a? s1 ÉN㕚^,>Qc>kBq6Л!. q9ЩgNevv &NO6jH&-FS &L `&hŞ1Fg㟻+SR4tclG1v E`@DL!Q~y+6GO% uda""#Vwm'l)IY9U]zxTɺՅS|:>mfE0BG1Bpx_Ĭ×EPDTu0`B)Hfx{Y)bN`CocbøoqW[f*֑`]r&^f|6¬+Hر6hlw}f9eP0T♴CL?H0_{0qp2 UK7:ca-\L_gąap:@x@y_o~#~m 1\T, ha cTOP38#b:B) V0$Rq8-u 1PE&+Gz a?Ŏx.~p臘nfRĎ5]6?KvQv! <4xAf,$"=Fd,MfF&NpwuAcb RuUCn8;9o!B1s`W{#R_3q N6KKrH0}!;GuNn<*y#AOMC]I`ۛQsK)Q#6n]*8IapFg9,L_iH0Șَqfݶ(+"b x"Nי qv!&9 '3ϸEZi݁/#`9785=10-ʊeO+`ՄVN4YX&mBKp0QdQ>bz`/-b|H0h/heW2XZ^сS 3ceMcdˈFAוc~ e7ILF+zGtoMG8%.mDKf7ǚn`O K Ъ 9X2 X^hLȨ˷6UNilR3K M_5ٛn}6q2tI TrbbwT-#&[3nŎ9 qj9 $jKdī no293p @݀{:<<+}[}d2tJ9 &k1/#)I,~iaf ).)Zd$02"r @}Ft`h<&{*/D%`D+񟪺CxBbŮ&זmFY ť0A6pπ1oozi7a[P%!A@Fb2/>HQ Q7`ħ-#h1alDŽ5R6 Ne`YN(;pMI63pEcU8K1&lA٩:Ad9i x8Pl,L¦%ȔfƪpDԕ0as~=ے3bpWe6 LqU,L PJs񇃝KEi؄NcgzZB=3pe%]S?,N;V%qF`IVX|4Rx5iy~Q^R;ŮVfo@`MA"\Ҕ `oZ'/`W@h7{í1?=Eڠ>ecT,݊`@ERzaFKN)GNc搏p?ބ[GCnk*G{ ܲ0dKzN'lH1-9O09*# 4?q*}bds=̬i1矷bo(_S2!_ZI+ZyS2J!ru8Ku7R6`([66J^ 4E$ *V%/v1/eFsgR/ c0O050~Kx30({mL¥>Y-zY>kaW@మ w,B~3kvƒ1 ?4tI)*4Q UwxcfY=Ct3rJѡq]p.Egi:%n[r 'lܹ_ =Tv4@o>_\d`X[e~Ѷ&|83߯?-b& r?*$m'~BMȵX_XrϦsJMaw ka|OޏȦJYW3}:ŒӉhƘٿ; 0 ,XS"+ ФB _vh Ea)~RKnvJoXXY\O~KnZGLxfw}YQY1݆-LyhD>ۧy*mɝt}2b83_1I v>CFkPhEn7U<*B鯇{Dݸsc̓ڟQ|z nRsyN4;Mx5CxCW?ơ Φ1pT &xSF}Ňۛ&e[Lw4y/tdK_3sYٸ0ZO6Ԙ.;C7>\ނ=VA@bW_lGw MLB7o_ e̒u3|4t&8wK/6TJ4ڄ8 mwv!p/E13&P0$ ifi0~"O13wE䰱0 34H*|b6&lxT?B/t8] D']ikvv D`vpcl8pNL?Nt`y$ hT-(澞*pzNW{׋mQ椥"UN_@gId3b"$WɺR#V3`k^d X rcUօY ƫO0xV0;E,3"$G`َ͘Z:ZC/\ g)Oԁ Liؿiht迼VΎS'w3LŎS ܱ1*96Easd{l9DZ J,J .KP3L5&ٺֱigCE`70 \2w. %C"q'R̎lU"}$jdyxLoX \:#V/eŎ]R@N(Ȭy''~xo!hՌ9i15[jz L2fB)rg%V3r+YMmY=SeĄyN0r--Vud`zR~Fտ3y-Mw ZQ 1>&??#6 FhSD=,ӋD7(KY{7lI*(FF ,)AUKNna!8XB!>9'âp20ifJP0ղigI)ǕPK HL Ù`4c={̛&p]"Q^<,]rbB4N%K}ecuü R,A p~8_d@e65VJRtH+M3O0N)}t4]r&,0dGO~\W(q6#I42; @(3p( GM ;W3%6sz>X."3,'03FvM''z 8s҄4M0)R* Τ`lJ. %F+ZTX @ݍMbR`#NEKrf5?+KfAk 9*OwrȎϰ`1GÙ9DWZoe08Up#pG눉Q J &H9Y/{ŶlG2|:Zw6p68A+E4kOE">.ZgF0EW|{~`ݙ錔Άբ35#gI V#=Lj<-ʊGA& asy~KrJnRuJ$a9a5- jyq2*(>nQ*/ЄS'R^Ipq|Xijk$D+" wyV<k0Id.L+R`Yz&]2B(>6zr*9".(X,V*PWY1A-0 4aD_fBLpAAhN~ P>Ctd-uܺ0)gp22 d$FS_*\G`hY(4X &n ~2~"+r9fVSYn\@YJЄ5ݢ6dT*3V\!gy9Pǩ{cM9̝)XWPY\*m:,M[MKrP?hD[05\fIUԀI@dV *F~ɘَ:4f8*m0hdPA'CbIy>~\XZ?.~faN4IhH ..Sq[`\b,Ut+>F͸_'Jx'^Л`_jQ?FTdVw 8]@ᾧb'*dp2h3HUJF; K9fHv#4͌U  G$E +>,e;pA|kY_ ;N00)9I_b5ь(ǚBn@/ ꠊ q6`: ]%Zp[6Y):8p6-V]U83VF[n_|h=~)\>~#$?YǎC@\PŠkaQ%(SCGM@͔͂Iq@qN0bȦ8'I_/즉Q֞ ;U8mw8Q Wbb@x GwiWr8; 8Yn\ˎ/4XtCP[< ^q&BOv5e`!3P0ìC@CBTr˜heP @y  9*YX,7 h'j(I i8Sp2R~wInIwzӉjR~p':d~9v$'F,bv5D"XoȄMg,- 9 ohiYjsqq >GCL&`yxgc:2̉ST cz)`50HԈ2B2 ]rg&764aca,a%` !}_ 0 M^^?dV)lxX/V ԛEfw7,jQmML,KN'>mf%s3KL g&sAF`(_LqK 9` 1FbW i polvWTUڶЎF3nx3Z4 $JRq*zG (sDZ3H8l20dD:0'-Ϟ_̖yX'(LCٕ&>&Efw-[OcDOqXN 8ةǛsin1ݬX3v^3=.Ĥf_0)H! us$sän{x~0޺̃jl(L C4<}[xPh .VpN'QȮ-Hëg)/^/wb+DSF?^R*Σ f_;IJi!9x!KULWt Lk2#'Vp" nNfxP\(c"Y/-yQp2?#\1_,V_fXǶTf&j Ъ|luaTB*RE]o0-V zWN3!e4 ߩ›ה(QpBhEV;h;4a$"/ ]A,Qp2\]~DwP?Ȩ85'̠fu_+5u&M93xUb = 2ךoo KrDl~5b*!dPr22(T RtJXy ѥ7`G [o`d`VߚL+⩍w6 np f;N'l PQr2r4 92bȎW(I :C8`s2,ʊV!|8QFL6xf 1J*4m&l>!- v@zU";NK *v13 䂃 $;7aw(-7Xa;&$,Ȉ=+R %M;~ VK% iL+pt(! Zpw1/AL `:r%B(;<5 b &zC_MALq%WKjzƙ*8$Dyw Y |'k /eĪCALF 4Ut]o L ,hcAAoVšIRheH,A<[0ZٵE3[H`e(A;lڒOomH|5(KKJarۯv- &Sl/,UWs=F.[#\qŪ ';F|Q8`""¬YyزW@c}?TRgZ::8xw%e388&άωtwbS'0>>q# 2q~n: TKGX+f@zzz45u{=FO`HLDĸ Ӊ-()ɝ7w? HNoNKcP*1#cdgHnpԩVǡ":yg7^zޕ;N8]&abLb'4>Q~D&2zqcc9ƍ'@[[~LGLDKGii.;|>۾W\޽'( <ʒ.fRRDֶA7l=;ڐ'UUuۗ.ͻ%%HHazn_5'qZ>GV?:lP!ᦿW,eg"''5\& &"__+ؘ1hnxoM9yoG"&F 1:{a2Y|챛qe+ k|^\9;vT7oؾv:NX6ťxfsb? _uk>}ZbܙDm«nEkkF3kVCzz"nq'Fpuܛ6ZSQ(.#| ee]]x問Q[ۆNX,VI=Ѝ5pcbB9df&{߻W^UUzg^o?ތO>9vy7>BK{Ezzna.||?7bs:p'ÕW>x3pW;+ү/--7ܰa~S#2 :Y>xj%`tԀ _cؽO?HOOl#.Nيի_< uN5׬Ajj^~O\Q|Ip=msgqM?<&#*+;iۦM YC(WOfcY_t^7t.\[ۆ;xfp={N஻Ûo>J tWV1i #sXww|egv9nٲO<76&&ؽϠqukyEvq:3`l̀' 'W?ԆŊ'[p͏#6V ņ~ytwј͛wJK`;9%䤡|f>Q;/]Z۫C|qc#ƌ^\K_Hr Eo1#o}0 ca<`q7~=WI1:j-_`dd? og;Gx?'Bcc'xQO\X|Lo„K̵W]+**JqjABn[.52 o=7M߷dɂso>|+ 16f+LDD),BAA&ZZz|>x}Z5w}yREE)6nV`Ƀo[[mBe,tu 򶓝:)N:̙鉧jn(X@zzN'y{e+pa1f ׏[N@R`bK/5׬Ayyd2`׮cرg>؇.Z!J|;#;;6,x]koƍGxRqqnqOGp8a07 pFdz=ol6;9~m;<)yٲx\̝;2'|y}t>キվ.K/]I-*f ^r9Xv~xg?يޅ:gVcBd='m[>|OT0"矿P*c-޵먗՚GjjN'xc&[[ZzPSBBycc9 ))wo0|-UqA*98N>[JM74.8pm@NN*x`0&c0q-ZZӥKˠR)~ ^F5zg$ DD+˾>,ߙ4lv}{ᩧ@Jʙ:Nmm}ؼS}{z\?b>fHٯJxƹn"h*8ͨi ǫ@{{99xo{EZZ"x>͛WZ޺Xx=WT &wǘ$x=KcHhY7BϢۂ&&Ǩ 5^w} 3`:Juecc/|Kxgc oeNAv t\{ZG LDٰ_0IH=ގ,X\uR(( =m_l?ņ8Zg.tmbigWLd3-모(IftQ^|?8pCCc>Z,6xl8NADZcM@1.-_sp8lŶm7kU.lo8~HK;v!o[.,$Ąwcc>!!'Tx- C{" -ZT<Ğ!!ޅLKv >q|W65Z5wG!LqX34oLСPw|-5^DOZ1lJ>ujk}3*4 !oKh%`""άYyNEW׀g >{o&NijO@Yb]AG OKRp:mFFYƄy]x]>IAR,=Ab8P'Z0gN>XypwnhMK [|!X^)UUnŋb܍Ѐzl#(>oNlk*/Z ժQ^^dNI~\nwa_%s>Qɘ"="6ѳ~ c)s;$i}uum.Hwv/Z\trAR;Çy-CV0kJh6`AT*Ⴉs؉abt9HLjx‚Q`WƊнJeeoK,(o|D3꾏 ~f6[泝dA]3bW] )š/޻ 7B抹::yIRwIe#Gqp2285qT &"8N|Qϼ;:ֶ_Fz`]o"%w֬<@&c]:x}4cF'hټ5} 9pY94|:۫};{MEE';fժyQ?ofA<īOEUV^j.oi_/_ʍL&d}}b\hj;/f" $>0gNnw$AEE q2(\ w9sө}Ν5%"̟_ի__EE)8NSzփغd2\w:I_DzI~~cN砬Lqb|m޼7{ޮZk nɠ{7(*wuu=o2F~~6ޚo))8Awhj|KHO )kwjҶZq4 B䣏~ >>3V[n`RL͵׮M7 Mzz"`6~D0kq6׻r\wՓ:C4';''O=u\wZϿKqk!q[o3ZvT93 = i~[b.xzA+Z{FVBT`l̈%& )/ jC`/g fZJee`&Z5o/+u},,?F&,_^)x-މu;wf@\ܙu׭[M.ktAOEwt}oW) O肔ƵA֩n8'W{^}nGbb,D̀i5 `NXO!F::a4yanJX/kIDATbw^WZDii.|w:g@_oI dH.R)<n =K(rAQ .ohQ$qp8=aXg03c`5EQ0 r+m::;;LNBB,E yc2Yя1~f@RRkq/ZT`^Q@Oz{[R8 [(++#H#%w}JBzcb,ؾLs 1Hm2Ybb4bc5+MM]-+*xO4Ȉ{(rx~-&]]ͬ4'f t:ôZ e;pH#)J$É 9,(И`O,ov::aXy//!,kH0AD0M袇|B r۶*D& '[kې7dŋKI,`" hk qb, & IdqHN̙YuӢ5!0AA@e  D DA! &  H0AA@  BLAA"`" AA$  D DA! &  H0AA@  BLAA"`" AA$  D DA! &  H0AAaوbIENDB`qstopmotion-2.3.2-Source/graphics/qstopmotion_logo_30.png000644 000000 000000 00000016062 12536560630 023565 0ustar00rootroot000000 000000 PNG  IHDR7sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxy|Օ{[ղlYfcb&0YK0I<#y !afa1Xٲf֖zQw]-u$ 6cWխ[wsvxKD\ ""d Y#` B" 5&"d Y#`@s zD7kvrA 3|M˦| %n㓺.ntiV2/77ھQЪV_WLU?r-8<\];IƳ\o甬n/:a?!؂خȍsmo}ߟ4o[dJ |>K8gdx݃D3j׊4j4Nn=$paIR/w խcJNV5gL4LO2l_N7ڌ%*ȩA᭬ 2g\ssF֚~Z8- %h0+N$/KI&-9'$֠wY<^~Iz>ɤԀK;S-΂Z'Kdhe3|oX ;jhgkL^Wd\}O*kn|r͚v67Zdir{GF~Q?ʼnQA˅V^ƶ^}~P82*ɬ,Ȓ<^c{s].zQfX#/'~ݭn oO3c`ɾeH6뙖hbY$TBx86Fަӭ`{sbV CZZ`f 2L1`u]i1榑Ѭ@/=齃4#椇M?u+խܿ  l15ڃy9DvۇxngtAV4QfyZ|m_;OnidSxP'<=mNm$~R@C>'ߣl?ӪD9kj;˲?~~9Q`Ҫ)NbWKOQku[:S4h\/NL)O`+^'ipJ!y GbT㛿>QX^Zc"z5&@;hw/NShD3A4kַ6>ȧ_X $t~p{E) 2Ys]1zxbKSQZ2}ZZ%>%x?)O%ŢG@+6 '.jfXZtxx9cCmfFv\i:ygçY{0`ӴD:u]c M1;Tkp5-g>RR}q?nk6բc咑z hW T/ۨѾKgfFeKSxnt{ѩED/ʌdb "{y|scشz#+?WAAFPnjy )+5^xkT9f<fp :FwM1on%kfֺ,A^V:,YA395@OgvuT ]-V3j,M _GkI"-:/*KS. A}JAV(ėSY1izMrCIRȽ4^N~8~' = 2H|*>}("S&C`Zv= K~/rbB.N`ԴdɨQ13yS Ӄ.E5/#:亥I{hq0:FVdgPQFNhC@vpAbfUjo@o]X*e!o7C[Wg* o*( 8fE󧥹wVF'n/4({R,!kRJ $C̫ @TIQԢi$4' DA<UIa%9G-櫢|m$%kBޣM2s(b!ncs}v[xJ(6=8m/0S.P"랣(밐=md0iΈX[CyjhMn%#qtjL#+i@'˛v*x`L0*Y~};7H!ЍJ)Oǃw=!ktN7Ʉ  &4 ǿ~R`DbҵQKrsFvzc RyοfQp]FlNl1b9ݼH^a])z^E'p@L?6!6=;|Y&kk;EN M፽{e]o,]+êW FXtj|6.7CaL8?Vspt :M̟$i%/!٬cb./DP&NGmb`Rw*yǃ4+7HqCM}n;.7&iQ,Ύaj^G=Ak21XɉV 48rx1 5Q:5q5suam eSb1jsYc]9dfX|^˧mlnefPƄ V%`5h1h^v 'JZ; Q<'4q|beE빦0>zscv==ސy?{燒a%, tj_m66mOÖqi^QZkj;8eߩwR-l8Su^yqx^^nsQ _($Ir1)x[xӏ(֍k-?}>e?u[Y ?zKDǙn=gYl?uz-W]5[+÷GevycoiXlY/_Zɶm?ژɺqc5O=.&3ϬnwrE8nbb,=vZƜyK%Kr;x^6m^_6^ySҦxANJKp:]zn*l6;1wu-o9(b8.~x `$eq@=%tZZ[P3rjǴc_ r‡!j5|yil쀠#.X.|rM_ԩYC 4nyWqd'VkEZxWǏ|}}Z1mm0J7߼Y[/%$Dsװqc5}NVf$!!nIԈWQQ/oСkxOٻsue.-ͣyyb\3o^o }}LIk+عZ_`:IIg*%k||4%%[ǺuUƧ?bdn1v:œ9E?.@`\*+wѨyxݯ܁ɤGnaݺ*8td4/xe̝# @yy+W[)*[r44c4Y,ZT x^y}x j5\y\j''wwpa\^Vz:;{կn壏IlIv'+V\A\ pa)99b`ԩY<hϛWLNN O=.eey_0M[(,ۮdwhhhCrK?38ছ. xiӲOe23<TVbɒ |1<qh3]M={h\Gؽ;HLhԱn]N˗/k.dƌ)SY3b N7h]4{hk?wJ +ͽ'c4*-ĉVD#P\<9{ VCSx~9m^ymuMoo䣏j0 >-MKg\C]V1)[`6$m QV?;QQ>d'o9 2ج(<v9Dwzy `4NKN㫯iVm28@+$  ))N*ft:-fk裷1o^1\3KYYTDE.//oTN qb"//=]IOQQW.]tzzlR=,, ? ,U$&&J"9E47wJEta֬jjzٳٵ.אԟÿgF>_OEEԇ$%;HJ%== KC@VFyM͛RR/Z[9cFF"|gI_={J?c()A5,&z`s%44xz@4뒒b8.>`39>)IFyuMZ5k> liio>a%mX\- Y A¼|E!u`sOa6$ԩQUlT#]'&b0۝|ap=c?X?wmn{KΑSTfunn{|gYN!33Jr}b&TUbm; 4WOL3,utuknN9~&fo+ p8\ԈRb1etwK{Z iLzv'7r G[i^((F^QNƑ#OCdd$Ñ#M`4QUEnn6Ç%-CFF"vj݋4)~'ED37??6v{HNE4+ss8zT,cJJ(6::BO:5+Ĭ8~>^]zE477ݻHyyPSsB& kwA-  Jf͛:hoBR裫8~k]/y={GQK.*@y'HR\$wKJr4w܁wLҼ]bzCF$RC78ԋöXw'jMA0gfFRLAO:bj^Fph@%D< WC7ۈ']ь1] ̈kwy5ko=Y{j19ͽ$?1qG^S<0 O0dh7=8Ь=\6;/ý#wj E6akoDS3]aBN2y}}x|{&mEQˋbR6ȤedA!b㎷ LCzd`HʰV"SqK!2F%j.'8|K v ǺH0`Mnhx?>ݾ]¿^1W>ޏ'.bC&U 9AӥAo"1}w+%8Jf}~Ҽ]B@FƺLQ6 c&laҶ|?r^UJ0Xii]^n&}W.Ia5eP>8#3YoHzfpr`" ` 1\w&5Rý#ˮv4bc< ݱ (K >kcH5)H4"O-;T].+jf0,y #xpz^,< zp= j2CHOk8"V }>ޏ_~ʠGXUL^H`5gq"(.bB5Av dsx?;7tܸ8&&iy?Hv ?z:.G0 =l"ݕipK<+i ,̒2LSQס} yh!#xt 8Al"+n-=ծauHҤ C#dQDD8<1f}rfwaIEvϮH׼M" #xp+bXS)u"Pc^^QB' "v *4:>F CLYP% RWeE?g9 v0Qepd'aPp#s]8tlbk[#y?0bGtql!%01=3ul߱t@Z2P3 8}!prf?X8#aLJ} VOqM1y~S_Tm%_WUt*;Dېv=̴J19$`+.( d[EU6ƖA4Dq@JIeԨvOQҴD[`qLtCnerǯTDsU1ӠHaAݍ6=wsXUfg$U^|K z'6ZKB~9vq{. @s;ǁAs٦O): &1## VgE]顭^a8*ғ•s}Ƨwz5Yth ̲41\2Fp1;}lv? cck}Y v(b־ZXi}' 9# iiڻhpuxowbYa 2ͪ۫231hÃ[Z4*ܵmvԶNTf$ pZidRmvEFW +%AۈLr(? ?O_(ǙeiXVog*~[[BвG!^s; ^QYt3|H$ .oŀ퉆 []^~ZLذ Wˉ,3#xYa lMG5'y?`b~l>֏G?mUY&_U!.L xm@h> u4MV3peabv17'HҠHFD*iX$EH598Ja7zw.%Y^?;ˌt ='{~6;>/-ŷBբ~) TXѤEpxx'WJ 6;n|`ǔ7ϙũ0upx_&}~<\$tf}gbRW1ڈd&q?8^ޏwc>֏*F<8bVi4-*E.O}P3lW d,O/;i`vlqL9sqE4@Mn] 27\^yqZJ89Ĭ.{#P+7MLY[AhOc1>|r ԗBa:<>'*\x~hcbcCiƋЭ R%6Q)ݺeT,`c/=26sf8<3r9ֈ'~ 1(47'Ym'AeXơ^llVsmċ0?/4)>mOpbVw"NuF8m_wu0tNx爲IeXmU*m JDe C]3s͸pV&!0ɕ;)M<o5BBTF8QˀIj-NH8*th =J`kivf1ǒ,}8V!]Q盌%&BmCn+.XTvEQJvzZVraˎ<~rwWֶ 1K76K&L~*Py EjDXrF:YD`w"I0WLm`ܳkU,%' xTh iX|P# ]n Lϝ4t;p߉4A ;VK@=ܫy_(r@z1~fGIV"bBj^$N2xkO0:ܒn0ҁ:)IEa Itc'XoċCLhߏv-OcȍVdG;9 dHNt )ی;3 rO,Lr?w*ٌwKrz :<~A%I's7v@SCz~e'غMi3@NdeY9GTy)5$0'vzy&;KqrեV:w.Ѽ?.9def*:e*]{jeQPaa^Ƨa!wL' :u0 Lʷkcaq-Kaj|^4Dk+ hu `84j%cU<ҭ U 7 TF }#ۘش#|!$?>eq4ِؔcQ89Xw 1ɅxYuV5S +Aw :330'[}s/w;VbəZ`wVM͵? sCc@.oq'$7hJSd:Rm4+!Ja5ziV%cŜmpAja~`go;}%9BdYZ-T;$M8V: p~ed DH;$e`q {LQE|,w*Z0?ׂ1{9S ij/pAcWs2+c2ZX`&=dW@k0\]b!rc AZhkH@@cuK"{A勃*g9Pűy`HBF7G$n2uwe_j JCXg\C fqWq< Ι1qz`9{%"'9>'qgX ɦnɳHVvd5~Ga`1gˍC *(őI;u;4:AjG #x;/00ԶB"5~2z'3 2M k0hև{dh)wcHkX(i* `C]^8<><턢um,mv7x~^ vf^J^ r`M3*٤)@Vq|@Jn ׯ B&2##iIFZF C|@(MQ4HR0)Xog;l< 2=р,:b<0H#ᇲ $ss{z&V{rWzpVf25\D?+dRLzJg7?cQR:be0#wk?b)XQr-&Gof4C{v00U wT`P5a*D"ꨊbBq@L,)`ӯya Cn0dDQbRF>PTHcq%gBIQ=F=n]^9R/O`IV!l%Z/"Ek(j<%r) Y`CZd-L>=pUY2!x<;.:dPㄓC[#E8 rO0 iA,]Sʤdb9ޞ%lr]9hbt2J!$%:ROeTJw:VrggaDT owOR}KH{ B+#,[ȢHƼr Ialğ.Š"GP͢<鼟u)aE{|*cIj*[߃m3ዊǣ^Anj$ 95A-`)F{uD?{M kNV>CLJk&JefVX/YѝE3:ӬYsD*ف#mP6u9lGl`bkr-Az:O :$NV"s\9hdrL08VT D"+N)dm6/?" zGEJXdU"J1H +iq %%9ْ(|)~/Ωe4}8XD4HǠ_s$2:YT[TUK=0BqQ `UDawiA%75i~x?5<1(bz聋 ȓH$+Z fa7p}h&刵屇 "MqbplX':5)X( 4,RUi~`LMzj򙵭&\ZLV bixGVHmv7,Q'bR:rSKRRAB,SO{MʠQ1~dI<5 f}NV"8ј(NUáMk~?p&M8ޥm_ȫM0 NFΫ2iDfUQK exnqP&Jaq]"%Z0O 6F*֌VUd=#6## IFK IDATd'tҺٜbF:gw2گ 8|vdc!"7'VG1,v,s]fhaERv0%e2:#-sEŤatQW:)Oy9?qL-,s޳ª9 Ӂ\nhaV1c@`C(OzlYɊXhhcwi8G:Fpr"0Tv&fɳ3`* 1# ,CEEyɒi~JF Qe$KtH.GG -Ҝ]y`~r-,N0L3Xe5ZEdᑢ< FyAt.Hxͮp|nC/tBt1g+ "cTVQޥ 7>DW.pzqXA!)]XLz.*/ d6I5󦚬 /ȋ>(My`NV2!@#7XkIٜy8 YYj6QBV zI>屯XNj;9^{սV*~%\l=.6ASu%Osv4c߉zq%kJR%m r pP-[co_z`R`dkjߗd!]@4??q :Ԩ`q^N/0%)R(M mvܳXVv "lP0J$m'(Suw7%$ױJuׁgvwKsvx2){jid>UpA}zViΪHW=mXBǶOזJ~S^K1Djt|Ԃj#n s$\;?gO[c1Ѭ|=8gFfeq׻G4K3ʤO`Wj1uE zʌK/6ri.Z6f` +UN+O-lXZ%A*;$U7u2 h[6Tf$!?%=,&=BnޏzG9׾Ԁ9f&"5YOp@8`J4谲X~&).,-H(D d`㽚4AjI2%d ltկ;gF:hcm$1+3 z?sxxleC-WI1$;ngR$D|QQ"E,/E*|g(2^2 n%#^+]z,:XW^GgC21 U_Sl^mvC@)ʔ,\1$WrYg~.\S5kj!a;<>M7V\=7;"@<-Yc$gUdĨ7TIX59ذ0O2F C$qâct#;M{0ݽssa6$]19p+d>*$tkXѝ &jq#cȍ &D2)k-uy(,  f:Kq갩IHkb[pd忌< sgX_>aQ%';6&ﭦ@gF4/괣R4>T2q~nŚ`P*ܵI$u#Šu>ԫX'gY -rq~ ǛMH6טbiz}wUqTwF٤܌N/IUqܺ𻊖| @-NZ}r|Y a=8GکDj4`xj}u)&=:bRMT:XZ^ctѬL\=o_Jq,imܸji̋DasrDCnl)xuCp -[5tct+IE8of9J8kJp$ Yf#~qV'I eKj>5Aϙ*sdgE_)L_q0dQܾ-O~X=O%Ibq qQ哗TcNv2l6f22,ުi8YLy3q )DA*eU-ɷ+NFt}']:"(+3UuxxA`l#Hy2l/ϝ%Oհ OȌwx|x{3Y*5b^K rfʜ6gRd j=^Fyi6ux6 Bc\yPU}YbuVO+|BɷոsU1rc+P;+ȹ34eIN7_WŪbeBAq27Oo1 se 8='|r$jO62G4޺7sRʦ2x8U"H$%gH<,{l[l* U5dʹ8MEUɂI4<lܾHV~xLtH%DJg.\l-3>rh,;3zzhҲU7y68zL:IFdL2*3 2@A/5r7]Chs؃a7lN/^.n,J_bEuy!֖?{ݎ/ި`'tH6aM0"=IXZy.ہ *mC|yqUq{~o%4FP{$\=Gfw+^~~M佦,^M6Ț" K R0?W8Qa<4Fݎ~'rx &'p/ƿإz8sxܙ8;whAװ#^x>_O<>a,M(a GZPhM@UkJOhG]u(М4F".,W[ljUXipڷk.AL"8ԋ6ռݧ/-Y  bݎش+S$ ,*XLsMAD@F@HZRۦ&?E<3AALlwZoW :-Έ2 AAL&0TQL~`Bʃ "VL}#BKgi.AL2+,DfLA!,R4R,)Ha6  `j6;pMv)+u0)}JR b*0ZF`.AL"XJ&ALm#xA6.a.AL"1Bu*5o  f < _]9Tjx?vin5) 5;l@kR@Ӽ]kA6 SHLGbS A_LUP\{/1`ZL% F08 8Ŧm}WYY}mvv{"Yg-UW]P12w/_^nv*c%Wuj~ڀͰe{Ia*Y-dӖK/=q^sHqN|ѿRq_"x [;}n޼4D@1!$%8II س n7k.b0%Ʒu7n)zmYY}ӂgLL[ ~<״>g#8wb 7QVi?:~۷}~ٲ}8,Y2+vc``{4nw`hhd?}޻Dž}-100,je؛HD̙S:msҥbs[[On-''r!FĴϔ48qNj}g>9|Ca3XhfD64}nBD.o^ բ0/>+*i2DH؛Hft:!쪭ݢ.]:6Rj߾w߭ {ϹMK&5EE٨*ڃp8\0BOA]]߷r!֮aשJQQ69A!텈̻L'R'^8S.H}aPzn#u:22-Zh[˗ּZAF01YFv=8eo?tZ6fc&cpp^o5tdTWd=>nOZ>3ϼ#^83}~QUW9'N`fttBڳ`2O'eWE}tnw8B,ܹe2K;Ftt$Oo$!##UU%((wMC1l۶?̫1Q^'j<#hmF_xWʕsQUU,{0^~#Umh@~~VDSs##.}]UU1Vo-pNyG. ]]}?N!5Ղ,X0C(zx꩷Ƽ_68yx99F23(+ {쨫kDGGq[,p8kD_oyy/5]8v3k327 {4>ݼ ̞]6 ^}us攆aRJJr9<\. 7r㾧Y55{` ))W`ΜR450H٥,> :75[/}DAF01YkϿQ#x]!VWn[ϋ-pe?RHoz۰Onpc.Z;}XF~~&n<100,6,^\9>ۏ{y6d/@WWxNCMɣ{=b^/? CH.pr,_^G F)oqH<Ŀ#~tdKb O##\9x^7؊~*t:~<]k,@B<7%vkm+@G o)~B,^\|>(yns(5.JJrpڃ/J 2ɝ笄#ϯ}>˵ȹs`6'vsg3ii|>lܸKR[UUsY% .6Չ;{a9|`ݺ|<~Nn8o^ S& cݺI~b?X`d{;D8ŸУ%KfK_i';z=rri&sFxޏ;Xfd`ѢHK"ܽ^/F}E'RpB  N1QϪٜ9h*ƍ7_{zNJ/s{1o^?j,;!3ӊʢg9>{)>{k}>hvξQ#X *PQQ0gǾ}X [WTXR aJK`ժyS;[4\7_+߾T fnphJ5K'$#w3E n)))f FC]Wm"Sjl<1cJ RdIUH0 G¡ jn]lݺO %p'>;vʢQ4RsApƎE 2AI >x>L!JJԇb` d26J}JO\Yhw `"n8EFpYYxfхQj++\ry, z``n&iSfL-Y^z]0F-~mJy`փξ_3M `@$~}_~lN YD܎c{19I8t:.W $Xkz L}wW0J$K:RVT RT{N yl߾ ?VxB-\xKI Fm^,Ci4N|'dq7k!99Qyz{%0NF{=JJr-$\r^hwJ!rGkc !0Nk%\gObaP!E lYvf;'z}f^`ŽN?}!1mm%;' ⛹ŋgD-E@pBj֢cj XjR0.d6Q_rRB&R8›"|*˱LOdh6Zt,z.$0~F*xRg@شeP%dq\J-gYː.MQwo(罓pJj u$$ rWc5Rb1h4`Ӧ: 4rQco]QM^ee!jj*4WCRpWhn>xL鯥zƊʣMo.Fu p ǭp,x[Yp$'') T[uaq^âEBf{AA8EE٣aggZZOO,uVT#8(`F@Ɖ+Y臜hg%#n؂qJ&V22/DMMN`CP7YKM ] s]>Z(D zWW)xtxoC}8EWhSrwxvYY8RjaLK`@dd9A귺әyvRw8A@j,ɏsYѸK+nރVl 2ٸ`D##.qTLV '!3loߥ:RG>ҕMdqAwwd7KcfAZ%1É͛E_r\B۱cԱMD')% g B(ˑ96(K T45xK"vj5k_X>1H%XcɒYGD3,Ɨ] x%eHrhڴ8lH[A|~_2sGv~Q:g({zEӾee_}u8ɡ^YN#Q/Ho"?=Tc2J>/`RV+\n!̘Qƾ}GEeVk2N=u!Ч4W4w<[a|ih?-9z48l*)!Ttu[ }ii<Ç[%5햗?3XphUptt0{v)@$']OH4bwzzeEbbhŷIK`Ŋ9@[wѢDefUb$&K='{q+q饧^7No (/σ`ő#'`0cߖ"wK,_4,z3X,,w^%z]d&FH^0Roq /RGtIJ~G--]{epZatwFyy/.RT~ǎ/\2b/۶g$KgOS :t[E7ף8axx@MM%}`".@/)7r٩.U_D k_88\kn/^}veDj\PMvɅ  ~JÅ",h]w66o6oggyG\7_8W$ xȤ$:n4mGM2nq4QSSٳK`0;++*~CKzk1<6ɍOAusRaa˃ڃ-7_LQpTһH5~`ժ׉nxB?ߢWYEp'? .dM&#yXFҫe0_# d%յ.d5- kkT>??=mUKTOw)|)#|#$'ZJJrT7c5)Yɸ _@+z:&\/?}5kq-SV_vg>89ZZ$'c?oo ^y#E}^|pJ̲exmaV5\m?5ALZ[)] c5dbtva``N@:3ddeY%"˃'z?4n28+]G[PQQ|ugIX5?%Z8]7o5[FXߖ[ ]6%Su'dpRי ͠2 ]7Oڦ\kXb {7 8#2+yj.p.VZ|5?c)ډJy)_XG=F|+eL"Y-J;1~pzĘJ/EWA`*Jq:Xpqc}NeIm_K+n%{DĘVؾU؉ADouiĞp<0Ū>G |Ay=N ܡċ7|~[R;'D3SJ1eޑBsuQŘ{"æl:}Y~ҺۉcErgbwK7;[L=uo+7aOZJxkip`N.Ƽ$UT3 vjC5,v)fH+ZXI*Яib:we aKՅ4plE.sVW)ΜO]];GkD\*7ZX ŘؙS?Fht;ȐcBTlc<6ݑqgYxؖxS'町w/[P@:Wm(0m;cm'cvm#"wPEov2OaHʰ},4jĄS$IϗivC3b̳^Mؓh3kcЋ)>(Vx_'ʽwڨ_ϭH͖TI] O9̖ /SBoWcHpc(Dl_(vCw"+2XD02|R9d0oUNSzU;LEv;uSuԄTb̢z:ńOg4:p^o;KRD3NZw}kp$6yQFl( t1_Y#BXy X0v22AeKQcS )1Ʒhe̟I-4ẗ́7 *aw=H+&.ܠ=vsƎ8 ""F *e @Xl UG=HT,9}@ )̫I%;-epXh|SAlZϋ1OzoHu|1摀֬$@ i}.1fܲP~ծvR6Y_K,5Y&ZUVN9܎- rU}5JsŘ)ƍy~ B5xa by œzS-AfLST[bZ+ j7G,NIdYOzmRp=" J#DU[ u[xD'M#SǤBlE OɜfgHO׺AiPǨ"9uI9>/+KzvKT%}]xJ߄y9MX{Nq4+\0" MeJr7?`ʔ[AϦ.KH(B*m _J% OIQ4HOYrsϧ#Ӏb6 ]Z^BO^;nko1U H;;q*)҈Ѐ4aŶsLȕ| ~eŶ%Už(u xvH* f]ĞXF8rvg1Eay? !;YV˛Ε73/8"+ S%I)5ΤunsS0Ý"cV T&Ӕ2]zz7qLx=g,X}BuFK[ەN:k׆ z{D|[x=n{5zNzj%)mJ3:tݱ6% z/_Krq*@'Zs%kt>U SM!)N lهQ-JP^f҉>ٛzb8]S eU"@~ 1'Ę^Kv[7bػφPt(?$A:pr`RVo+9JmB1憚kϣjGꫤVuDWIk+X<7ATZJ$_zĸt,pk="z= y͆5ؙ ࢄ:j'`+9,3+ݾUZ1bu'cjRsac|[Oaw̾8X/ĘJ.LQE\eRڧ]T222 kv۬WX?AJl.VF:aȨFj2222:̄3222:̄3222:̄3222:mRj,֓B ]RixcPC)u (a"RjR:=> "A@)eĵVաRj7,k1-w E?Ǻc3ץYD꺠M7·̄"R>7 \zX׈X Oby 'R X'1xkYNdbz}ӿ[Q^~sEdRj$V0ZnۑY6QRcOU/"=F+Á8P}I*Yޏw,QJxI yY)XD^SJmuXD ;}ov+"y*W:}."oF׀%:b^!WJ&L%c,¾o^."˼v5HG{,]^Vn(} \[<9 :K}7J?AcO{9x^ ץ7AݾX}܀Ɣ}޻^Gߣ-`PїJG{ܣ=hz`/"i4º?;Ԫpi^if9 nAoa/ (nɧD@{c0^t00@3vi?O GePd.gc)ػuо]F]R_?իQ.7=]~ﹲɣ-ݏ{>n \Y`2?ih,c+2Ӏ> iWc9ӣc%>#줹ȣ]ïKʹC}U ֟4Ǻ~w@S@+i䷃'<^{Mjt?7Y `ZsA^їc~ Wv7N" z!G%i^'= XKJo[c$ K_=\Sopdw(DaUɇһOXYyv%3+2nJ{oxe [ JOCIp?$v'R" `>M' nL> Sl/Ҟh~hc(s :͌FJîuQ/2N/$.hK+FS\򟅕xAM6 +Ib(1]!{hތo =.}0cu{i͎5{w[i|I`Ⱥ= x~ΣW8/v9+hl⇓;KyuI۟ʧ}q:3T3[†}:Cp>{EqyT\.;ŷ`7zvhS]m wc(z/_#\%}+?eR.v'TG]؟P)w0{><u5-N^V#7qQܔ@}4(+ý =,}\*::#\؃J5lK}h ?mQナ*w!Eu{8|:^;w*Η0oL(a#5RjkoXHJ}qstopmotion-2.3.2-Source/graphics/qstopmotion_logo_45.png000644 000000 000000 00000025545 12536560630 023601 0ustar00rootroot000000 000000 PNG  IHDRaSN:sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxyxřsfFIieI6#` 8@d96 KXCkpc|lldYeYdY}Υ9gzgT=PcMuwuuu[o[g8P( eV`f M a BEP(Y a BEP(Y a BEP(Y a BEP(Y a BEP(YD1J;ưt?F賹1hwNmh˨nv^ski2rMZ)dŪk5ʼn3 Fdd(K!QFBmV"9=0iBiZ7EUSw}#{»kES,JS+Na'g]аb r@5Twۣ`y{c:,prpE0h CZo TrSN@Pn1_se\iĎ!:7[k y+f!1t*9"5`u k|=JD|r#CUk>,QJiWNq'LsÕN-A%!39!to|ZtCal \-ίr!i&F"F8hc=V\ґهs#H1c9(3 ]z?8< 6uwH,ė- (MO+#IEq9pL2_< 'aMʸřA;6oǶA<qA @vئ5iyy;2a|syCm{V+\(qT<9W1[Cλ{i:>m&oiF5R*AO),8~f6d$-s& UxE4 q׶F&96w㣆eU CM9̒Æ/Z:αqtc_S__5>%]t$?GQ6@ۈZe;~sq&Vy}@uIJJaq@y,M/ZN=-\)+Ŧm(׆1쳅h⋒)( 6Xã_Sb@U m%.{EPy,~Ԁ>2TxX  Z,L򎚤FCe/]񇧧ݭ;hs 84zaiF5n+Kx^tK|hҨP+!Sd(ߩCp4Ȁ_,@> ih𿇻]':Fxye^A36:"p,3Ӯ]j5ax?ٹ26hl>`#LI`wye,`|3V&v⩃D|3VN*/垖aĚ307ps#tp>{[G~gmv,JBqb 煣AOVwN I9fW)k%FMn<]rD&hڱЉH W%\y KӍȊӃS}V 5xM/w4 j*R8 3ktvcH %#% AOʼn=-+DA) 8E(Iyj> 5xB0 z2!8E .)Bxl܍!;=rKR`(D'#liݼ0IT }o2 dBX qaRҦ~(9q!qbs%qN yi.֓\@Gϐc6GJ &'.E ]!p,Iу}YMv %'‡T]x}Ib">j|7:_ 4X{Dx${K֫DWI.6!L:rt)hmW@b߮i@fl%m@,]zS'&\Q$,4N@C,I:)چ9$ ~M]@l"&]6(hcst{P<#6zQ#ՠ {B0!mC :i1GLʼn:AOZY&jR %RspGmE@iO$<TjӀ) %9&/\ېO CZFF!D g#=Ojsyp2?٨V!,&ggz)U93HU1F,qt# 1LDev-,UaMRIҫ`TO9&z9U,J6HZ9Yiz !.HE8Ɏӈ!%vyA$Tx32">$ F  ՠ&o)` ]vzX!^ IBLeY&wp$1"))0ݨxV4 1hO,I8Q0BBMxNưβ|2@p)A×0A2UT6)~.l>j R]ZW 9KCpQ^tZ# ֬hgFV0HN`"eRSނ}w}L(F Ҳ)p8>m (oFSms'd]Qqԝkz|l=33vYw #|TӐCv2L.m#a֤ (4P ? L QLn["t"D 8Ndia!a^LS:N5DUbuzPG8ɺ )FLh<*ۃIBג aR+<{WV)s8\Vy&M 9R\x&ک4$ $كhFcmVܠ} ^"|T 1e Fl6/v5Um1L)l%̉YJd.ar$MTd@y|$-|j)><,.<ڈ.ԑ*93B&>B&B_q {bJHыK 6Y`0?h^.E{"FHL\AI6ȅ0RM &RhҸF[MΙcXXg}Da V0_GUNNRH3b%"VG8ENΓ!?^Av%b&W"!f~w+pQ<I­VI#Zr~V1MayfF"޹2/7/Lt";h Rzo["PZ"_@"_!;+ޠ>oJ1QĦ3ʼAX/ˍ8Ȁ. #ݒ}[[D8E%V&mBK%R2g!wOo:b깅y^ GhkHrVSdR`Yk͙prGy}o>>93`>w{RY4#^=֍1'N.<}02j9b5 Ī1inYt-)ΊyxP'N:yR%gW")FoeD~r6Y@HuyH,0`Us:%ms(z^;aq" %23c؁S(ϥx:=* P(33BH(d#wQ(!h?>z; q ^CK7`R)ǓOFJ(S 6lx--f_:lhhǣC_ye>^ +Vw{. m_޸LjT0 %%xE]Dss'|oFmw{9a0݊OiW/4*vg6!>ۃŎŋ pw,P!< \{Ex?;w{xQWylSVhnuv{0JeZ ^" AJ1,p8~xf1=>0TdZp8J -dw/3t16&CN6hfp}P:ht -Zt: |=}d2 -w_ }vs)q}k100 R `(++ &Yn!vm`]pAvJ\ݻѨ<#gF&(xd2FFp۔Lg;zԟ^Eqqwb1`l| ` 8[>S.|X [pX3^zi;^II LIuTf eĉVb۶gv YmB>t+W㡇~n[>/=A}}+֯/>ozGWozhǎop22̸'qp*)/Fcc;`3܇d/`׮aGoᮻr7/l/6sAUqOV^rg`v #Oz5~Ղ-[&Hs:]r,[V"8[ #/~?a6>ވ)!6mz|R-Y=v8WOOH0 X۸k55U0u?6^Acǟ< Fݏab)0B0 {+Z[lٲ+x}l6WVsssSC?BAA:9_yد}3nhӦiP*صkSHg/*gż?>܈ʹn=??'?. x9 ȿ|4E^Zj:yy½2_/8Fj?F‚9xgcqkxqZͻqkP\+\588PwE}}+={q5p^bq ''t*I U mxN_ʕ޾+*tjlP*x=Wa޼l_`߾`Y/7x4̍ sqkif>.ip@R/ycc6s?6_Fk6n|x]կn×_QZF>:>|-ǪUmob ֮]Vӧ+*;: ==%Ep H+˽< IDAT`Н7~5~c:p㏿ ́..?i륥ذ6<ĻhmRSq7t:ͤ0@QUU'x][ۀL36n1r7\$n;nJB- /.^Bq޼ll^8ސkM?TcG VZ귏=Ǽ^Zb̟e>x<,8Ѩ޽3g;Ktj|QA_>d/  8&%Wpժ/J:[cJW_r-v\..}񳂴5k.Fa?z`;(ڵ^xa+ozQp:طnsq\.Ɗ˳smtjA.gyۡOFnn zzZ&qpY6 W^^v gjoqHۃAgˋpYA9+*tphv%qU,W+JyOoG1Xf --˗Ê!e*g9HN*0x;a4zm,!dĒ%~ju@|xBx޼lt9C t: ?dg ǴRUTw m׽CMG6 r[~[ ˟g?2o^ 9{ll B 7warAm_dCQӯAd2,\ݻ&K/-K|.^r,X#j666a{{GGXǏ7 ؾ:~ee˰hQ>YTJ̟-Иi#ܸ8=RRz|{48bB8]{*M0ut\ɓ-sQe7]`.++±c~A,ʩyN,1:jLdewZ;'*//΁3 E_#omA~2 mGyy7̧i6VaPVVwm9PWwNp?Lh` JAV N NCvv2^|A88Сk 6u8} hl\QQB:w3gN,!KȨquu-8I&Phhjxp0wn`@U#!(un( t@##,6t q9{ b ) vsPu:5oľ}%K C< ?E15C330M!ގ!I~e2_n(r׷dңg˖v|RBxصV;xzyHKK'6n|=$yq%Pȱpa.kl޼7\=^yӈ i6A˖񮻞Vfe%a[W={bppcc6r!y䑟 U7ve9lٲ[}W_|r0l/.@UUYH^.:&AU'*2PUUݻ8<xTVtWX^qEo6طoWc^vBm\0 a]ݻc``V޺1~?| i%%()B]9SOz_pNNN 龺TQ#K}or8Pҍ JB` @QT] \rsS?^ϞQ{[n##Vv esLzu.5p=p:ݸx[GBCYՁN\nz1 1I eJTg-CCC; bl %[cBb.8nd2df/qvFHi&92bESS8Ϋ5%'ǣ?  IX/6ӧ[j%23pFN֜d5o"aHKK khhΜX}u82bt:5jǡccuhQp̙8.A}>yy`'N' a0DӻlӽB㫯N F."А_𾗶6=.NTF 188gtA @ JKCCcho|.@0B6>h?n~M#(ʴK. 3yo*TP(ӆˊ{*o*(ʴo8_L O 2P!LP( 2P!LP( 2P!LP( 2P!LP( 2P!LP( 2P!LP([xIENDB`qstopmotion-2.3.2-Source/graphics/qstopmotion_logo_60.png000644 000000 000000 00000026747 12536560630 023603 0ustar00rootroot000000 000000 PNG  IHDRn2sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxipus.]' $ADI&ò䘔-YqrlGUI\OL夔Jʎv\JdIqtP%YÔ(EA^=f'39wg bI>^w3SSS"( B8[P( r+A+BP(B+BP(B+BP(B+BP(B+BP(B+BP(B+BP(B+BP(B+BP(B+BP(B+BP(B+BP(B+BP(B+BP(B+BP(׺;D"%d2dYdYr9144mϣԖ):_KK W}XZZrЀaG܍b}}*R*X,//caaxEu(ۈw4|>_=B4EDB!KCʮ `||.u(;IĄeVǕH" DRZ;v`E`3E&q4JrU,5 rQŦZ:55*ntA 7-(V`- t@Ѽ}~gI?<<\Oňڲ+k6BY'#y[t:h~YdYGfn%133S}ǖP- *XkˮKKK( \.a=v8ǁy[ab1@zJN˾08NWb0[ l5 h4jhaY\%Vv#+(bmm>3e,qhmmb\|>Sq>G4Ķe-eL01KMss3r&''m)P]]]|kEg:ͿKo~ 忷lLӸ|2+ȁeY9 g#D+^藗111Q rr9auu7 0N1==m{bbFOOO lYVjffЏxى˗/?lZYY7jҎwlmmattG1,*1YaffG1 Qc~?n-S=}}}EdF3%g$d2;P;j߭>n5NN166Ç\ITYx^Ӿma7Aߵ!" `wHӸz8!P)1 ͚jN`d7oIKu`yi, "#6d2;z\P+vڲ^$!T%$ U$T$Ɋg϶k)rO\uR3>>.٬Tq򬰲bhiU' 5j֍ ;( vzzzxV)mGvCvJ!-Q_VDQvr>x3[`azse;:? ȼ*S7xGQ\J&DkA."=;1344d9Њy|8*eYN]\(L&Adr, X__GKK&F');DJQ,NRx9Skks#X|{ 5eYD"ۑ(X[[Ckk+XwXhSa*:OY/-A&!6r'eu{A?A&MxР+,ɖ`'8~C |X?y(= vlU"H rnGD2t; Egi|7h0hQFQ[,...890#9_ӎMF;C_ڑ}[&1GՁSDP5d2xwOi`T$ *n3 [/It瓟4@f}N< T |BUy vrѻQ~z `~'k>7euww3&^}iGVvTNj`2 +I󫯯/+Tb'72aK( T$ VazZ+cMtk5ΜtFig&fg;5RanEJ8vfV6vssӰc֙uzz0Cێ`5K%#vj%X&VE*ˤ>Q:HklL&(,V9`͝=Kv#Oy@oWUx,'0Ӱ vVM=4l\Gk5g( =jzQn|T|߯ikzNPvT(Y#oeg}3MHHC9'dߞrYĂ5K(X]G0K ܮ{TN ØXh3;Ҩb3fmPwF; +G2$W=411a:3.؍HN4pb|jgS;ʈx,wԳތ4?&FS+agzfZ ,a{dDsZ[% v'ޮMN?k778uqvkה45V˲mَ%=I0֧-XqIn|j/C$ nϷ#YcL̈pVmc JWi$UCqJ)fHIn f35l7Ǚ6F`ceU;9;RcgpD 03;LzhݝTv*mGU;JBrY>`'qGBYˆ]+U1Ew713{<:t;,\jn;'DZ]898]`G1ۡډ6oWfS'&}xQmӵI\k(DF`ɿzD¥ؿ?2 b,2 Attk"Yc؎ zŜIA35VU#AjU;۞v^yU;Z#MR\ҽPCe}mvp{Xofggmmn] sՙv6<d_53kSSu;S.#U>>#D}3;ːN1]nK-ɟ|܊Mys- IVfNbGC;Ѣ'M,Vc:Y69V;ՙa馥R)[k + qR+3hZ)xzbZ G6uo 0`:33o1$Ib1:rā^^W3#x"Ɔ&M7eYͩ fJ@93PWWVxsjr;>jܬ+r>-6d2i˧hj؉ 6zH.HC;q{{G%ٳGwKY;Պ˫Q ?143 #cY<;477  p]w!H`eed| #;GE4; U(e'".\@4  P('ҍwRl b Vaj `R[H~ER([ ٳD1n7\G:\N;P(J\f L"f);|>_Z( )j+XExJg 'P(vQSv 1KCɐ VekB>j*XIgYMrk@_& ewRSJ_[l6KR(vU;v;P~_I) bFP1g?K|[at7 ; r#4P( VX) BBP(BP(BP(BP(r尵β,>ai8"k6`@2R#fnd2Bzt4߆zT"bN:A;;;o|C{ԧ>zh[$GqB}gŵn_eg~~O?ZWWF%^~`aaAq:;;}G}k׾h4SN)Ҏ=AMkp8cǎV\.pjj >p . =p&{u\k,--իHÇR~?:::wPjxԔ{K-ir9| _ ]5u}}XL>tcc?O "OEMP'_ Bva\MN… _՞wwSSSkbf={TEp}zC?~l?яH$҂/~r#\[["ug. DoOd2x4;y$8C<ǯkE:qxGzKvqlll`rrR.8)ŋf$XP &&&H$tǃj`H$Ư%?`hh__ۍ~ŀN111y]y)ÆK.)]ގÇeccczbll |^7n|ec*^{5d2\|Y{֔&?~\S_ass->n7qrL&1>>9ܷo XXX"VVVtcYMMMe˗5\__Ѩb~Wm~'^~eM=<ohcuO,χkncc#p%EZGG2 pҥKbr0=w}}o&K/s=~TBn6`dd?ϱߏ~kl)3g_2 fڊ|3E^EN8gΜQ\ׯʕ+kG-qy*N:+4ԼַH$9+e7|*?)-Ң+X4^xd2K˖9E=a,,,`ttTrUg,c)x7 ;[r,fgg=W\WEeԩSre0 o|O?4hټ} 0==i.\mg:z)B%z%2ecǰs=??yol `݅:tH3OOO(8×%4ht:P> gf)Ξ=!E(,..j%޽@$a g>^/:::ρ XIDATF5tvvbdd _h3^x`Dz,N<`0UŽRO`aa'ܬ1CR)"ٳ8r{=P뮻4&6AH$ 9 hL\OV dϟɓ';beeEqgΜՑbkk o VOƍo~H{ݍ7oje ӧ1,.. /BJ֔P(5>}ZS4eӧOkcۋBsaffFN~:Dt:;;dE/^zY__i5(*,9cmmMϧ~fܬ:t@QXv{{;N8t: .y{^ᥗ^XJyAp8vE(xwO>1w}{W^yE1IڨJ>8 Ӯ,}|倘;00T*r( O>)PRLӘ՘9ӔGRR$g)}B|o;@oo/fgguSόDQ0E#].|Ia~WR. tųoGFF4'LN8!EE@=\vMq}pp<P0;PxWVO n޼裏(R%o)SiQYK)M+ c^@Z?(m*B*B04|G2Ԍ[}}}8|;:Ci4U8UDugYV!yFuxGW$Q&bwRqj_FWW4U,?N.~իt#:::P(4BMzz0@SS(Ϝ9'#0 Ѩfs!sZZZ4Xa_@ѧ͖PS Н}r ׯ_(4x\D"/)v@FQPɨqZZZ033QJ̌TDTKӬQUif,u$Z(4ͲPϕO]PK;ߴE֒KQ7lɤ*aA&^@qR&4+)LFP dQqnsssA{Ň~1^YLLLh{BEx^K?y`]^^[o"R" OIO9JBwX .\0, 1SEsR)ͷ͝TJ1~g+fz PN5Djw徱^aݫNs @O5Z߽y g6*ܬX/ 4]oF^sO^M`ݥ r$L_1J5 ߎNT g)hd>&ݍS\cY_Wd__5ݻᡇ‹/h /\y}s K/ilmUDzQЙQ~z Ss^ѻ~ak͛43SJ3755d@7ૻ[V0՘Շӳz ڳ^v *Xw)VL=tpIRVwvvJ \~ݰ V˧+v>. -]s=j. -B5j_kk~+͌gt<ˑ׀v8}}}覦&444h뺺:u]层z` W$kZtvvZO=޿tիW5۷\Nc)m\N>QWW,`^zUԿjWK=fiz+潵q=lۖTBu Z=w0 4oُR?˗/#iFgg'DQ8my'=-ެ_Dkk+2z<߯2c~("'@[[1Ѩ|ښI{b@~ym{*|>g}>tZ3wvvrabbB$T~E>d<5J6 "inn\N,u|, IKpwԭO{} ` P d>DݮBzzzt\70LRZSSXUX*x ́a]`- + tZ Ljvy _6mE"yaA4- }.Puuu cjj ?=ğz)w wyGsrwwwѣ{677u3 n ###ʕ+rS>|>)4z0 k׮i6RטEQRAFFhkk b8q/<rBҒy>=f0D:‚n޳Ek033#׃4P=o'F,&''g)8@q/~䍊T]u ߀ܸq4ĉx-g$1U}Q<3 EDO> apEMz:( \P({ /b訮⠶bj2{i Rڻkq_rEYy.P>g?&BPy睺Ԕ0E-^!P U$IÍ<FڍTh!)|ۋe*:~)\ND(X]]UDz<aIeYL~ssScV 4X,xFiP(P(1y~_wmT hT~zaͬ󡽽]/  w酅gcys5$ McY@@[NVVVL%gKgVVV 7>8>8(j=4444Nڪ8*NcuuU.,uw^|_-w4՘].177y_), (([Rrd4mȭTR(-D6Jٳg5qPS0BBxu7NA3KyvvoW@+BBlnnP(h6PzDO|j& 5S( ,) BX V BP V BP V BP V BP V BP V BP V BP V BP V BP V BP V BP V BP V BP V BP V BP V BPF}Ӥ]sIENDB`qstopmotion-2.3.2-Source/graphics/qstopmotion_logo_transparent_90.png000644 000000 000000 00000026240 12536560627 026221 0ustar00rootroot000000 000000 PNG  IHDRK sRGBbKGD pHYs  tIME"p+tEXtCommentCreated with GIMPW IDATxw]EǿI jB*PHHBAEyDC6D'*φ]TFĊXP'5څ@B= RHٳs}?;{5k^{fB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!"AA$[{kvI?>s3E_'p_?%JEs7K"U$5À/]zR%9 ;{)QS*/ 9NlCO:W0wtc[YzTINp܈sK%Z!'{z^fn;Ir 2/U[ jVr0lL',zu N5(7FFNht77*rE/3{EsI76V N.q8'oy o_sߒ Cv,$qnY cj .BӹrA,wwz3"d3pR^{;)0f;($ +QvˀˤBi+}OR !';yΘc =Yj&SG4'Jݭ8T(j+,:A_}7Nܫ%p)0ǫSnVM{0>%ZLu3[9Π΅(X4f2}<[b /ll  LK=QZ@ &Ḯ1ջ b(esVZ8LmBN0]u1ӟKH/^i>*BXspj\ tfхGwJbT}_[gMR 113d E8˱;/o,]q#- ;ms3)4B!w}ꈧt 87G& ?f׍Ȼ ػ#$E |SDV6]醒d` ! (w6 0496mBN3d mMt$dE|HDNpYq`vBBEGC{t l͊߭u  ~w}Rz0zUXP3:Ὲ^AZpϺ~lS|:,s s/4ٟkscd/ToMSXϣ 0 m8$I^Ml !s{~^K57zV& V{R9-;>'F~M3vbO0>i'/}85}Y*+Rym 8/E"GM7sU3 :JOEK :-Us$`7IVşU_ ">IG̦s&K4J꩹FNpL;GJP?w޵ `.xj[?N.lR`C6ImҾ]z8D?w F {{{QmP纄$9$2=?,n)̡Q$Fh.z5/1rmlܱ˟o;d?ؾjԞS ze$8w065z? pn:I/~̂HY@ki+u{Ndb%ѩnNFJ6 fut7J5cߙi(=7Y$ɹ$uʿ:Fum06.uCZCߑ$yg=c-qdG|(D Yci.PX=[zpjKo\ 8?D7"pqc9?7 Noggv> ; \v(Y}QCWsϧo&&x`޵V/8خu߁wtu'z&UVk^V{3":1أ2hdټ`JHsC,OV/yZ19#c ޳+?Q@uqSL}Yg`nJnn1nv:=spTf)Bم'(ڹWWCUGV7j38wF4zVV bWzQ - ~E/|Z}5X xp&613 w`|>p3=EJ'KYx\}%>/*G/-?cF3wspnIn}ڳ((}Iq. "87N54>R teZX5[f,<^ndj+fk PM8v gT}9]SxppOϡwA[9jPom yo0^3KMD  I+=ExOf)yK#voRbRͿ5k#93m1ݶHwmdO<_ށ,'%D< ZEm]GT=1n8lhT3gr}M5zwyaQ ڳYNW2 ||R;KZ[-W~sU<2ld֭Bv߯ҟ(xe5hKY*<l:Dϓ|mu+>)|Ӝ,µȐzg mtGT/][%|fienojg'J,ClОOll KL/Ajٟ {ɠ)W[ԣ,'m͘U>H 䤭:Y\'{!~Ϊ[rC!4ֺVZlW?򿱎jv;2AmY\!/e/KI2hvьƍiTiЦJ/Ee9oZ Fw?ǯņ)9lM#8T\7 虁,=8Z.'{l3$ؗk?swQA(v9uf<g{ߐЫp*M?@f:νlPoqeU ^!048,cE?6ZwJk=^DAl][qn:v^iB!n¹-\}+稓B!3^lu?q45֢ZʊVOɿbS8wgW8l:ˤݧ$%9i:eO"'5  c?BEgS|M 'bbkm+hJ'J)NK tJ$= |D ]W(O鲨0~Ao㌜qn' Rxnkj++FOɿ$9Np?l l)ݮÜr&H mf'ɘځm)@Cj|;iS\vgk΋U Vke2X( /oڿ_AEVfnSB,fcg*?)c0] f4ҙ1f9iu8h\732ƹ37_"Yߊs 4"nofxP?;#kN k¾Dа# p y\"Z1[]!Yl7=Yte#˖ݶ () n%zfF:)YuJB*ĄBXd0e0c(>e`z J8ܔ/E ¶ ykm++z!A?c'NwyZ;[cw`SvΒ=ը^<׵x865uɷY2>bcѹ*K_,6!/wOXkm+e6:G_?v_Ҵ,h(Bk'¸u5hޒ$IM:MՀq3;Qo7]<}5 ki ,ic޸9qĹ"ZBLaݶRfҟ(9Dga h=VNElӜ>Tf$ɗ|eQlf+$慾kS>dN)#ZM\ln^x'jeHL9[nKh++XģNDOۮLl1m]]ڑ'h.y͉7U(`m$܃e6dġp2lhPŸxE/M3Jp r--)@yX6XI[eZXf[ I)6&J"N<+, ~H.~<(3C_?, 9N( ]#=]#)I kdZoXq}=M $YAqny{MV$.87# F6?qIc,%L58wY) Yh`^D\<&`!ݰpҕNNWs_[X[ư.~ILL_ +_>RU!{ivpqvW;XPw&I\ zEie3hόT_G}Fm?~` X3௣;2eݓ6JťVzY %pnCN,7ZwJy" ҟ}A{̲pYo3ISz ~C/u*.X}&]tLs]CLv5o1}uaLӥ?Q3ؠDڕV+:}~ pr-gv3Mi$n~0b#X'qa $Y33g\ެ9H0pZ/JY{?QsL}v.+![g /1|"{a :Uꇖ?똌aJQԌ2YߋMC/s]wol,<uuqVNO㙏1>d|JV ^Z'8cֲE(OB,>sB'53XQ" Έ}¹C>584'`29:ֺVJ\m鏍|, 係9%h~';P֖Q7B!OZ{՛:ƹÒ.8wwDY 'vJTY|Qo3/f/Źٿy6 ıֽ҇ }^#?q.pa;iW-{>:8pɻLX[3vùi8w2~z?хw?asEM>O4k'Ӂpn{27pJrk/C}&lko+im9`S-ߠtC$m?1A{35V5R >fv: H`]\ClC 6}yna[rݹHә#SGq7Ͳ(d{g\3pZ$?J3# I>6L쉰==& ۩m;sy}k>|ंk}sKB!:^ P!C2n,BNp{X]Nu|5OpB ~'>|uBx,BNp; V(U,B!7 !rh橌CZWoPM B |"k!z$ؠf!f,o956W+'B!~4|oo}4F3hB!'MjPRs$``Aw6(B U.aPB9+?@%9B9mU?O"G3_B!'}3|RS$ɪz ֒B nֽEk=JB!'}7(GcdD,B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!:M?oɨ 5NxlC@$vF^ 4%mh;[Ǚ |.߆Y󻓁_HnoU`߯N `(z$dMhٍvXEK l(5@ o$hcymm%r??8ud;Y5#KtIۊfכ[B6U6rezӯd;: `}]d`I@ \[JxBFH պm6z+cKޞOsU)s7DYG˭htjfƵI5%$Զ[B6P`.FT _Y{M3 IDATuڶiƵߩ)mF 1pQj~fLhǯʾ-:vYW#6oO,WԴ_TrʪzC:bUl)+9ELbmd2siNCAcKf%5Aյ#39]3#({{8-Pܪr'5i.gʎe^vonjv]\UvԹjT9d_O Lg鲲 &;f2k K_E3O˿z8i:2faiN(Y ʡs!6-9mgh3ۣ9t*m62L!U<ip6QM"V(Ohb*U*U>4prp @^WwW('`TF3Te+f=;~՛MǮct̫yei;F<Ɓ-SEW9N/;Z'eߦd\ڹ=|ken+U]S㪑FعeiЩȬr?O?&*:7Py|lߋs<[l[[B63:r:/ȷ@[jNvX,|VNJ  B 7D$Zg)߁ak8S2VΉ;&Ҙ ^,CWf$6 @ڙ(.&IޟsJu_U}΀I)o, +ҋFל!;2d|佥Yq1mYf5h?sg({Mձ(B 44r+6ܹAf:j#q}u"B!8e)TU6$0\kCKkէm^SS}zuVϢb]"Y>C+d_ Pi163e_!7üC!14`\X'UpUL}#~gyecKN%^e\sGF:O4fE;7_`iٮ4yY_{_`xף3>xod9ghE,+xkr,e~qH _8vax+|4:i +RFp6:%>Fġ.S>]gQ˼yFQ\ׂK(_ȒGjۅ{?'o搌w3O{0p&# 1)Y^^e9/P"d_o7/Zm[S9 9q^-͎-!DI| n \:?I)jQzw%UBq] PճOʍrܨM>S]t{y,Z'%tPfPj)HY! +ҋ9?_d*FHճ4s vxضfdx7j >6::CA͘\S@5 P 5 g QdE<ޜ.knțg1?^z@a9Auڗ|Gk8~q@]˩Sg(B,+нZw؜ZdYXٯX;P]3+ңņa_KљW6jGK4;%hlB1;.k^(UꯎgmĂ=Λ)n~EP@]yb,}XBK!*3ӟgG7V> )YV+iG({Fu|C劂79d۶X2TƳԦ;!6Mձ%(1ưaS}ZSs}(thլG(%j-1O|_ΌҼcx-iz7/G3O8a'>î! W/W2Czs@Eά4YἘ~ɢb.\Ľ_}eF;@EۯogE+)OՑ2|۶X%lfi7;B!Dn3p8!B2S>[!B / {"o>{gHB!De@Y#\!Bna*0_"B!x] LIyB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!$n'QpQIENDB`qstopmotion-2.3.2-Source/graphics/qstopmotion_splash_screen.png000644 000000 000000 00000042030 12536560627 025154 0ustar00rootroot000000 000000 PNG  IHDRu/sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxiuU}Lt}b H$Ed6ZPcC֟vc#vWUC.MlZ"%RYUaZ=]YGWvuO_#쪬|0;;   AAD!LAA$  D0AAQw&  AADA"  ;HAAu`   LAA$  D0AAQw&  AADA"  ;HAAu`   LAA$  D0AAQwnD" q$ R)HY!I3D__ǝnApٳB;066fk/^ꪭuabb] KKKr>|~z *Ae,--ayyX攍u &GD݋p8 \'x_n7 `$%!8 LNMlm (n&":DH˗/;j`p)oܸh4j[}fECCc'*G,b!LXDCd2={xp&5pG.,Ifggm `ppбP[[zepY199m0@`>-םw Ɗ:zhll^> K\rHfpCEu-EQ I,lYS QD"ud׮]5vEQt⿉ m"` \a8nWZvfgg-g4'*S,Ceͼi(bc!"e[et$h`HWy3"8aaa6HFQGʲ٬eW "s%H$eWzHWl6\KE\.U%gLPJJ$dq V5EQMBV`kԪ|>%d}}cgg'`OtxHH&Yy pV"(D5x\3Ȳp8l{d&ʅDpiƞ={_ ׋6 ! իD0 DIqXlsssZc跆,\yT ---e{D}A"BȲrT 6qÓs4b\!#f vhjp83o> +PTB?Ԅ&.uEEÖZm#b$pkYDZd:;j 3 ^HW[[|> cvvvrkYl&%ȴ[c cf H AT#J$%RTE--yeJ*e,@B+OkEA:-#eó#HD͢!rE m{);k)A=e9w:]. )۱fD6;Kv|>AXɲ{r,\R3՜żz3U:IއRﰚ* Dt*R2=g@^]x.Ķ6xn ߠ?Pٍ _xnϒ$q'Z-*kkkxc.7G5TV}HxT dRwP ԓn7W|rrXnҒ;/Jaii `xܖv#l+d65>766q5*0̦Dha»k*oyyW\Bmnܸ7nUGss3ׯCQ۶n)Κ8.]U dccOz{{M}7m1bmm .]Rw1X Ȉ-U* x`#y&1|J(seT' \tS! ̙3E__nZnllrdY1;;k׮ކJJpUB!޽\Ur(%a޽hnnʈ`EA;A?H;ƥo!h8EQpun\.~5NTVjհmV,d2RJRR7 Bz7F|K0Y">`dȚ/nwʕ+Hعsg2x"R)L<c"8ٳ5kgmm D4%=T|W&ٳ5IECĿ}0(oe{B o~gL_BI1;;wUu[4͙ N䵍JLFX__7/d s)F [^onA62yE"m!󙟟A1EscA Yq{z:qRe\x8"8;9/( _* 'DeLOOcqqN%[.$I… դ l KWׯ_7n 8'͈ᜅɠTv3ǘܬk q0,// ގcv&1`]Gȧ5?N֭&酅ޮdN NԺ `f~"X$-U @ &O뙞^\\loU Ȳu "]+vOut|P UEFخ".Yk`\?Vq'& B r9Ut2.@c`Ab,(DA>LTmX ˶eǎex$_[[5rֆnMdN X#R3Q$n(hoo)_ B\ڡ( B75/Zx&f[_ /F ^__1w-"Jq{ܴX%}^SN nVqT LGV婹yh]~xޒŨ0D3kH O""siH O(ʉ`χ~fy3*Ph'/ w6uҔ(td9B!.֕F8pT"~ o+Ec:‚Ⴟ9̣_ͦR/_`|,x\. zZ1<T---13 rYHy<۷tu\pbjU@9{1gǎ\&oh߭.J1s188Xs/2aϞ=A DKL!vcd7{tGGGCyXCæ0h;Fcկ} 8e;Fcf tcg|xgybm喃`c"njj]Q.Eok=(W^)D \'QsѮD^l\..yVLܼ,x*^y-9j\7RC<(YRnǘOuFG޻p2$!,}/_#<p9.Zpڷgj6*RKNL*vΉ`AJDg@ Pfe)^ uVm㔊}J.Wsl9(? ϱcs92i~S[UZd2GμÉsxPS"e4\m4F]px]*N,~nb4:5TΊllll`ee,/Qkmx3s2 n=qL[S.\`k[TD0gr*YpQVݶT2: ݀;{gAoxnbOR7!ŋzx`L,+($[RJaf|^/ VVV URبL&t:T*{ɕ5" GSD=jŐ%ycSkzK9 ,HZ~ӻ<4w]U bo/\n'ZJm1U$ DQ(vLJ +i###˼s;(iiiRoIpwr (\Q7Q@?g8D; +5EM7TV087r(cvMW֟ IDAT ́M޹q"nДmh+%;Epss3M}Gen0r6::ZjU3y%3pUޫriiiΝ;e׹B[666L/i %vuVMMM8x`cn7|s TZ===|Ak.0ڵq!,"n&$I׭ vzVR,--q9xDŬU.S2>>^uR5>TA3~un}{/tʥ Ƨ.1ߏ^NũGۋf 8t:1 ̹&熆ݻא!c.u6JCC&&&tLMTt[{zzLHmTbq؅޽{m۞ommšCe1K1$qI)b`߾}\@cbbBwX[[;`unǭ \L4bWZ#4 WDO½ot;8|0veЀCattq_@#>w###ػwmѣL:vS U\444`xxG5t,&V& ;)˅aߛ+˲UØJ)=^/qQSc-whvvk_܌#G *(Ç1::keӜy,ի[IiZyF7#H/BBŠXvC 51;z׳ C;DQɝh}%-"ߏx%LA5-3B[K/`AԴNspAT<A ` &iX^&EA8^G fE|Yȟ($I^m{ARHD LA5+ -,p9| ^AqdKAa75+y).uD5 2"7 ܻIŧ+WR7A8M,R"@ R7AA؅0;;8  $5AAAV!LAA$  D0AAQw&  AADA"  ;HAAu`   LAA$  D0AAQwnA^̡Cpqϳ,}YH7 455ZٳJ~ׇxtP/wa^0CHя~85?wq8›oY\GG~a.m,ZlYHۖn |f#G08{,rnnn&\ӧOի%?Tլ "P?t׋9dْ۷-*r1W9sFlWWmZlYHۖ;v fub^}ܿ=~itwwZGQ\rEqKaAؘz#cnnDdl6~ .CvUl70007ktwhaXZZ*x'O\K&5wy'S_v%IcDQݣ>Z0\~Xg. ###]XX~RD駟jn[ڵKS~C#V5[a1fU0laͯN>]E[f'$mMgg'5+WNz K/aff&'Ob3fQsd2n`+ZZZpQT Ķկ~3grٳe# x/".^9qmFAoquߐ/EQo]rp'N~k,w-+9ٴ{axվ~:ϟdrccc |A>W_}y9'H coƖ?~*D0 &=ŋ9 /|-pe | ~킿%II,#J*U x5-FYmz4sF~|>z.2>C|ᇹMOO%m Be.I}Fx5-cccxqiM:ƫiݲVe`?ONNnGoo?cfC1/N:e}ƀR(uիeY=0ȫ箥JVDQ,0^zS/6/ŋ#m. u5U&w}77hnHs@8v 2^3gh֛obݻwo,x4=Μ9Kuu8q@ gYLOOkn9s `Yk]{ d2HRXXX@ccf{T&''o>sexwJ ӥ%gk~ ,sQ AER)%w9Eٳg C)FGGsn.o4߭C:@GAWW,._iOqCE({O]vo,xZӧq]wi֥͹,i9MNNBQc.9r$׷\Yo+Q[۷;-//kx<عsѾ( m$I8w 8t|>2 Ο?ԩS8q℩69r,xW4sOIbW9 L, / C Yl߾}?ӂ{^4Q3sh0-g@###wIYC"D/ȑ# k׮iZV^/ߏgyd|׋ܞzܹSSX`!l }}},* e~?_(ʉ`V>T`^~G4\7VZ|+7޽{t~~^|oe.\ѨxS-fZttt@]1uU҂'xԡ# z*ᰦ^Q0Z']-܂??wI>ZB_3337n`SE ߺn477F/3oY- |Ԡ?xonn޲fF1YN߭O390vر%nl=22R LgfT6-HZ ӹY&}Eakt`6r쬦jjjEۛPUX;w欢{//ce3hFA, 0y/bAv466D$Ium</jWRlʌ)ߟMdr˽tfy#Bu1חfS᝝97H$t!(lz W~Fׯ_4BgfkC)1zj`VQm&}1Epww7q͉wwwos1C<Ғn9uX&ZEZ8e}}Phz1}-@A:մvZ,//3Y1{B[9K~,,sw#k4\.WI!mt0{F~ww7ZZZ ׏dG]/E9F[i3hǢIHu^$]w 2D"-t-GWW7hvY=02QZV+ܜdf5&H0}wO  ;ug*?Na=둑;eǎ$ co-(Zxbt;<17"7x\3eu46MWL-t=++mi,*D0Q7;*2dvё wz (Mj$y1fillԔݍ'Of---9>JEWW{Dy￿@qlllh6,z(q3 ie)zZ*fBaZn%|&齳jfBGGeb37B!j~d-;Y~w~6 ="3|〾N12fvZT8 `n` 4[ fhN>AX`5'X/0XB`m͚:TpQXj|>_QO ʼn$I=+J{dߟKdFO<^b|f0ĺoY(|vfǭ|_hڎ\l6jTm&NՏ/3.Dv6*oYu{2FHuA8fP oNR9Ct5"PP9 x,l V*zYif`e(J R'`5Pcc#/3~WŰ_*}Y K!I3(2kѪx <E"`  wP~BhH$Р}T9uf?_aw0eGŬ`uacZ Tl`.` @_NcLSS `bե)~}Y>|. xSSSL$-@f`eZȯx"=~?dYg0ޞ{K/addd"l6 k_V믿x\[YFmO~D"477jn_ollhoeqE?Y0?Jr٩i3]=R nvmIcmm ===p\fq\.iE.ea4ZGӟ_g}yVm__ODJSS4i`ΝE$aiiIӏZ\U. jy#uEafȯ %U {twwCA Fh>F˚nX>oK('nYmJsWLNN Lbii x5SiHu^^J@ {jZwDu_.N;dl6O?P"hrrRJK2s"oǑ#G;LӦ2/DnLNNB!n>{oo6:uog$g}7˕DŜ%_Wbtt%EL6Źs綴S (´Gs^z饒ݸqQq\x'tsA%EܖO8 .0-f}8{l~5E{1IF8vؖ#U`3 P,Kx-ra0KApI(Yvzzڰ ax<9k~(bc$k Td>򭭭[\uX}2hiߎϗϙLW\bsZ&2YXX`Z PyG ގz)`s )T?iP$IA0$`|v|[ҍGSa<L ===[tO?4?(枑JՅG}pSO=ZgxXן~)H"cǎ<7v|4u8x f,˲򃃃xꩧ4sTfǎԄ{<\ƬT}L_̶[_pIA,FRw_tWWW ׬:u}3N&̣63>>$; T0;; bܺ' !!J1 Q&A0D,+Y$^+dyI>z02! nQ D"`m ,#RY}IDAT(Zjp[,|9k> raffi/&477[K$[,>p\ ===2@Xz(P(P(雩Vnb1b1$ {{{u-0J1ӰjmiiFDNu hhh|1 (t1Z^-bRIurΰw5;A`f&П"3?I$a PZB!q$Iif$ ض?LJ~X3#! .]U]v63b߾}v7!(0  H?-uy^SAQNA<#N#/d & &H&[d6Ass3zzzpo9?(0  ;  ;HAAu`   LAA$  D0AAQw&  AADA"  ;HAAu`   LAA$  D0AAQw&  AADA"  ;HAAu`   LAA$  D0AAQw&  AADA"  ;HAAu`   LAA$  D0AAQw&  AADA"  ;HAAu`   LAA$  D0AAQw&  AADA"  ;HAAu`  t hD}IENDB`qstopmotion-2.3.2-Source/graphics/qstopmotion_logo_transparent_60.png000644 000000 000000 00000015742 12536560627 026223 0ustar00rootroot000000 000000 PNG  IHDRn2sRGBbKGD pHYs  tIME1tEXtCommentCreated with GIMPW=IDATxy]E-YB" A$HG i"D6eQg("*Ȣ֠ l&NB˃@HšY dQvݭ~uGxuk;NSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA(M"A3pp0 RF2u; B)R,Co`>//٩]{J,B:RaCKPB=?.ذv:sc%bT^"D`VI֞+7$g\Zz} u1^N k%*Ka!J%ֹ/^ +ސ..aɖǔ%RoK/ Ͱ{A~Mz=bXŰKZUĨqze;ɻj!Σ~%-ݫ #Zf /Gx`Z "J=MMEf2cmtNmg A(`p6zr˳bXŠG>c kTuwS= AbXŰ6:;fl^*O  Eo.;[~ a{ \g~z:q8:;jV6DU*(V^zsHsA'͏ yywx;V31=#񻍪^#[ h:w;Wm,|GGza=t,`.9o*p"5ߧzVͤAd|v0d5cLF{݆; *gx-p+J78xlekSv}=(Ց[21& X 0-yNMw!Mw7=jCe3n{{J0MG_t2MV[XiO(t%Ah9#*0OH"QX}uU4;Gy6mC &{/҄xxÀfrIto 8P^RO>5N"k~`w7#S/c*si63w{߅OưVs55HCG6oAQ`0Hg: 5 {@~Q`J0| ^P`Y*䄲BjՕƣ C,v"z3e3M;nC3V/ϙRo0Gy((kV\?QC=fW7 1 `f9itgʰA/%P*'lDyanaǹ2}#y(f$߲2V-[-Fwg]Y֮3ϲm6D `fcX7ns1ebxOʺ?p5$Eqh3Y7gW*@'lmCѳ*>W[6[}@ kEDJ3 ;de^ (ڊRF-wK74Q?}9}BJZ\upȈ.Jx(b8Z6T=N0doe=-O] pqYlh3ٌ̪(/3rȠcFNnW\Rs fy/z#HڃR.o).\R7XCڈppCcb~пr ~vs}VjCJRw=Wo"Z-}K MI┗Z֏vj1_h֛QUufS('\G99ƣ_G_Će"> !=cޘfxiot} -oWp2 tckh6T=>61< :u 8ju{lxnLXY>dUrwۀr8]R 3<纩v9ͰXh*ކRs cgP=$fƢ kާ7f88SÊZeY7Ups)'wXr\ځ--аsB|TaOI|.1PY1S=Kz \g+iX]NҏԠܧ]Wg p8wHG'; ӯ wwf-~}uǑ+x/ WD.^o6T=+o1({"d}5֊v3%V>\gm a('3 q(\L P);`pH?Z/DC(ݠ C3ƒ_gdooU׌u:׀&Z|zlJy[ PY1k++$SEod <°ޛcoK ]mbz¬UQ;(kɳ>㪘N|#gY_]̺Z5E~ء:g7_m6T=+°<yh4ٻiZ^Cz3]aXy{3?m3R}G׹ݰn(jP5T%(RcBFہ7 l_FG lzYGM6?=CY}vHj9c@!ij8*D߸RʺYK_}X*ҌՙnyliW^lbFNm)ZL՞ӻAạާYW}os"w ϲ:56E{qETOw4ۏьwOޖQѮI1M{׵kr<{sCfk}׋ xD"a󬯮!4ڎ\Vio$hm~z;0\l޵J1nu-0! eK"*lcovSHc,r}.#wt`Ҽ wX޽h}hKG{%Ap9[<U-3 Tv3e~9~hՎ7|eor(d :=Sk6T=SzTٷw/o,sEEc}۸U(ZFD34cB33f@q SQ;*VL'.ǣJ>zv^̇=k6T/=xD\6Zk_\"iXo\ H]e5?L c؟kG+.nEUvk͕NNx>mljX/l w<[_ӳ; K@_NJ1| H~EtsF?wgn e?LF+DBגPHY'&I䕋+iڔgNin6T_=Gt#u5f}$%yISXgnk7gjZf.8w5Z.68!MjT|H]fny g}ŴFiCӳ 90\вCqPND<=cY>?mU:%g6a]ZX(54k<ZcW, A‚GNSRJ&NQꞔg5$5F}3 ._s9x_{j2?ףg6SW8߸>3 UAf>pьEgv5>ݸ|BzcF9g3:C_E_ȷ`9u]Yk!'4z!&ƥ6̻ٚ/JsZ$v1[SgCWNNieoCѳ 8|Ӱ:ygj*_r0m=wX B솾[C#QM(B*qu4z6"p4#AnfX}\3|> I'BO3-rGqMD'B2}|p/ eC ccY"@Azڌu2e63p6 tky=c6X/ASZ{KEt (j$k cP6cY_z>(v{|>7 h                 Ba`>a_h, wx-2Z.Mt '{xS^V/88ư#(U``{32}EF7K2> xxX jyn{A!/]gmGb|*XJy?14K=1ye<Z平,C=HNV|t: 7Z_MXE&`čÌƇܚf%PYal KmqB3?Gҩ>s 01/ZF῍@+ɫR0`~1 htv?]Kws ΋k %"ʌ~dHMGD޵臍Ҳga[o>(^&fڑ x3Cߙ_L3GC5~k(|%66s,uŭ :Dr0Ok5o3,grrv4N1mE8CyPP}chθ"=ZE&l% #nW_G@ : BaI]*cq1z݀,75(~dx!F%Bj[F}64Kdu5$]=eh~wovT8gc;p 65?86bGY«D֌uŭvgX=h71x{w&MoaW: Í)g\VQ; 3;].A}&p\;wABqߗ`XmJcR^Ii uiigmG2cjnXb_,m7$f]hT}%n NKL eg-Fx%^܆~sLuOL zhwz stN0]͘ 59)3Ņ5(~tI3i)qXnsNNSj[dPhXڎ0ݾi/UgCy֢K-!؎ÌX?[ܡq2@ f:ø?0]咧[L{4iȄz]fXPA؏Tϕ~f(S;iy%ZRڎF)$ܝm8ӭ$;[ލ9 }Kf|ngQ)q@gX鸶7Foڹ8:B4h'̎mc|>C[\ǧ%Dj sιKW^裏/ڀ!O2͖v$B{7b!M~^g}KeYB\=?Ճ?CD8Noy<88+ʲ,{Ǟzƪپ Ц|_D0L&~,_m@̬03tY =ID@fnUff@At ]Q5xl7~;wƏ_~6nFqVּ\[joZc@,Z!W] $x݇ <ޮvV!47 A2?Cl=}8cѾN邤F;"+a gI|Y^VD xu{$cg, V5Bp]جu^5|7B~/z 5,3`mG?1PU[t>uga{Z7d<: !K,!|7|l#jT/?D3kyv;nt&̺3[N[=q=yy o\)h#fN7RcJN1BZk8 gehJo^/B[.?Ѷ|B}?0%m UC4CYK<mp, 9ϻfDF㱿pn\\:7s#^V"D9Wkk16TaT haXJLZ5TUJPYm9E<|҃T w=`fVd{2@A-{T:MU_g5է;M 6_K}k(<1E>CqAn]צs1e*fh.(o>ÇtNlS!FT|\ &^j( G«t*J܋NREsh$ZGv|]H2Ar5 J. 8`sR²ώ̈́OZ!V{TT0I:X%W d9hvv$+E_!W>p!ˆA0,ȋuԦ[+UoKSW *pNCl뜇-숩: S 4RɯA*;w{R%Phs]jסj,gVߘKlhgZÆycE `K|׆~b|O=|C{^Z7 p\d^J#0{^o9XǨ!CRN5jN[~AFvݙ&8U3[7h ͒P[ŝsW_pn `g`7P$`Ri&,} [)rofVcʔ) +saZ)N*$ W#)LK p?~%?}&?Ӫve"s[xJ|q4 ;GLoO>!@dմaVUļ|}G1؈ M' Y(Ȃwhp" hjvlf'ă| ]bpȎfKS۽zA¹\ 6l Jq$V_z9~j4/Cg~؀5a1$I%H贊o:NDi8R)Ec4f̵jC#0wD6`3 d8mHzQ)Rq":r B'sa/[fnu> 'UFXDp=; ~9oVfUDK]>9afq`|}bQN`7՜=`iOņRF `B,Va\JcC&ae h $HFuP8\Wv*0ă PS\#c̜kXRRxNG>Q)25H0A7O-pli‰s=3!yhTG1}1uLRE$^Rܞy \sLlǚr * ͽ&q٬qy*փbFp '6 tfdfB{f!<#[!'i"Ĉɬʣ&rų;. (" ҅BOf6Q35ղb>U!{x7kTC!)p1C,`~B>h0.]gB5އj#e3N64 yѭ S{@U0Zy1dCVBrU~sN}>Eh(jƶ!!ǟhp#[18I& -wg /4#Ꟛޕn=eY GlRN=+G!rVdVW2Rԏ(Ɯ9.ɞP&Y{ǁUbY wFXt2{s.JH#q~9O;Eݷs_www9_lǦ4T3%au|}ooj_? B<\sR.@w7@^o;yK" A񧡚.\t~Kvܟ~+n:cۍ{9>9#ǔIENDB`qstopmotion-2.3.2-Source/graphics/pictures/project1.png000644 000000 000000 00000013571 12536560630 023236 0ustar00rootroot000000 000000 PNG  IHDRHHڏ$sRGB pHYs  tIME+4_ IDATh[Koוֻ_KMQ"4F2cdM03l U @1 ##R"zlɆI&٭ꮮ,>躚dS Y]U}=|;sEQ8u=9c19ODQEQ(RU5cƘ""EQ$QUפi)c,MSW~mۥRIUUuUI(BA - C%xVH?JNTӴ(T40Ba9Zqo$TuIϢ_g].~i&Ib[VĖe$;B4 JE1 #"M86 CQ9~0HrX45"s.w H ZEQKUU )IԲ\.a$~$qqQEaqVm4}/P$XX!\Ӵ$I+ˊ|71M0Lt߾}ݽ{>MBpFy C`ӧ B9p||<ApmA(j$뎏,i:77C˲ `a811Q.4]]]w~j0 㥗^ `mmΝ;$?|[{yZ4Ϳm<##HYX=XzX ,JOw:ONU>a۶ iEuc W8Z A8=c?IJ~Zv |84Lkr9.(۶cOͭV ^EaH$X.c M3DZ(a Mv9P( ( ovCKJeYjwa0,̠\.>|8Iu:Ϝ9?rX, ۶N>k.^ uccح0vatlۚjv;5McssstB^zu]DUMNP(a{2dHEGUv/I,b&lxt$3IM\yy<^rh4cX(qqTUE\FPiA#9oۄ(*Xuҵz<9$)JB۶@k@ǐ%VGaDqEqo(K$g4FPTի~+ bE/_<44t ]ǀ:TN9{8R _rGGG99 C|hhhxx8I~gq:thpp}X&e;xW2-'dxȻ Ʈ]~@AAO8{{{0㏇O< &/Zw#}:!i===GUBfFGG00l6i;6W~~H Ð☜VA,--r9\ѣ\.ls^dd`[r8?&rH-:(*C`<4{s=d/)/c s m~hbkKIķ{;6刏wgp#/~cqN|`x\.纮8)4fW0q(jJg&mF\[~3_<뽽BQe[ӉЍNf?׮]u/K71Lկ~5==}ƍB'?޶m` cNyƍW\y#0>3gP;\~ۿ/#Tx޽{7|뭷fgg]6999ˮj4tB}˗/=,..J%۶ ݻ?8i޾RXv'_|sة]vV4^*BŋiSQq߿nݺE"KjB*a_\&ct/dv t]<vt( ɯyQuM.4ѯ8CyS.6o1gH4<T*xxst2$v;"EU(6^RP3Ƅ*:k= r5D/>vf Bڌ@Ԁk۔qs[>rDUUT'I,McƓ8l 0qXʄQsƘPTyqjC-PcIȒ5F  .^ځCs?h1eD!&  <[ lG1t/0 ^|E{wyʕ+rY7o7TK.8q|uu^c<û 333~Z 0IƘizY4¯\Bu'''a8?cթ pD\XXxJsJ 6P(J%tkz @lDXʘ送N૊KIi0$O \}mn,`fK˲(B9?8滎an3P]sByK&ru֏Cl*!`MlƄf5.8&&wO҄oBS-.g>l9J4ѶI!䷔LOGRIENDB`qstopmotion-2.3.2-Source/graphics/pictures/filenew.png000644 000000 000000 00000007470 12536560630 023141 0ustar00rootroot000000 000000 PNG  IHDRHHUGsRGBbKGD pHYs oytIME 4,/IDATx\[o\u3WRu%J0E)~ ΃ ( ևyJ'A 0 Ven-ʢ Ոċ!93g.gp%YP$g=8"5|{o}{ /+aDkP{m?AcP,|͗rȦ!C$aLuzz4 wy" {,--wعsg~3aCD!&''@Ps~w?zjibbCCC\jr0sf7$u.?22\.+ ܹO.n@ L7@" ޝ;8t"歵ťKw.ĉK.m<@.t+ڊ(BR,׍zЌw&S`= r>O?v;vO>.F(s96"lR""0PX,ܹs˖k׮]T*噙߿ Щl'X:J|ZkJhMB!m۶|>OMM]...P(l?@۷o_(ptԦjJ%X/`R|P8HD[n]-Z鈃iӵ"R Ebp(=ztBFV+ۿSpd{!fms8ys=_pܹ("uJsH,"ZٶmΜ9?W_}k^ziSlf%Q"]9pJL۷Μ9z255t… ϟ<ֻէWbè7hT*XZZB\F\FBiE[eT+l{{{[gEN}"r(B.Cd2JZF#Bٍ7~Jo.(я~bx3%;EuIRq{z uvR Qy\Ý8xW6U^,-z}8r9FTO!`|cvhD 0z|R0' x1Za5P@J% L\%`0;p[ "i5^'YAZ@Df Bqj[ѭH$X_@:iIf2/N3oRŇAfc m(8%eq$ʠ8V#;$r)R RIĬuqp 1Hۮ8H p]hqAh\^kkQiջWqET4mWnO?XK JD *Y[BOMhocD#QG[x!"@?\[e2`p c?!p HbH_ J0vo;>MJf2>=s6Ne-הgAy)P q3.:.ЂD.ǨS%)DI Y4h[w)d͊c'.*\Rw2-tTgͦNK@0P܂-[  XH9ʢ 6A*?rrI  "7lİdAlvG`pe1i{c4&(hp=ŀ0 Hh$r);DZ kuYCY%=U('EVM+$DE3D H.cL &#!.~}\㾹&/a٭xJve20Zi%$r`hH`Edlda  \H"6 Cu˼HҶ/EDhEqhJVpLR(I''` 8,`,3k֣gtPO5m4ϜX4**êDGq#)^C>@$tZyz@PDlqPP^BO*٤8@ I'8"xCC🔃V47PyJ%D9, C'by"'`'1X`H \F`hmqd++MA ;f*%-hrȃ>mAC6aonːv1PQEt"`"!a&hD`Qr-Ulkq+ܔc0nA`!#ԹxٙK>َҌQ>gz58ZD<[*e*#*rV ްʜE6-W.Z#G(P;$NIY&f'JZi:8kG/f|QP}2I?w-Sp੃+R"aRxl'MkŊۙp&i~?^<"^~e0j9M|+54P*v?Qz>0% E *Q[9&]^u qwLx&h?5}Rl3b%@EX(֦Ę.}c "q(dꀃxzC hRpC;NMRMcZK|>:/1sk"g* ,7[gbskͺ, tR.,,,137- ^*p\`J@;F|@wKP1B~E6rwp߰;`]/e\ π2q :D.-aj &0B\6Mx)!,P[F3^T L(&0u~+{LMa k?NkJ1~mtaro|R/e3Ui> )!,P슖ҟ1F ȷbB/31XIwQ~1ƲKƚ%E #<P[#~w Vꢪ’ U+!ܦP1M7 =p`ShNGgZ`p~uS>hU־h2?`[ʫ=9Ψ8k7x:W!j^L9%.,\%!3AcjQ%x/B/@H9*kS& +*s7Tv0T&7?\TWm$;WWhj>C8?c4pޯL҅M03eEkq-L`Z &05G0sDsE\W.(cLM&xh֢R`*Qܣ L`231InܹZ ҮGji* ц=1E;':;kpژ;iW*UzȧxRS;8/EA³e p͋DaoUbr?;^<F Q.BB{_o(f:Z,9*Ow|<',I'Iq M(j|*j@9Z%0G<(09oYkuN_Gu.!|LMK$ ,\[GXroN$t{ |^BXй7; ,_oy3S5VWiܹ݈Gg;6Yu~xLӜsĵ'aq{kj9 3Qc80%svN|~{e9bdow('tSd&#NOtk#~5i; m!/lơ?mTObmŦl|8~#!] t#N@s޿]B8&0;3÷~`ew5q-^[Tp!tpkب L:o" 0i % ~(?Q^{זPf{#3;$a!X)/q1DdhV`*8Gi^Ժo"4{ܹU18aL1TQ HgNF2:~7}abY cq?vsrUGWI S!R F ejK-^NSGTdFlP69]"!mQξNA)ފ2:Z—5#D2^F4;Ry8xb[E>vJOOiuSq ;yUZ?|ގ^XD,n&[R7R{?l ؚ'rU9I{RbC7t LUQMM~G klBtАnL䛙ߩE4DtԘ(r@EK7BS?e%!\VW]i:u7C;#L6 멾u8 b*Jʞ5}7\򀄐rX2~m0&":/ڞ'qo޻ э*1'l1>\J?c=1s+ ;7&r.cO IBUP{FpޯE&!jpp pB[}?^(,,[ Zu 8:R&D eY'GS{uIJm#![~bޝ^[ȴKB/z(/Sj>ܟ\d`kKzW^R'W? ;usInܹ-*T%IUBb8׌mGMU㦣3\WX(Ϫ,X_:RANͺK-VpޯKksrRAJ'P +,HQhw ssQSZNJ u% vt JѲ\7k1Mͮ"}3DnjP^+!fnA$y'W(N4݇T nik9c uBDIF*fRYNP:(3hD=453CqXeVL2eau8?i6Ѱ̭.2mt=S]`F5vTuy$]knF9r)U{$N joSs~GF=Kϰ/CxFA)4uYN9꒾j ^}m r@;^I2!N5䖮dRƝ9]lWQ4R c,P;NmX ,ȿ+UQuKtTgHgwl4].!m5]|fZ"pvsٴ'(T5"=n,(:jw$BkDH[Int|:&d=љ^I'%j5_g4x9W"F_|BԽ2nb+ ?MAW`FuZ{4)1Q+j1žD ^$!K`ҺWUu"Mm}mՎr**bQa sK sً+WdiU{&~[= q*jZL5'(p]i=uG8!.Ӕ_C([H^Sjw%t4L&>Kr/F:(Ӱ/=S q%NFGq$oؚSNN)8˪hFBx=hE^!!4ɫ5Wk,LBE`wnytKb:Y\drL濴B+Y~8}^M rd4@n52Z.HvHy06F'C jwFji$kDF_@E1 G%;k5 0թ^վI!y:Qvo#%Ԩ L_T4|ƔщP?-NӀD.Z2ԢXĔS)g+,cYU}2\ י}/C/}֜jh6CW w I?$8>5 XfYdc%= LέĹskc~ z38 r&忴-BUe2-Ly-Ǻ[s_`Zd9 !Yn&Z2{{_Ymhb1\WwK[V'|ИUNe%yRh ϯf,4}Xu7b-+CADrĘc8ddF~HLpE'IiRwޯ3O׬ˮ,nL Xk5ZڇAƬWMpO$Ί.gBcIuD 1}$2hKs:M4+/ hVj)kݿA L*TLWj!tLy ⳝx/G4n]mYrZ yO(NVebLٚ8I*Ys|8ۉtg5C{\hϴޕ& wn= Lc"Ɲ=:cߠ]@-SհJB³K2p|kJ})Yj·25M?\gl cꇆk L2tr(3y?N3S75˞|w[v ᮶UǗ31 1r=G%&~DZWg*1 rzX̐nPCL.6y9 |?Ȋcoh^tpVͲU}o¬$ޠbɒ1y:9:8i*H9 4K]1U uL$ifj"4}K]jq)CO/D8F@HkR_$ATϦH5TיzwC4g¦[o>֊]VQWt6l>V_]i2h[; P(gNEiwML(cslJ*"T6 |ABqj~GOQMt$AB8'TG~jV$REeߋȧw2ey8HgOjq,9Q'bb歩Bۑ\wy: ?;>vPD /W[[ϔyO5¹,!\G(]OL3c,>!!E"i~ |I:7Ԏ" S5hˠ6>kE0{h+EŻ SCh oŢeC|fmY *Vk*MII߬BE4_#%є~Ls(!.":IM_1ۙp}i%4 34+o&;J-XF]M"0`)5ԃ}bo{qMT ?qջل $'J*BY[]{ݮ2HۉkC@81I}DG&9IF 87!;h/~ṴVď>V&ke#GBؼF!ڍ:Ȭ=-FD ƽĐ뉩*b( [+!{u;^4N̪mIc8^,!Pa%X3[VaYe0 )!0;+a!pB=Q 0DB=WF'\g6 0TlnL5VWgf,ˆaF*S taƐyiܹU|bz Z z 0y(,Pc"Zx_hӠj*0 cLIk~R=Q~$-!E3>"Ag*;Ka U?ǝsG&?,"?_)y~-"w?uw{ p%y"h5{M^/"9 -]oo6, ]_t?cp|b"wgJ;Vb "R61^%]suEdse!"okKp lص74L@?;N$0_fBX8bY lcz6lSz6 S.YD=s=3 .ׇDd~qD [څ%NL<ӭ"2c] L 9'Q Zs?^#"{sn#`pKǮD,ص8['$U9\'2^LG8/=.L:]G{T39w5kboE䐶r Xι݁+.i?s&v!"W&ʿ*Qjyv%cDG;Er`Į=E$Os)">Atevhw|GQ.{8ؤٙ'[C2Gf|(k~^Yx6Sߛѿ3/Kg9[t5\LH\ j܃\rl|7A}X̭W\- >[Gws`$8sg-5ޥ^>?g8]Gū;f9pWh&j[g'GqAD'UU2ԣr﮸&dxX(33SՉTH-S$&ju:7h3_j~BD?Ҷ ǿV`rlVfLEgʜK WM2'<Ώ^cϿ{:V첞7Uvj= eWY[=dԩ&`>)wJL-7+S嵙~VL޹\?\ǘI`>&W;tyU=GZ?a2蜻rtr,pMvq3е[vٖ |snL=w~B;τeŸ*W}lx+%*"'9#23OH7Qc I%ۜU7 jۀNSϦ+ ǒ3b54Nn&j:Y}D2iusO& 25>D7NU\<_ FO:9ɾj:V^WN,@|R5FJDHGL'Z#j&>I|99"xx-O^QfboPΑLGZ86M{!F>Gj&YWs6nv}c _ax'Qho?I&~a1 &\7J[>b?,q"DJݼL:6{yIFeu0vCs$]""ss[΋usZs.V+ӊ1&mfȢǖ)&A\B?UR׻hFlݫH Lk['e}IDXD[=QF֧ F>{#iϝH;Ip.j+{8}Q(E}EDNnLWrέD:?|dcFgdZykWBU.NJə"ιI L?O{hR=/;3;%,&"gd&0 '0x 8\Dؾva zso,ELneζs#eiЪ4T Lc˔k v.pε;)wsn} bD3E *؋t4q[s419U\sL>p&۶YsB+o2QEr_w\E;u~skcuYqM?y׮%mǶ9%ǜ9;wLG2.-B:bxP[S EOgb E 5;}WV\c3}/2e|`L[ <-6*e_Q3..OgGDr9*쎿'PD8v0+tp,&/ys>a`D2,.hQBkY?9禑O;j=Mhb{~ 9*]/ 1.q6iϹY~]̨h[`.pqr};B7=Wi$# mKBYXJ3=Fڔz, rw_2m(5lj=2B;^D:A"p[MɘOE䎊~Ѽ IFdv' >] hQ5jc2ݼUMڶ,s?b xѼV9[>tB"oDAQ{MIjq /diߋČɭj\&SnnPꭩ|?i`f$3-W&%\(IXw% ,. nU{W*|4&"дV[T_ePKhǪc\RW!=?Qzis&0@0v#Ԍj@)tUKkΤ 鄑USt^USJO3RdfMOZlMV+f)4{䞱8KkeyXDnNl%=\hćpn97]t^C!Mz^=쪄:oFbeas^DKVqB4T)给F0ܟOz5򧙈r;;Ԯ¯E1>ʋ(O/(fjqkKi)fxKu)񣿈#978f7Nɳˋ ƙL;UEBb$Q*B &frxk6[ʵs>Btͽ{B++r~tF}^۳ YOhHOرXrVaڵ QιyoF[>C.+8)WI[,xe5|I=oK'fܢ\Q*w7y|:E=eʜ^Uj+Kb[wKrnw'e|L.Pʎ^)wS^=V拙2uԵ-逝/ 1X%vg%HL1MM|[]guBs"g86![ǩ)䇳Z_-'g#E(D1$|,+m -"̾'S~0UVDZVHD%&"iNgDx-|ܺĐ)YH|\Y*rwgn.EU?N4ZCEwE{2喼W(ʼ(pf>[#3yQ'9|5ƚrTyS6E6%cx[|(ιvxD&_ { M/2ǩlK-wOx!0mn'Hș?+"v_X @k9M Mk'j 6!=ȦH:LE9ck6[!YHڴ\YdlV]!5j\E6ug8"w! ΠSBu{MlRwFoURD)m@tMM$T0D⢮}+vs~whY͈Br } UwqSNOBYU'Eυ1 1R"BskӺ $h)119"+L#oμK?l}I%E r DdsnC[;7oCtX%Sdad1Zӷaasnw &V`G*|F 0 7#Xv"|,&0 5d"bMh+Ca2 0 è aaT`aaF&0aaT`aaF&0aaT`aaF&0aaT`aaF&0aaT`aaF&0aaT`aaF&0aaT`aaF&0aaT`aaF&0aaT`aaF&0aaT`aaF#p\imIENDB`qstopmotion-2.3.2-Source/graphics/qstopmotion_logo_transparent_30.png000644 000000 000000 00000006500 12536560627 026210 0ustar00rootroot000000 000000 PNG  IHDR7sRGBbKGD pHYs  tIME1tEXtCommentCreated with GIMPW IDATxyU p(P.1Jwc#.JSXh%IH1.IBcєX\AMAA (jd>wޙ˽}[ջz;}NvB]#'C*(e q O]2<cx -C1&)P1vdBWY;=PQfTTǫm5;Ww-5v@QU^ (tbD]Gv\1ByE5s)SA]5 q_܌1I' + nrn4~becguV. ʚNH?QQ[#ftycu#e?1~(R*1-5vlem/^1ɶ IV)f[_R'RDPL/ٕ \1Eh; x‘|1rhVwcLs$^o*pC~oUܳ@? TyoǘsߖGJޡ*,yED]!#kQ5*A=:Ai\H^L@3<c1)@~ˀ4b\mR&`z4,MJ0)Ӽpc1U(*`Z^RAoBNuMN0fUY. \[>WGf`f.ֆ׿ n#Gމ hiwUqh"PިjL\to`́ f)Κ˜-(`QBQS5v/k <0f#A{`gyވ}}U ΍OƬl(*k>lYήr_8F>xK Gfং)wq9?_(HY:a#ݜ|]m"euu1d]cne bc>Ƨg~'!$L]߂1o;KK"e=5쮐gCj@SF娣Hr2gGfjc= FY]A*Ap#RY+jhz'?.`qkR+[YGYeRZYwΑ+p#\G*y&㬺-YB$m`꘎ƼafO1!)8^͋O/KƼ+'xwOsJfֱ@߬ lk6bϫuu51}HClNBq^11I8 fc uړ/*_ :wxLlYf5ߎ̂u0x몮Kr4#bmX2=7eUY[e-̚':c'rNØ5`0WJ'g4C/9Nn\ᔇ>1ǾHV ^9P1Le1KyG7Ռ]nSɓ&2N`:ґ'n3uve͆M\ Gg\wEJL'HVgl)Aץk4F{4lʕ~wU&_ݜR!duMI#XIN &;>\joڴLV3AKFFS5m-|zYFG8z(mf|\ŧj͋L 8ԡSbfV$.R\):<cbDgNGi;X?Y[Cgʠssh1ep|ȯObz#* OvgZMB@z8qJYkE~ u#t3~Ym&Gek0ft۾R^.R)fs|V~˰,W |zgվwUF``$kŞ0-Vحqˁۀ#1效jX3DZRʜ138SFIR2*1f4/oc"z{eRiM罁_oMM:=iΙ /ߑ~TJzdx~k1f"WZ y|VuVe4J$.WW{/]lyd79\ﻚGAo N"/gbwLϩ륾}KnOMouaK*̓&jW+e+.)WAVga=2RNE}MyGF3{bJq*|.0-X}U=CE_XBHiLa/ݨpӆZ4S6k`r8]ϏBեγJ=EPWxM {l{cO`o>EWbF챸 E z[}* =uX$ӆ-Q :Uy)YՇu#a UCOKQyjTqxv)kyz%;?e`!pD _/WĞSPZcB]aY^B̿8+S,Dp+|JE~vImpVI[/ %3(%i3Ϧs3mO5C@u`[s5j ØmՁbpC_pgZrjrs!ʁ2OD%\__ $o<9KK(<>P<ޞ148t0`;ӊg(?P\\|yT"Զip]8Qa]ԇϳ%ilDT0k1FÍX,6 FE 7(.x2;Tuĉ SUYMD"ɱqscfiuݏ=u*溞?/8.u.YL]왳] }wZdxhTZ_/ $-IENDB`qstopmotion-2.3.2-Source/graphics/icons/lastexposure.png000644 000000 000000 00000002323 12536560630 023513 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 2OSIDATXݗnG?{; 1iRZHHhԪR^A{Qo @R(cp߮wgDT1AIXiO>Y3ϼ)jGu 8/SCxW(k✣_<ǩoSsx־B`o֖x`?|v)~.@9qQR:Bca'yIn\d^;#~܏2CbD1Z0vI=~{뵥g4ekZw8s0sI)pEG>Y :.T׉.VPB B*!U!}WV#oVɴy';O:--mlQ,(\%\tw1 xAW•CQ JW%^9A H` QJf|IH #R]PB"?J+߁4קf8rs7RW7c6wmx pS<-_6wݳի5EM3Wo"kCZ*[^FN,Xce}?m2k?N,1fC=|unz]\4꧿>Hu1]ۀZk3m`Ҩ-~k-kK[g&%YF`TDkQ|$"l2,*nmecζ/L'F&/e&@d4vN,͍# gX{Ͷ-o׿hsׇ{gE%I2"HӜ|T۾H:vSUMQ޹Pmm9]jy̬ܺG7{yN qUAPxBQ Y <PB Sjz%#*HܧqR|'6<ʉ'wL'wئC{.i?+5z{&2VW\ :!*1-X2AK[Jd܌7hmB"s,KI$5a"f\kqW h3"(\Ҭ5K ~IQLP XQg\rŠژZ ])ٞSp_07 CV$.Jc&,Krԭ[֎?=_fa 0p PAG ,Wrq |>I=WM(G?]:3#X[|lwN2yIXΞGAC?&+ ۤY4 Zo?Qd'afHk"VEӍ e%%!{oZqWzM^ 'LK[1WvD>m 0[|гh|Ayu8[5&@8cIENDB`qstopmotion-2.3.2-Source/graphics/icons/project2.png000644 000000 000000 00000002232 12536560630 022504 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME !;`'IDATXŗk\U?׼ LcIRc 4-$֒ EV1+T ...\ĆPӁ&SG_{77$vǽ{~Ϲ?2<)=`H[N2^ P֚y" pXVov`::*#~9ip +\i+xxx!rXV]py <0m9*0 C@Q:Zےi@A@s'(׏p/%\jR'+Y`A9JWx_M]^EN pw\k<>K~dI^>@ p^~M5}Ko;)ʆ;Vk]!!xCS~ɌNO JM'uٸ!$ x^ +J<'_mZZ/f} .t\i&M%{nٌ\FgTt##XT*ТK>mR.GFF21pI`> n399NYk/Dz`-U]#^ EfllZdԼ>|zxCA`RZ6;0qBtX|~[^R?h=o]֮{%n=gsX"*#u@J& ٸ(5j;ѽ~fiK$IӴ4p@r._ZoRi677I&8g&N@25XkK@e߆ T G?kMX,2éNW2ƄC51f. gG9d($̈́LTNTcny+݌1斫=` lw{|?L|e=RS{|]ph@8yY(U=`/fK(;q^}4M.՝*fUqZ`# *X;p3Bէ%X^/QVn~CӠM !5"9Ac# 3 (%qt$D)b7"t"xO#@fͮ^X[^15[IO̓ʀ%vҏbdБjqf‹o_zs/`Xf6B@%AJ cV}0TkuK>3x ?)K$2CifA"<"(xH bnbZk='E/rNWw!xX<IENDB`qstopmotion-2.3.2-Source/graphics/icons/previoustake.png000644 000000 000000 00000000525 12536560630 023500 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME -3_btIDATX 0 EoD}K=s͍VBj.>o 3;ș6%C ?kƊO/Kf](|+2'[t RED4磯Zx/H(m6Y`vLDxx3qlի0" W7-HsL Z!ĀR"/l$9IENDB`qstopmotion-2.3.2-Source/graphics/icons/cameraoff.png000644 000000 000000 00000001057 12536560627 022711 0ustar00rootroot000000 000000 PNG  IHDR- DsRGBbKGD pHYs  tIME $ XCIDATXVq0}u i-ZP .܂4@ n!蔃OR30OOoW lذaW`AD,Z<@Xku]3qQLDq8/S{CU[C= =RCu]"y?!쾫Li5.S)S!I>xW|YdUN9m#66BH L*DC}['aj:c:H$Xۡ cԳ%S1IeSJ>ƙ4m-ɍoVNGzmrK.~lŦiWYvwֆ)$-c{E`6!t!Hc1eaD|nSUE!u:XkozH _D e3Y]ޯ`&k j|+K; IENDB`qstopmotion-2.3.2-Source/graphics/icons/nextexposure.png000644 000000 000000 00000002103 12536560630 023522 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME A&IDATXˎGjxa HHP")Ow{5 y *,L43|kUUC %8RoJ]sJ^|Âu!;t@m+so/u3/Ԕ+.x>чxinso>!?6<9{ڌ)fB<()=E#8gYg9ȱe{\PLۿǟ~>m) !Z3B7#7|=5ɘu2LwʒJuwPB B*!թ~[ .n|ץ2{~I0S2hT;;g 4}v?Vk*\|sW(ũA#aQ $Kmn%[-cpgsdpFކF QPlƶι E5O:|QR,J"+ u!_yІFؠ|{}I.NoIBEH9[0L ˥!/++F J/Sl7[ݘ'%dM*ڔly[؈0u1N }%ׯ`~05q5/߬HоfxtpxLS(B+aO:n!*L%Z"Dx2fo"nNg66qV,+qIYDtM"sF#7Ox`Ʉzp`2@uKK ^IV(6j@L#Mv %3I2fƔ˒#5rH=DbKj;ƂR#H4 K9q^XY@JJ CQ`gk[7`<ȆPNT^1-se^"3.tv O'Ӵ "(!p@ZIoyC <IENDB`qstopmotion-2.3.2-Source/graphics/icons/filesaveas.png000644 000000 000000 00000003345 12536560630 023104 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 3 XeIDATXKo\IUn;x<-G@ 6 hfb>|K"!  (ș0muglwݯ[X{ YP[UN}e-yu:N~j`r,T]!T1LԗRjMMw֎zj}8 Z g{ZxL)O!qf18&ĸA{+`bqlvVkg"o|{JKwn: %Q~TT*c4k`A{<|J:O}~qpWhףW3˗k3yVEF4^ m gU2"Z: f8(c?B$o?#Jo1W'f++Cb/}fFEXKwI򥋋Pc RcF68 ]65:cGs)(fRSj8xs铣>I0tP*@c B]!Dx pxg7~R$ KgWެ00^BªQY41 dIGGkXk+Cw85_;̕ r1o zT mrYK~fTCgFUÝ'Lw$1C`#qZcO*Ir;w[!՜rgCBNxks~fKD )Bs @JI,'J#WWx_e~:$\A;2,ۜOI,c8B.MH ct@LL gTy(NMx1n`Ч`1\2A&rly.v҂~D$ Wr g<>KK1 ,a 5'GyA0yDNYH)rt] "DJ9< o|T0`H`gg0 qg)%Db1Jt:Z[`X;P(pU|ߏaHj5677IRT*(t:4 R /$g׮]}:ADd}6=P(q]6wZ}cc[n(J\ry#ƏóQ_Jvͽ{qJ)VVVX\\D)ɯ롵f0Djg<&d8@1 >F)`!J)OϔNq!ďwUP((J83ץZ-$5vNVOFB5!ė-R),RʉJ)v4 D=Ccks E\ IENDB`qstopmotion-2.3.2-Source/graphics/icons/redo.png000644 000000 000000 00000003745 12536560630 021717 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME %%BeIDATX[U{3gKCBS E" ABL1>^ oh41DD)/ JK۔Rҹu̹~m3mC bekZ`]w uݳ{ILgN@\1IrgcR*Eg;v0RiY{޲ߺl#s墸WN1ڈhͷ܂ @!0L){|uܶѐԧz~{<]ׯ&p.#`؃͏[kmN47!p_^6*q7`6j7m޴&MM^+4@ߺ.H8n9y23^)c(¡mp؋G5 L|e0 L;"ߓ,j&Z-<~Z-.o.:y \Tg} xɜ{$ٖu[Z vtoLحȉEYĻ*_ضM#t\%LGr¤^L}iێ[N{WKNQMnlwܵ?(7"x"$@ ~|m޺?/^X&Wl8ة8v܄W-R-5_n'{oy_9!h.@˚mhdzT `ķbNlWK+F8''e}..l@8sKYT: "Ct5wvN1N%Smk\ܡR=2rҡ1QY:NJ3%*sK,UKhL2}Y:\K7V7GG?ng/HT:M!_npt)0 V ۹*:hKP-&΢Du&E?iH-mHT~J; )`Lkz|nBvo5\uC2п##DZ!"qcW1-9 ףr )uӳ`ĶiFi6;ӕ<|@eՃ̔nt"E5 /pV1&0% YOFs+/IǂEF+pxcO6`C܈ aD@}۟vEL\\C!)$K\눈i֥R ha°bcD5N+#ZW0 1\bs%%hY܂Lr}j'Dg׸K_D4A١ai@Jץ T[-ŪLZL%ߣWhgM2⹦Os,lƸX1i['T^*g'u;A і&S" |FCJVHÉg3EA jH)[ZT>ЭT2$K7djf bKKfXGBHm1mƓ05:0daUJg0b1j1O+U-4&4Nk t#嫔/kH+4MUW4E\G\?j߆AX>aIENDB`qstopmotion-2.3.2-Source/graphics/icons/window32x32.png000644 000000 000000 00000002655 12536560630 022776 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME C-IDATXŗ]hgϛҦ&[V!pPNqnsC/ Mz1/.Q6Pk cLu]-&o>goSM;xț<?99UZk g!A6OްSi ZT~iaD0!98JQTVk4n7 i4 m88<$|PJ񰣃#G1r0ΝKo܈2D0]Nc :ȍH2'bҊm܈g RheY ] yC SgfQ=nJPKOXhg"(6OZ1FRs[k}RW)FX=~#wf VȁzŐZ+IENDB`qstopmotion-2.3.2-Source/graphics/icons/cut.png000644 000000 000000 00000003364 12536560630 021556 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME /2tIDATX[lUYk_έPN =m@=--0:$$c/_M$`$DQ2j2@)7lP<{g_afh;dgחksCeg\Ca{2xyb݋MM+XZ]嘅#iuphXM|͛E=h*]M!)|S%.W,_l/r\DYPyg{lLiU>/ߪj[lbQϭ 1&l y^)Ʒ\"6]dp@=]|^2h SV^;g^/^(8خb%SX%4w %K`ێ#B>p]ԝ-ժ(ҵ04|)A7|:at!Xfh*1C\7cK|y[m`Y/ uGG5ez* &L04K5믾rsh’/U\n"γ)7_4P}:LMsIG̥ +8,4EVJ-r}kK¿V:̟_\ET?)LaMC:KhMUmx]lJe( >zcE}k@Gc(8$VزRJx=Gm@$,)Xy`c̻>a~lh׫j[4]ghF0F dn5u9j.Avۡ'܏Z/XTYGMǛ4oxClD)FdW"pV3Ri=ُyhG|ӶlŖ^\ÄZ?tn'4< /rI#Gp1 ({ŖgW63EztFsh .X̭Gf'm= gֶ֭x!200$555!d2< @!進2ٳg BҢrnʕΧm8ݬIENDB`qstopmotion-2.3.2-Source/graphics/icons/removeframes.png000644 000000 000000 00000002302 12536560630 023445 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 6YxђBIDATXMEYa?X ѻG'1&ޑcegtWAcA yTUOUCkSOUsν XXiޟ'q>| !P|jL3MYʅ3ڨ=pB}XxZm&ٰ}?xJ|Ryf:XUrc= _J73T['c5X3_I֪1oճ+LũA#atWb $ʩ2W/oGs5Z0`$%:)0흅^ǪN '4>kta9O'(`Or!_B/&&;7)C!,Pc>A'SNRITEH;LsCo ic`s}msM !' lj d^L&|X-1# CQ&3'cHtSΝ>9Bz crv$ n^(koqenmh)о&.Y78‹R*i=|B (B+nΰcNǭ!]q3 Rd$/K9Iv * U*Un?OیC$"Y' w%xKM/E :ɀnFfxA<Q,,8̋ W%dr01נtFSA CѷRpoTّd2%kؾT@@9ÜL5*bMRV.y`}ek`~ Sp,B@gC%ւH+-P|oދ#ksOev>!Ij'LNMo%0".H ʼ)C %{/ۋz9\{nxQ77z7IENDB`qstopmotion-2.3.2-Source/graphics/icons/appendscene.png000644 000000 000000 00000001027 12536560627 023250 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 5*IDATXVJ@#N%kA|8%>tnnPI H7SLKrw&M}wQ9ҹU2a 6am"Ley$(;)9VATBfKv .%ib*q"`oȋƈUіk,pS@Ah5`+wg @\ \g}q40vSOIXe6L.·`6Io} `,ḝ&6w<-WͷNf1l3XP5|aqqԯZ`OSU/Gwdb"$ 1HQn? 4:0"YqIENDB`qstopmotion-2.3.2-Source/graphics/icons/launchgimp.png000644 000000 000000 00000004624 12536560630 023112 0ustar00rootroot000000 000000 PNG  IHDR00WsRGBbKGD pHYs  tIME G IDAThoîw3R B iTPPJVUm?5\ҴjM)Q@QC Ħ. ]ff/~{&$`HD2>}[(޾>3`?]q*7,I8N3cDؿM9<;̕l7VoB׮O0s\L'lAk84f>Gߑ>/\/#:|'s`$I!E1=MݱXڵǩ09G2W2\ٽEyygD#HgN{ '8EOAY:`q3.qd]΃.{sGLxuy\Yo羯Ǟxx#<&(Ԝ2"G ިzi:.L/1[$㵀"SS S?C ؙYPsʸPMw }GtZ} BٌiqB A }C[GyާbHtek3F&Mla~ 9#$MEFN@V1gfD]˨͈ݛLALp)L)6NĈDt$D1[w$u"1u1U Yb;~W{YfG%qm$͗B5n s|-1@wp`˖{ɤPg@fBPENe  0xM_=3ߥM@6WDUՙ*!&}]l޼e~\P5TUCtc~<]+\^-2QWԫE`45}6Wl]yeMV6^wx%;wbQTQ #ňF f>=iLQk +oRkf9U:%.' B uD ,t·v/ﵽѣHaD}F;UӔ]+!$*Mi5BUDd]Cydv_80@$z D@0QH޲L}1[}Gё&3IOfBMiv&D9t0&+c#ѽ]P CE$"/cnSõ aprhTWxك hQl3EnÚY0 q)5tE➍ $QňFfiV/OYsbDls#U+‡N[zX8 9t lkUk-r9RO~zk1 [fl2maD}[ JaZFxcLdH%cZ%jvۭ1"֌Gp=Ivu]xs91Q ʕ-gO> ~CZummmm3bP΋{OSIENDB`qstopmotion-2.3.2-Source/graphics/icons/addscene.png000644 000000 000000 00000001032 12536560627 022525 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME /ʴIDATXVN0.":UX3 1 ^RJ钧@تJU7T:1 n D*pH$kn}>-sM}{\ 3[8 7D7| %HNę@#gfW/DdI ɵ钐$EleU,uB,~Bf8J2!אOE4PB㜈?8xF2pJ# YEK4W ̦ӳG%V E9@(ͦ{<@#ϕ;}m H?0Q%*Iw ~M"-}T20\kjeE8^^7A@Fx{IiGI,yRM3fɂi?X 7ˌIENDB`qstopmotion-2.3.2-Source/graphics/icons/window70x70.png000644 000000 000000 00000003406 12536560630 022775 0ustar00rootroot000000 000000 PNG  IHDRFFq.sRGBbKGD pHYs  tIME *h1IDATx[mLSW~Z„(@ B&.EgYD q&&?fmB?%FiI5X6p)[ɹ=}=9\I@@@@@@@ێ ^l`c0p ,3Bp!mLxֆ;w`0tz:j,H~tgmi{1f2y"!K9ٛ`JFF< hx$Zaڷ>='FHOzsstvz;( +GtqG"Bpk+zsr0_/_3gxFyXY镗R 4gb^JKj"#yӫcmiA϶mqYZ,Pp.vgDÆ/3s2W>q~"tz)#.]!#-d4z[Ar"Uk^Cb՚ļ*<6@; @ ZڭqM- lϒ Rr:y8&ļO{'e'%} ^iGpi;NWq/ td2=z}w<7O2yGb.ҹz< 1Qœ,IzX~#NKM˂=HIIᅘB$$$c;pi4MJ?L> ATdqAP@CREEEhkk#L8"@!1bn'bT%ӑgwHse S?8綔윜󿥔K0 7'% K_7q`j-B$FQ=e7Tm'''(cDԲs[v%777(Y!MSe:D.Rk fSV,k4v*ApA ) c#;Gu 9NOO>c0MS}a!<u]4Mh* c BF#e8^; @%}A웺p\n)%&>$A$Ճ d2~1ULfy {{{m>jT-c># F4zvf@=q]׈X7<+4Ma"cH);!BQ!"!@D "z=!ة Dxpxxxa߉;sllJwXV<ֳm[Ắ%e,U\51?<5Dt 5@\%+ Ɓ Dq0Xk P@@ v`kl#09S1Bp{pm\ )=,/4MӦ#1``!1bAĴ @˴ 7h=>t0_-rZ t xP AC0bƶ)0Y M(7мҎޓ!"֎ /e4kU?VeVcc4{ƫ%>UO{-`g;W1JpEmQH./l^xazJ)-0$p-myu ?P.4UZ Dzv f3X,a2uvߨ70@UAE˙xilr2D!usl6O~^X̡*5 *ښM[‴]{rmu_uŨj,U%,R 5Hj+MӪZZ7MȺWpc_W6^Ar ^Ih &~xoC1x>޿Rӷ\n8t aU!MAaI`<[G1l??Ӯ|Z ż5ڨ̷MMDc[<6l (kOgSx.y#{ODb}s.܆%I&S6Y,7ٽ{{Vm{衇>f]7۷ojjJGw)gkii)xGלG=ϓNOw^Ξ}WwG5Mk<|W_űmY,bb~9om=aNG{-mmt)/y2!?9{Vd2QTU(*Ţp=;\۾dQ\]J~H)k/h6m޽{y9uHRhO,===r-|GOW+R8`AKK a|wid)~a.\oQ;Tet%T,PŲήJ{[YeY'hmm=i~m.^ Mf\px\)R4MsJJ2nz R <RCjlRsBrr9p8s=ݭ^HӢhv0Bu:p&P(biIH)E4 Buaq>.JFcccb={yidd'O<677'ŵkH&ݻz]4èi蚆UEp8B!(T* @Qe4eumrD" =SOqyN>-ܶm8t }mJSRJ*&mCiq(W^4M H$B04́rt]~9;; /'MXYZbkG#HZ鷸I <7>KsF_5*M%زe +++R)Tp]wZRf9˶/:ۣΑtG_~G,񻺹w-EV1wszG TJ,,,l6{X(LږJ؈Rb8˦iu}aᄪ@UU}!=Ggx(9g& kTAEAQ_,-X1 c]yW:TXw[RUhb qJȜ;Xuv) @]Wb7䆽 cd2 Hߣ@9U3ByiZ~w@+BxخG(@ss3@`]y\ 灳_Z-`CAZs^?(ÒgWY"!? }Crc޹Tlʅrhl 8b4ZLʎC9s_!WXڒl6KHjI!g_DXȀ~֣DH<@q i|lO)#C#(zǶ-ʲA'Z}h.O/CG:;\z9cxIENDB`qstopmotion-2.3.2-Source/graphics/icons/videoexport.png000644 000000 000000 00000004234 12536560630 023330 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME );IDATXŗMlTޛ3X8Q1&XT2D.EAE%JDM.HiijN*IeG1`xj 37.< 6]9\Ǐۇ(@_ (0,LY8 t]GJ @Pqm۸iKPX7 MPJa6a u.!;˗_d֭;v^^uV^M:p8޽{k~uvMCCh>)%mmmԈݻw#^~ߏtttD"Ν;>}q6mڄy[ذak֬!p! ॗ^bɒ%D"뺤i,SSS% NI$yRLOOdR7q4i874ϝ;w8mKi躎i:tÇ?'ygx<4McFD6pT1_v*XhЊ6J8s eͦEL&IR444oSp=lMQ<=|_|AWW < Lr+jJa$t |p8a'0w !BPܰ,XWMBRW)i-UVAD_ -)iN͛Ժ. !(`fq !%`iu9G$2V2qUZ]bbt|>_jK|\.b\ )Bigϲ}6b%c=G9ygu:>ʁXw@\ u|>kh c?<4./bl;w0t}9 g<|߿O=˗.{q0 t]\/x-ĢQ8{zd۶UkW5NarAR#C|447S,Zz6/&JP Lì_P(<. vߐatDB!֭[G8Ʋ,89$ geK 45-Ek/]@RUU,bKk+2PQQr^䣊#jk?=B)"3{23S)R@ƎJP|^ UQ[9r-`rEy=vS(VsQSqnqG w9L+|\@ >T_Y`C@ S.%>fQ!?Gy? A3 '܈F=q0h QE鸟HWTdbb?\vu5B4Z~u84šK7n>4 eeLdr dI}=wtq²ImcbR)Ī++= :d23gB<8x4퍩KiTVVrst˗.Qc0^2MFlܸw200@Mm-uc6.tu+WXM өgqt\IYYGaܹ=ΝSJU(RPH+!:pvW* n@ >SW_}ɓ'U$@Ύ>ʒ<;UUUQ|̔lfOr躎s&W\ȑ#%ŋhF:f||\.GOO### |SN1>>N4ejj )%Ǐ`^4eYJJ뺲,KYt]WRieff!0 eY2MS !B}{hS~h>4IENDB`qstopmotion-2.3.2-Source/graphics/icons/project4.png000644 000000 000000 00000002101 12536560630 022501 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME "%ISIDATXýkUw|'4dhLC-q ./тҕF]ԅ;A'ЅVhBIyn=ܼw2Q%ɛ{=<03O)FdfU0 hZ4MVVV֊6paxX:CW:l짻!!aǁ#; <(3X7<ޑWS6ȀG]Oo#0xx1 gݹpH9p\_fJ<ɣ0G ;؇%PWWu^΀Dkf&B!L;8#.Kٰ,ъ|< ~ݝj`SF^e, ](~rΎU+ʃ^81MuuіȾ3fvͬk=3;/^! o œgN $^^SN/t i]0;U3bf'ʼxq_>^TY "q@ǾJmK!]CF܉Ŧr$+aͨR0* 3JձIͯ;gVUf@1s[2&PT@7lZ#* 32&p"mgHCOb>@2wvEޏ]KKPR'I*][Da1uEa{7ZrBR2OS+|¥ dN̹yb.d+VK6' U]$oUwF yIf.dm')W|'d\vjH`"yWߗ3n: IN%.Ƀ\B[de7k=BJˡ˯ҷg(~tn|}3,شJ9@Q$goaIENDB`qstopmotion-2.3.2-Source/graphics/icons/filesave.png000644 000000 000000 00000002733 12536560630 022560 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 2!Ȳ[IDATX͏WUr{[@CO Q4%lX!Cd)3Y ,il 6B":|5 vlc®JB#X̓zeխw޹w cmmxu *Rvb0tJqLHp)L #B\=+.Df9( \s1vr5{CS$I6 Wn`zeZxv+WnIB@ {yG)*5&lpRkf3g`0ɓTUDX*V{{~$1^>3~:\SJ=^p9D[K wǣ+͵ъB~̟N[{1₯0Vy/xHӄ A-d^rqz-8k0&Ř?cHcpe,۷ 0  Y*>pYrW("TϞ"-W50<@d&S ^\JDs!.kűR@\B!w*2ϙQh g@0i`i}RV ]r4xRL?&Sf&B5Ͽ3jY)qwusxr˿ɀ eDY^J%~Nyt8> R 3Z0󼪬 wCj=khSx{x<Vu,-UxcZ(8}:%K?R4Mg ֚zd2a0՝="~Zk >Rsf@>O>ZK ;Zu\.l6Vޣhp%(bIǴZ-Rc}8~cCN={W^%"zi溸s?ht}޽h4"@&Hinb:l69NqΑ$I.P(EJ)i^`RXk= 55FesZ-Ν;GVc}}0 19ZvUJ-tJmgɚNCKkiv18qh7 \_<|Dц[[[ܼye41k-OI,P_*PJ@Dn0_;~IENDB`qstopmotion-2.3.2-Source/graphics/icons/capture.png000644 000000 000000 00000000731 12536560627 022427 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 'YIDATX1r0EL\6gp&T9nEJLR2vC~Aٲ1S3*ZV𴞦>Xp p>M#N 8/t ^HV 3\P /;BkA6`]yYu@C"E!>z \d rCM30f2Dt]mǙd& LUu>U],11JPu'Ͷ:&}2O! ޸1=34r ~j@_J^><g| hyw{'nZ:VuXI2!(kh&RvvvN\.w[JLmZryq禦, H)*\Ȅж0 ۋ ۶诬K 86֧(:RS*nRZVE!B`xOE2|dwd(JwrmeQըX5RJhǍ1q62u.J)6F)%GGG-..>bь@q\%˄Qj8<>.GQDEK4²,BCURc3a?&.cg|g‹0`BJ >0~g ,DǓqd/緉|+ Y'I,e;:0I^e"zry7>LLo'C_10} DؠIENDB`qstopmotion-2.3.2-Source/graphics/icons/configure.png000644 000000 000000 00000005141 12536560627 022745 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME -,E#2 IDATXil\gسx3ǎ8c;Q, E@RTiK[ji˪K7jJU 4mCHpvl^z7t -/YEvutt8Akk0\ ||]o֩ƛގ)kZ#_(:ɇ?L,PV}};a43dz=266FΎ*,C ގZk 8khd4PUU9nXbR]v۷VSgm‘8#+ˋ` ˱`ww=}CwޅVɀKKCV ݜ" CN\xpӗ(V0CנS%x$Q,/yX LO}7Sog8FFX0H 449ĂːF LL:`dtvuhpbe8X,7*[u;__ed_Ϟ['O"4>A,M]]AlomG@O&<|i8*eT+;v0L:VL&AJl \~`JWL fNYun B9N~9{Y[ \tzbSp([f{E EEMԾV{- -/ZW&27z#(el6[Mt3B{{lۜ-Z&42VàDK$tbTݕl:GbC]e/ ǝ.ןㅷNf6:k5jm{p5ԃDD,g9R\Aa 0Djpoj'f PUc2Y:FUm5},J&hEޖ- jݲ:;cFFIra G5R0[,uI@jFlPTojt|97d=jzzᶻwUK'1v<=3tQcR/L)Ev'q6P%T۫N/S_8h<5s =]]Zj2![禦d},TP̮eդBY$Tr| Tf*tz#) ,FScg0$,ox!erT.milBS[vOOM11ޛ\@q1PƢ@_Cywf36!fjYA(%7(&9N5M#[S^/fOIΌNq>ўJ53J:5 H$"$؆%9̲ zAgW+K^//P/mFxjd$)^PW*UTm1=hV"i lNez,}*/>x<#o\)J < `jsdL] &(]@x{Cʆ Iz|PX^H}%Hpb<9J_U 6#d" ,)BɌB˓A݋m9ox,O Ar)oIB/z Gz%)6Wve`8Fۿ?c?LZtzNCRYF!Ntg{Z"+:}7yP[,RaL;ѳ Et`Y7=Ӌ QN-|sslO. E(DTqP&  a$)k3Pf<`{ Wk#|"`J]y"Qq0 {4M; /f,xy6*$IL nSۭ>=._-j.y<>v& b& mkOן8IC+NJan'>aI/^̖1jVSeJe*+++z߶Ay("ѾW7?`w%4X^<,aA*hZ F=j;5ja18KxJ- ́i^ԀW, "&NR{.nm Jb o!)LbI*\HD +!KJ",)A+tî^X[^I}H,Ty`.r_c2Pa?|7Lw/|['aL-  @ 4T SIea5r?HiŃ1ܸ5_~~E Kݤo_̼R:Ŝm8ec p^ҟ cixҮE:.e$jY9վ`t8ZZ!">J|lNh* eHy<3d2QYsY7a%Maj~3OcS'OWS6ULTS5beYIHHZ$Itc[Dxă#G.1AЭ($r2ݘJoިuw/9c|zgZ-Dx0Lts|yN #XVisss )4d]tJńC=2S##=Jri;X-C,àּ -&'qԘl\ 3,Q{qIUNH]@LFLt̼m enkBOOO( (}II^TƂi鑖qr2ʐahj5/B-,ۚo@CRJ|},mBNAVKHLHdp~([ [;a5 4Y%]Nw?Bz]SIENDB`qstopmotion-2.3.2-Source/graphics/icons/previousexposure.png000644 000000 000000 00000002322 12536560630 024423 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME cRIDATXՖnG?{!vҤ.*RUJ}CߣЫBj^PL]L/60F1#h43;?Cn.×H9`%,Yӱ'XYh GZ\iq0L`ӗSp8LLANRՈGe(Jnw7$"r0Sf*D*aixI M`rX+t^4xh^ԉHkn5YwLw0e$ʤx fprz>-ɜ31nA0;_r-h4](]ҤyhG jL78 R XF r ZCwgRoVt:X,&*nYZr~?ns;/gL&T*3 o2۶iZ(BrG[s7!zJ%N@*bZvn5 Nn1 n'f1M` !^Rqb[ &*&6# rHDwضMDUDF>m'4FA.v[lFdB>aH똦xE$6 %Xr ͵t~ |+jT״PW *ahXPUE1 3 `b${΋߁/u3}=xtX[cS!ADA, ^P YR#1c5M:'յɽ ͝"dXjxW?O]\ـ|oSHu%&-,@ x&`G$V[R2eŔ}D|܈.ŭi1o|Ot %JĵXlFCT `W >攓<Ӌ:Lj.7@[$7q + >}l&{+H7`Ly6&3ʹ,^O+&s]gαgXxYY7QNGT[j+z|a *ULxk= 0IYft .qPQbhb>C]jgZ'Ε*>P7G{lP[[w)wC}*πwGc`O{B/|q?B)—9V,THK@k n]ǻ>Y[ &).s2>JzGh@cqNu&MDZwcH{ lnT(WcLa(跟42{ۿy dOC{ilZE*u&7п}DFXur8Z&)DͺWMp7/#.'2Biv*F BO0m;z@$9f}7qæZ>Be|g?KeW՛;$`-xdgc,ΕHz)]=|)z5@@%ŊӢr=N&$44[I+x裂PL>娏/3<[$R7ѿ|Y6^n_W Tϗ[?H痾O_P7B1(7L:F V7 QE9l |2?Pg4^^5Dl~'23#GEyHAǸi&6΍|Ͻ8y ދ90f~lRs)i2ęő0A {?c#\^RT~?8o{bl`[N0h0sK:9ˈ5^N?/oigGHIENDB`qstopmotion-2.3.2-Source/graphics/icons/previousscene.png000644 000000 000000 00000000737 12536560630 023656 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME .;z_IDATX1N0Eaa2t̀Ā8@{/tb 'Rs7R N*U+0 q;(vG=;(O*颽O"`o 6|'&"R iEJl! e0l.RɇIn'r8cuϼ9,#k,xX@*X{t?c,O9'ŝM;L鬿ۋ] V9p_`[qedM:-z]V0v̒:Ѫ? EX["B5M /.Nw GKIENDB`qstopmotion-2.3.2-Source/graphics/icons/window.png000644 000000 000000 00000001764 12536560630 022274 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME - XStIDATXME_LF$H4]HS<AA`Aɋ*1ω\ (zA!ލ f7j2oaz'Ϊ~UdʈLQϪвpOtMZQ\(X NgY,[\w`=R6iw o3Vt ٍKcѥ`!hdYA1cK[16T/˩ON|'Nfb.L(D""!&W]L˖Km𨓁7 ]+a%>oln28fGVZ"u' U4AkT'lBv?녽xȘUbo!= /*Q:p& bs8Aȥ0 /TcY!+F|;hXgwyV,kf7r/@I5'h0*+ҲYsLAqsRy~8FեE^ a1U]_sSR YxL ^$F.[o4V\ꁄk2o8CTw@j&9c㽢/=aYNټwڎS~ @[=<.=PMqh_wL=$Ք䟏[l F; _%IENDB`qstopmotion-2.3.2-Source/graphics/icons/window80x80.png000644 000000 000000 00000003265 12536560630 023002 0ustar00rootroot000000 000000 PNG  IHDRPPsesRGBbKGD pHYs  tIME 7.5IDATxmLSg*TeBUUJ ,ֶB`\.%_Ea2a`MF\B4bt:@YgAQZjmZe`틔v-}S />syν~LIf 0Y*`f`8qx8}e6;$FsDPsr`ܺƗ:]jf&W.b\á$!D?{FիΟ_'{! #_y ~e6zmؒGVΝ` ֭fXiS`68oh48?wT_󮮐64P Afjnvɚ#ls,7>zim R%&u:ڀ]Cp v Rw/_)Ch^-"<: Lt[ޭc[w"^T?! NO#(Ѧ^sT~>=0~do:Bb #H$[D"x\=0'̯ \*]cX rcaPp^X`vNNNC Uws,8|8^9+{h4+XQVF[S__pxK8u􄽮;z s[[i\RwyK4whojܱ#֌P遬cys|^OuY펀;;MT-EQ(xs$iji8U{tvgt㕕3M涶򛚨xCܵ8FFZ-9@ +)%| =v$gZAhc40#R).gnN8hĶxF6Y5{a<ޖ~1=+k)/\hZc=Q&=L l?rW~^j2ƧJA6 <v!E㜉'.>:jj0W.JwvJ+W %8`''}F$`O x(Q ]g)^L@ Hp$ʸݳ!-G6?,H8U}VTT dp\>,0Ŋ,Őc+((H@)u[r9iT&8,6L"t:LFcH*HO}|ȋ Zj 0B! ͛% 0/^|1㬖@Y  03 03q/jIENDB`qstopmotion-2.3.2-Source/graphics/icons/paste.png000644 000000 000000 00000003542 12536560630 022075 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 2X„*IDATXýˏ\GU޾̸3qlgp$F;XB vX /X@A%fGy{qﭪâiBꪾu|}9U_ǻcC#_L'۶aL]?Oo fTwgϞ=G tddfq/ѓHR_?ba6}aaX7/LRJ)Ry}JO9v 8^Lm[b~ uW&/>Zˊojڏ_xJщ':t5 t὜ \FiC~)Qngos Mp΢bff˗/jhhץRijO2pႈrEƆ:cn8{jLZQC5M+'IĊ֚b8*"?LR^:D$],,,4˟"qk}oŚ*IܠJl kVCT7Hg "f|sT*bii ZkP) xa3os2+;ܻwD,5J)\o&Q,f /f͌zPJuXkqkQ~R#7ȑc61ךX51,//q1fBB\81FLR)&&&h4XBV(\t>|>OR̻&63J)0d``L&J'Ð0 |;w i_g*ݭ{[ns""HEqLA !A$ [^exx})ѽ At@+<巿jM2ƼsܹWtOӑn|a-,,>VɎ1 Ԯb\&lSk¶4}>B_1W9jLvaww+WV86݅h,5,&0uj9R-q'[nڻp`b"F1Kp,MO8ha&IENDB`qstopmotion-2.3.2-Source/graphics/icons/pause.png000644 000000 000000 00000000676 12536560630 022103 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME >IDATX=j@"m>MrI.!Va gL`IV3C4 0=;O XWPa7=p |It8JOk`#C^JoЙO؋ ]&+aVݯXiM}U3@dsF^Ug2`a ase`U hL~ktQ5SsF5# :Wojuc W?nՙ tJ9gT30/yΕdZy¬: p-htxNIUg2Ca!y!x3 Ջ0}&ѬB}HGIENDB`qstopmotion-2.3.2-Source/graphics/icons/addtake.png000644 000000 000000 00000000615 12536560627 022362 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 63p} IDATXV0"b0!r 2&FHSB s)}1ݦa"nn_to| &&%4_y %t:y'z3!8SV+Rd,v"@REsU\E|q⒛&Z$a඲AM]$5N#k5T$41ZDV-n/9 ͯd7Cuֺo,Rkm`n\UX5sjR\HZO %>ގq IENDB`qstopmotion-2.3.2-Source/graphics/icons/fileopen.png000644 000000 000000 00000004126 12536560630 022561 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 0-HIDATX͗}lU?y}_;XW;NFa,lAdđ`/`/J?0* 4Be/ݠ>OK׭?%Oy;|sXÒ;Zs|wĬ0GzصuS@&0<]Rt`w a=gO]ԭI~- #jϯh\*T9OA0A:ԉڇgiq |u֯djO[|[M拆a$[ -~%,J[>Msƀ`3q`nmbL|wUOz;L25ĒcgWb=|7hh3W Ĵ,b ÄyEg497{N ?B > owפ1b=,ejQZS8FHw\F,fk`/Z5< F#~%/@DOÍ~ӱD&\0(?prP/;4°Jvf|ԷiQoKjuus]B)@kZ[Zg'ޙϱn#[_'E}/~kyt:a|7Z#)%]u4_%* I+\Յko ::sf"@( !@˲ BQ#DIO~wV$bVA>߿2( C *aP]@[alj^ߎm[s] Յ#u A CZ[=ߘ1 efܓA#.0}D5xUj4BeJ~(pŕl4z˳ӳ۔eޮ2޲ӵ}\|} +!M4]|wQTBG8VE䳬 ģҥB."|2ګu ̕:[EP/sLj֓|# { "aRbb̌GU̞G@*! jkD.ƫ鐸m163chHkH54aY6B+˚2m9;~+eJw{g͈ %&,h8./#v`|{h`&,Z)L4,)p|ץK5#'BszcZ>kV&ll6{ttth˲VJA@(%͖mtGK'9|d;(wXmX0 9ydI55dE}s v޺0_E5l: @)5 8qbGqu蠭MOKChb[T3J%iQ(ϳ{gw eHgshm`!w;vԛ?^ݫ2 D)E(Sę ..`[Ʀ4[L}*㌏׹p|bx N  x!2\E(LӵoЍLOLSBp%_x[~+l߾!&''9uAd7lШFJeYe:l2wZ267~Dsp*3g_bz!fko '驩twwgK\fqAdrGp*?eCCC `$]8~se\˲6&>ZdZe٢(*\gdrD/u0ld2ΖOC.gK*|AU~?|>8HygvG"(Hz)~3z_!JRG:q: %WWi0ohxk}ے>.2.zi\tZIENDB`qstopmotion-2.3.2-Source/graphics/icons/inserttake.png000644 000000 000000 00000000600 12536560630 023122 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME z&.1IDATXU =ķŏܾi|&Z$ սp휖 ְp}hotߐf很U)q]촇ϩ`xNz=#MiᅱJղ;Tp5)`2Rxt*AB"31 mW7[F䘑~$c7@x`mz93Q:<?(anFڎ#yT'?^iVר1 ȧRO3e#W,eĶ9WcL8I&!ir+GN_w'R<,*gyжqH$4w[{mA/>L(TyRYvX,8syL$<vrNRdML!;$MH}];͋Lr8 ¡^cI ͍sEn^_' / Sh ]~ӔT4h& qdlob!"貢C.ķq5A,i"e4{~D/ & q~{s4ܥzg97G:PdQCADyHLF/a8L$IX[2x@E[Z# (VϳΐNo@TG;S^XlUHA@ӡVo>|p}]޽-jyv! [b. mk4/p$ À硕dZe~}bka)"p%D`Z}Jbc rRi -FAad(o|ObrRKx%,HvOmF]C#scP90ˋqKx"b$ee@)H " L/WBTD2$jڤ= \ňlUYs7H Z /?My1`my[?"! h@SUGK|mcaF@C:s޻!O_(0 8K jJRiB*uO{q(cn?Z‹Kha"aңitd^EAߘk8b8i/թcLND(z#u`u IENDB`qstopmotion-2.3.2-Source/graphics/icons/linux.png000644 000000 000000 00000004170 12536560630 022116 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 8ÝIDATXíKl\W3Ό8c;']KUE-JHUE@bW.JYE*TUPP*&.yٱ;cy;5"H8O{w~;mĉ'9qI_6o}7}v`vvz8=DX*f:lnnPjPmhnjMqFy~w P(1L2UUEɨ@EUPUU4|.;֛gW$3:ܨ~utl`i4/_0 !qL8NHzޏTM;-j#+K?JӴ~QUCc۶ @$I", 8N!75U=|t y%,$:'ffFE@y.!  \ץn8NC`:{zض/l\.He*8}\ץv )%mi0- ]IGʵiCdՖ;J\_Vn8.]aP*Hh6[u,3rhj#4 _8܌-ECdGeId2{d\nE4$j!,dr~yYݨjjjiE6F_6ؾ1=JݮG8K/Y]m9޽Ίr̕EiY;~ ai, q=͖Cz a&U\E\zA@';<_a4 j5ǡ:GՠlBը!l$tˬ8Q7n$rЍV]׵[͚ o2)`lPg(!ts{oXYYYն~$ɟEzT725ZĐBұL TЕIqq·M6 -_q:]]ןY[[_m#`ƀ?ṲmgfPAat7w9:\^rj*騪 >4l6;0rRoH)ПU4ba$#*FȭfJ0 2i5jR5L1cB@#]RK҄jq{+5.\hm%G@7˜9j"M%2rO\&B {ƙf?^)CR, ګĽX$)HRs$pc[ccc,LCchI[Hg*RJzQDq.$A(@"-24MaƧ;G3l/t2 mˆ 4MRfn8Z`&*HIoRT I0 $MSglHBC4Ma@ѠQ0 MvEٔN`Yq"O4- x44)FQ6MT*DVQTDZUǑB۶^;|䯁sI4tuG4cV/ ??o;~ӤV%*AR仇?wn]nHύA97wU/MQ)/Q7K \O2ɑ1[ yʍDdgS#O?c꾑Q43̟}ūv7>wd <8XP[y&^CMfD Ř.dZjOjn]c2;V*#Fa]L +lV?g+JՋ^H&?X0z⡾'?/Vv>y,o]oĽ(N Ob?086|n_^u$5ŴLV:>ʩw=f2'f&sێ~呬IENDB`qstopmotion-2.3.2-Source/graphics/icons/nexttake.png000644 000000 000000 00000000517 12536560630 022603 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME '*>IDATXVA 0 Nc`/Kޔt7PYXq2*(.nAܺYpN88L8)@nQ OGg ! ,c)\: y㷪y&!IgfQX-B"EW;c*"BxfxR%Z))k}Ukbqu[ qWf%JL IENDB`qstopmotion-2.3.2-Source/graphics/icons/note.png000644 000000 000000 00000002022 12536560630 021716 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME &IDATXOH\W7d84BCCUH`,RB .҅tPp!.E*R %t!j6E0[QЩu(k%cɘAg HM!.r}޹|U;n5۫|̺̾+5$ IENDB`qstopmotion-2.3.2-Source/graphics/icons/cameraon.png000644 000000 000000 00000000763 12536560627 022556 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME !.+csIDATXVq0\14p.-ЂZP h@-VEri@0gouq‰=wk>꫃K)㤔.{?%9#":g/kW[ݺon bOnErp&+JRb}# RGvcʏ! Tx!X "r}]ӽn_/4:|q}έ\k~xAbcGTpu5󖺮ж_?oGki4mXEaB}!=afk:]fDa:1 M L0d1 6",e`oNn x>ZX_8RS2W}ߗM#Ixw?'-[ IENDB`qstopmotion-2.3.2-Source/graphics/icons/stop.png000644 000000 000000 00000000562 12536560630 021745 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME9/IDATX헱0$ átÈũwƓᚵ wnb^adeD;Ah9p8Yz|Xk%%Y/{/θLYkp7LJLixG@9  îwpeNF"ĹKtYI*pv:5ze.]Lw^OМ"prnnB:{բ+'^ݻwsMF1rZ#'^ `aa! PSsjUjDQ 4A$APഈ\O7rY TU󋵢FUWU5\x >$9/EZ^NtvyB\.ĄqǨ*T S@m_=a?'FFF\65zF""Ƙ_Y` Z4 \9 Ř.?$v~=+ L[op(N$r$M D8] Oߊ6}bngIENDB`qstopmotion-2.3.2-Source/graphics/icons/insertscene.png000644 000000 000000 00000001013 12536560630 023272 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 3 }IDATXV=K@~"Cq(\3_[t_!JtAn"(Lϻ pC}y4dGXW՞J Drev-RֹV*r]E5hGhm2m6±\@5p0!J³!8"t״|B'w+P<6*p՚WE+i`:鬰><%bk +p\-o1Dͽ98O a;"eziSioNs?lE6 r=ۂ c΃UpD/vl <=_) 0Vx ~D.*ϓ X3*ocDCǤ oD 4N !zIENDB`qstopmotion-2.3.2-Source/graphics/icons/firstscene.png000644 000000 000000 00000000754 12536560630 023130 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 1˅lIDATXVN0}gEaa2f@b@|@1Љ%| _Q1wVU҉ uC H,hSױf,g;=_Z?MR0 Rx7TBh{0($$7"$wr}/d%nq%\fV|pFfdSH=Nj\^=QЁ@1獀\!50X_h1o6,˙\De.lڎƓO9:SB%ՓmN SHƓr%]:.H%dȢֻ+8Tq6Zyؕ͋qNJ!0U<ӳ**$A`mxc -)vؿA=;~ \ҐIENDB`qstopmotion-2.3.2-Source/graphics/icons/appendtake.png000644 000000 000000 00000000617 12536560627 023103 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 8"3IDATXK0D $9,9S|Pl屜; d9U_9`@9> \)l" pK_e]pHnU < }m`BW-2SڱbNK4En6J3R-%T>y2M% _/9.`E l&/\`mIs}o":7] ڶ{c 1xc4U?$KXTl1t+b<Ԗ}IENDB`qstopmotion-2.3.2-Source/graphics/icons/qtlogo.png000644 000000 000000 00000003072 12536560630 022264 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs@tIME /2?IDATXíilTU̼t EJKYP ↂ%!j5 11օ4D?k"1AYT"(E*Vl8t3p~̏3s=\*Ӳ䲲qk{ .ҼJ}$lO~vw_ȮWZTΟR֔{E C"e"BIh$1;.zGG[|w+rU 6>1i'RJ)B$M,jƓ]c]GZ0خyK-4$+gqXԎ=S_ݲ5Ⱦ "w !E8m v~κPUA(<@cEAjcpH>4'kag K0 <E(\WB9sl|j's'F&cV5n ?ҩu!&XxϻT`Z/|յ:Q:;mTܪ[ղRq8Ƃi7!B޳o+>BA@+bsh/זM&m:(53-p˂qWذm;)Ά}ʕ|dyUT#Reo>_`mSg~ PҢ1.nF~zni]48iHpiI?ٜ[EjFޢr#a܊'A ҴK <*L-Ή04pԥ=T2w+{]JI^`(i->ą:tۂqrٶy]9j;9UO V;JfWe}Umnz"5xFt X"tl]9@l &e( `뾭NVdg>`̥H)9j(ǦFv軨YRKI˔T={ƃ\!V.X&v/Gsaf.@/];B dC}Vzg݇JvWLQ:ƇTX .ŝ}8 yn }\#jc~`V:M cM:PS C~c=OeD`ǯ;ṥi iL_i펥nФxO{ &a/-}<cv߻[sIq1|uݙMŃ2#Kr^:?D H"6!A[SɷvS LʑD6![}~eK?f?'[tXT Zuܑ.ۼ>e˩>RS/LdL o`cQUxS,j| GPݾF% Ȭ5IENDB`qstopmotion-2.3.2-Source/graphics/icons/project1.png000644 000000 000000 00000002000 12536560630 022474 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME !&K*IDATXýMKQashEP9mFza]+h'];i)I…A Id_^ˁz}ι{\bfفRe0tj333˴vιXw- lv`2tv:p8գE3[&{ć9w@n4n5G~KGg7n7bM pzCK3{l܈CpVocmt#N䱇P_+rEӴvUW%Ng̬affkd.i˄V[$P"+++v{jf6ifK&q^ӊ9Y팏nznfM`+”ܻ!5<*4˲jv/{faf f6pD:}XRr ,NX⻦l4>3f!Xe]l}l% ߷|yQU8,;JMvw;ssnSv„ĒEd4|Y(:waF/*sss}'Hr f;L$zȒ}1 7{e,j7?vM],)b9h|F7UW#3  6& u”*pEZt2ot TMV4]~[Ϸ>?K^K4r9,.`]eȾn0.DY2W5M~C?JC,{D¼[h iN zo54/uT}mkIENDB`qstopmotion-2.3.2-Source/graphics/icons/nextscene.png000644 000000 000000 00000000730 12536560630 022751 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME )0XIDATXVNA\ƚ\a{Cl#~$G_A 3Heab茅=ػ=%+w_v潛y_iYMB9oM*5$@`EP嵫E@De6gl뉓$W8os'0@lkL;Xq}ـYm͆Y"vNɸ Go(|?Jbsrky0u)m ,+9_.Z3*Yf@7S)%~ԚDMW. o5iTV2 f1{ط\86]pOXOKLvIENDB`qstopmotion-2.3.2-Source/graphics/icons/background.png000644 000000 000000 00000002175 12536560627 023107 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME $4-IDATXOhGUA]KnpA9ِV^$zm ,[zoh )&s.)Bڃݮ vg^Y,ɒ } ξy7߼mMbjI ȶ}6 ";8!9ޙՉDoW7_O vZS0D7 .C`={Yyo;{2|} Q N@vMy~^o&zozв7&aBqo-ұ\):wzu666 XRj51}[[[W%cx&;woN8.l6qyެ*evvv["y8\TQ8g BR[ sd vwwVjzZ +:y$ZkDlchy""/Yjn{ZK$,--Q.Ids8t:[[[/)jF2j2ZKEcBDbX,R*p177waaoloo˗/ˑ0ɀsF(2<ŧ'tPT*V;ZJunZ3L1 \0֮)tR=&m!{}* c4'@سsXHrq?Dq1UN:R$Ij3a/0MEQZk8n0??O>9G#(ѣGecD 1t\DDsA)3 ?c;9; uAk-i Ƙ`6Mjg1 lHZZhN/!/h紐Z0T'۲W{ \IENDB`qstopmotion-2.3.2-Source/graphics/icons/camera.png000644 000000 000000 00000000711 12536560627 022212 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME & tڜIIDATX׿.Q߬am Q*5:au(^D4:5 FA)^@Lr]ε~3grw|g$id}X ]3h㭓:_n^C8)7pmA8'1b1ѐq>ڏͷ‘FY{X)^Zb/T4ؼ4@Aس@q; ~"!ZY+'ʂ;xI, ߀-‘z5w 1ݜDgɎq1@ K|*v `eIZAxS[i?&C B[9CxIENDB`qstopmotion-2.3.2-Source/graphics/icons/firsttake.png000644 000000 000000 00000000543 12536560630 022753 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 0 M(IDATX {2x&yݺB<`[R^ ' ~$;|O8PF_F# H(ų7`脚~X= >Y)m.ǫ¦[O igfѲbV@,7Q^rjfuw9ϳvO1.iHbEVT@V[QL R!Rz+IENDB`qstopmotion-2.3.2-Source/graphics/icons/whatsthis.png000644 000000 000000 00000003362 12536560630 022777 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME +"_grIDATXŗ{pT?{fIH@iAĈ*VkBQ3T:iKA:8j##P; A@U dHHݐDe7waIHܹ;{~g= ÒEXaPLNSShڱlvp!䋶ᇿxsmļ6:ȄT"Е @$DC]@Cy@fE,!@" % #eO0 9`>O5lpeWB7ႄw((9r4QLdfJ.vH/4]*ڀ/^+l ]#! \BQqy4KS*p$'O0@rpx8^ ŊƱH$1!hPT(=kٞvUv ^B /+?! `4t[cUBDVnp_1Hܑ^  9kr`p$BF,|_HO` MS_uMVoZHHR>+@%r6" .*@NMA D͐ <oB/-@P7U }3`/W䱤v}Qgh4@$U~ pn Axr0OWRAE_Wp$ʝkCnXeH)L`{)..OKK{4/oԇCHi;k wEIZrrr.]*!|ˀ7,Lb]~mrrN`|M8`Xqr$ `U5IUb9.njc̘B>[gTWP]5v'@|JD"&Pgl^H2)*,t"@)BG}:plFE)RwtV4U7ysgIO4MRzx8pp)6c!+_5 Q\G|n2G {4CH nMTp|r]#G ]w)UJ &A.>}F|.{뫪_oj+TpÆo4ۼ~_<π5'Mg9bMv)TȢ#RFwxC7 3kN~mߞ۴#[3RYT~jr0j`- RQg˖޿X)]q#Bt DbL*aSJݤU}8-J^^%cKvfﶞ"rՕA ㋯}>D@lHR^T u mtn|̜Nf>;}c'NIwKJ fNlsl-I+}sb'ǟA`kGHxӎRvsLO=y~"NKsw~Ǭp3cM؉u>U}3֬Y_pVf#ǬXHgffCuu}iVZ_[6m`ܖPԝ !o3>~矷27`n{x{$iҴO|eEbK/<S7Px$blL TSשV"}&9Hs>5V0?7E xeF.s?#f] >C}$#k.И=N Gi/Lg.*^#W\3J<nwGPU4+ 3,c⑐a AZXh; BZcxx֭Ƿ&jrxut5l6nx?߾Ky`SvY@vun!!$GC r\A+е0ω"dž Y5<즦l}kUuWpJPАgec jh5ט_qMaaagWx7y.&q1 (; RUmzQFFi4='֢ZI">^HqE U_+vQS Tb#rV n%3;}#&o7RΊe QqB'3iOex5z{D|ImDKDPQ&̀P%3$B>99IJ'\og_5T I:#ι?y2QuŃljW̴FiD-?O7Op|\7ԃIENDB`qstopmotion-2.3.2-Source/graphics/icons/clapper.png000644 000000 000000 00000002502 12536560627 022410 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME ("pIDATXMhwd7MvgWjzQ֋X@Ra5jJZZsUz,a"lE0`EDPṠd?fv׬iBӴ00ü3_ ."R4y@?0YWJ KJ,.Hww\pAB]JOׇ.I&I<"rqǎC@f{l 4iض->O,˒h4*rW\yfEdv`` |=f XL?~,TJRQ!bq`պuVӍ7{ic^[D@ `vU<Q dXZZ,--q._<  SSSnr\VM1sJ|=VH2:;;T*%^4t:-$ I$H:H$"Hd]]|>>k|׵b`E@mmmyMᚦXq]+5id2{WDu+z•R*Vz 6EUqt]GӴs(0 f@c/_jġCx>d2I(B)U%}6O<4:+yݻ ÔJ% `޽S*um†8VK+FGGy&X'OUh*#DV8Ą!0wRr26IENDB`qstopmotion-2.3.2-Source/graphics/icons/project3.png000644 000000 000000 00000002231 12536560630 022504 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME "~CIDATXŗk\U?w$3Y$MKV%!5.V)7B! 0. f 4%-Mt2ь9n7}o& }{~| C~`O+I2Z߀n)FYw P>6N2l[CFXJ@X02P@KfOM:󱻲 o##w5@/r_ ,:E⌬<[15)kKH@Q@?n*%n- afKX8 <-R'>d~,0 w٠|BѯJ76n$DKAw4 #e/Dr]gWP,au+?'fQzyJ'Կ |M%;eX/sK}oW"fF7/1u6]JgFްB)"J#ˤ6rd@^'uNy "Ҥ K x|"/4I}mw1-#ffc IðO87\ -ΤشvwNba΃~bfsΣ( z}-w+bE" &윙)hٺ]6WD~rs&1 p.>&ߢ}Ժ|N$#l̦̬Dff#\M܄w^=>ӚR6 ob>Elvvs9M%E`\ U3aII`6ɴ| ٬s.m&$i-6g4Ɍ:BJ̪@V妧2=#VX/X<U~<; #}~(}d~rm3[* e!eM?=oBP%x,gK#~SQf?=,MyݱKbfO҄/ $IENDB`qstopmotion-2.3.2-Source/graphics/icons/firstexposure.png000644 000000 000000 00000002331 12536560630 023676 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME O{YIDATX͖nG?{; 1iRZHHhԪR^A{Qo @R(cp߮wgDXAqBԑ53 {~{ y [|/~Y >;//@\bgglC8f 5v Yky_M8.Bʣ !Pr\Xk z`҄[7ٮזB?/~$(8yC|%*Rњ~ٰK:߳]]<3 )|.Z;q @T>8yHJ{!:1-D_qNtR9\*pm5fLkG_yH/y`i~`AGmc'dm4Fyp*jħwc6XU "B]C /|̽uCAb}(kKj+>c,d:DFmAǺp{K]5F[iq0M29/P(egsMf wOP ܈&",aUT>{<ӴDZ V.n# *֋%jބpXI5d1*!m3/w1^^0_r]wh](=Ҥg@NՄ^V5uFĔ_Iv ƽ>O5x3;X#EJ<oT.h4^vܼFZRYNttM?BéHh3aIě5sKm]uv~oVō]ūDxA~UulܴzjV|1'L8c88 Ml9s<_1˲JKnbdfDRQcbLaZcn-[egP VIqx c&J)$ y4p̞w? ܹP꡶|ZZFgoA`NW_ Cm}'`t((PzM$"9azL%сD>Z%MEO [+g? 1¢b#YRTTN"q(-TVz̙c3lK(F BI&XYׅ۾-|jH&Ƕ%=in̶7{+AfG>A[1teDSPnޞS[Ti4sB࣏^e5M\q:BtFt*(|$jL`M{#;2޻J)ˋcM*9{S2|'<l塟~.[ș>.A>S:/˓I:-4J$~گ00aMvjHM~:}VZzZ-tAKY&ACX6aiV ?*@L14'Xa@ȔEvJW^o#/,Ӝj!.zioF*xIl'R +۶3g}UԀ! m'Zs|V[[+[k>?膐3'=IENDB`qstopmotion-2.3.2-Source/graphics/icons/languages.png000644 000000 000000 00000006117 12536560630 022730 0ustar00rootroot000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 7 IDATXÅyy[g8cטHbDЈH 4&j*HHKTRClCdz3w߿{.Hwunxi$ISil?~/k.Ν;.^4{S>j w-/}n$5$T &=x/$tl]lq/<8~΍D1_Ǫ8%EQ-˶XZ-s{X0(/.K]rH;hCґ1Rur(`ffj˖8Pi-B/"XuJ&ZYC ݡ|`n\n67@9Beq}H}J~ܹѫPof<ėJ吞L-t4VRXYZDj%i`ƶm4§pW01pv6u}::Bq1#nCcET0U>?Ya͋#D2bQ&`y%za|77>~?-[F*NSLafYXYdEɿb=l&;$BX}yliBMЇ?g Y\Zfw˼~5Q^WS5"Zű5I*3>K"a|{̪\[ [0Va_]TJ67cV ޼ƙ%@- y 큋q)>bvr}hF;E $|&ٸEch $ZL 2S YZB]H('GE;rFZQxK$"CؖΚ$WQ5*ua91ܼDG t],:2e& -pqfgjdt+"gd vBORM^*h'w&M|?Dbw \x4/"A!ia, eXYFka?3bHBŀ"QxQFFv`)^PT412hN`fyy&f3d/-H+$#E["YգP,CDÅo=Ԧu ëZ uNI{((%F^YI&*,TPooa.`P[}-H8K3 78k\.BQBH!6W%S,V!-[vp]~yW6_/h *^XM.vIXMM+:8ndC<*[{ܬ }` 敿:ⵝWr{^Q2g9~i;) DXKUbxP$jfQ,5Jf3d')TBQR(Rhy+|L<ղVVs]0uMYYm?'hTUP)'s,&8fN0[O3ƻZsfѴ#_'BzTQ,ㆅʄB>"(VVzBU)KcVu#=RuVUc̠hW qky ?>|ic<E}_RurD4 jLD"A>#͐K&-#ti}7To7һkԟ3 `k T3—ϣ d RLcz]&{O_5pkQIyf!(ۂI!kd=f=&LeIޑհ^{+ ;DmIENDB`qstopmotion-2.3.2-Source/deb/changelog000644 000000 000000 00000005552 13011063365 017737 0ustar00rootroot000000 000000 qStopMotion (2.3.2) unstable; urgency=low * Some spelling corrections. * Update of the Czech translation. -- Ralf Lange Thu, 10 Nov 2016 00:09:11 +0100 qStopMotion (2.3.0) unstable; urgency=low * Overlay intensity slider now works. * Change the onion scinning to gray scale images. * Remove all gstreamer using. * Bug fixing. -- Ralf Lange Thu, 02 Aug 2016 00:09:11 +0100 qStopMotion (2.2.0) unstable; urgency=low * Change the controller dialog from listboxes to slider * Improve the gphoto image grabber * Bug fixing. -- Ralf Lange Thu, 09 May 2016 00:09:11 +0100 qstopmotion (2.0.2) unstable; urgency=low * Update the Ubuntu package generation. Fix most of the lintian messages. * Add the CentOS package generation. * Bug fixing. -- Ralf Lange Thu, 12 Sep 2015 00:09:11 +0100 qStopMotion (2.0.1) unstable; urgency=low * Update the DEB package generation. Fix most of the lintian messages. * Update the RPM package generation. * Video4Linux2 grabber can handle BGR image format. * Add libav as the second encoder application. -- Ralf Lange Thu, 11 Jun 2015 00:09:11 +0100 qStopMotion (2.0.0 (Beta)) unstable; urgency=low * Remove of the Gstreamer grabber from the Windows platform. * On Windows qStopMotion can be started as an portable application. * Video4Linux2 grabber on the Linux platform. * Camera controller for the Video4Linux2 grabber. -- Ralf Lange Thu, 21 May 2015 00:09:11 +0100 qStopMotion (1.1.0) unstable; urgency=low * Last Windows Gstreamer release * Media Foundation grabber on the Windows platform. * Camera controller dialog to control all posible camera features. * Camera controller for the Media Foundation grabber. * Gphoto2 greabber on the Linux platform (Experimental, not finished). * Camera controller for the Gphoto2 grabber (Experimental, not finished). * Update of the user interface. Preferences of the project in the file menue, Properties of the application in the edit menu. * Optional grid in the live image view. -- Ralf Lange Thu, 09 Dec 2014 00:09:11 +0100 qStopMotion (1.0.1) unstable; urgency=low * Fix Bugs * Full implementation of undo and redo functionality. * Full implementation of the recovery functionality. * Call gimp works on all platforms. * French localization. -- Ralf Lange Thu, 15 May 2012 00:09:11 +0100 qStopMotion (1.0.0) unstable; urgency=low * Fix Bugs -- Ralf Lange Thu, 12 Mar 2012 00:09:11 +0100 qStopMotion (0.9.11, release candidat 3) unstable; urgency=low * Fix Bugs * Add packaging for Linux DEB package. * Update the German language translation. -- Ralf Lange Thu, 21 Feb 2012 00:09:11 +0100 qstopmotion-2.3.2-Source/deb/qstopmotion.xpm000644 000000 000000 00000004104 12536560627 021215 0ustar00rootroot000000 000000 /* XPM */ static char * qstopmotion_32_32_xpm[] = { "32 32 60 1", " c None", ". c #C80404", "+ c #F70000", "@ c #FF0000", "# c #EE0101", "$ c #C00303", "% c #E40101", "& c #F50101", "* c #DE0202", "= c #B40404", "- c #FD0000", "; c #DA0202", "> c #DF0202", ", c #C60303", "' c #F60101", ") c #BA0303", "! c #DD0202", "~ c #CC0303", "{ c #B70404", "] c #C40303", "^ c #E90101", "/ c #FE0000", "( c #BC0303", "_ c #F90000", ": c #C90303", "< c #BB0505", "[ c #BD0404", "} c #D60202", "| c #9B0606", "1 c #A70505", "2 c #940808", "3 c #A80606", "4 c #B00606", "5 c #8A0808", "6 c #0C0C0C", "7 c #070707", "8 c #080808", "9 c #0000A9", "0 c #0A0A0A", "a c #000000", "b c #030303", "c c #0000FF", "d c #0000F4", "e c #0000B2", "f c #0000FD", "g c #0000C0", "h c #0000D2", "i c #00009B", "j c #09090D", "k c #070744", "l c #07074E", "m c #0000F9", "n c #0000B8", "o c #08081A", "p c #0000F1", "q c #0000B0", "r c #0000E6", "s c #0000DA", "t c #0000A2", "u c #050505", " ", " .+@#$ %@@&$ ", " #@@@@@* =-@@@@@; ", " >@@@@@@@, '@@@@@@@) ", " @@@@@@@@' $@@@@@@@@! ", " $@@@@@@@@@ ~@@@@@@@@@ ", " {@@@@@@@@@ ]@@@@@@@@^ ", " '@@@@@@@! /@@@@@@@, ", " (@@@@@@_ :@@@@@@^ ", " <_@@@# [_@@@} ", " |12 345 ", " 6777777777777777777778 ", " 9 0aaaaaaaaaaaaaaaaaaaab ", " cde 0aaaaaaaaaaaaaaaaaaaab ", " cccfg 0aaaaaaaaaaaaaaaaaaaab ", " cccccchijaaaaaaaaaaaaaaaaaaaab ", " cccccccckaaaaaaaaaaaaaaaaaaaab ", " cccccccclaaaaaaaaaaaaaaaaaaaab ", " cccccccclaaaaaaaaaaaaaaaaaaaab ", " cccccccclaaaaaaaaaaaaaaaaaaaab ", " cccccccclaaaaaaaaaaaaaaaaaaaab ", " cccccccclaaaaaaaaaaaaaaaaaaaab ", " cccccccclaaaaaaaaaaaaaaaaaaaab ", " ccccccmnoaaaaaaaaaaaaaaaaaaaab ", " ccccpq 0aaaaaaaaaaaaaaaaaaaab ", " ccr9 0aaaaaaaaaaaaaaaaaaaab ", " st 0aaaaaaaaaaaaaaaaaaaab ", " 0aaaaaaaaaaaaaaaaaaaab ", " 0aaaaaaaaaaaaaaaaaaaab ", " 0aaaaaaaaaaaaaaaaaaaab ", " 6uuuuuuuuuuuuuuuuuuuu8 ", " "}; qstopmotion-2.3.2-Source/deb/copyright000644 000000 000000 00000000675 12536560627 020037 0ustar00rootroot000000 000000 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: qstopmotion Upstream-Contact: Ralf Lange Source: http://sourceforge.net/projects/qstopmotion/files/ Files: * Copyright: 2008-2015 Ralf Lange License: GPL-2 On Debian systems, the full text of the GNU General Public License version 2 can be found in the file `/usr/share/common-licenses/GPL-2'. qstopmotion-2.3.2-Source/deb/qstopmotion.menu000644 000000 000000 00000000243 12536560627 021355 0ustar00rootroot000000 000000 ?package(qstopmotion):\ needs="X11"\ section="Applications/Video"\ title="qStopMotion"\ command="qstopmotion"\ icon="/usr/share/pixmaps/qstopmotion.xpm" qstopmotion-2.3.2-Source/deb/postinst000755 000000 000000 00000000105 12536560627 017701 0ustar00rootroot000000 000000 #!/bin/sh if test -x /usr/bin/update-menus; then update-menus; fiqstopmotion-2.3.2-Source/deb/changelog.gz000644 000000 000000 00000001641 13011063365 020351 0ustar00rootroot000000 000000 xL$XchangelogVR0}+(ezZvHaHi{%#IwW!!IÛ/՞gu3/4z{hHhl:}t`Bp5*%u 3uQ}]#fcVhEϟÕP ]")~p㨐*[ q(>|VȨpYNRbͰ_;8J6\]a^K^Q.RXNq|v 0N%Gb…  s QԵNFod B:kmSLdr6`w7gF 1gCml(aGX,kpO̷6 %ڂ4{t Ip}ڐTsOE! F灏EKIȮk$ 'BY0E&W~heE"O֡cf ֦z8G1asBIT|d pHYsu85tEXtSoftwarewww.inkscape.org< RIDATx}ǿgga%QU4V%"$u^.D1V 23XQ9#x\< ' \vY}]vg?IFݙ~>UOR_h'\ c5ءZ|rbm7k˚Y+V 3<@kb`nOT/FV*1_loD/rd^&v*v99LfKypXXø_F5^lQ4W}4fE2ߌDΖrT2'bÕnkch$Z+WNJyd2_$*_ 冱ڜ\(KU$! cd2'州4EG'&ŁG4&W~2]`,dEg_Ods皍sG,+\lbb^-LV=n.6=|0Њ^*Ol33R>=-{F)ܘ. GDqZb۾&A\XSS# "\1j?6tI0+@2MOruu`Q 9|"3Vkr9XEYaYU)uVWgu^8r:\9sKcF XX¶}eEѶQwٶD"/^,YK3hhےd]ngMm!{B@2C(16˲8NHb㘚}/@ٗ `l:s}3Y_bۗf q2C8EA!˾`0j6۶; 1y.6@p~ 3glCh5M8(Đy&!MBt}/#ljp'`ݣmGAl:> }+shXۻ6|˾t'ctcmO iUm+\{t>!zt^XZֿ>wPDž|/zZ>!pl%ѲN+zw__ߞB6!~pGU{]Hۯ]= ]D>-7{iZ5{4^"L4Eㄇ,\wNbXX#kZd|~%2p)_9Zi|]Ӿpǫ #DLfnw:P͡Ш_UiUUJknٓ-HseT9b(4TʟM%Rf=$/5BcfN2Iu[*/eL`$X%JKZd$Kof J6I}U|+g͚5ܦiY.ݭir6(OT PO?$g.0ʙ{OU*]\`N('r>k=JğF[J<^9O/}8/{W%dFݛ0qcal)=V$ JNRRWh.M)d~Mhpa<6ٳg/9˲ֿǶ|²꯲/:"< ojZ[tӯ`yDvu\C/ B; ao78K\m?<88>c(Q4W42F2/@48Fp<bhG:-ܫL&q^d^1/ԁ9Ȗ,p赁^=DtoDTωB"x@CC>3|#NoG7G_*(,uF"8pߥMD󻁾"a!̌L&uiO8F$錧= 8I`YM?"YGD(1UKo6߹ xygEVl8~r=pN&\I8xkgn!XKD摲Lp9xl:aDЊ)|h~a"*=%}GP|Q㯉hi[QiMV3l9E!. oq>pOD_&he*p_w "jxj+{\Dq.K:o&jLDs|X|/\jU[^% _nEYWsmˀ/@QiG pG pG pG pG pG pG pG pG pG pG pG pG pG pg,x  (Ea0ہ awxh&}''z{Gy8Hf2>]Nv`p#3;^  m]@̖~,0x s ޾A%,?ww-@Y] pǀ{De 論gz0s2RB8ॣ@:LuD؁+om_gJS `qe̼l0- |̝eOpI>#@̬~{3l2w2s0ox8~+Я\KpQ\;]OplXX|],[n`.(\0o=̡ S ( ( ( ( `jXqX!lBMitP(7?H 6"0 Yem(IENDB`qstopmotion-2.3.2-Source/icons/hicolor/256x256/apps/qstopmotion.png000644 000000 000000 00000016663 12536560627 025136 0ustar00rootroot000000 000000 PNG  IHDR\rfsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<0IDATxyUϯIKD E %zz WD/AA*!.peAApYB&yH&3Uu?zFsLfz{{~f~99S9R PJG@ .@nef}k^v1`14:rNtڿTj1l s`VMdl Y ? -_|疧"UA`9@sE6K (Aig9ʲYy"sP/9R*Yk_I1oq7le&Iys2fY3Je"?cߗ{~q/GWn~eMsG513h| Y{s'{cf1k=qmDaT|?9 "AVZ&ks Ƙw|ŰśӴ6^$ fYKL[Ð0Ve0wd#M`Ƙ8 [7w.>^/I%IZ6〇|[aX}ex W󬵯hS]gL!IRڿ^gF?+E=Xς@|M>g}^@2c4'Ixs:1{bZ3ExN>M;Z[]Ox_+ ߃8Z]ƘXsbm!7R]E̻0X6˲)ߪբu$ (][keC9}T*q-SdG<#_K=S7J6RRy_3/S|uZE.镁q*Jv3F}@g솎䷾yvCcL?{@.i!>sH 洲5rbymwβmn/.zQ#z{'}E I[dmf Kyȋ"Zkߊ90V$blw^]:^"_cʻcv.oI~zu~}{N+֫01ǕÍx,.NV#cNʻ!Ƙ}z}[W.m< \:0Xn2|d+{`HJrƕJzY`P7yJ;ڴRy+rwuI6TJ]i+ Ƙ=c1ffhc̛|ҁ?L>jyo;oާ㸝hs$+7.$5 6}$ݯHCޚR/qn9cv}zcjîƘ}G@c{Z_xS1lk1Fpumsagz@u8ZmBF~ ;"O*)t3ŹMmz#8z=;%u͝Z -d #83Z0@#qSjR N5TZNc ZYk;6qn:ޫZǔF#q̬,3pPFpph$zM!sDp05Z@`'IQ.$ U]1MgffoGm,#X88cmrԶrf41f֣E =LMfSGoN9Egh[^l\0m0~FVF䢳CH7hΥ@ȹX3)<0;<4f`gVMe>cY_Mzs%o- 9 [:zezMVff[+qN7iFIY&;SsliSt p*Nq3$_DpI+E^^4Ʃ/,SMZy">nA&-*~0~˖xID3i#y>孵mN maHsOYk=-`M,Zz[Dg}uÂ[ vcD I`OjޅtNy8Ws*!= VO~,4Z:p 돞 #ve [:{!%Xa}xChk^g:aHs.ﺪ0R)yI^QΉZ ^ Ð:'`+DEIwZxz`Z~X*ޫ=? ޓe3OWb}ZW.+ ܿyUӣIU#_[jۂ {TrU8Z۲C$k]}Ji:Tr2Ѽ_ŬpWe8(JBZ{G]/4pY.QxkBQ b87ݡgxY~>ߎ[k 5p9=2^7e4ZT.E?%(Kp7FN|+ޗ~R*|4$SQqd}yroH XkK᳟I]C)|Ztg tV_C{{~_c8*NKZ ?'}@LK=#{{cZׇ}q==3,ڦDh<W(ڀ=)|e"mMjpb_{z&Y߉"wG5Zr,u8z?O֟?yKkpx+( g7&MJ Ð3%pG`Xkk5Q߷WE0kU<-ܩQ&[{_|'K[!n5O2Ƽ=I =Sr9TRZӼk0}$dw|\.,XkD`c^OͲ7fe=Sឞ x5]Ӛ1;ml]ޫDhOO &pX@1&8 yAbcnoom=U[k0L/S{<퍗x qcoq֭c9U2% 1eJ}-:L^E}w۔)%wo ok眾r|U*cU*lsѯ*m\*~chn\2zޞýZ<σRk\xq@1T<8AoJSSviQr|pyu:c̻#8zݛS{& +q-aä.|Z ʻ4:1fvN#eY<^$ ojs,y}?wd^h<#1Y]玨Zq.3I319fd3",|-'2+DJe1姚1v8^Ndf 3ʐle,AD܋"aH `),~8? .e *]sFxι5:c-KEMcv<\|͢ˀ?/2݉0NƘӀ7]Z"<:Ѹ\ﭵ_[n 82!eu݀=.BL[7 DD'"ooMJ< 74ȿxD֭Ju 602i+ l:ܤXdYƪU#>I 1uTn }`NDZR9<S>,vR9_DnoJvib"w{) XD]TRM8_rp&"Ź R]lSg'u?#"ljF/Q).-%3~cf'"gkZT+pK~ >/<#"W[=x[ >L=xHĿWD!R9V@wn|ZDz_Rj}&[x#O/~Ƈί78Nm5q(  8؀ws"rekRr>X,z?VĿKD\͠.ԃ3-n)9FD֧!0d%yq7o `p"E)5tX xp4DD.s.PIC`M{ Ts.N0d;`qoS$xBD>!"~RNMK|KAD."[Rݣ `H (?r*x/E9TX{%D[DdScM=pd_.w"a|BRà>xÛ+_""'֧Tg0$x҇;6No\ "[R} <|("]Ry(P $0mpH9JD6&u|/>$UI0dODYR7k?S 8i/"̹@ZN`y\~9T|& Z'EXo}J-ߗe6֦i4esNz1c{iޯTu/ L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4*0 L@P4e˻L`L^NLyԘy].Πvʷ.FFm|/NeʜSjt`~ ^?d?s-ɻ2ZA`)08#G=_΃B+9TKijR89j9T[h >x߁ts.˹8ڪ4ppi58ùޜ Sj0w )dWg9=saJM4FWwsKLL?19gs.NMX\R^霋s.N1`9 ^{s\Rg̠.Υ[R~L`I ps S+ta8# nStQU4F_ ι\R] Uy),#ksSupfW%\RF4FtnKɧ^L H ٥9ιyWdsdB{z p8^̷6&\b>,H/qέΧ&gBV?AcDs.ZRKdCcD'}9qd|7xUJFnSu89L{@ ,1J໐}9r붣jpi?ヿ/s JvG #}q;siSJYz@iN֖j&4Fu2pM)l2/]R6_ౡdd*5yl 4^NPMJ 2\<@✛JM^ ǜsLx%J W8 Tqh(U`JRTi(U`JRTi(U`JRTi(U`JRTi(U`JRTjP*.C)GB"B\λ FM*0 LS.BZ97х(:(U`JRT|MIENDB`qstopmotion-2.3.2-Source/icons/hicolor/32x32/apps/qstopmotion.png000644 000000 000000 00000001533 12536560627 024744 0ustar00rootroot000000 000000 PNG  IHDR szzsBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATX[Maml3K"qr} |1=.jI}?rߘ/y`:!6 ջINRD5(DY>*0cJ9}Td| ؞OyPf\ 7\OQX T+E.D(tr=@AՇE^5p$lY:{.}χ@+a7T݁yۓ&{Qz8E8Q= qWݎqCw#OcP("q {^TTXU93|߯ d IENDB`qstopmotion-2.3.2-Source/icons/hicolor/scalable/apps/qstopmotion.svg000644 000000 000000 00000007716 12536560627 025755 0ustar00rootroot000000 000000 image/svg+xml qstopmotion-2.3.2-Source/icons/hicolor/48x48/apps/qstopmotion.png000644 000000 000000 00000002251 12536560627 024760 0ustar00rootroot000000 000000 PNG  IHDR00WsBIT|d pHYs䔥;tEXtSoftwarewww.inkscape.org<&IDAThZkhUΝ>Tmd1Ŋ"J-b+*U4hVDQh- -&%I󰵡I5ݹ20.ͺ;3q4s{9{w4HF+{&'9EcYiiŮ>EjYJA "4__N]\S\q|WQ:^J&_cd6JJW4l)+oR%b_ D_$f-kwzT̳nU˺w6-êzz6>ïƳnDjO 1-Yej b< DzZ]؉VM;@4/5-Czhto c}2 p Qh

qStopMotion user manual

Ralf Lange

Fredrik Berg Kjoelstad

Bjoern Erik Nilsen

Sunday, 31 July 2016


1. What is qStopMotion? Where can I get it?

qStopMotion is a program for creating stop motion animation movies from pictures you already have on your harddrive and from pictures you import live from a camera.

A stop motion animation is an animation which is built by taking many pictures of some objects while moving it a little between each picture. When these pictures are run you get an animation.

You can download the latest version of qStopMotion from the qStopMotion webpage http://www.qstopmotion.org.

ZZ_cL[h|^e"ҘuA =DҼ1X@ػ7x 2- 8梭,JhW4Ӥ!C ~]>vf9tH g])BUknaJd@)дF$Cn ICò_`^|&ޜ WGL!E bZ&a UϚz4g'UE]Y4a{8;ɦEB$jL%̱)s5cfJ1+Z޻_[gᕦŇ 8>9 "@2 G/ںp($ 7M|.C6rjowۢKDS rN805u5IPun 1`4E!U[[71< b[:6(JuH%{zj_G4s*BnJ=}; GqDKDg*['-*Qp;qEr}@`y+|) 3PP˘;zCsrdT)ƼqV[4E{ޘ9(M-"RP_?a|+ToHXqyy" D*k]ߕDV2]N:,k>^#ERpTw]է^{9Y,WWؕKP s[&^>fC|ջ2ӎ?n4>5.gBr+*37TnS ā#zḷ1mewY#$gԃ]ez9js)k{R<2n.D5= gi#rvS^/BKi[2X**Gq#ۜ\X\/rpmyaLtGcm adOCP<~#ΎTy""#6qFX2|cci ,ORFp|WP`;ˣa^*Rji3K <ۉO&+U@Y__h~d/` 7mfXΟtI(w wnãiQEREŊFa*UMlmMBg#M5G7mMC\M2^C#SDһNC߶gLk3D9v-Zԗ%T>dR&tQ&پ#M'p̎ -G4{4u>^y-GlUW9l_ۼ?rUqwEw`" a4`Ɯ5s;py-ĺ\ړMB"Xv|7MΝܽ{ M'6qjpDpvv.~_:O=4O?s_o>K s/yM皧A}юL']FN- Rn޳Ry,* x3l)[ۙcE%rB% 2Y&cd%rL2Xcb,Iu<i6̑>K̅\x0_iX-|{ Ue{>e:r B:3#xD޷oHa.F'OiCܸ~Xe˅N`3fjŔ͝QڠuMQj=4VU>F\TIȜll5&YLHv4?(wVey.Yg3Znea8sdT>N1U.tlגs}FM&{QΧUYD#礩b3 5 (mv;fQS>ޙ@M)*TUeg.R手28.da ZvѼx7&y 4tO;j%l2}(ƾ_p՛:n@WNHTG@Wvޫ`+3#њr96.'j)5 @ً%D{ 4nDQ]K<&9e-"aN@R8H݇ssD .GB IDATP0]W?ǗQz9"׽bZ)TW72b!]裺FGuJW 11抓@n?,֙p{wΥ$ffAX_y_p5^ c0̱HKWm6B敏f`>^x n͕nwlf`t'ד5'N_yZ s%M0EtjlV(j3OCWLqQPM唗H)} D?Ck=PZY >+ZAڈ$YGu\5 jhj:Q M&"Bgm=@qqp~94o]~o|geH6QxˆWtC&S ڌ'Gi۔('2 B aGq0E:]BQi†=R*p@&IEKC*t+Y9P#D0%IfY"`-^U`:; ۈFFZۍE#1Ǡqf:J.xsqG˒cO78%EZ]i=_19IT^y zR@݌Tg 9V'dWvǝ.aIA5h,8+tJUSi%Eqʍhag*+%p~~wbLpj`ғueAݲ0z~gSgš)52 "z TsZ63}M<|2336ԧsy:]br:2ewVwT3UG$ x<;X:X zr=>b9$Bp6!ZW~f(s[_|{xg݅۬|yųqw?e/qyLmQcc$iVNukLS [[ɬ7)q4EGFL_Hm*vC4l0 ,srˤ6$(aQmө#td<F*[lsuvrH 1]*  wX7T<=a+^q5<vj-76A Ww&Pz- dF;3bEU8^o~%Arؕwf+ʮHZB "7ߜǟ}1Mdi*dހBf-p>sBMrt~ ,f)H/VT~kfmXLYC[iD5R{L Wl.2Ą=WW9&H:Hj4elO]iSc8!q/W6 p7KmXXOc)12b"u:1ˑ-Vܤ'ד5yl3A #-SE*)ԋ =%HXF-Ddx[ lLsj`_ܤDO|8z|1en0N[vx.~h&1z %ImB7Z,E3wP=<[Efn v h5>{8):^e_K@\9)C~>wW^ƇxD>sULdiE9H ͮf msG1!rR4 tJvԚXsU $ }D.^UytyXTuX ՚Lc^'NtTOEP?.l=f.rFDwKӛmK[N<A띈|OF+͈*O;K>{ ku_K{VA9˞lYN9 _KhK/3 ocysXQ&lSh0;G=Ւ} X:O3uH֜"ÛRά# 7ݩ'1jC?"СIU7ԗduņ䊙)TDbXd$,7-6|Lea ~'דIQ+E$CB6ʥsqˆɚ}Ҋ֯m d|9_T$45\HׅΜoHL(XOg DXn>`8Ak%`v4iƌYZZ K 8҂9g`d0v;Mw<{,`VHE%nQc?^|=<s\[o÷g_̅9:ݝ 5;1&L$]k̒a/eֹs4Y[]/KkB!ipR`,OhZOj薹@AgA%(5T+;';+Ҳ#Dڍ1 qkFs\l|&7%c}ٸ|nV@YJ3Ghgu*|ާX?rw';ؓ9ؒU^&_tjʖߧ˥XjP 4tpD? |Ktӆ;ip\tl'"/ Swz|8:9FpVq9rD3ϥȽV$͢˰Z"0>3e5"lMuX8(3X[rӉhE=n\#/_'?3x`hgށyYK/rg?Nv\vme ׆(II`I!lۄE<僝5\9_Wnf  Z-ZW]9' 3ij^s#1Uc}N Q6)4FZ{HI , D6 ApN4CH hKMQ i*5>ɣGKI %@Z$yP:ӝGtw)YJD%*C w` 肢١"_&RbGv8HQG>LDJvBٮ7L6\]eAYܶΛ.Mxz)2Ōͷ:/x1lG21X]Y< aʈ9f&[QbZgnJgā) yڡ<(3#]$M*G9,fNbe-ZO[K@l $n484al>>x=\kQcas)fZcm\3Lp$܌(]15$nNg IL:[ "d6&A4p4 X5>Ҟ-V)ڑly^1ݱթ+t 2lj4z<O_reb@äg8#S[ʉKn o|ca#?|9ᑲ۝#~jf~|9rowcqXqғcLL#Ka\wvŎ;ҰnYO?xHC$dIMxAyʹ6GTxT;)367,hV$D^Ypµ I%aJF[m(x 鴋Ç/a:,9촜Jyq',ƾ8\^Fu%&dBxndWY{Za,R+sVgl  mCc!Ad0Q9<[5R?NI&4n1iNGGu+Ln5݂vvwqklٹrhn+}]>܉xGӗ[rĖdLc814UI1nxq,ݮҡ#!F985m{/Q4bK`QXO'דsԌ0ƙ c0fўL^)&&ܔ5bYleIM'546>vL7dV:Yi{? &_O-5qYρ Il$<G.ڳ6/)1Pi*'Br6Gv!FnMIĞsӍ_q |胗E'븤,v7rqOOĹN0{ :(!;1"%iL ]p֖dswVuVϸ78+DFIh˼˕y~!dK&$* t |lؑqduP̅ 3F!X$[ [#&Rc Hf4z$e  #4 ;Q eglb}[41jڿ-]:PPuNO'&7b8-:ف{N)mkgX&s DPGx$Z,t0gjgгKeGtvd'QV6Sq±5>ku^ ϳ&|v˭iF.`>3P vd;ypM6|da7DҌE d hՕ&&Itl5bWt}vB-*9[B"A*|0Ov'דshqazIS,(A GbdKw`*54 $k-j 5S!VO FsiE}2W(l{ٻIXZC᧥P抌#<]\qJ-pI4B[1M$UёN$3Kީ  3s0!Y ݥ!;u+v~Oer3.9\OV?>ٶ,E6n&zj["-رܛ Ux,!YMihP ,|.&Kp-n)%rK~yR'E!% &4K fKڰgk5'c8/Bu"өcUVA6.&I2umtl#]hgpm\?mxɦ&hm#;=.^ܺ }DL=ed\[M𒹮ؒI~@KMISM YyTuyukrUfˮAPHuU) Vnaw҉ʑaQ'z(O֋14ueCC+vhD۷vLw<P/'uv`0SVe9:N!" 3yNVN1DC[utq LX]>@$/)hQqړ|U{OݙOf?&y{կ|O`kn??>'wRQ[lŞ8:n7mND'䈹TL:R6s+_ԝ:(*loZK eme^?b+`iqi &RgdG vzwH-89YO*(0~/`gr(.9QMEfUi@) jQ, #Q1L&a{OK_j:1"ZpM`^`,[ۥ|іU i{.kȤ/UԐ﫤LsQ-Y (ogqt2C$$op?bhf]h+*(v6[c:XݴңΕ%E_?1rtTt˸ nw͑NS+eI:&BA 7=[`̉YgT MMHό#Mqpfd @)~rpL`zΒ%ROݒ+${-z5:+\vHGFھ&ig):ڍf]Mx31Y#UZX:*$XY#c͘ HǞGT : Cxhu38S*)&MF Śb-#`إrlUnwx'/|/f?|~Cm\__?ZKnU 5c[WCy[cgНkOKk hU3Uu g ;U{YwtQǒJ IDAT)X*UF̆or[g;ImVDi.inq7vѷFs ܍_canEn0\;S{%(sυFC~>{}{79|?ʿ_~]Rt?GsO~|7}>OG>>o}_w4Oߚ< FxCfey"4 KmyʊʃS(Ciea/ `H!Éi &seI[)#;=J.ydiaMEL4fY $$W+3EFզNqԦ+p5)6BGYǝ>aM`67n)Mݞz6XfaNtokvH 1XmʧVHbJ ]ٕpRxc̹ӥh1";s6 EUi6҉y5BE M5$bIK~v9ʵV%UL-P;x}DKܺuIۋ]]HfIqdب"` .4[kKtd9 g&G?:&-C(ʼni .GTW"K7)'w$ c$TMHV,E Dr}=Y˕.H |2QH׳˱9f-=3⮯d#, B+0ʜ639Ypj"NR#s-s}&Ƥ&*["=UJBhO ?fZw{MwQVa5c*c$[R|h-P+הs!a㣕ePqȵ̒ tu +(x(^QA,H8VX"=F /Yc@\'2e3tiVAGb~S_q.=Ν;n8K_G?#? /@_:?~++'>G'z1ݟOj'p9Ȃf}+ic9#Iu KvbŴJeo+Jwa2jLlhLz–e]teڷSޭ?bKr3zjBSٮ}Y ZQ"hy1@6ferE3Ozm~~^ܳ|7B[[g?|ɲ,7}m|_տ}O/7}_?dW}r t \t9H)z.uJOv/ƎQɶS%^h^mmq6Igh;#[3`ؒ-qwd(XnQܰ`IODF8ec#-EXvkdاSaI˳e qnAboq֖jY Rt'6$7G)GKGgbJL7eQѭoV6t <֩v)zpg8$f}x-tMF澹7f@h:LnsOWn,\ՃUeSRFF2Z9*°A4qdU( S1Dz) .9=9V9*sae1!:Bfvo#>t 0:2l+8-:PQ) bfsF9{xBcpyyɏ4'~?w_˗o㭟V?y׻w7}7Wo~{N'zr=~+5؏G͘:'HdR>#| )d RCta25uH;LXzVfyNBn&N5 Oꉴ26DF NTalQɹeɎ,Lj&'SEfDu%|l[۳%I[W,ztSögn 4S1 _`]%8?]_7>VVxuY1Ǜ)mA UV3 dg>. =""B/gm'xIE 6e^s a'`*/>r^]!IT_GoLqʞ#pp$tX4ֳ__IEKYLȈu$dQwrR9Ø6ʼn̢vt\7bb FhqSZ~kw1xȏ/?;v|w~'o|/Lw>Or}}_}_?<3<Œx0k:bdH.gnhоi6Iy=!`Unhpu%>ާD X"U]"3tMO:) ܒpYᚦF1$48$3{9Qe SoMdrZ {)n6}%_-}: SZV앖CI5KM F#ck1HcM#?J ʂ3gD d#^f~J!pp%թ4ƛhyuO{wd-ߧb^7w,Lpsm WQ292tMe00#z \N4G{f#-qeDy3{v1n(֓r 1^  tRqlK6h&#Z۲cLCO{rD h.,(i6(3<"9T<(9+FNf)Q*%AL:se|X9akO\D/s|tCߦ^)3_ypxumߪ=Ν"fW^?d9/ei iFU-0-Ԟ<ޑHrvD« P1k$B:of1TH@0E.MRЉ-0$JbɋM5 ԵhڟH$-[eg, y>I\8mŠִ?)M- 2KVc{਱NB J CܘdTNtԁ)e?$!vgNdž )ʦ23qCJ {R +̛dx$E akRQ2e]LUȶe{裐(ݱ>yKWJ܌pNEhvVDZc\u=0FB6RI{N=eNzjl!7י2!`, +mpGs߯ttJ12%9Rk 3B)G#feoVy={[9cz1adLQ^Ӓ~z,=X*k'ؐQPt4 /4e:NBp`0*]p1!V VOcuĞ+u7TG`iurL ЭKS4?+[cTb Wѐ[ps3!u<6QCty|/?̥K7M۷eqt|L~'ޗm~1cZeey<䱷>v}, /%c _ƥ xֳoc:ѯjkw-8#zshǣSIX 0ҳ;:E=ȕIHNR:l7вv 5V4ErAW)(JfqJ1#,C Qh'T(3kJR@`axuw$c'h+*^%eqZW%CӑXx]0TrA5tv&߅Bk{Mr :-e| +ǍVhRQ9l5AaJ %:[Kifhe"lp ;gvm*=Ss<@˂X,zR͢I&ו6VBwD> W cJ/9ڪz7}Cg<ɓo}}OzW?1{k cSc.#uEFu3 JS8љV$ .-7BeGCN4]p dR,8Տ5Rfb}UIK:%GNFB n\k9Z:/AUʵR:Q$BC3RQiю ag.;Ey`#A3"2}]sZ¬-`D BZф&F[HpXnVRZRȢc1Eꃾ hd 5ud$PĄ,d.3-w̧mJڨwl%KG[=E[IKXr W0gmOp0N >($ڄȊ-[dJ^S2B.R\wnI1L؄ 3i HatQi ='y2߇5ZHN/Jkx9RWkܻ5V-ؖ(1ƿC¦7VhbS õO4sͼ1RvPPzm,zy0MLSd  ZUxzJU/J" et.ԭ鴋(bcqJεv;- |'=g2zڍADvK)|4(r]R Oo#?pitM4.zF"I~>WzgOz_#oyupp8ٜiB e(⒙.,[S~5 @uk[pa 4[&ϰACtʆ~20P$2N0-8R#;PQ2z#*B>x0A'GTY%f8$;l@tnbH"DɠĐN,>v'u ]Hl M-J. ު3]sTs|ȸD;=>Fpcs$BS0n2TnDqRTYm֞)uJ%BԲocd|-#bFh GRj+%,X!ݰ2Q b442 DjTR\K)!%;^K۷[c+5{^-u8n[#{D+% _ZGò=1K IDATF),wX=(Lk8YVuB`1 mSXrLBp3BNe gnb:FC{%Fv1uck: 3A2((|_s )G5M82gYi/B5e(IΙwƖY 2F q_(;N")]S$GT{2Y>R|b#+lALvvFxĝ)0O_ tz1֥3&h!kP|-]W>B|əl|"1G_5}}<2x㍼=Sqqkj⥪ o~u*wu~Wa]:rfk~*aM'hYpx 5M=O)AIi@U,pqJO(RTlǎ`<zt tūUj*I'3cae=j RvZ P%ɯTEޮ)2.:2X9*8[da%BH[u.*P"ҳ85!M!eX]rt3w#1дPEWaߓ#d:r$،ɶ%Ma *lt!B %8=*i@jwL 5.b)FD>M ъ(X/Xq MQRcr iN.K?-%4C4 ݝMD *Jog )>67`.DNl+p9jM ֖e[n}٠@o䵙H 40yF&PJx2PA#/:XF9S&Tܷp#IԅJao&M`MhڈωGh5)3I홶 bã 'v¶51EYp8.KvOeKсZׅ:9HżRDGcQ(1S#g!֮5xd #%GCReҖ%!Kҩ)Rk`8OPMozzԣxk^<|~/w}ws8:6y{xk_ڳ|A&u[TO|o~3:֚]K_5~|啯|7F5_KHǴ%P8KC.J¢=54]4Q X_vDx@T*}FB$ŊBP\;]h-+=7RIzi%;R3 sZ#[VRɔ)irt֚\ Gw43qʠ+5Ԫ]Yw',"#q>*ڳe.ic e"c&1DsNiӈHsRX^&/n@nJE lBYzguJq)`@LkES#58=RC4*7 ߢ#fZ=GDt،hc%mlZZI" HɐE!U*Efi <ɪSȘUw̍*FI+2ONj t>d HAP.`:A7cU֘V,A'ϜouU(f=P`Fiٿob-ZtRW%{jcg"UxæЫIFsg d2E(2nA+mhʩպGˀȞcX-pDnHY)2o4EI#;cn8 ?b!m[zۋg.+J6m(!__s%PtmcԜUA !A"#&qh4-4F" Ǡqx"Gk#9/`PLm}!f)yoI.]$X%Lu̗9՗Rxw[.\pڝ?~ oQzozӛ;B|\Q?~w~wo&7|F=ݩ}׽uOEoxH/׿o+4ߌW?:&{TɳrVR9yш2&49lL.'(Q7p ԡgBXV3L)2 9/7>IT.YH U%y&A%EѹPV!7t\ˮ難! R_"*.42JU(t@.'YB4 9Ȇ4$x 527wC{@X2R0 7Tg@Ć)9:4*GI!LHlUasɠCc2yxgZ'H ISg!P٥\Rm݈I ߢ2%Ϸy FZ#F@Q @Ӱ;SKx!æ߃|oӏVwͶC|0)G<("¶w]Y؜ v OY:T)t8n){zճ(#0; xwwPK|1%anR sl7MlMLJ)`lrq7/y$DG}ņŝsX՘Ӵ]SzpцݐWׯ ~0BӒTc:PA#\J U *{I.%1`t"YT6Ҷ-]=y8cLI.Iqtu(hz<y^ǏȏWs=y<я%/yɩ Bg}w7yz x_|888W~W!~~~x'|}qVݦxE H_# /7nniAo = EQ:5ILIֻbvYޣze5S{Z)^BKC V1Z UiG=! LLcNvZEl՗t' sbO|As\ԙv٢35'6ph䈐Q&ΤYJ*(s) :Mp8K;Ȇ9S8E#,20I @KQ1W&QսƲ?s+6aIY&sL?):ԅm$GKf63l㊯Zo /j39$!{T>Q3%žXb5-<ѧʕL4;~'hU|Vi-BQb\(28/tBS?L Dw+\cnkDl O"ǵ'A &Ft@(vgԡaeT_e1XǤ6 {HQKB0 rLwOb:%Gxӣ:4ꎘLᖪN:i 7;: ٍrfz55y{ysš7 z}UMaKH+`˰n=C 8>b*;<\I2;XYA2P8?2rь݌]jI$p"+U;L.&1ĿW3 :0K;vhc(2= 2ef v r!SwLf+ 'Qv x$z=W32v-xITܡ8 aݚHb;VZ-1ݷniu DY!M5zfJ2 *kt68j.):1.CdS-Zu Ǚѝ֒, KKr2l:2F(9N d1iHƈ)S૴55HLzW=ƮS7B}etsl2đ*%cP|d1`\*1xv+ny(Y.5maFӂ}Uta'&Vb5V_,p5rn,׸n.>sJ9);PᔤQeWs |X8SƏ}K+xHo:5(uQ4/9)K70k׮qwwnr-g7~:YKUZE;> W^X/ -6 𐣣#|ɧHn&-HG#e>řgcF'+P5 2N"dQ:^CCnƅuv9.p4#,"ep4E :[NJMoڈ?o K:R`!Z%-B[:ew×N3d݌ޓ*找m>rivTeJG;1,D+".:KEjп,N7'W 2 [*5F4J0UYĆ.eҌ@uk D['_1=]niZM,~ϸuͅ=R191l²], Mqcz*h i#{zqVmvib<nh:KB- =-butXa2:!}B N1u1`;Ӵʂi#ӲE4(%)'}|??CTHĝuy# >1rw[[~7~7z꩸Zw׻3G3 vso{۾ 6v̋;qbA10˖;C`Q(=7*}J&in#z.B .4OCH9 Fv2A􄏩f.dQTݝ|e31V:͙k iKSRRŒK- AZ}W$lO3&R~38 +͑i:-P\(`I8+f7(<-E8.2]zƥPj0Ihh9rcbY\Hd0%u(6"gdBI--#jYB'5{z-)[söFӻ,,[Ǘ#]#DUmljI*E:Vk%iẀMY5G(ꔑUL)MmiwG&ԃIMcũR\R%C?zz_;J-)J#(pEƦO:&YSI-Fm uKpҜV5>u} 5'DG9r)twqͣN8_fS'f0!?WS ޮ댣 LB))OrfM1oN&B =a<0\/"YD$(0Z7HkȲ+!p=,N˗/s~~c>ѿ_ƭ 7/g>Y{g&?Px7V~o|?S._??ͳL~q{oh>Wk׮7>//'>%~\~'=I־i#>~aP\c{vTFLq%r&VR46ؖx<9JloK&lseVPxdƋ 5bؗ \'I !`%QGDvaՠ$inELj(R((ĥʍK&/Y3!@ ղ2O½!Q) ݃)6YG#TYZKsNS{+sѹj=SLs+)S2~LYU)ʦ/1ʑH~ң u{*FKK'ӜcsA͠{(YЗ-KZ彳Yk5;]e.< XbwbսL@ב(I'g'ܴDYcoy9O+ǰk_'/A*]m)# dxh045> .İ+VKpԴ/G73]bOmelre>y|QI '1JLLcO'ްGgaO sV7.ǘ;Xkjcכ)R䢝 >_ 3D۝A<ӅGF I> c)"9A즠㐤קo%9"L#,C+OlhA,nc)?n;N_'=chiqpppfZk?xqy]M3t~~n{6wuzՏWb=c._|v6YQ=?s?K^>wWȭ=|3EHVnFa8ea7cCv- bȂRtY%[LQ`R1109bM+2Uʠ| I$VNݠ̍ EYR;`gRr'V$Ty*8Clh-[S;i`ّe3Ռ hbu=Ē;d*>t ঋ0 4yX[PeJY(еLfu YEbFCn%{Ox=C +I0"9Yפ6ˠaE_F(`I[N7Fg/u-%xwY Y2E"ƎݠO!tǺl{.8X  XZi7.p–(.6(D;ǝͿz/~Y+u{{:ue-Љ9*wdR_[r.֡fwT{s=g_$;#&,< :YxF,‚O'_<}9޲l|xSW6>y\9 ؒ,!-BwPn?౫F:1:RZt W624".Bsctl#lzvQ @CF˄Q^m02D}LK- ;R\]6婸bfq3̌mwu NkUʤN*2) _Ɔay pM T Eݏ_/k;tJT]_kTH\tv:z/~w||Fn6{_D<'Fcn<9% .>K{ { $~s({R0+i|%oZnI7PAKb6:;<*> iN#*w G66JzXid{e.@HH1TJgO'2s -L_{\sEE$A0Dмuh'T֝gDR (Hbz$S)u{Τ&dIfhRwES )U 3 JZZ+7|3<}l6>Ol\S8>>aY/~nWrԧ>k׮nyngv5Ozr||¥Ki1y Պ??~64я~f2N;5' DeI7@vO̾iUi%SIFD 8bˌeT&BnL7U2eٳp&"Z](N@4s EORtC5T|PltA~sF7.hlZ4JaY4* Y< ř`ZAfلBD_˓va!iGo;:J&.}\ a#&^L3O@ Rk[Kղ  çTe8LtN"n6aSF`{rn,ٶζ%E3ÌP{?g<9d,p\?\eH3jQYuV^a`uH_1ò<>q|/?Na SKu4Qk$H5 줈\RȏWz%e 345ZDN\D~你=Q$/!+3F:18]xU%pJ SR''X#Ĩ}aM8Z&{0;^a* c6aQ~ w^CώrY0W6]"@Cj!F$gSVCeXS/"^qy(!LX/#,G &XYa0 R3|մ$O6H̭;*w}y<)OG>򔧰ZάC)j3uABNV/^#7|Ü-%.H*ZPU~z/䄿ۿ~6<5lJqnG0Sw5λ~cڧ:WWuOj;>ac["$@?K.A&WBD7 0ر;v;}pwuծ{s1xƷc츓޲i{rI}X}|=5ZJKZg[y ȨGr :,Pcuvɉ9DՌKGjL[[i\2W.yE5Qm=vEUP(erTh4dǬ">tUzˠ5bj-`O[/٦ϵ؀#uq46_H)*MWd]L)zDjoV<W_dOJE-~yj>΃>讘D\]\\N+.g +H2ǔ_̦rLW,ΊР')8/ST0a9䕈`Pi.%֢'zKy?]qv4?dו2#\i-{Zmщu SyԘqlFTՐMx7: F'L/<ڵ$]*]a.B(n,XU6lA5@auɵnat5bL42x|{g ~57×j8ʑ6X$?BMC<&uJ)(o*J6\ \:—'Ol%U/6f ZFgtLjgG-r#z > NgxoAxV.e|#1/~[>O߽6~+?^||g13^|E^}z]󙒛ok9'b90[5E]HC֫В{fE75V[Eӂ 8KdzNg^.Ȕ)YRvQEY#Cwllѽa8媋jqg^CLghmͳj."nB̿z+Ojp~u2d [.##=r˕gNXU"2ӓFLʻ$; Dluc6M6-c߇}}_ U7r}ߙU7u'/hB q5Ls|F Ϋ:l3h$19Fp>Ɯj>$qs,yCµfhh.,-|vużz/p4'l?/:#f\\ʟy_e~}_mIώ5 ~E!H"I)́TU |h:ZfKj0ԗ`hn@Ӎ~q> TUbsr ~"8CUr8O'moLrM3'7chLYwܦK6x 2g58qCvÚ5%PM^ȯu]i$/y f0{=Ȩ?H-/ؚxbV ӤLkRw'Ńgzgs{{7<}9:_y13]S|KCM^(Fɗe}>q_:.kg2 =w/Z3?}lo(lFKtQO[>`J.{I:1Y %ڴM0iXC{ݻlC׵h抋ׅPj@>(dS6rb31ev.^L]da \R0.2:FvOxy}Zn n +v6Ւc zn2hi]ܩucTkXSTmG3yOw6Zqc6x\[y9z=#{2J,}k X7r3  df:T1Y+rthc.n9fӈkr̃9 6(BV6pj_iT7v;D`}#`k@2ROתU`y}ȿW2 %>Q,CB%3XЌ#4URjB_Y!YH1{y #q &0fiZ8а,5҅Q %rcpp_!8#kg:qM`NS P,~U]Ij8Rme ku;H!UźA|wde3 ]+cOzk0/"M*SOsN|M;ocfw3;yWx?yxI˿£x뭷 |M{=0x7ɓ'G>L;~_C3JExzs}7;'8o7Ͼ]?pc-p. rX5$-&J^u1V$= n Vm֊KfacFƴ`fNM ږ*Y |Ux;*=#F/3['l1mhh{'wƦnt/l[Q3,e캘fE;L4Gןc~K\1ڑ7ݯضFoƾwRȨ;s5n4R``-#y/mbk/9RL|] q1=&Q NUXz6/kxL;`km]ӯy+oLڋqf;{4[t /O_g_x紑}jmb%MֻV|X!ƌzda+L' QM a(IdުK)4[3(%UTpM%bo]ʜ*iƵEՍTJ.l%v C0mE,Z7w Q,+HnvĜZUdճÚjT ٝ#O!*d<[^_O(yޖ~u5V'vjߛY1Ő4fV .`戵S}FR nR,;FڦS\1303q߁^o՝i׍o3pUnkZ;iS7;k}'V u"ekR.`(:n|ÓO!;y+ۀsE'F)N.mhmjPr1 RX;A{ | >[?|YfhCu흾uZm-&a*ǜԩUe>52/7ϓ99gV8ƒR3cMKjƪ Ok{7|kyv٠߼Cԯ'|c^mYȖ]=e8{_du߉SZ۵tۄO#ycJӪgoZ9fD.B'SR8؀&dJo@0~)8*BviCNTݱzcyX!FNzox]e2-eMKK|S]FcрUQpꔊ9-*^nGgW8齻A "S!"NCELe澽Ƕ<~bFYA<̝|w;|^zt|OVr7nnRjޅ5$9! M,X%Co2UR͌8lĦt~YQB,:5r]89GU섷vM E%k~.iu*Jy;SʅN=a{SY& dx]:4$۞FT }z̲VPMprV>O {L+U生))c D 3q;PWx ȲC{'c[yOܣWxov |k5^y^yzbbm,Y ^D3s6۱ZSOT̝R> V2F0r2Z y@AcfycR%Xy6"7FkA7z ߷}Om_?Ͽy-^wk{ïoSOnvXK_>Ѳ&DB*1mpqVVd}Z`tozAc 80n Qbpj>:Z*u#0P)a2n$meqC@QjT޳>v "^"5Z%&[{b`Mj| y5`Fw/PxVn 5L|p'ߙ/~<}~KԴ)\ 1V1[^PŎ~% N3@@ac@6c-+>گnM83bgDtR\D+/(WJ&s'NaDDUy[}8zBy5e"v&CÝR؄C/7\o5]7yp6yzpab얌I=<#≨sն6GXg ѣůX5u˼Mւy,VKm:TssK- M 熣a4~Ovk0ۈlr;1oUpG2Y+ɳ,w"3-Jp:i\mʃ~u[/iOOAA' 7)V=:զ0ZKɡlї9Zkؗb2bqS^Z鉑RUү-"f5O*Iv]nҡdro2#Ȑ:$bk,CVTcݔ G{WWtX2'4 QJc?rZq /gx7? 3>1~?{ӟ4礼U~G~ٿ_x 3Vx ~G~_y$7}+LUFIPݠRHz*Ҝ- \@ZE 0b0[}IU߬Ski9 IDATK=ip/¨CdkX3J{iqתʬiHipF z JFH!l6r:qty$~߸fc 9y mhԪ8Q,tNZmrv[|;e ~#^}g{O o}G}?{O~u^ye n6s?~IX0ZZGsI)#0ۥE֗NDb2b#YY_0s.x̡ttJZ@O4_x{EA}&w wnٹA\ nM0OWC.z1*$Gݢ(/. !5ΌJم"s|FJRkJ鬮7 |I VONuY4U 8`Q! u d2Q|Ţ/c X&ĚElaLI"Zf>1I,u URze ^`BTmWR+\064h-X!N˅-a ݮ?;LYlJj S[vZoflΏ?/wr;.ݑ|[3?tO.냇__S;S]ˊ3OS[7Ӆӝn> mSĤ9[sEO9gb[IkvV Q|)85PmMn[ʗaҙGEvUDT)]\SVz)M/ts1pkZ3|'O9it3xq:rإ.eg䉙K2$O|d m6ɏ?/4h<'y81vO̟3?|߇dگ74F#9CW YI)Di KH5fXn;Ub0PlXoy098.nkڸ͡Eo{Qw>.g 3XQd+k`zc. 9f9&Ydm twc=:[#Mn ̩CEx\( !Qk{!URGD3 D/֒dZE|;[jxnK BixW([s,U(^I`6qF*nnJ KA1ȋдJkDu1_ֺY)͸{^!SkFG. w*Io"Jg,DZ["M\Uo`9Q2ȩhѤv|Ik5i0p隺ۧ`(wyfζR *sgj-OZuQR&s'ȡL%n컌;6]뇶$F%*ޙibغEY ,,P[tS;\ߴ${;kMRd zzLezE5HtQ)hو/@ VyI݌W;xStZ+O*Lӭ&[e9΃ӧǏoX7}Fy`}4{wy'Nsx%^:-%_ko|憷oa2ׯԛ/y7y6Ӳccҿo'vИ1Iec m0sVЦ?4c3&lipcV 9XۤIӕx"Y9CJKC#k%k9s\o}[86c6ޮZsL E [l\ԯte*.lUbiXTs&WHkK!;JpaV')6=c#n`ȾLC ) lmnI.sUIRREi{ &fDOwauXꉲJ v."Z!M_d`OD ]"Q[E=.uWSYnh0YkE/jk{g E0aD7֪0W+x+iTwl:&+Ȏ,[2 31uY`ވh)>ثH3Dov$tp.'‹#5J%M6m;Y`a߇ 謱\emӀd=c(‹ux?bIQZ1PٺRc8'%lKcJ@b3OĜ2>_"81%%_ߜ~]1kgCL};oӧR4Nu'|k~/^7'"Ge4.QUjIl}Ju)T~xF)cC?XTS5RG nK. [R/,*݄&sp_Upaʤ Lݰ/]oLmXw&HQ=WyMyi.JRVӥW.ueWFd.54ex&(/_."7JWs5VK ,%͢ڕ,/Gb1 ;f4`]T*^pcU٤d}բ^ΚhǑY`]uIs:ćWi yxj܌š(c8d e*. Mr?rgkFKTҝ9'L`[]4sL܅j_OHe͘Ȁud߳5dA,;ֆ{S=6٬ bIؼuYKIjC6_MRubkO^;st1Ē 2MXfaVvŢ6> wr%ƣƽxŌ#ljO3_zo4\sj~}Ga1JIpCG7b?i~˿Id댜X6~^Ч8>R/̌KqPՊrɣ132h՞b(s8s2e|3e͊- @LҧKMj%}ꋭobXfl~9զȥ3w,GE`1[$-.Za><3 ezS X\}kwùJiPE**Ly1\\djSWǔEwgVoal +`znc%I2]^37%֙Vb4/2rn&/5pjƛԗ{yb$,ewy}2PXژ-6^[C\Jjcg3ӱ<4/???š&4z0F,Ҟ$3׀93X38TpjXmVdfsG No;XK]Yxhw x4q]#]IXc4Q]Ls+)5hdv|*gSŰ FT 0=Ig/4:|}^WƼzHG:ƙ|3v&jk5qkE0.!Z;0lJ)(EñR ʈVSqon@[ ,ٽ>fMQG^W<9'fy{Җ@Ta3+Lg`ɜbٔrǗav.65+E66Ζ1Bqc2Z6`ڂmSܿ'T--H ha֚k]2&ZK]RBd ̷qSU`s&e 0r{0qŎ2R^05,.MwB!\Z9eJ[N Vk)%aHm)>(bY5Xΰ9YpSlꍪvbk7W"2I;vj 8[cu*HH~ 8U9d2Z#>Ik͕A>BP uVz}jՖ\s'Z靵LXAL}ӳ8zV[euթ)_ F7cMCZly1)A.FkIxQk3הqz,,m Xރ0h4i(*13jItJL%sǢ)רGďB*n4f/Ine6^|jWudx=c̔cCulfsdeT[WfL7ZZEȩNr_6 f,D3j|+{e@]"23Z<ɗ,oÃǻӛ[l68mGC"_|~U=~c>+7 b߹<.yZ֒o +)e<.mR V#bsTA\9(:sDU f9Zb!OÛV0Ի1sUYcҚW oaݩSj6VˉBJ[tpLD_kwBUFn4)73h^1r1XׅϊuO쀫s!͉t7r&jjƄwҾzzrv ܯ*i]qٜ'tO cMfs$Siv Kqg hu^5Њ8W)&RRA(;k-hiq' L—=)ŀLj)YU(, "ء%ΥgKt,w6IV5%,mdʂs9;IF e9a')?*Z'yf7 vwld'#I95(ߝ*|Ӕ 3zMN7E~_ln䔑*OgSҭM1*Miw!_>mχ 髱g#r11$#[b+lx;d]OmEg\ e,7K3HWa 9S-sks6U-[?|ZS{}S 8&AnBƧ^Oq0h LjSFɜɬfŨ>16҂լx' "C*da f4~+_|'_}?=W*~ IJOFHM~t&C9usc(Z6O=S<1s6d~lI ٶ$fHjo^X zuaH)iU.R2;iNк8'V,Ug窕 =<mJ Xajq6d03iYK߃\5B7SccE~ک -bMg A\+ʒ IDATXZih0pPy-{e ^ԁtE/吷ѲqUo{Ud#nJ4Q#Se!ल5YSᒨ3ZUyq(Ԋk]L}Sv"Lav lhֱwV‹Z))FNN,6]ȈhH[c*ܭ[4Qd~dv_k|-м'?w?~JMFbvlxE%ͥ0l* oh< wVJ.3)I73n9ӗ`Ttbmsf,lux7vY8`K]~%S%^'gb̺GҬ\mC gbigkB$ͥ}&LBշtj`n׃F3ߺ~QY!%"f]BF] IZӏ47͑Z`*J,zfՍ2UQ6sTsx6Yc+sحbM'KEߗj_VZ)A3uaAU`$Vf3s馴LdwtkhmJx 4TQhxFw]Ծ;uZ}PI.qǑIf15:]1/J7'XCǡX8l-J;6GB/]>*yD'bspZۘäl#˝f< ]XeTg7`>鞠FHE\*g!ٴ 7Vv]ꂔ։tf>uCujI,f2E2 V`\k fZYI.e|<=iݹ;vvIpsv%f̊]%~1͓-ZI$tNpLSFkq b)H}9qbzR@BpkB P<ˡV֝޵\{ ,lpܹ5dzFךqhkN r YCF(+]wil$8Bid3ΥUlYc/{mZ}<~w]v]vY5DDDE_fZ1h&cJөvJ5FR[نhQgbNIJa!F~b"ȏv}8eo@ >}]u]q6iK@L ;0vDj ۤ[QݳlCFzEEL Qplvh0'BtUf 煋ؙr$ycYQd/^.(_y89Pf!ݲSqXy 1nX_5j:eL]B'qH9|XeW`|K;FZgk>}em6W7p?k_Z@fmr}><99p8]ww>W9YK.˗9Vsҥ˗/mqs…GVG^NMt|zknnIIijV]p6?ϊ{J+̦؂&{;[YU7Z Q_k)*co2i[%J6 pwz.8xG;p=9~q^R`bZMSmB;>i!H3mTVk*0c4l5[vrB+)(GN;Ks" KsûѺ6^LQ7#fqP`  (8ISuO~ Ɯi L892&sLYؓw"F$c$'=uf^&b{6Po hv\ܝ"] Wf mQj$28=^8 MgXP98x+M%yoN`͈`SKezgUhEUFS|,iӳqiMzfnmM$6^ņw!<]1zhy=DCuut׈J gT4_$[*+ٻy⥗Fhfi5^,&43eMO`\`dɉJ-בs8e%1sdn-ڂU@K/!v&?u]xsã}3O|ZY ={?җm尮_ կ;?r/5>zϽoo;W~S>_ŋ^"##O_Q#׎Iۈ:$6es=0 ۊb$PcX["po'$D'=zjjT$pu)q1?)NbХ$T0+dYPYTM27r*Q~A`zg .5B0lqKڕr[A 2m;ޤ+nmL٬2gqJ\Nf0]#Iv^PfS֑,!FQ^kwiH!qnJO3@bLe55tNɴA#zdvEY;ZmFI7b*Ni%lTضdWĦaU R:'+$0_v[+;&-F=iYSa3صTd$*WO({dJgNf 6aHEK{r@v 'Az#ИjS:ĕ EɩR7ZfCyY'vwYhT1N!Zӣc.hl:t3oZ'3 J:ڔ<]8Zl'+k5]O>*p4s/ gd9YƑ9 @,׬MpVYg!:#*BBl(-[l3R <5ـ^dn7bB+Za$vޒNXnsON\h;ns}.zWP sl˭&z)FN\&K6z|L[V Q=cQڨ Ϙ] `94`0+i{W\:s*!|T_Nvڶ촠FV~`3V]5KvH۬Aa8.g):k\ Aqb8e#FΠ0T84Lgk^H%d#D`fAˎmQVZc^ﵗJ,EaD6To1#%JE4fOy?$27i9P|ye#_Aс|&-V)1_}tvld.uYpN9h~%Llds<Խ+v^163vg2&Y>ՏW)InK,6y79a;p}tk*ٹm2G]]#^/֏+(nfnv̌WK^w/_&pO<'_,яwggg ~Gw]/|W}5_g?Yy}OBNɖ[K{߽ъlʾ9qB>!$tzv4s22ZpLvD{Q8EQS g9\4W_g} U } t.eddfXRûn̐˃Hbn1*pgʆh9󗶢Forw ZW^{nkw VI:1+,&i0Oev禝j*G!@hSB&sm2ܑcHPLJ$W:bjZ9+)iͥ:Z/pvӉcc ܌}_eeBO IaDCuOYu1ϻ9b.Դzq`{ɹ*SJREcVƱ0G[TGhLBؑI 9 7Ԯ`V(vJ{^zTqUN09$K+C}F!.g<[&'u/h\>OA0[InbL`;QZzRrHiLNZ.Se[%A%¨lKҚi7ړl!:JȽћ#sW`@@ͼC1 ~M`w)J=^|x_?>}EMiڵ9a G YyEZkXKd`XD]< 0D W7[в?Gi5:Őr̮VB>3Je6!69+H1lbM*|v/ skxWlgv(;;oD*KEoVc4Үř0+Elz͕Z QH`Nz>N0WJ3%j:˓1Ͱf,!dْ's12K3J䆻7sT 6J;b3y%%>T԰8UPYh!VzO2sҘUulEfAH4A GKF;JԝDᾱ(RuF´TU9ݛ@|{c<ϷM-/]_=_1;%9mlvһ(b(;+V*9gBe)KD[$D{uePWk1Fd.,Vy,`nTO˲=7Z[d*(͌fbE4PD\H6k KeUX#U:q[,]K1XT ")}cT`j.h1g.Sᜭ2f k@A6irl)+5j΋4|6Ӣ@J[sz7|Sg.ȟ(.1X.VoT<9;uʇ*zsZ Gu[h!4cچsՎjnXDO^胘o#G`{u]p&?w9ƕ+Wv;v;e9\x9'3cZY3`]Wea饋p8|Yv~/Mb1un|, ?=B"w7A7gۉiӊϲ!gBdC BUӂ;mcVʰZC\8^H疨_vp'R!XZj,rxuVFD?/vLhKbcl@`Jlsטs = nHmWHBN$cƜ oO]ˀMd6){Ҝ9 3J1> Bbm~Źw*IYN(Hgi+[0U QWW`9 K#mg.[U# +F ~D8Wt$xG 7-YZHl$^S&.Y]fuH݌JbF:gj"q؂֔h*;i4*iV]z(Znn]a:Fu6 OuEicVP ̏z;ӂ-mq,)=ߦl$cN$s4GρW`"!tļ"ЋdnƢ1rD2X6)M,𹧻|bۀ+F*6 _]s+@GM@U8rz^d>Gf\|\V'ʺo#rO&޶e]z=>~<' y,h]>BAxF!nlPZ,hm\;YB-܆ݮi.Gvkha,fA+騝8Efпs  e !/q̲> j4,ŗA۰Y m1˕0ZGKih2촦!&H_v>n,u ̠BU:9|iN6ҜI*ȻA ':+%X.@Ig#éCI],+{hknEt/m5 SNscyLhb#qJF: (:t=CuHbn> 8̘ aYE.^.^|OZ4^U5gǔj~Ww`F%8lIwDdveI;pXSE)@6Nl<ܢQ]׽Hj6P>MPҖ*{! NkUW9apg);YrsY"e /d9ѣ2TC5- aƴItq[k5j4a.b‚-lSBuyEI<~cU/c[yǿyoG=/gn `}쳶Z~_E<3s,hgo_? v_/o|X]t1rX cyykI;M٢Q`96hZlEY3-tlRıTw,~6RevWH_iĻ&S)t 2]㍚/Ѵӌmssj1dҴ w(L!ňizZyk-"6hZu63XieC %v s}.gaxaeqf;"wWvOj61spre=U \Vc?Ѩfԍ#؛ -'iHr5:'X$ƈ^oʞbk-!4JERȮYz-:nFHkHY[#FmS˝^MPh!r6Zibb)WYEVC%Wq{} *{ștĜe.S9†Stzt MydqEeӻH~Y@]KmM\/6[΍6~߼oC}׻|%_e IDAT_->Fnx9Y{-oz_ޗ|[fL?#כF^Uj.]w.Yɍ9;30#$lmM;\1+rw츏j͛`|Pg%=Ӵ{)+i4C4ـN0&Wʱw, D$H\5-mkn-'[YgEAXtbQQEUfeysU8+sY@o1,iK tւlx[arVpt(U<3u#Öx[o"0$jM_H7<EN9 gDs0OR$W)ጦ?GbFmkfRx#:s$O^A)4&L?"pD44_ * >次N;) tȳJp u~44&|y {NFRXFuĪKJU2qYYh#K%-\K`hJPWrQBgݒZup#Z A8egj45υ+gtHU.yi<` g7YQ<ƻQ;ӷJvzɩ\$6:ͩM;ωнt%CXxف]UQCv! Uk[ | ğ lGE9?W܄]|'OWoy>sKռ=cwmw|ܙnYo#>),9#x׻ɷoTxS>>p7|A-^:ĭQN,EM袧ɶ7Q[YSQI""͚JtsTLGŊq96EقlXK^dwDKZ4YV^9N->Nuu[ě>G๕G ψJ3)Al[vQڋDHi6qH SbYgai^46Cl)ϑe* gL`Mì~Ud8hps|(h͕lxA oF( |tHjH*zF0MEfYE|HC-6VҺ*2 tCo u_iY6#y殫O)@7ق]2Ii\6 bѺK5"41+d?$6js` =:@ȂEm9פeu-YLU uYCp;D\z%#Οae# 1,aq2k]xwh\#h+rzƜꈠUEo)Ȟ4ѭ4jZImpf+o 9,BZ|nOWlfb1Ϡ7z(T3qfx]!M\ 79f]M5X:E5+h7[nEy{Co2?QןñxMLHkf| Oxƒqvv .я~[nwt¨/ ۺ֦_Ǹf~ǣ:~%u;>Kt"jNmְ%⃤iV޲cv6 maD&A/s+a 45v]d$RXً\xnG˪1 ͗":kABd2R!|q39gMؕAQ5ƲwQt%,}F"Xs&[3BtvL\*јC5qCf0㸐u99^j}ZJo5d7PQ2uVf%[A۩AֱC b V邢iWCƘ0hC7s'Y5pLDY*"m3 ғG$ӢGAĻ-E杹#3fJ f ݦ˶:N\N#m MEZ5W>%Ft;o|ٟYFK+Vjg.4 z)sI/-܎7r!McȚh F#BmQ>RN-^T7,61[uּ%^q t_#l֥)nw ciнZ[+g5vf;BHV|G h BS#u|n~hlش{5g1I-#4*4*[h5zLru)KZ4S'$ 5K2:nɶ /ݥ`e*Z&ؠMX24Ȋ\L9_%;s:^cW^(ubMZ32~,5sT|o̼ ߴE te^x:r91k=^Da:M Z'"Y,/8cT*@TO# ͤ5=94$w|XTuXdaEY˥IO9[sXN[v< 3)>qwm qF˭f .rp.`,zԏt@1f4 .0g]^/_{;;yss{7Mc]B}} oG~Gjcfu]c ܝW9y3qM>çX_//׺|wgt9ݍ\ *pɔPLQ E1.dӒ%2nFK#}c[5e#b% kTsEd#ڼ%ݑ\L 5uSV=Y9 v1˞mNol++(‹#qbȪξʅ5, Z#%+,1,tL!bH+ptD@mxj)YENtrh%m2QYn^.-|AZvx6!sF TX:P`Nc]/Q/A6كPby 48َEU9ԩcObr k79f$e`/%M72aTrLD\.V&h)S^`?2Ð}CLf3J{%.oad@)wU gяeiňgM+;~7>D۪,w|v-6{nC:b6ZEcB;֛ =nVW@GA;<`ywoO?]wv~~;3+W\zիx ^YU_oxx͕+Wx^Ǔ$uc4UyBAs|׾O5 =t$M!e~ Ss儥k4rlKٖLY 5K.}1zr.mqrLޞ-/ΌG\Om-6KٮIv%B#[Hx p£1gfMȩF3ǛcMUk^YDi$³ٺ'HؙIl9gfɔp Kc9Rz${(,a3h{4O/ xjnyF%0%nkA g= 5]G"XZ8 W &b#bdCu 0Yк16-n^>M]"eH"P$`l:Y,tW7# ٣+i/r(VbPb(LQT:ZUؘ60vAv^fz r)54͔˩uʁHhtEW.-d0-ҍ=]!v+(mԾV<$h~ʱ蘍.NrN9Ut 1wOzv6_n^0DOΧIwYZh3V: g*=SN5Eդ39EFl!uD_|??ȝwM7Df'=ٟ囿;1lGXYq'|xK__r^WtS~'~W~׿y睼5s~,>)?t=jפɅf;S鴜Ő%ZHg+ } *٤Cj.kU0Âo90[pV(dIt;aΠwZ\\ OqRqZdX#Z ̨o:^Vr/&.ѬŎ>QE *=GYaKKÞfI(gj*oY4~Ԟ8)WEuҭֵ37llߛvhK&2;sRVL pҷslEZ&+9Ͱ 1N"Z,D#W|Imd vBgX$5uJ<G= 43YV)#tDfFBbIEԭF9['LDh\:v.]$s2k7ż_*m&4dN3q0)`rl|.< n15m )wm\LJ2a|r<dL[g u8l7A#rOUX})[INԥ 9IFtFQOe;͜Q#p(9G".g&B#Lh*vLEr: W,{nj^c qg?oYqY{sNܟ3K.}Z; .:_gsms^cIn[nWq\Jy\.[OD F[Y: vC?$ٜ$-6iO'LV"sOsK`15:q_#,ʌȒ*K^( 1X!H֠u`F_(ȋYsü42EEFkVaʳ#) ^ݔ;0m6SaJc7)VhT>YEw͒x*Tw^.M\[F)]昄Kh8ظU1KS >4w?yuL-yZum/} Lݽc7z [Ci1/jƻAڥ/6JD}_zʭ7^cX"//zlHV"^{klʾ9&V(laPc8{L<8jY#0#Vl1|#٦W6~"mJxDsGΔ8^ ',}aTWȔTYܒBF&l)8_WIF Cmumv1,e#Ua" reTu5ZPHh l)%w iSn.w jj|a2M.s;NY@TN~Hh(A-至cs´=K&蝖~qfi`Tgc ":hr<9Ɯ)*HF8H ֱHYێ-5seD3ś]!W80man4)lQ#H94-kb䴦l(r+>aޫșDN4HqXt*ēj:Sj j*ՂYو/"EǬ=d̦ |TVeMMJEB#V:u#Ԧ/-*D',ѥEZv5Ӱ6d.rNɞtl!5]Ƿ=im- F~c]-~/<>kӵ8V3EO*7t3}s| բLاfT@+۫SAx<;5VW܂g3WØk(IS,; Ȏ5%~HU19h8cMX7h*,DN fj$YQ&Tf2.j+9e*tOd?N> 0F@8 fYW˗Ԯxs7̜qCfZp%&͍ cb͘*>2U0Ѱ1+)ԥczgnƤ`Sc+|NtEpԂ73~@,xP~VsZM?0p2Jk1J܎(r+Pօ\۶E鑨 s(eeAoNkug Ua+vNFn̜UYus蕫4E=jL*hriOQSE&wc6cIq?vH.t&YnSfjo^q?Ԑ0UKi5Ql9qM\H62NK<.Q $ɤi\aɲ wox]Z)IdY p^GqA$/JY4fK㆛n~pzvçA[_p;O}, b-sKw.?Oѩ1>zN3BЯf]t rS_0:3g:o3j7c3_aF)ZfnF[yaEۈrǰ˕Y[xÎg6U-ea')VF1ׂNsnXM 0NFLfic6un;sҦ\<\nڠ/BR[N&k'v\^rHlȖ gU. W𾒹qQ]Y;/G-X] V #\)H4&wGt"T7BFn-GZU7lc'r Z \1s\/.ј:0^#:8 2`,BsIU} qԪlin׊<k*;j2Lw cM5zrؔ雊Ob-HĴ* 0Y:CܢIWIwYG|҉98Nz/ZZM඗9b=ʰ3ElrZDIΐkd0hN̓  K:b,<քmEmLh4f7l _,Ay %}^N-i,)̺Hdkvxc>cЀ3 ώ"trܩJ^k֫_f?x IDATO|MXC| {Ny}7~-'|ϟ\wQO5fIHy{<?ݼCt= [|lr?叼|c!w{ȣHKU`˕=9mϸ~֏pȎS>xnu)'+WN{5399=;K5|$TTzt$Cߋ) y߱sL>kӰO8=r=ȕcr5n(a^<o=~3 ~Gykx7rzmuqM>C*(Svc:Vkw^o;a7>p{V>m[o㣧.BU5C^(1㪿W3c^|]↛oo]>Wև/sFi.9 {\kqUE*#G^_pKkC]s_>=/z_{/zGta`X&5'zH^_5G>G(sx<{~ obwgKɥ{kAj.~+g=CozC>2կ#iݯuG#G^yU얫Ϧ2/>oOy'ncl<ځa=Vio~yMrM7+!w6g]Oᆋʽ])ҵ)6>ezf|Gx[>RJrڭjݙn^~nmԮ0T4y\ҁmxBbqWYfEbXFX?Vy>iG eS^1&j% c4ʫʫ`s<ޔBds59* lj*peYhpρ'@S%)ά$]kdS{$pqZ3+ ǡ'bjOxg﹙ Q֩Ip]e4^}KqS3so蝄L0 S7 CCĘR;q \HN_N{rUxkZ*gegbX,!?n_ _81000{ Ȥe D-0qCC>FsA0©G3yLT'+UVX,eaW^F}}ø_kPUwt@kjVfhwg~uos7u JvJU)sn(<ϊb0Bp'Of괩Uz|nV␟Xp>}}x^7(@{[ /$#\cEy)9s ~b^ں򎗰bX&t-Z8S^'"y󨮩gwj<,vډG !Xhxؠdpl̙TVV]NØ)455JJhEbL0 444P1ʪ**^stzuI'3iZQcX,ak&ҳN*kmX,嵀5bXX,bbX,ŊbX,+j,bXQcX,bEbX,5bX,#a3 [,k c 55,legu]d\!zj,5F,g!~OG#Brc0-멱X, 1}tS"#`ҥq!J~6e>8ׯNd2I.Ck=XQcX,ÄS~}6&0ছnX,@&gu]]3dRK 7|SNj9Oeʕf}9_s˗3sLHvi8IR@-=ScX,QZZZxϻMTUWQ__8|oɕ{VwJ)>oOL&vbEbX^fΜ7P>Id2%/Pr9tcXQcX,W}K/B>~9_~D"Nee%{9MwI&BXQcX,C_:6mDBuy^/2sLV?$G}4 /qKqYfq-EP-=;4xi}ivjX,)RJuT!Xأ P*D{A (ymf8c欱*D00dUMy?яbX^{U\UgA&'28Kee%QŊbhm+۶urX ge'O)k52 |[73mtؤzc t^|SkVX,˄04;:9$ \ŔZbhR9MlIOቲ`X,Vt0D)e b`);zj,ek¦|/l;qaq4vA<ъȱ41bX&ٯc!mLBJA6Ö-[cڴiB3<1˖Em˺|8[QcX,\֌ŽoH&Vbm L|qOҌu X"X, -i `;6_B6%TQ̌1>],YN:Ƒ2lzl$\\6[QcX,Z+h-+cMFMm->,۶m% 5 Z8ut $DöǮX,h]~TJJ&9⤒}qB`!JPWW6GJyj,rf(qA"t8V8iEbXrdDibX&rmScX,f rXQ!Sc=52Aqc~[)DxXObLāB:L2/Ȭ9sq-n )McVX,D/!1k-++*y_g#sw',eҸSr ***9 ˬ9sB i4yخ M*8?aܹQIΟ_Rf*6nu=Vzj5 1Ye^]玲G} H,#r=Dss}sFyvɛ/n(-mx9sf_Xp7P5dbX֚~YfQ]]M[[d vI]]x|eRlSUՄiI$eyǩ::5# C>O$QUnem!֭c޼ymc UՃF:@{l޼ɓ'y/GeR!"}8֠ []2QWmZԑ)5RJ)5-̃ ŐҺB!C wD~|Cf׮]2: }r]w1ydn64]wsSL9P>fuV>ϳlٲqJ 9tAu.&ik([׵䦛n3N=RJ>OqrWw|+}ٜy<̟? 砕qc1 r[dGcL&q\tCgy=ܹ_Wp 8A1Ҁ%g/g֭b}۞r[ Z> D4.Z:<-8{V]w9âEPJRu;::Kя~y7@kO?pe=PAt9?!D5Jw]X,6:1JKGtP1vy,X͛7*R)@CCàY񡬫|[}Aǘ,!}֬y]mmtؽeZN8D*Z0laʕq<#U]]] o881GJ;6mګ38CaڌyFmU#ѺXy#ymcӦ]RҡO>X,6gAr\Ac(?UL;3믿6>p 7|.f)%~;_~9>K+nπ# :̳K/cWA:&Π'|qxj5d+od֬Yé/? ZSSSQq(zKm7M7Dgg'?y>J?m!& O=55hcwi#0:I)dO{{;W$1Oykr 'o\.>6orHpu˒%Ko˵^˛f9>OyOH p=t6>0MO=/rAa۷ogժ'8ԓI${jlw׿5vqDxu }ݜuYh[Bywq\s w뮻8sx0RP"u],7ؾ?~4ǯXAKs3 ç$d2,qoGMt:=n^%!ʀ+Ƒ~T/gr#,#yܘEMqYiF姑ROWdud)aƌ<׿sD-?cx56lror=5QC1E߰+}vq\*~yܿ!D~s aE`HNEZONO>f*e XJ&|Cw}tWɏ~ 'HˤI:[6w_H ]ŕW_K5GJ_ƦfBeF| k$.xFB 93RʕO/~6O~YK]m 5UtwwA@]]TBZZZ݃wo| qR.Ar=EşҲM</Mr98뺥eXu=#͖S(U! ˍ⩉I?KdONSS\_|\.WCfijnc% CzzzkuוZ~={/1eg}Wx/@OX^5_Wq]wTw$RDWJ}//JUH2$"$1mQtG{9h:=/+>OG~^)*` IDAT5L}Z/^Lww77r+mm\v% o!'>IcC֭G?/Tr?)l 0rM\+iow;:xWםƷ^zE ۿF2f̊k)0ԓiӦQ[[8üyXnZk̐} Z[f t?7n罁̞3q&r{~3o\t?B RJL&DGe$+**YqF?O>cP!׿j-ݱXt:MsssY3H5*  1A z[,к|{־F!$J10p_AЊbR>dR ' 6^`QSS͔)S⋹;زy ?3H)̛F_;ٹc'~{Yv-\}5_Zy*gx׻'? 8^q\yS) OH<5t<#\ BAV/<^G[ xe6_:%DE>_KތцkkܳϦ??9_6/^DUU zRp)p9gMH)ye+,[v {{Z0a!1F GSJyR;w׷Wt1xrG<z{{ :lذo|.f L/K"CQ>kKxߕG? yy׻>9?0,9oN!4;,c` U9WA>_JW\zf2,YuS# 2w|; G0 GM*D"_<̔h+&hH ;/wt =Г ,A1xw,1=~ RĎh^r;rУ\Wko`F10g\z{r#E/%K쬱š,fϞ-'<*wѧs+WT?*U1zr! d]9 s=`wo#ٶN-i +ctY\ޕvy[Q0J)Ynt6NZW>`?/+ԧITUU>H$b1D"!BF:{Gۨ!`Y"(,:N7ҳ !PZ !l*@l߾ӧEoo%eS# (7s5pieK2@i͆ 8餓HRTVV:m۶kWW7<l۾u^ٶKsNv_@&Ĺݽ=„#=S3/`f2oƦA:KODr+yT?hi@BҺy$Ew`Ŋy%cg"@YLYËrqK8yRrg~۾z+a$`BpQGGa/a̙lݺux6),nӧb&MDSS?|)P6۲(򖷒fiZkzvF~Abpu&X,n#ud&IR$Q]l-8xbJz{Wq1/cE̘1c‘HBL~+7,?U&elنъMcٰ::u:7ўD_zm^hŴS$C6G4B?c4f4y.ˎYSk9gg`cHRO^]>-~u_Xp )7ٝ1DM7kg͔Il^P䏫Ƙd^~J%lٴv --lrvuh;cfjO <ϋyL¦H&c8q ^q_ʍٳwҵ38̛;Eqw'>q-\-7~G?駟6N:+߇6g6u*^xt\ϣYfy%xQGMv~_7bRB! .1wٸq#i|'<$Z):;;s֭ j^w.ܠ͞=N~娫޾Hoꫯ3Dk9S⋹ꪫKXh/fڴH)Ưp:hppv?{iKR;3xq>--4LW_}ۨpe_t#Z==.}VyzVH =qRyKpmm-)N;p)8S93Kx5---۠0c Wk)y<}ΝÂKg3{,^o m}hÃ#~n:1$F*{-nq|vއZ8Y'XpLf95 棸 lU7>tĦfz(GIdbuʸ {rU}e=z"{2GƝ/pОr)?~\?u8W (݁Hsc 1{0CcƘA;M[[w%J S#Jܻ L䵸"P{4=/. X B.}1wn40h[ 4?|5$AM+%H %u~~'9w\Ǟ X+c%+Zm3|ޟ1K#X:I( 5qLyxӍ>cE-z qrgqyHRc;i# /X$}eˎA)5r:\.1SVt蔤BXOl{L>œ=*ZY_y+ƻ}W_Y7/f^+(=gsY6-bNӂqg.& |#BhiuD)dbLeŊA8<5Tg ΨsX,_o4i+l~yAi !o:P< }2~k_{`/{$LX,xtd^Vjp ʶ`W3|W͞0JxKcE͞2S'Diw"Om] Da[ɸ;aH|00@q0:mwwc9-ޑUU,ZdOݔ)tv~TUVp=Mv/LX84462}eK$:::Y1TyTVTh+V|U~"{hkgժѡ>%%|qk19qz6mXC X ܿfg81a&}v+j,e%Xt)ltBJI,'LiǒKf2Hg3`A6Nzfׁ,u./>,,\e…hmCzPDŽCUu5K;>1z^-9zjAMx" [LŎ$5VXa:KeUի{y\w# Gq8Oq < 0gP_[ʩxI% T z8TMcEe:Wk8\}83a@u䵟vRZ-cG֞bX,VX,byM0h8.GlbLzm!X&(XD_xq8:yàm@*H)wQ ~Tj;F39z>(6(b3Dbkr5.x`9}6¡*G30g[ۈAe<\;`֬):?$ƀ#CqqEp%H0`$#i0R F$#!DK^FkB B P+!E9yʉ!y4A C6@RP0$E5iFQcAP0J`T4x@!Kh H\ A(Z'J'dU%]vV!EATik*i7a\ uli]hdQ q  •BhBD))u:B )LaPoWntM)pJAH#SR5(m(424xZ@)\)%B! OK(EB@_W:ZD_(p*e"Xĉx8`HC814H:&DOH r-:GiQcrv@xJ00<q1R#%•җAPd 0R(1>„(B @*I@(!W!*Q&$D}*Ѣ0t$h,R:%@ $Ʉk@QH#񤌦F!B-px_,Z1K Wx$tt8EKѱZaxh(#$GK8Z9 H\B#%9A{H9t!M!4 0FOhC|‚SP˜rPF0oB8Aǃ$ cdAH$RH$4HG pAY&# 2pƉx`$8 TDJD4.hL H<Z;DN`BMF'* FkVKt gbuͪzc}ҊzNcĐVGH'bOϋn"}a"~-IG4QDb-&xzg1F_V.Ug1_"px2b8p|89Nr֥.'x=D:Um l'.э&'0pib~0;IC 12R\`KqEפt$!qwVYqzS:6W$7Bn ru%f:#ZPD0HvQ$͕Qu =L@堋3eTWb!jJ$:4RFX-p>t*P/Dp@H nH(g@H$qa9NrԥU!hL121}1LMN^(E*pBND[{vUA0톔U8Φ84Agb 3;$ ;$q" q&z)1 KVsBJ]uHF5 PmҞݛ6W7ԇl]Jn Spf2j+^ׇݝ!!g#%ə4vRc>\]LEBa֕/1D ]x<|p̓Oh*<: K׺@Q$@% EрIPeZe@ʨ'4g:0"wH'HId'3N0],-dl!V\)Qhp3^]DQ?:!wXKs)Gh)L7ζ/W.u >Tze&ҽNx0DLA "zzˎ{%ε^4WF&&#OD;8d*Cp ($+k& сkڥf 78q{]27Wk&E]D617 85*g^:Ohh?lH^JnH~=} Dj2 z` 3 &ٱvA} kъy{#-LK2&7l~;䙑 q%e0À `!-82QsS$sxB7O=m ?Q1]^_/6V}9N<,!6=,wL 8,4DDQ2q taA;΁g,HL*3)'Bp4voh4d#aΤrrڹ3N1h!bEX8gG{qV >8j4q^LB"04# oDc><2qjL/(Ext*;>)h, pB$SL&SRrt>Şxr yMЫ) By}2VBn$oN&4T >/g ?/CL"x7`d4&P*@=L16,!٬q`C:i8 "w2c J IzGf W,.4Lf:%-* &%ϱ#` Xݍ1t3*!8 3hLBK.Du!]kh(NRхȅt#ہ-]ˤK3O_il<-SMP8ķӓBKp7] UIN!:>2U $KK3)T aSp72O@0Wu|1H2N#K!%'-I@jVoRl㷇zQ/D0xdg&?c?vg,ci$Hi$:L Nnp陎hQdA3 Qvx:-&Hi,6N:x@HH"bֻ c.0#/K4Ha=zi\ɼxY7,*;ޡA,lw+|_|#6[wu&%q2 NDwF2ܸ q-qg౱KAwS=;Ӯѵr H#D H s0!s?pz3@G67" δYżk[X띰*v[ 'k  z/>x̓x׻tz@(w#DhI]~Br0@3[K|,Yw.G;DNBƗ(mn'Z52ɬ ;N=s=&'̋hd:::y.s5m 86B' K -.%V$Ne˂f-t@ڙ#a g7sVt xAoh\hH # [m.G8%0e4 v%'嚜&FLCwҩS'F8 4g3{ s1JרO·rr0uBԱlJ:!]BRG9L)yG anYnۯ-|w~'/| d,k:Áe͂Lΐ0$!%N!]'0Yt@Ds! )&CWRUV'>sO4h=:44 J,KOQקËz}<8,[|>?V)J)E:e,ۥHC]7%(l!W'C6k# &-UԈ/TٝoK-1Dv? .DɑgYe8-Wϫ"ZnHnw46'7OZlZ|74s"4U廾ٟY //yu.(K@eV{Qj(Dud։(ԃN$!r2(hebܮm|I<:)ɜң\$] (nPdR6$;'iG(gN0Lݫ|׷s=>>0l4ݔ.t_皕+f@'*A1nÃq'gHXH5K΅(d+8P&e9E! ^,h]&Rz4-ac5qb&(siqbxdH8|wxU4G>G\ V)+At?o5Rʢ3ܰg+SBPC KNB-\aC3"cM0DD!Ғ (]( ô lɨfBȅ2;9Ç}~۷}ɇ>!~ 'UF >`%]n`G3&isf#Se6zJsCT֝^4QW,Md`Je1UyR907G1aj+;K;\dGmm]%qσ#1oɎ莨bH3^E<|}yk7//}dw^lqHN׭t!I-]M+WN0I1" ܞnjsT'JLlzNv=!RCT|D2 YsM$:3nHhz! b?gz~֠ Ləɡse\T5 uaHR7ZL\sij(Ze3: JM xdfq7կ~5?#?>}>(ؙ! 2LKXBB6z ¹-F< NjeQJDʈU80EX( ^,='$HHc2|Hs "E\Ub4xdc;>1_5_W|W?ü~VeBWם–rz(-Q$}kQ,4N!dB5hJd\* B!qŽscF^и H6f*tNe/p YT͐)l*ЄFpXn939VdrSzJ{7oxx_QgG̎C*F;%^ +2Ipe?^D!NF,iԞk.C]&'}"jOSgug,LҔZigpG%\=~U]3&?ѽMo}{u*}l4s,Ktk\JOLzW422Jdӵ!:鹨,z7pS Ǭ}4Ss hH!=2olo;M4U$.xڂ{BbYSQQd0q27\0.H*5 y+^r}Y$E<n4:Bēe9i"\ vs%DJYH_Q38S9UCk=*c%Nf~/ڟ[U?^GJdVcL7k aJ-AVR)bOpuV5KlID)N,+:Ծ8Pn} )V$Zf/Ţ0B*1AhH$_YH(*pg{@($c%G;S1YqNdQaWKSz(%RUzJb^eCc] FN8.6)G5sٷ#K90c92(% Ny~K]BwwΘYg-x RHȆP ]>3R;&T>%?z^Pӫoq_܌b _2\EY]NFg5,]msv}%'(ˡ`955fPlJ\튘GrX~'eCn*p-;}0U\gFܺ:;M'6i|^&v~O_A??^:^=㾭5s,ŹEDtͧLbq!*AdqFs0dc1j@DWLc ߕatߞ|+y}aFJM@CR!|#0zs0[ޥw`^k(OKJ5Zn Xv: CXV 9%OyU)Q*-H "*XӪI Q:Ό$'d ˹7O;;oUzO>$g YlGTytQf ZTfQ#3ق%6F:yL.+;ژ4q U4`jٓk4{yTDRDI1Wc!yYя-&nNS PV#:ltI-Cc"4ϘEӣyU_UU[[x_l θyx̵si,! Td8 jQDDH]T44}e (f! i^4d2H?t\27;KǚԺȧO}*^kVf[E+"ЕZUTaQgvll?E/z??K_R>O׽??x&_*?O8gՕʢ]J[AXi0Djd-(aZi)Xif5SJ ,J(d!(^|Qtd4$=GQw:ʅZԑRf|w-ų͝}cTro}+?ww둭l>j]ly+jFƶB2wl1胘I=P.}b˵ }Shgb%:wv5A{B7Ck EȊ/ /TQe0g"4lOekrt6Лr2Y>Zf&h\^{Decbi}۪=B.wFگ~>kҐkU\-eFXp3 &9rh,%RXf&5C*J\r@{ևEC 0[V(n(+!kVyB:72h8TWq086++';#&cNNrw]|S~꧸w?3?,(~셀,7b&)Uȸ0 E3J*tQZtF3Pa{ZZI asinSA֌ Ig+]ܰ#?GX ]J'+pJE>&=K3#jVX$0~m׾|73oxG1u- Ӻ3a2ʏݬBfVJ!}TK^n)DDٖx[zNAe(ʑ\jU5{*E1%Aj\i_9ylGG΁km +>ttMt4`#S8c(ܔu KO} tB8R\ݡS.y{>3[nR` 缵IߥMϭ5z!ڲ:3ҷͪvd=|9o4ˆA,Ҫ|S񾂳E(ӓir:}CĞkXFuֱXw¤Rjz)'IJ n@+їCk\H2ز6Ϋ KTRw" h(axkȍ.&1~*0KTo:Qm%V?D8qߣYFp]!zO~S{Zmd׼g n'49J_1"Ad'i)J0.)-mѵn^c^?if^/G?c\emp\ a碙oөe?۳muk1\ks9%YeX$ERT*$BUx*O=A򖧼$U) T C 6]}𵹎RI^k5F}Oƭӻn{ { b+΢ljG;a7qn2^0fIG "4р[q.2 `z;E<aP.@ dt?7Im6ֈv2^y#5y|h2x]l96Cl[:9q`ucXhi݌i.@O=YWrg!Zyzrbbpg$oeDhjߛFPOofs )x;bd! t{`6rޤCseQ))צe\oaHVQXhbPj\keAZ{E=yS{DӥohLZ (z*-dd/>#u<1Z[EMp4b=lŪ1] tFaʹʲ'lӹLbINSE\A@K%ΐnc_8ZZdZ%܄m[`a-pCNNסFQ~0$Zmccqt#1DӒS*GI՘{X;Ю$3SΑw5qZ`.e6pl}gl;y ˥q`d\D+34-xۊ !O\Aب9HAWwP!i͢o#M/8k*gE~Q{W[2|X/LH+TSՋ3 .xLXnS{΃Gl 7c;jT$'ZfJlo3Hi'66z*էUt6cJ3]IÀ8댲A i{i`_I6ǑOM='fwv%9VX'Ckx P]0\FMNc{VEciwhtqȸ;0mٮ#.z93Z6\d7AV9X[DrHH` J2,x,<44hzV ^ާxVaIϗw$( %Y@LN~{Ȥ5Y%w~G).!}R{)cQ~_hkU)42:u&$3b:n=MwQY>37T!gtŠI:Ntʉj1N3m4>|Ak"1{V 9:(Q{*y܋m)$!7h$FW,Fp,M+ [m,EXJ]r#)CTZN.1f%Omɾ^l17m_D V6;}hZ٪XR:8c}q0ѻB ΌfO(k KVhA> 攕eE*r2L+Iqk7rZ㹱Tq&;kV~eY(̥ry̬{îB[PWg+qUT\ǫ+];X̢6xfvp)Q|&[e* 1\xkkeh hwSCOv'xg:Fj6sh:J-MG+Pb 99 )LREپF0񝷿Q,IS̅WF){ZrKn`L%7Uϥ'IEgl&晀h hOV.dH`]j2YdcԴyMUo4z[ mXX̛vA,S]bJs£&Wy#[飵TЧtY4OYC(@ٴ#rRF@RWtDI`VW9*{:j5 ",]i8W5f"wZq_EleI4Z*XnV)7OX*G;7i<^u (]U*m"y%󑱤]J|= %d>LRcllxTRCxyxG84;C,bcġB+s;3řb"FMTw c@|'LcZ !AGp`HߕD]tOQvC!mVvOEkfٲcm`2,"=Ԝ68%gwE^n(dCuZizF dť5wG#ޘۡùS@M*M dy"qH7W3cAKǔIU!)8*)'RK` F̊$OgYMW[ޡO.m1YѰEl2rޯ L@B6KAEUڎ[ޓZAm̔uQbV>1t;9 )~е.l򹄎0c,S$b+֞U܂^QSCwY] :׾-1:j] bu thr3ޙ\r6 I3@+{mU4*Rԛ`&FƆaR v=qWq=L- MՊu.=wTijCNcҚ(l} IDAT^:a!vUc-i$L kLZ;hRC #0W]6n3hS$!I꿱"{%#kU( "V]E* 'u ]MITOȺHV-$'A+xYן7˷)Sy*"3/If)Eɮ,= u KGt(rxy%.@NW=E}Dfb6C}ꗺ.$"s[x*/gAӸ,PRsK^y>۲0?O#ywsx>$.xOC87 Q!V/8H5|fK2Y)bf|%>4zΟ,]|e;3LJiB6d99PG:ٕ!TZ[8"hņ3NU@A)i\A_ ;G˺0N NZ&&>M"=g$p5zհ4Cn\lyeΊAb#f b,;wXH@,< MA.#U@Ϛ j c!%鮢d)V83c$iVB npLiQx$dű Nw3lٗܳ]G&4Zr*lպMV +\\*zᲵ[bˣܷP|\ӧgz8#{jh8-sY{ɞ&~R5=ؕ8rZiy-8FNI6~+9qR!Z,Z!i&:jsver|)|FlKAmi Sr}9[6[H}MMvC RÒ^M ŸjB$%o\s}=KíӲ1jD|7!CUhϳV-׊hEwbi⛀H;lVg۷ S0OS(B)u*|J6. +]1Sgu9U(< gYz,n$/+cȼQ] [UK+X'$ny*E9? TT]̧7rZ;+FQEP%c{~@Y+n\e\'&M򨑵򽉠ju1Awi}  Lظ#Q{gf!j>Y.ZgE̓tдr\ 󏽡uwMiW 38lܐ s#c1ih}l0԰mkJ)щ%"ͳvpewi;`3,+7M-;NsRfIW87(fEvtWyS޻kvli=6 h:7eX7< bdOC/gVe[0"F/IWlG-Zs5"#Y+v`Z~9j`Qޘn~[dL%PB`2mI' ,X('L%>$I$\Jb/6uA*T ze+Wf4XB}IItjyF(zYdkU" 4#Nn)x*y6h3Bgzm <6)큈EB pKgZqE{l.MlA+:ĉF_Tx`Gq>iWƄȃQz$iMiQ<6V5j]HCa\`}p\CI5;d > /h~Hi`Gě!Xӎރ *ʁQetFcThM&GH°TQaiw6Qo +JsGn;m&evrQYN4Y{ ǕEc"Hcc6ָv[ ;rz_\LY4f3t[l4U T|ɡ8ZEIJD9J+@k>"xOzJ3.}Dbm^V-Cju.!.7i"i\&CHJ^mHTZ[X ~뤏Twu7I3 x6iJwJ7d1Ⱦ0tNEHp4aq΂+ &'dl'Ƚayec;f!<V=&{MֳH7rtr[%ݧqmW읽!89J&]m%' gF^~ v0IV`4El]k0N=mDH+VZL0GV?„xYB &:,M0?_k4`@NQSCY&ZJ#%*k)P/V?;ibQ) [Wa7:wfk9# n {+G9aÇ/^2,Tq8X ᙟt*6+UF-(1DKDf k C3DD$үvd+WnUm#GSV,xʨ 9ιCĒ (uIQ*HVVp~bZ靶x^!;xZyo/hd ~F%;J|(~'DiwښFbJMKD%i̓lgC [*2|MLĺ65Qiy9c|4SHuI.8f=9DkѢlKD3{TQ)g'}MwXd"OV%5ٴ-0#2rg0|vu6xPwpK ]ư %-a.,@oFes'\Y,^Se=~)Md0K_eG4٦P̋Vk:U4"t?2U!#'8l+ve+;黶qZ\.{!dlV+z/IYMhFDFv!mC/O9l1i۶=Y1+#4:vi*3}*>$:h&zƝ7&kz :ڒ~ 6ѵ#Q~ؚ1Ndۏ)rS'Bv%ib>tqU:um8Z~p̼Ҭߨy8J=;ݥb7j$-g1;"3Adhʏ@y7&e>tR#/WAr~AE,WL"j;e{x'Ҥ/IJQn0/jo6%N-t-zrp> ff1"F!,⳻]Cd A@{{}_)e;ffV⋡JU/Yd\NkOG)zڿ#vI5 ;oikkO %{.5Mfi3ԝ tcU-s=qM bSiuάB)3C0IE3l)SX,B&פ*p^}I.SUF>,t[єrWp;FM"?lK;0^\岱ٌE4uR#f DRUdԢ)\'sSx_d4Ve,S'Ҥ͖݆+s5s TD])+?lؾP[Ktɔ hkβjCp:/dZQĨ5=K -;cc0cv3MKg'xɶ`[h}imq+N\WEZa5aڤh^EWr{5zrX:7sNG'6& Ͻz?M>bjOQƎd扨9qVSVƖR ⦊NjVZdTsmOz58\S|HrhݡPFݟg>g~x97ࡳ>!\ŕ0zO'OlJ8}h-r7/Vt%mjZf':o<$s#<6~4T:2+*d6߂E3H<݃ :(,wy_XB܆)b#k/}/OqJ} +30.`SČ?#ƟCo$y5hw,a7ԀaШlpX# h/mZ(l #B *gmY2(&PbUXSK^jr*۽{MAW RrO/>BcK̸ͤŕx* Bݜ?g|ESLJwH?]@U49;G;ؒ/ݯ`sdp jz9kebs`E pZo%9? hb o _M@%+~~~&*+5wpUg\Z;gğWr\֦to`pI&/9"RP#aq'7^ /nԴH~#;RiﮉڒF-`+_k94hY"fUbY++B8vĤ3w|g~/}gX΁Nv!Ҥ+ 9ؕi?{;ꊷQfY=R-DV}c_˜;}j\b %SSxF9g7QSFϣKڴ LJ;w,Q1y&AhES?-xvVj6M.+w( V2C3S?~K_洟E-x$慜?:8,[M#:8cuqUzuf/F9 ے,kjV[$uby$]':F^z"J:Od^+8]TdwXQ~e϶'Vb0%O7ѴFRˤp%ZS >?k'ZEMLfh~[ ]tsp,b]Y/f}.+Ve,1 +عKoBY}Uv;!]y^1:PPubȕ&|zO}ijݕZ; &bfZse+|61i[ŽډczO֧/'.ȝUΦ!Pag- >q}>xW{9B~d NɊN51u-s"vJ( Bk; , M!R&@5FQ_<ݱIGo+FVv 7riJ[.NJZً+w]O}K di5\pI[ɞIβ4ȼ3srSK#[h~ٽ=UDF&6 ݈])AE| 9+kQ ?zh 1S:S͒[ IDAToW<6h\ Nv/2<\GU;Y .+& :c?|N4Y "7-=H^ |^\#//ˇm<*xŅUrѲt+[5~TrcD׼Ii 7WGIWeJahtRqcl֠ h[Yǵx:m8\ x/4̏~Y`IzmuKlHp 3.>W^~ >^2*LUte*oxH7]2MvB&G<+B~&nJ۸<6W )*S֔iMD;#+"x?gC?91]+'Q\0wWmX!;tt8s=hSm]l@BV4Aq2'?񆊄t}ф;peM+p]b<ߍ/saaEۚoVQzVS|M$E|.o~;߼$mߟaAj)sNOɯ:+cɒ˅v?辱pz ,fG7%̲\ߨ_ۊHٮpVk`mަvšh<D;sxq#ڡ}jZ U" ?/g>kT[#AvG%+7fxrl`1..\~[g;6ݳZaVL.0>亂YiZ}[ܽ}e1.B!1&YNH-JImJ_?S_yN%,֮|V&4hK!u1h>1r^{o;\Uex^Yj`E6hu:ɰ7zmFل&0ڄb@5;$3 ip:-\f~a,8i\q ׮\و#Ӕ翟UdasX4,ld(L]IZ.sK~~/GON+FךXDLE\J\+c۱l|@~m^]twdꝾ@>Sue2ZEƲx:= 9rd2=.Yv'~c/̿2YpOzW<ιև(M9Zxaɕ\tO>#_mvګ&N8Fݬdy7c[?xx$59z\׺5'Qʮ͝՝eYq!LIljbûd ޢP QXJgcs†\ xc2~wEA'&42kzx=*ϿWM>a@ l%g.=nZ|qGWQcO<^yW~0c?8"cjsMӿ0z|¯[" M]v!(kxYGYMݯq*ȋi|oQyܲ#+\sZDfaAD<|[y:_?SJy!ZxH*` j8r /hDž/6(+w(7߱x GVHrq,pD_;MYX#*\_fe=_l+ +Z+jWFɷbkaʟ!u;G)7Ut}?:g_UyI im ~y~+x\/xۼz{O(:~Mu˻5+oa?wϾ.һϘ'%0'K K5E[QVF.ܞՉ5 Ϋ[V8w7KܢUL#ʗ8;__7~5RGVܢQtYnuB%P7"c{x"ߓ}ȕSe%x8#eGf =!'g1_}y0BohV|6l,9"ohJ›WI]n'<6t J[Ujh5N%x:&*W_Z_?\__;O43$r% Mbqs >d8y8mlWQPG4Ͽ>.+}ڒ/>o'؞ɁiMDGs}ٜfO'KVѸg`NU֡rD*agFzE(1r׏^^n#_URiђ#U`x*_% XL;"?>8|ڇwqv$X\)eK^䍸Sk'넿'g]4 X`uF:.ҔآyW3Z܍/;feitV- *t:Ui&?q_"_"mc4JQH1MTZu(cKawǕ?xF޷coC!Fqߓ*xO3X׃Gd]4w>tƐ+:sy᧿9?G3r>h_֏0:_~=KZ֯J~&m>4AT*|n`)O!zBrBKs,dzjd5 yA)F\ۮ :ة/YMtj|x/߻ ΍)]uO~S?"o}PU S-~cg_m~}MlF& Z?v^am]zW 'y2l66uw/ZMh Wv9kLQF*!!XoT;uW~mI&m N;{F6qٛ6}㕻3Ǘ67}͵3$ Dž'x ~c_C?c!O?GY_?o?0:҇%!.w ;XYvmJВ̺:yAj60RNe"?cD Ior*;xw8_3~!}`npnϰt `)QZbDžhxmq^=/6nUZkr\^{{fCږL|?'[OzO&kك݌iܰktߥ J1UaD;m te WQ^sg#Mf $mb7.C;KyuOkˇ~{`˲B~1UQԦdb!3jU]Īت 6xP+!H/V1]2Bbu@%1#Y8Ap9"mRFߵѥw ] J|HYV%B4A.aV1,f&Q'(#DX$zU fL'+h5;s>ί|f?N;$c{KphFgP e1Cs#' A ^4xvbb8eIДF@b-^dYJ0K1[yK8oBm;s"=đI>@NljZWN}E-M+1eʥ\31$!SbX?|o&jqjznY^Zf_,0Nrxi>4gwHLlV* _Ԉ_u^{pg/| GN_7n B#;kUwVSeѴ$qR1Mu;w\ _Ds44H㽷:rR;i\F>"-H$ &TX>8sn-"׷XJbQWD5G.ϝ`[|fCO$@KEK\}qw_ձgVV9NB9lh5/&2tof#-!}+-P$eV+VXsR 52q1V8RU Rj1&qkNȷ'$,SR`DЕRRmqBǃhZ7v[o=mfOaέ=EkVKp2Xʃ1O}a>շ:Ks-’KRsrUWI|iT)`@p uA 9Y=Yb#U[TCAeIJ A2D %.lt%8Ϣ3Mz(1ޓL wTxc*!t$ b岖ħMM]x38Vϒni]fϜ( QYO5O|dWE /ZͭHQz @--h,$H=lB )Ew!e3Oy8JIH0S056\o" (o8  `ĥr!>iIv? L R(@;?DL>w詄L6vj+_y=݄̞9N&W|,|XR|˓G)4:HXeQiJpH'&+"4)HDg nTTRYU=,lNy7dT^`=t۱I$(d]c`Mgf_~k8Ӕ@oE( >ʣlwJ*QYWcjDM'wZ#\I6PqzEKB:aǍQ^48R`dD U[S )o׎EyX6"c=ƃc)!,Ce5B>Gl ^ u)|z6{k|GXS4ks^lg1I.L>k#,iaf @LDw4h6 T츛VA`tX9:l:qtt e^[%bRH>iҭt`jL:uОcZYDjt=ºEZ࣢޺7 K vw87om190S>q~-n*&?}g6/os:աQY!O37G fIV #'0,hO@O*'$A$V}ClGhK}<UAb@H *i rqbChhfxx:ޤ u~e, 2EIq2i Aq*L9:* <#|2lwo3I!i4g>C:#ъt6mԩqI`8Db94sYsCICB}^WZAPiEӼ.r1G $󜜎pH:<ƲZ KK ,ЙF'':B_g1۟ڛ78ybr4==¿ ,oAE9wpn!Y\2\\ Ɩ)GH“D ST.0tz ̐YZML![+˳>XG+gzN"@[ktuJ j 샒w2XZ勷v9p5re0acmcBy:u(G%jʬͻ[otiOW=p(V]*'42"P(0Wo?s(ڻEJc!FxZ AYG!f($nEqKY$BD}e8cNywG>ͅ}J#%@$iU@80 x5z72gH5}(?nyU~=,t#d5U8 cMHVFs)B(P!jP8r>߸tg?FՄ%X>NLjt1xT 5REga|Gj1G#Fұ[#,Af$'BeDb^G4kt:'^}5jcl;;~=´\2.m_u.YT235D`Ў5N+YF[Jfw-!Ki#5('}iRӼvj'F4m]eT+z5.<ƅ(}&Pv+QQuۑN@o8"t>7R** ZzBj'\:[[5JNymּYndk{ȅn`ko|LOg뼸)6Գ]eo ~Fq|̵-E*^k92Zw\[7 疘mI `;pjL5H5=Crd IDAT'rC 8Cg ъ]ƵA Di wh!|,jq'|`ܟ̵ @ߙph{ʓŔRg mRi`F*3ev՘b}f{#g-/=r KnlNxsBft:L+-Űe\Ia= 6 :,tHӌG$t!9{t,/s-֯C k|X{ّ.ؚc˱2-b=QHLCl9f"UG`%0-$ wdG}{$u4&mJ2Ѻ_!D qHiL1Ua(ғ!G;OXwTHQE/ V:O'| 9oL£l lĿqR@1 4Э潁oW_J]NXȿ >U"嬃7ZO*4Zg1o)PaqY¤휋f\>f1uؼW9ұVo mʝ]jP2P@<{Ym~u~qsme 43JhD^yY>Qa1tR Gog!pQ"K:;܂7G[~yxÕ26DUNy9ot͜Ç5{mD' :agoLˌ,92qs(f:0-}sxGn-%;T|+US$đ,r2"4 O"RF/j80n֥ExA^mf B@ɨs*6%RXJ'&_Ey_Ŭ8g3bKנ IT4S}=q\<Ⱥ5/+7ָyFa8vˍ#lOإ77R~ Yw2YYISNJj#zΐKs+xQۑ+A5BHL3M[F vk.9qtÕ Z k7}^a8Yё|}ZБ{8ᰵcRvvn5hq0057n +;8{LqxF5aT{q_}11 4p]UҼ.ڊ@lFxQ%ʴ"PХj1^LAs$w,'8~*ϽH._5\9tkg=S8LsY'c.vv(xXYy0 WV5+M-PGspeQ{bXTkft̓1U~~ĺ%u6wֱ-ҹȹi=:ut]y<`S8'eSk2$ Kp]Ʊ@Ng]f ūpyvj5}X>GX#r53jdcG:ろ2ݜ J֛ F\ߙ.',I"RbdzNZ2P:ўHY~0{g̠EҬ1>3q>JCDL@ILK8ӚI0rG4^"{ 0T =:[cHS#Ee1{mb>S İ/Fx۫35ް:f{=&\O]n.J,(E J4/ X0=+G- POkBkcʈYG}[3 )ҞBjG>xʘjolM0 @Gc$HskHx(}L"*N24&j#}a4ưaH;ljvK|"qz{z뽌M_$5djEПO+8@+I)|MQ;3.+|8VIKjcXY\0Ӎ,yj锖LIzGZ,u G1ݻ[3טv_>Yh a}M]J{#;"hw0B`T'n>hŵW)ND w̎F` a:e Bƌmրϭ]CIiEiAa΀_¹ ܽ.0&Ei1e04C.j@޲3¡!(Jo6P:-,5">ZB -8}O]fuhE4]DrCW.lZ%pҁ2vzoeh/^!}Fqg.R\xo D3f(W፮`Inc~{cEɰGo揹y׶vAa`Ѹd\QB"MX2;IU3"|%$KP9"af7^ biAzH%RQBd ;' ;-d@(s2`BQ,3hNJ7jLw! :SHXf(a6ٺ:TV2L0@IJ+_7~mÔkoo1N.*|aɋQmT:4UNUMJ,N Ͱܚ#Wb'ы}[CJ&i8`q躒>xCW%Aj_A`5k򱙉Bhz0"`1AFr.!{pZb)_Y|µUL(Jnߺ?٣ܸ 1" EQs0֤8E]k6˳NQ4Q#E qB87;;,$H'6)QΑyK5Enmb\RJTݐHkA4z刵,'g+Քs)S0^# ( $`e=RW?fMn_[C]:`D#d0N$ i% {TEE]Xƹu[ i>0癛OaH5Yc0*@" RKL g??~&#Բ;]=Ӧi7lNћ[bsZ@N JѪKQr0`OQY! % Wْ}H1&KGo ygAnF^X(/#C F߃gpYI:iTԡAD0XUH^d^F_^ߧ3BGU5ayaX;g9DT݇ww@ݝcFкiVax~./~BnJZ":cx,͸)bT:|YQ%5Ue g7Ǟα,JOᦞ>pĭwx||߼UhI)gLVqTC8)YA2fɾ$aଐ& -2/! Jd`&N_s}r#+rwgt? w˜nCCL|N;vuU|CO| ?hF G/[SSMY3,::Pk SRy #GOw Bk LӇhX<>?pLGSzC3/MA5r Ui kʠ1ASRԍm9CY#/ zQ::RUo aBm8|xN+E e G_d"QPVG,H/<(FI1&=8?KYO)u,:ra}r!\%{C ·?wkg|DX"}ƻPqDs:R̅Q5SFx)8W +r9DiN6$p(mA^r,jڲy3.,v}^?(PV~)!aFA8GC|4V-)jC1.0.u!7"g?xɥ;bʚJLQqOqcg;89Yo"L 6'"B=E(CSK :~n} ^1/t2[e]B?#TkWZ)V54윛gǰ=CAd YJuΏs_yQe-;:hgjK>urF`:3l{_L k=p_!JW{lTm8s2r\MKfR9 G^;n΅#,Z`)#,8 [GgòSz&GZO?y}BA!r/l#ycv#ȧ _mPA#O$8dECﬠeRW|- #-[Z]St4F6fCZVF7k[|˯=޸ƉQS;/@*E$ '.ac>'8 Um-2qC#{5"8:_ymܦv_#ʼn 'R f5A%m%ѥPa}6h!**8rx[Nr* #M9+OO|%2pwkC Y4DSf9:3RFE0XI{gB< 9 d|EEÚC?β+)j$/F=?qڴeJeY5WJȼCuc ZFJYS%.kX".Zc#Mk!gAUCOsh4(BKT8Y>nڲ:<OyH8auY(Ef nlRrOO 4|BeJ,_8st٧ir" RP[q` ÿxqC#:B.$VD# KW,CW_)r] cf\ğȕpxcqm-r»v68Qc;f?p_}&YMQylGΐV/m)-ۛ zl> IDAT+rH y1D(Q_)w0`ap/ }H,obxuXH*ˡ6 uŮo3M2Ql I z`6<>83ykB؊`[ZHT2ߛ|IO/H)_I-XXGk,'{yzDhNĖ~FyX?imYz{5}ywzpvwB H>> !( R )aPHGI,v;hwzn[uw:kxֹe{=_n:m=_WqB{#ӘbF1^h/'oY2Ufe5\hFwղ7r^SH#"vXZ*ږ}ӴR9ߜ3[e]5U=J`5.9jҿQѴKzx'e8_$wb⪋,#uζ޺?H٣:|Cو-h{Q&_-t~Vj \)ɀǴJAW}҅$65Z,mph>(Jb [27ԙ 5p]?ъ=n\6sڄpƵ(w};wy`K|~o3phA+G: vy-]+lQZALd [oL3uI)B3 fLgdw;'0iO[v,ۚI"I ˍj:+n߹O"IJ?\>>0Rm ;sg qΆB& ^sn%Xn4K@ir=Ps/}z9EVtdڞpvLZ?͙RῺP,^0'-~}W-O7ƴR~Cq ,O%/(g= XΈ4Lf}eZ 7 hes3|'R{DD2a0eMxsLOo'J\uf6LtoM.8gV!Pi.ݟXPjDkgV ;zbs{@Gn\z?,w_xٽy˔MO&n#;*)39To7sl=âC%8|=\ '-@d3 ; ?CaQfu\n^~ĥsxKOpʶdj+Ρ5AxYɏ>?kkxIw,blJr0arEҳap* Q02a"8ވz8ErvJd̋rg7ݱQlss3)P 6m 4p $*˫cu3Av;x I d T7-vn4>#{&߇f/ ?\q=mʙ5cʻv)J>;7 pR9$rrfr2>w\=߾M3=Jh1U?o`b5ַKEk K4U0+Xo8t#b$~wcTsuc rUGZ98;۲m}[L(;6*77ymʴ B\W6'{2q2KHu\~p1;o<`[kx2kwoѕ#t8D;Y>zYJNqfNP* ǒkj[#/uP6qyWyF*Kwki¦ [.Fcd~qpO}Ӝ_[=>Me}Q+ F" wyэі0M{8yR Yhɼ!-B&Rm(lvg92m(F<P,]0r>洣vaɩ37_eô*Ep$j&)՞sqYx-\Px8! 9_Tt{7lN$E>AF+Ы2a:Ѷa}&L֊'蠸^K+r8f] U^(8wz9szGӟrMT% OBq%6jݑBQDqPZ$c 눕M[lSDISˏs2Oq|6c^~x9oͬE"ۯʮ4j uqS XSRW$ɽX+g}"f3"۬xϦkjoOx̬)9"&l;WڞӤxeF@3mFqHF.chs25Q$"*uf-`Z)wJ)8 x+qC@5ҼEEͣ\dY|x0W{ƷqZ1qyߥ-6;uck!Uݧ OXŬ0kvwfݫvޚڡEM&.=n^ر_bU&1,:I֕76x6T=eDǰ'Eu~O3Gm[Ui92 Q3j1RkڟG%Fǔ&Vsd=sx ~$E< < {p}5T̄-1_{$fXlhU|JNnFd[nq1t' T*U_ vf< OGy8X Pm#  WQޣY JʉQaGY@d&]̌O-ɩCj=C!&h=Z3!D %Pѡrpt1)g~WY @TNo'.׬s(y XszaF>mlYO d55|kT\[fAغQ['|>^8[ϝrOx<޳<\@|0dPaa@$jݩt&zeo6hZ6;\BɍA)\XWH<΃( c`^V W/YDEA%C ĕ˂CgOU[Uru&҄+LQk}s{*@+`"syEs_*~u_/LKpY.n0̊sbb]b;g^uKLqqbbvc2>,28ud&X)]w|?2 A5>>.Ga$>QUYzGqF !wj3T yw)ͤ;4Z{I#3NNGV埿ſGx82rp6f.4q,K Id*n> ֛#UPݯkyr0Z3A3Es@|o ཏrc|oYyl8d疌ǀ#CTk{Yxqn|f}eG"CdqSyij0&RڹUBIm|W!^9 }>uug{g<ƺ~mo`vuR'X5M4Tvwχșq!$.5B$ZEC,hjX>z+z>l}+_=WKBE!+%e*to=/ʨEuUyK@h3D蓝I[5Iyz!-K)~7on1':GOt.SDi6 & CiՓ N$jEoqIotuu=* 36]pOECՇ r6 !š틌XTo|ݢVU)Sc{YyVZpQ@dMޚ֮\>dj?E7PZ!y%9^|5^} ~'}wM<7@RVNFr ~s̮nYu}N_k+2}4}aá_r/!sy9d2c5|h H"QP}PF YgWܾw rZCϳ4̨ҹFX),C0c's  z xɨ(#j'>SO=-޲2!1(cF^GB@ݫpKfjuj쫏,uAG*W.ES2:Ԍ0Gy1;8c{|s#)Cd؛yZeu쬫*hh߄Y.g0^1tyw+9g/V֌gڟ4?o;SqE.9q4yXD<~p8D({qT|DL -U2GqT*IE\jؐ(hVwL~?A(XS#,##)X\E-38USȱŋ RU@>s~CzՀjN&I*M:YZ*LS߱7~R"{CޛQSeW-g\FJDwe^y+np!@>(!(s3|P*o,%W%U(5^VJ 'h7ա -1n^A)}L&HFA+=]rYm]LLuHRm³vG"+ yő^o_ْX-=L}Ų Krs;PtJujJ'<'/=dž2Ӵ1)٭SHx A:\lmi]2%ttF|PS%ȋ 'kWp5֒6GY@\9c3zT!w`o1T2?GЂ 6As /J 3"=4B|<䩥[qg~Ze4Tu*F h\bֳq 뜫֘H9nF_7A:ꡤ;y#u *y[o|6|u.c/s*"n!YqTQVˊɽHabJfyݼYHIsfVG ה$ n .3.'n pa#6@8{Ik*E;Z6oɞɝs`]rF3Z6v-p&orv8kޞڧ~p<g\zW'(!Dw'Tטw_o3"ݏ=D=6Tpf.jؖ8i=EJWċ􃞼SGV!WU*y@Lh"L@28Bg-hePOOYq ~/^7jߝ^.[Օ`VbXcCVx`E'W_*[MXuPYbf}v;ֈޱPE ?|NNq&޾eG$Sk@dZe%cw~Cu,H׹hTf򺓌Li XN:aK\gr.`¯ȍ@`oT8X,#qx!,#<qR}D|d8{p3QPM~'%p{ #|s 3ycվ^YʒBFSOl<;鹽cKP[ [jg}wf0)KNRo}=:*@\3J1c2՟7145/M$nfܺua,d L.u72umO7i Yx(ijq:iR&ehmh= , FIJdnMYv3KǸ\Zܠnp֐n"8^{fOB5AUHE;9;˨5A@G ?u* 8$_5whIUhs&5 >zCsk\NJl [\U8<;iY nՙƞA#vR^G=WάFY9u*5q:L=[ݚ})W֧Yײַ6u>OS`&Å~<^3-"NWL1fu s79qVwջ3M-W:;Qh0-Rp.0v|+o<Ԥܸr d9v)}H͍fC3<',͘8ݞy_gg%ļ&\pdRq8guQr~3@~-Q"e}`xRmxQUeF˄𭢾298>ޮ7뽁f~UegadΈ%^׭@t;?٢`pqaF1GvFNkti31[=s]Үq7p$$z\x/j XXhGrdTU~g8"%fjTIuS C38]2a3HCybs KW^a#׏*!%s E\nT2zfFKdAI\Hl[..Pڃm|%ڌ6>59:Jz[&\`PheGy;Zz ߿FA\ĵHy@%o‘w=f4e9kVX@S#̭`U|᫯dyC4viT#)y.춉)uLAPlޭ{{A"ib3_+KmUv} L\ʵkgqBBRלS;u$˵5sΏegI~@⃧s%6^K,i|gRӤ/ehrKM ̣V]"+>!Ӟ miyT 8p^PsGGCc2F͗]Ry p2MBͭi8\.C1eG@Ԇ վdbHu)f3Q*\֓5 ivz%Fe{>I[J' VB:]W;UG2F6stZԓJ[O9u qjƩ;T+)ZK:XOO >֮hh8 6py\;f݌0\Uw0 d !f(fQ:7Huέ&w8p~qC259k}TGyfre}*,㖽7ji]\|ʘ9,ҡL1;\={B F_ݵ7[ͬ]<%튂C mj;$iKћjKy{Puu-*sA0Qε͛P0DOqvZ~G\6XilF,Z7G.F\gYEPp3!B-F*F)F]Ny/n=bg ,L1,TT+-WWt!F\dtb rYx;``8tlpOn~?rl#+Ec]\0_ UjВȽ k%Z.7ZnDj@O FCDA#ɈC8=^j}\>t8.KUw{?3qd8UpcWk&U|_ ȥсE6KZ[ŒIbuwi$ ZwB ^;E]?K{/³Y3GeRm~͔kV115p]NNͼDtNTRXoa&V Y9hsB)5Gp?} ^[z͍jQ_њ[)V+q`N։-{%cDL˝_@{ Ӂ޷ #(!(!ףS*=$WIIڄhW:m3.~ 8 "1qE֮YW5i"i`d_y:p3$;n yNX1n9?WggG:~KI&_x3TjӒy0?JM=k!RneF:#ɊTF =Dm eEe.D fNE} 3VlmjB"96$><_%=t7BW -;Jls[9_.960r臁Tdj:gA4OW8Y~ۮ9\\\ȁlp8m։#wOݙ ÚU+.f&D8C5rH3B9+m*gN-~haK!ch|r}.]=V]jr>P"sE4p76 /ɍ-<{&f;j'jal6[}%?o)UÝ`r;ZfdWTVoj.*=]h}I.Mk8;k!Wӌ\%D*'3Ɉw-?<4DG'SS]dO+TZ[YC/s= (FJDs68B7*#d~3mTgIR +E֋ iW]g֟?/>5~BHN&\ٵq1y_Eم#si&*P:z TBށff3g|b: WJF`9",qG+yE9!$gX/Y^;<:^j-8u-̯ Ka㚳cI8GOپLML/{[ƦˁaOK(I&g|wǾt=%%~U, %Fm d6-})ETIU0ϼۓKđِE M޾pJH|m82Fp!co]qzdCi A9-SU93A^!x36RBUk"RQ>*\ ˙) A6H4 g7WƑ JI*͇1v =T ]Vܜm=۳5O< = IDAT׿xC\ACXS}) E g/+Ral*"P#=edH"F3u/w^ ß>a8vSJ8Vu9a C5SHfJ퐰:>aqsüGi+w|6Pq1t/JGRy?,gvʯ~Y{~ӫBWQLbqHJ?z;E.I"55F":jIF]T:TOtz]M'7v,(I:QRϦcut:TT )5T6OO9l!88&_Io|ItAT2)y'۬`_y4{%;lQtN>w Dz[RJœWKRM:,S+I%Ƞ l)Nr[ zpӖۛ<adfNq&lD)xR yHz;{A<'Iĺ5Qk&&9g7lfBz﹛׾u>ջfsM $ͺw9 O"H䯾fk*m-5 ؄!jM MsbZxVMZi2@0=܈:Oʠ=6 +_t6qx.a5\Dž?t"HXm&jd`j;V-''9?p{1Q )<>o}k= w[Mb>d\3+WoPڮoڍY1cD(5 3>1xNXѭ,?>skvJ.fj JƅBgy$ˠ/RĉYRvzKI7M;k;TŽtHEC @rmP[* oGs|V"DRbkUT9]-8qfZtso7ι}%[8r*+TV""P(c⣷' M)x*s _=Ma}ah9uG1mak^=x.pHHRfqjI ysS&NNW|8G9;wG[>N:AR4_\:銏;jhT? X@:%`Ro07FYW" C2 f=<a-:N/#]϶*Q;.\X{6ӄzٚ.\y5I)🽝xkx/xݼϾ/O_afHP;`K|EsW_}=oG>4k;MFJ#:聍^#&97qeǕ¡BTtX8xpښ˞pŊ3zz, wa18SE26F"t;!t[SBp҈T]Uw* 1v{82gS}U}E6zO~i@@TZVZIeb99Yqz6&BP.,)y.U<|acL׷a^Z 9WJ^CJEr1+Sb3 wzSl-w9m0'K %#MK )z/;Qi^jp V߷9gAX :jI8Qq$Ƴwu~[ݨwSDc*#`p83Ύ''̷b=o~+xߞ f٬Q)9DvyE/|9Z_!ٛ\I9S5rH?-ה1QWth2Qݴ#*V{4$Ȃw g8S&+$S*m5LT/ںs֎ݚMtS޲-΍`['Ko-8>YYD$8[zc?|m&sDuxN"VɔZ16A hx#$>ާ*ugÀ6ͨqCʎ͸%3FUșjAJ|DA.\EkDjtKg "Jx1vM0ʆ= M{_-'O\ 0w ^XF("Nh-_f3T;*s &7t߮ H.{/VH2|^Gݸ7,0\[7Ҧ%cƹFIk9ԝPeQZ@r{Hk; ; i(l<2O:=8]gK nw?/>(1S,slk8)&O֜/,Ֆ8<|Kѧna󁞶&z|l ;jMac?N#j-&+f ¤/Sȅ)%Wrj޵깘9 .6 zB\֘ux 89VBgL% rso=➏d Y&D:ȟ~?p+g|&8_Xqvaq۾p;W6Caq2~GFۀ #*f,k> /;BN50\m/ }?0dc ]:'{n B\D5ĚNHHmkZ+Hۨ簚)7l$Wp]T*ι=x>ɏ M!dNxH1a"nڒKmMr ySGb51v7DFL5gWl?s͹~79: /28!"L_UZB]21,ә#t+Wdk+6Ap-PZ Uc3J}4Xd?&}2'Ռ!6@9U-mQ@Rg]֫)JFZ؈|k}GM%ȖZ"A) Ɇ%g'+q#돸#aƠ~_`KJBҴ[ϴt(* !z||udL0.s!M#.F!Eqd$RP /T6\AUghIH(ա€Ho/o} ? xp2cN3~ޓ6MxR]ʴrr1 '[j1 :<G_jYu\ mf@n7ؔFCV)8NԨ`*=(1OVNTlr]ZnӰ*c"4lxFHQj%&٨v8LZTkeЊ`8~@% 4RPM}q$PhPb&K5Q V=/):WP+_PKĔĖ2%b٦ b$n`ޱ? {}~3hrC@iL,,%No/H-eltà&+g+Dhi,l2b4RRFHݴNXM\C[d+[-XfaԊ!nw6BԺ0 ݹHNh:yb-b1`_Iq"=y@QR];.- *͖FF5!exf1[VG ~ɩ1J<И[*j⑚Rj8/t༴xƚQiȥQ-$B&Jڋjv/!T&4kr15ci3W6k#Q[&u@}C*M%S- CAJ{ϴ/ֲp{=\s9o~V{,L9GOk)bJ- Dt#OXXHhRJ05M}@o1)+4@\UА{Q>orW&<>\z|c>߿Ξ+U]0F:oiDRJc'R1F\s7N~&yRu@MJU[JX% 5$ ahrވ%W%H[(9 T_ji.( Pu~d0CSCɠ$:i2Cjf3LW":?a?rhw_?W!ܽ`}ꙔHF?p](%Tfn&FӸgsKGK-hU7ƈJcSPRMjUU IDATSJqT$ }'A]*cb )հC"\Iђ)5ъn Su,F@_ L W~^Cc?:g,VNK$I1@ *l)m#4mM0.ՂXOAųzZꝰ8gҐŠnlŘFQ渎ʸl-0 PKz?V׆&K4(U!#G)0ALƇېA#Mǔ@& 6e, qBncs@BoB36g싷Ca3ݺG>QhZWnzΖF;+]j}| $iFT=9(AR]D;Vup [!6r`EEWU抎rCK F !CblsbJN)!C!KNHAF3I^A=EW^UWwn:k+ 3z߳ٔ@֞uzo<#U%@`V52%ɁyDuwZ2@$''3WA|H%Hn87ĜPڃ\{?8kϵ]O}|]'̌jЎ*¥R&(٠_A(=5N瓌( RB%J1UbRk9L ZDz U6q(5vQ/2fMtX(?%Jnj)e;64 7 Kσ;VwwE`lӟB%"=ր TP~J_;x&-+-2k1hkVAzM*EGL=sd"بt,oaTז̮.6^s/1/Y$J@1c-Q Ʉ,},&?a1j.&T UDX3cV] 5T4t$QJ0R`0(yOy:wJVI˞K_ڔ['jz"#$R1&t(X["L)B2h ]EhRH"0WP! B 04SBvŪ6*aLI}͇Yٹ mWF]@'l;'12jn.Q4LEPU!%!-둪Z\X@cn5M»v;W4TQtNij NI9aے2=;gF{(+J$%e(;bMWV%YtƄXaU)!O4#̈́A "ͦ35 =-=ZC+ "XJLihh+kȀ fHL׳mKJfW6KP\b!/od*ZZ}O $-ZfPT $&(] 34tH?Ob/&dU&y gg/MKc42:4l lR3x@cZ j dè^dP[IΑf^9}a}ۄyn_22 -+yp[ ¢$@D$8BixvJ{F*1)N:pCAb`!Ĉ\SDM3e֪[\0qAԚx/(f B&hD$ie\U(!3/,! ]|`-A"Y M3[ Wd`fjx c:#Ƃ8&4ZiM݌L8?GABH ng#)\b[3]7ٌ-Imqq1>J_jUݼAͿfn$im\$+w 30$wjRv5ƚ6mѨ`z/!cwk6LbF ɚ]9*-"t6B]EFMJ ~a(,Be(Z˖$-c:TZH) :Ec Jv8IV73\&$ ,HҺ@q<(w)JH5y&GjȨ HfRf cYi %T 6OZ~L57$մN^2`:!Z&!Z@Rs,B΁ZDĕ k)wL' MSM`cnFdN 9^&=!&Rm]Oխ& 7F;YxHcU A7bu俭d ]ɤхլEN1U]7: !1ЩœjSL4"9g2d})X8|;hxVP"y#ܗap:DɴeLZB7YD F]8깸pAF A7DVKv^7$TLↇU#ؐCIhưL\՗0:Di@Af4I-y:=ԌH!A5tۑ+Y Q";FVDzrSe 5B302Ъl )JrgP>HqSP:JW0)ڻgUmñ;k"AF=J#ib! ӌ:BuK).C fqA[Wz:&5D?$RIϠ 3' }(RY PMT0Re`AEaȋbGJPc6[!%"S˾cٞ<.#%Zi "U"V\S J F hR2&Lc=YOilPeL,1T2~͌:LDL )2%dl)XRBw)oHa9"km=cкrګN6 =Ây.iXYRj 144\ ;"PLme>/LZ[zz"6mI>f\0'Do gjihe'ƌVN+@L$tȥlk1 4y )(v`= C)5%ТX\7qYX'WAX tBm=?/@"q>*l؂[d EqL  U"tjHbQ{Nڣacj05ZDL:Z qQ=!@jˤDb ,X)+H1)wKJH Mw[8YtԢaԅ\ aFdh)„3Rb3i洫+nL09Hr!F-Tz6LQmRsGcwP2 N=Oj!Ku_T,b RޭrT(51 *0 ]P{Oٕ ^6^?2vIjT]P\+bƱ[¥3|WHM} d ρ~l _bRhC!DQTjV(6 rB0z7״".GB/]jy52(I[%#o?=4{WAsJ d2O1Uz9qS C [S  d$Z7s&"dBmfjiZ)EH>hATje{UmZa*L'R*4 Q@ hC%hf#cFS,YTUcDX\_&kXukQʓ0b$s^up-"m z7(BVYLobfNlPW!VBi`%CFB$ :-U}x7_2hSr 0]NfIT$G!0z%C07 jbyG7A ,kC{ݝ$x#AWҔ8Ȧ$0qe9 Ž(΃Ycvk݂^قлn1χhjC(sJw-AHhW&L&Kk,Q; NŻf,A J`9RhKA"}VulŖ+D0U,MNEFO!HmOlQ2;iB2T'6(押{#dt44T]?2E[Ė SzhMvmJXY%%%f3\|7X .ʵ*)|VsBD uL\0SY!ѓ7^"2)gFD[M+L3vpWIX$HzeH%Zt$U!7 +:ĽB4@n5d꼲qR" nu1D0*[ʜnHR1V$X3ˮa]|OJR5L-t-.4;hr+-NP%7p<#t?NRDRتMml+)xbdl93(]cEip"Il`N59 U,nCIkfqݏM$RKa^vela}͟v\.ˎS]r?Ck԰Na6R@ldz8%֞W.Nd!.XIUPl "/f@ b&YX%Z }U ,r`ЎFL"j#-TC"!e8LH{BQ'5QS% "ލkO aꢵ =32BW/DA-i5SSFhPДL^{@|}Qb"YfP&4\z.X0JuN{nш4Urt A?%*T[HCL=k,RE"̥,kdj4ڻ$T+PDZ!c@I\#.3 qѰ@sdH[jR&P&)6;>X_gh  J-,t@KZJ9@ F_?o@Y-hF2̢$T(Erv9_B"% S&C;U7hd9@P\A2-+TqI7(2]!wXOL^d$Qh=PXo(#U-Hjcxu>QJwzZ}ebA:/l,:A, %L7rn`7%/wj6Е bZ0ilJkj -y[K+sS4b5,'DXNYUt$T\p3\i"f´ S9Ć2,0sA:E0&j 69B 'kmȓB0E"FeK0@uۇD|uZjjY!3H%R@'R) 3$m=;g j=EB%3$CJnFDa%J˗)IjT0/ ,&4CPȑ{n͓2bjhGff nG,W7#| !7̦܍[8!hRMFqSlӭqw?|\NF;L*^ysӎ*[]3i$Q>pq7pCG{mیaf.?y?ٝ]ivo:t/+v;8XF0CNjC٭tG:ܕy|)dw~̦o~0# gdLFՍێ!s;G|.alEczq;;o<`ՔM&c(9͏t]r<;za{:yjHk.m~iԒiN=Ԉ߆.o"DM!@|  f1f"5pl94K,K,E\ IDATpL}/"K,K,ķ%I+;jvw{M4%Xb%Xbo&l6cرs';v\K,K,ܘB.?NM}m? 1o[b;tFmI?_b%$BsZG;m۶_XJᒏuN>^G|Ӕ-s%\O.swiK,y׳-9qcL|33lpd۶駓R:rPp_nw;?t|צK6)ʱ>,K.K1t 7-xk~#5>i⋜ziGjD={PSA؁yGB.^\]uK| ! !OX[ P%@;r RJɔR "={hږCb{_Oj9>lP96QprcXVty^.cˈ./K|k7rF*+ˡ L׍ƕ!?<)O ?qù|# ugqqiΝ;7K K,quY[\WjU%gj5rsso5, V҈wm83_zX#5Uǟs9xӟN{r Xbo&vsZy#~|G=q K|+H 1H4|=KO>]PSb޽ڹ=)0<.KܵI e[[ < JLR ]%-Ⱥdt xjePO{wަ<,"<Ý'D.?rߟNU,`sP֟ii~"ʴ]-Xb%;B#ujbL B۴QT 1puSO{$e{*nwH4%B-eP(pӌf锰K,qT3{ǂOw!PJoqRJ:OXj4.KɞjwzpKMý/PUrΛdC_Ӷk8籱q?!>س?“dj/~/?YDa>2_{3_~ݻoQ{K>9G4|Z _93{qo3,+\s o~9)p_L2U+d6w^}v=q^+r|>?#nF.2J|]vrc˖-o;.ͧix^K_GX,xCs\nb`}}׼5K\pٺmn'܍__%e]Ưor̮]\wu'>ɟƹm6ЇifU>!{3sPJ}+fƿBֶF_5<OOzQ[f//g^7r3z;Y[[ccc>ymam뷈1/}׾u:f7pg=,ԧ0 xǻWaftn;;w.35K,q1G>tB~'Ga6c Blllַ锦iPU>N7Oi g3=v׶v,{.g>}gri/YYYټ#`DsLB?7ル7躎R _زeKX,6}~-o[na޽O$w'iۖ`fmK۶]ס<e3!)!a&b Ð7筿VgoJ)\*}osjf{Ͼ{v[lBJX,6O{7ދ-kk{><)OBΙ3|4?ȣl6{jf\yU|-oy ۶m|/x߈qſ𒗼Λ[q<[җ῾t<ٛ߶-Ml͌dMSau B Xb)͹f{ ð1FrΛAmGlzk^O)p9SO/kkkw:C}={ro%ȫ^j^w'^s{ݛ_אs?}yO^'=z _׹/ᬳÎ;8hۆ#}k*Yrjlnj)lݲw<~ /d6qWQ{SxӞca219s=y2Gկ~3|4^W/]1ُ;G{ٹs';v28k.ɔ;wqOOL&a9?3'?zSp cnd:g۶^7y y?3_K.qϓy+_8t{S袋O$ԧL&>D %3gW]v# "|#O$)o_L&vُ},w?$:l۷ysI~} K۶1gG#۷o .~7۶`:[aw>"WU֭[s?sV>Ͽ`> H?<fGreߥ9«_N<u o~>Bo=N=ݿwI`!y7t#0O}ew>"B?|{x3L~0!N>Rػwa7p+_ W]uW^y%q̱qeg?w]sql۾g?9x=xYgAJ믿>y9pM7Ѷ-q9}կammg<\>яR:&{<y̏BN`2㦛v*]wᦛvsϓO>2Y;I&.x xӟw8rSN᳟ J$'W/_u%|_m|:җ?A|y_̳3l۾ȏ<2k-7زvR z*^{}~LOu0W]%.-[_%N;4x_s~gY[[={g{.~ֹlݾ|k_/|3~U4 oU;eGvルOPku{=?Gtyы^)|7~Ї=?c?v`cc.'g|3}/]E^2LxS3L|U+K$X,K_qI9)SUt:MiI&J+3}MQJFikkC-2-"7`d=zg{6vĒN?D"0abw$?QT. hljN/f(r$&L&Zk*JS^^M4EUҜ:}g{_<.Q[y BvQ P\\ cN!JQZZfYF#FV>ӧ؈blp-.HT:M+zT 0{,:;;YQSU?Cii)9f3#ʈtGbǎcEM +jjH&\Y^=Q]}5{3]ǎZ$b@l[괅`O>D.Z[[1 *.p_-*ݎQihldpq3x<oF#Hy45eP(DL2D"Accȑ#wye޲8!d2QW 465QPPEHnGeſdS=z4ۻC^%r'sםw裏ooS,\8 - HzQ޷W^y]־( %mqqf͞9׭p ٖdtc~XaXz\C3dۍjӘL&)**(dswѣo;wDXm6}]gwCpXG>e&Ʀfza͛K:ֲO5E7j$I}>ϧe/,]tbx/UQP|.r"+3wiҢe< J= 4eDpdY&vgjl6sHt֛mKmv&{42#޲e+Ջo2tP P_~Y7D*d8pT*E:x#fѢE̖-aFF.gDYwq;ɓ'pa_?sGWDzlUeΝꫨ$I&NdbUWヒ(Dz-*HO'd7f=p8l1cư3RÎ(l۶׸7 EMeˑ8d *7l@EN8oŪW^T ٰa=55,_~+q9ȑ#~[ݎ$۶2|pA֛վ9L>?xK!"ݻ~+jXl9DaÆquS㬽ٴi3_?L$a֬Y\.dY淿ϧ~JW<_ᩧR͝s}҄arrrs(lvNE~~>@sS#@GhctG$tuu!&"$ BAAyv :05MjZMMM$IB~е&V|> F# 99vs='\Μ9àAz[4% "nQyaꩩYA*"H$1Mc2R)rsstb Բa"SPPHHD2"יKnnƉb1Anrhnnڒ}׋(W͟s-%I(bNTQ$I"HrwkqZ1T|]IDATx<^A8d,[0(j%F#`F2`0Ñx::0L8NLQQyUUVRFlri5lXohi BF]줳3fD---Rsvn7---hmm%//Apvv;.K˘ql6V30 x<~YN`Z |Hf539,Z͙lTOD"=  G"uLz(FΜ9Cqqq8Nx9f,H x< uvbѹ]LķiL&yVwjt0]ӝ񃿺IGXr,,YRA{˅x!1pd}6֡;#;vPb9!GzI~w'[F.tMD"`wp8.XlMG`4z@G$`?:N~7+nL~ێ>} ..éTkd:tСCa1dR(wСC:",?!UIENDB`qstopmotion-2.3.2-Source/manual/properties.html000644 000000 000000 00000006432 12536560630 021700 0ustar00rootroot000000 000000 Description of the project preferences.